@sbb-esta/lyne-elements 1.12.1 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/accordion.d.ts +4 -8
- package/accordion/accordion.d.ts.map +1 -1
- package/accordion.js +90 -81
- package/action-group/action-group.d.ts +5 -5
- package/action-group/action-group.d.ts.map +1 -1
- package/action-group.js +100 -50
- package/alert/alert/alert.d.ts +11 -11
- package/alert/alert/alert.d.ts.map +1 -1
- package/alert/alert-group/alert-group.d.ts +4 -4
- package/alert/alert-group/alert-group.d.ts.map +1 -1
- package/alert/alert-group.js +101 -69
- package/alert/alert.js +191 -104
- package/autocomplete/autocomplete-base-element.d.ts +3 -7
- package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
- package/autocomplete/autocomplete.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-button.js +53 -60
- package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-cell.js +20 -22
- package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-optgroup.js +31 -35
- package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-option.js +45 -63
- package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
- package/autocomplete-grid/autocomplete-grid-row.js +23 -25
- package/autocomplete-grid/autocomplete-grid.js +112 -133
- package/autocomplete.js +283 -295
- package/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
- package/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
- package/breadcrumb/breadcrumb-group.js +107 -114
- package/breadcrumb/breadcrumb.js +44 -35
- package/button/button/button.d.ts.map +1 -1
- package/button/button-link/button-link.d.ts.map +1 -1
- package/button/button-link.js +15 -18
- package/button/button-static/button-static.d.ts.map +1 -1
- package/button/button-static.js +15 -18
- package/button/button.js +15 -18
- package/button/common/button-common.d.ts +4 -4
- package/button/common/button-common.d.ts.map +1 -1
- package/button/common.js +41 -30
- package/button/mini-button/mini-button-base-element.d.ts.map +1 -1
- package/button/mini-button/mini-button.d.ts.map +1 -1
- package/button/mini-button-group/mini-button-group.d.ts +2 -2
- package/button/mini-button-group/mini-button-group.d.ts.map +1 -1
- package/button/mini-button-group.js +55 -43
- package/button/mini-button.js +28 -32
- package/button/secondary-button/secondary-button.d.ts.map +1 -1
- package/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
- package/button/secondary-button-link.js +15 -18
- package/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
- package/button/secondary-button-static.js +15 -18
- package/button/secondary-button.js +15 -18
- package/button/tertiary-button/tertiary-button.d.ts.map +1 -1
- package/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
- package/button/tertiary-button-link.js +15 -18
- package/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
- package/button/tertiary-button-static.js +15 -18
- package/button/tertiary-button.js +15 -18
- package/button/transparent-button/transparent-button.d.ts.map +1 -1
- package/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
- package/button/transparent-button-link.js +15 -18
- package/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
- package/button/transparent-button-static.js +15 -18
- package/button/transparent-button.js +15 -18
- package/calendar/calendar.d.ts +7 -7
- package/calendar/calendar.d.ts.map +1 -1
- package/calendar.js +638 -692
- package/card/card/card.d.ts +2 -2
- package/card/card/card.d.ts.map +1 -1
- package/card/card-badge/card-badge.d.ts +1 -1
- package/card/card-badge/card-badge.d.ts.map +1 -1
- package/card/card-badge.js +45 -34
- package/card/card-button/card-button.d.ts.map +1 -1
- package/card/card-button.js +16 -16
- package/card/card-link/card-link.d.ts.map +1 -1
- package/card/card-link.js +17 -17
- package/card/card.js +55 -36
- package/card/common/card-action-common.d.ts +1 -1
- package/card/common/card-action-common.d.ts.map +1 -1
- package/card/common.js +27 -33
- package/checkbox/checkbox/checkbox.d.ts +3 -4
- package/checkbox/checkbox/checkbox.d.ts.map +1 -1
- package/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
- package/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/checkbox/checkbox-group.js +99 -76
- package/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
- package/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
- package/checkbox/checkbox-panel.js +51 -50
- package/checkbox/checkbox.js +54 -43
- package/checkbox/common/checkbox-common.d.ts +1 -1
- package/checkbox/common/checkbox-common.d.ts.map +1 -1
- package/checkbox/common.js +39 -24
- package/chip/chip.d.ts +2 -2
- package/chip/chip.d.ts.map +1 -1
- package/chip.js +45 -26
- package/clock/clock.d.ts +1 -1
- package/clock/clock.d.ts.map +1 -1
- package/clock.js +136 -144
- package/container/container/container.d.ts +3 -3
- package/container/container/container.d.ts.map +1 -1
- package/container/container.js +60 -35
- package/container/sticky-bar/sticky-bar.d.ts +1 -1
- package/container/sticky-bar/sticky-bar.d.ts.map +1 -1
- package/container/sticky-bar.js +55 -47
- package/core/a11y.js +29 -51
- package/core/base-elements/action-base-element.d.ts.map +1 -1
- package/core/base-elements/button-base-element.d.ts +2 -2
- package/core/base-elements/button-base-element.d.ts.map +1 -1
- package/core/base-elements/link-base-element.d.ts +5 -5
- package/core/base-elements/link-base-element.d.ts.map +1 -1
- package/core/base-elements.js +243 -196
- package/core/controllers.js +8 -13
- package/core/decorators/base.d.ts +14 -0
- package/core/decorators/base.d.ts.map +1 -0
- package/core/decorators/force-type.d.ts +8 -0
- package/core/decorators/force-type.d.ts.map +1 -0
- package/core/decorators/get-override.d.ts +7 -0
- package/core/decorators/get-override.d.ts.map +1 -0
- package/core/decorators/handle-distinct-change.d.ts +8 -0
- package/core/decorators/handle-distinct-change.d.ts.map +1 -0
- package/core/decorators/omit-empty-converter.d.ts +8 -0
- package/core/decorators/omit-empty-converter.d.ts.map +1 -0
- package/core/decorators.d.ts +4 -0
- package/core/decorators.d.ts.map +1 -1
- package/core/decorators.js +59 -15
- package/core/dom.js +1 -5
- package/core/eventing.js +1 -4
- package/core/interfaces/paginator-page.d.ts +7 -0
- package/core/interfaces/paginator-page.d.ts.map +1 -0
- package/core/interfaces.d.ts +1 -0
- package/core/interfaces.d.ts.map +1 -1
- package/core/mixins/disabled-mixin.d.ts +2 -3
- package/core/mixins/disabled-mixin.d.ts.map +1 -1
- package/core/mixins/form-associated-checkbox-mixin.d.ts +1 -0
- package/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
- package/core/mixins/form-associated-mixin.d.ts +6 -6
- package/core/mixins/form-associated-mixin.d.ts.map +1 -1
- package/core/mixins/named-slot-list-mixin.d.ts +1 -1
- package/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
- package/core/mixins/negative-mixin.d.ts +1 -1
- package/core/mixins/negative-mixin.d.ts.map +1 -1
- package/core/mixins/panel-mixin.d.ts +3 -3
- package/core/mixins/panel-mixin.d.ts.map +1 -1
- package/core/mixins/required-mixin.d.ts +2 -3
- package/core/mixins/required-mixin.d.ts.map +1 -1
- package/core/mixins.js +291 -242
- package/core/styles/mixins/buttons.scss +1 -1
- package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +4 -0
- package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss +5 -1
- package/core/testing/private.d.ts +1 -0
- package/core/testing/private.d.ts.map +1 -1
- package/core/testing.js +7 -13
- package/core.css +5 -1
- package/custom-elements.json +14515 -13465
- package/datepicker/common/datepicker-button.d.ts +2 -2
- package/datepicker/common/datepicker-button.d.ts.map +1 -1
- package/datepicker/common.js +110 -116
- package/datepicker/datepicker/datepicker.d.ts +6 -6
- package/datepicker/datepicker/datepicker.d.ts.map +1 -1
- package/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
- package/datepicker/datepicker-next-day.js +24 -26
- package/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
- package/datepicker/datepicker-previous-day.js +25 -27
- package/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
- package/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
- package/datepicker/datepicker-toggle.js +154 -136
- package/datepicker/datepicker.js +248 -213
- package/development/accordion/accordion.d.ts +4 -8
- package/development/accordion/accordion.d.ts.map +1 -1
- package/development/accordion.js +118 -93
- package/development/action-group/action-group.d.ts +5 -5
- package/development/action-group/action-group.d.ts.map +1 -1
- package/development/action-group.js +138 -64
- package/development/alert/alert/alert.d.ts +11 -11
- package/development/alert/alert/alert.d.ts.map +1 -1
- package/development/alert/alert-group/alert-group.d.ts +4 -4
- package/development/alert/alert-group/alert-group.d.ts.map +1 -1
- package/development/alert/alert-group.js +135 -79
- package/development/alert/alert.js +259 -109
- package/development/autocomplete/autocomplete-base-element.d.ts +3 -7
- package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
- package/development/autocomplete/autocomplete.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts +1 -0
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-button.js +75 -76
- package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-cell.js +24 -24
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup.js +38 -39
- package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-option.js +57 -73
- package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.d.ts.map +1 -1
- package/development/autocomplete-grid/autocomplete-grid-row.js +28 -28
- package/development/autocomplete-grid/autocomplete-grid.js +142 -160
- package/development/autocomplete.js +394 -393
- package/development/breadcrumb/breadcrumb/breadcrumb.d.ts +1 -1
- package/development/breadcrumb/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/development/breadcrumb/breadcrumb-group/breadcrumb-group.d.ts.map +1 -1
- package/development/breadcrumb/breadcrumb-group.js +130 -130
- package/development/breadcrumb/breadcrumb.js +53 -36
- package/development/button/button/button.d.ts.map +1 -1
- package/development/button/button-link/button-link.d.ts.map +1 -1
- package/development/button/button-link.js +18 -19
- package/development/button/button-static/button-static.d.ts.map +1 -1
- package/development/button/button-static.js +18 -19
- package/development/button/button.js +18 -19
- package/development/button/common/button-common.d.ts +4 -4
- package/development/button/common/button-common.d.ts.map +1 -1
- package/development/button/common.js +51 -30
- package/development/button/mini-button/mini-button-base-element.d.ts.map +1 -1
- package/development/button/mini-button/mini-button.d.ts.map +1 -1
- package/development/button/mini-button-group/mini-button-group.d.ts +2 -2
- package/development/button/mini-button-group/mini-button-group.d.ts.map +1 -1
- package/development/button/mini-button-group.js +77 -50
- package/development/button/mini-button.js +39 -38
- package/development/button/secondary-button/secondary-button.d.ts.map +1 -1
- package/development/button/secondary-button-link/secondary-button-link.d.ts.map +1 -1
- package/development/button/secondary-button-link.js +18 -19
- package/development/button/secondary-button-static/secondary-button-static.d.ts.map +1 -1
- package/development/button/secondary-button-static.js +18 -19
- package/development/button/secondary-button.js +18 -19
- package/development/button/tertiary-button/tertiary-button.d.ts.map +1 -1
- package/development/button/tertiary-button-link/tertiary-button-link.d.ts.map +1 -1
- package/development/button/tertiary-button-link.js +18 -19
- package/development/button/tertiary-button-static/tertiary-button-static.d.ts.map +1 -1
- package/development/button/tertiary-button-static.js +18 -19
- package/development/button/tertiary-button.js +18 -19
- package/development/button/transparent-button/transparent-button.d.ts.map +1 -1
- package/development/button/transparent-button-link/transparent-button-link.d.ts.map +1 -1
- package/development/button/transparent-button-link.js +18 -19
- package/development/button/transparent-button-static/transparent-button-static.d.ts.map +1 -1
- package/development/button/transparent-button-static.js +18 -19
- package/development/button/transparent-button.js +18 -19
- package/development/calendar/calendar.d.ts +7 -7
- package/development/calendar/calendar.d.ts.map +1 -1
- package/development/calendar.js +768 -766
- package/development/card/card/card.d.ts +2 -2
- package/development/card/card/card.d.ts.map +1 -1
- package/development/card/card-badge/card-badge.d.ts +1 -1
- package/development/card/card-badge/card-badge.d.ts.map +1 -1
- package/development/card/card-badge.js +65 -45
- package/development/card/card-button/card-button.d.ts.map +1 -1
- package/development/card/card-button.js +23 -20
- package/development/card/card-link/card-link.d.ts.map +1 -1
- package/development/card/card-link.js +23 -20
- package/development/card/card.js +72 -41
- package/development/card/common/card-action-common.d.ts +1 -1
- package/development/card/common/card-action-common.d.ts.map +1 -1
- package/development/card/common.js +74 -73
- package/development/checkbox/checkbox/checkbox.d.ts +3 -4
- package/development/checkbox/checkbox/checkbox.d.ts.map +1 -1
- package/development/checkbox/checkbox-group/checkbox-group.d.ts +4 -4
- package/development/checkbox/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/development/checkbox/checkbox-group.js +139 -92
- package/development/checkbox/checkbox-panel/checkbox-panel.d.ts +2 -3
- package/development/checkbox/checkbox-panel/checkbox-panel.d.ts.map +1 -1
- package/development/checkbox/checkbox-panel.js +68 -60
- package/development/checkbox/checkbox.js +69 -46
- package/development/checkbox/common/checkbox-common.d.ts +1 -1
- package/development/checkbox/common/checkbox-common.d.ts.map +1 -1
- package/development/checkbox/common.js +65 -46
- package/development/chip/chip.d.ts +2 -2
- package/development/chip/chip.d.ts.map +1 -1
- package/development/chip.js +64 -33
- package/development/clock/clock.d.ts +1 -1
- package/development/clock/clock.d.ts.map +1 -1
- package/development/clock.js +203 -201
- package/development/container/container/container.d.ts +3 -3
- package/development/container/container/container.d.ts.map +1 -1
- package/development/container/container.js +86 -45
- package/development/container/sticky-bar/sticky-bar.d.ts +1 -1
- package/development/container/sticky-bar/sticky-bar.d.ts.map +1 -1
- package/development/container/sticky-bar.js +76 -58
- package/development/core/a11y.js +40 -62
- package/development/core/base-elements/action-base-element.d.ts.map +1 -1
- package/development/core/base-elements/button-base-element.d.ts +2 -2
- package/development/core/base-elements/button-base-element.d.ts.map +1 -1
- package/development/core/base-elements/link-base-element.d.ts +5 -5
- package/development/core/base-elements/link-base-element.d.ts.map +1 -1
- package/development/core/base-elements.js +329 -226
- package/development/core/config.js +1 -1
- package/development/core/controllers.js +13 -21
- package/development/core/datetime.js +1 -1
- package/development/core/decorators/base.d.ts +14 -0
- package/development/core/decorators/base.d.ts.map +1 -0
- package/development/core/decorators/force-type.d.ts +8 -0
- package/development/core/decorators/force-type.d.ts.map +1 -0
- package/development/core/decorators/get-override.d.ts +7 -0
- package/development/core/decorators/get-override.d.ts.map +1 -0
- package/development/core/decorators/handle-distinct-change.d.ts +8 -0
- package/development/core/decorators/handle-distinct-change.d.ts.map +1 -0
- package/development/core/decorators/omit-empty-converter.d.ts +8 -0
- package/development/core/decorators/omit-empty-converter.d.ts.map +1 -0
- package/development/core/decorators.d.ts +4 -0
- package/development/core/decorators.d.ts.map +1 -1
- package/development/core/decorators.js +69 -5
- package/development/core/dom.js +2 -6
- package/development/core/eventing.js +2 -5
- package/development/core/i18n.js +1 -1
- package/development/core/interfaces/paginator-page.d.ts +7 -0
- package/development/core/interfaces/paginator-page.d.ts.map +1 -0
- package/development/core/interfaces.d.ts +1 -0
- package/development/core/interfaces.d.ts.map +1 -1
- package/development/core/mixins/disabled-mixin.d.ts +2 -3
- package/development/core/mixins/disabled-mixin.d.ts.map +1 -1
- package/development/core/mixins/form-associated-checkbox-mixin.d.ts +1 -0
- package/development/core/mixins/form-associated-checkbox-mixin.d.ts.map +1 -1
- package/development/core/mixins/form-associated-mixin.d.ts +6 -6
- package/development/core/mixins/form-associated-mixin.d.ts.map +1 -1
- package/development/core/mixins/named-slot-list-mixin.d.ts +1 -1
- package/development/core/mixins/named-slot-list-mixin.d.ts.map +1 -1
- package/development/core/mixins/negative-mixin.d.ts +1 -1
- package/development/core/mixins/negative-mixin.d.ts.map +1 -1
- package/development/core/mixins/panel-mixin.d.ts +3 -3
- package/development/core/mixins/panel-mixin.d.ts.map +1 -1
- package/development/core/mixins/required-mixin.d.ts +2 -3
- package/development/core/mixins/required-mixin.d.ts.map +1 -1
- package/development/core/mixins.js +573 -478
- package/development/core/observers.js +1 -1
- package/development/core/overlay.js +1 -1
- package/development/core/testing/private.d.ts +1 -0
- package/development/core/testing/private.d.ts.map +1 -1
- package/development/core/testing.js +16 -22
- package/development/datepicker/common/datepicker-button.d.ts +2 -2
- package/development/datepicker/common/datepicker-button.d.ts.map +1 -1
- package/development/datepicker/common.js +144 -142
- package/development/datepicker/datepicker/datepicker.d.ts +6 -6
- package/development/datepicker/datepicker/datepicker.d.ts.map +1 -1
- package/development/datepicker/datepicker-next-day/datepicker-next-day.d.ts.map +1 -1
- package/development/datepicker/datepicker-next-day.js +33 -33
- package/development/datepicker/datepicker-previous-day/datepicker-previous-day.d.ts.map +1 -1
- package/development/datepicker/datepicker-previous-day.js +33 -33
- package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts +6 -6
- package/development/datepicker/datepicker-toggle/datepicker-toggle.d.ts.map +1 -1
- package/development/datepicker/datepicker-toggle.js +227 -174
- package/development/datepicker/datepicker.js +327 -249
- package/development/dialog/dialog/dialog.d.ts +1 -1
- package/development/dialog/dialog/dialog.d.ts.map +1 -1
- package/development/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
- package/development/dialog/dialog-actions.js +21 -20
- package/development/dialog/dialog-content/dialog-content.d.ts.map +1 -1
- package/development/dialog/dialog-content.js +22 -21
- package/development/dialog/dialog-title/dialog-title.d.ts +3 -3
- package/development/dialog/dialog-title/dialog-title.d.ts.map +1 -1
- package/development/dialog/dialog-title.js +121 -66
- package/development/dialog/dialog.js +205 -191
- package/development/divider/divider.d.ts +1 -1
- package/development/divider/divider.d.ts.map +1 -1
- package/development/divider.js +55 -36
- package/development/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
- package/development/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
- package/development/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
- package/development/expansion-panel/expansion-panel-content.js +25 -25
- package/development/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
- package/development/expansion-panel/expansion-panel-header.js +56 -63
- package/development/expansion-panel/expansion-panel.js +227 -182
- package/development/file-selector/file-selector.d.ts +26 -15
- package/development/file-selector/file-selector.d.ts.map +1 -1
- package/development/file-selector.js +305 -172
- package/development/flip-card/flip-card/flip-card.d.ts +2 -2
- package/development/flip-card/flip-card/flip-card.d.ts.map +1 -1
- package/development/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
- package/development/flip-card/flip-card-details.js +39 -39
- package/development/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
- package/development/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
- package/development/flip-card/flip-card-summary.js +57 -38
- package/development/flip-card/flip-card.js +110 -78
- package/development/footer/footer.d.ts +4 -4
- package/development/footer/footer.d.ts.map +1 -1
- package/development/footer.js +103 -41
- package/development/form-error/form-error.d.ts.map +1 -1
- package/development/form-error.js +29 -28
- package/development/form-field/form-field/form-field.d.ts +10 -10
- package/development/form-field/form-field/form-field.d.ts.map +1 -1
- package/development/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
- package/development/form-field/form-field-clear.js +51 -51
- package/development/form-field/form-field.js +439 -328
- package/development/header/common/header-action-common.d.ts +2 -2
- package/development/header/common/header-action-common.d.ts.map +1 -1
- package/development/header/common.js +95 -28
- package/development/header/header/header.d.ts +4 -4
- package/development/header/header/header.d.ts.map +1 -1
- package/development/header/header-button/header-button.d.ts.map +1 -1
- package/development/header/header-button.js +19 -18
- package/development/header/header-link/header-link.d.ts.map +1 -1
- package/development/header/header-link.js +19 -16
- package/development/header/header.js +198 -140
- package/development/icon/icon-base.d.ts +3 -4
- package/development/icon/icon-base.d.ts.map +1 -1
- package/development/icon/icon-name-mixin.d.ts +1 -1
- package/development/icon/icon-name-mixin.d.ts.map +1 -1
- package/development/icon/icon.d.ts +2 -2
- package/development/icon/icon.d.ts.map +1 -1
- package/development/icon.js +258 -157
- package/development/image/image.d.ts +17 -17
- package/development/image/image.d.ts.map +1 -1
- package/development/image.js +584 -216
- package/development/journey-header/journey-header.d.ts +5 -5
- package/development/journey-header/journey-header.d.ts.map +1 -1
- package/development/journey-header.js +115 -43
- package/development/lead-container/lead-container.d.ts.map +1 -1
- package/development/lead-container.js +22 -21
- package/development/link/block-link/block-link.d.ts.map +1 -1
- package/development/link/block-link-button/block-link-button.d.ts.map +1 -1
- package/development/link/block-link-button.js +19 -18
- package/development/link/block-link-static/block-link-static.d.ts.map +1 -1
- package/development/link/block-link-static.js +19 -18
- package/development/link/block-link.js +19 -18
- package/development/link/common/block-link-common.d.ts +4 -3
- package/development/link/common/block-link-common.d.ts.map +1 -1
- package/development/link/common/link-common.d.ts +1 -1
- package/development/link/common/link-common.d.ts.map +1 -1
- package/development/link/common.js +81 -51
- package/development/link/link/link.d.ts.map +1 -1
- package/development/link/link-button/link-button.d.ts.map +1 -1
- package/development/link/link-button.js +19 -18
- package/development/link/link-static/link-static.d.ts.map +1 -1
- package/development/link/link-static.js +19 -18
- package/development/link/link.js +19 -18
- package/development/link-list/common/link-list-base.d.ts +3 -3
- package/development/link-list/common/link-list-base.d.ts.map +1 -1
- package/development/link-list/common.js +97 -48
- package/development/link-list/link-list/link-list.d.ts +2 -2
- package/development/link-list/link-list/link-list.d.ts.map +1 -1
- package/development/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
- package/development/link-list/link-list-anchor.js +18 -17
- package/development/link-list/link-list.js +60 -28
- package/development/loading-indicator/loading-indicator.d.ts +3 -3
- package/development/loading-indicator/loading-indicator.d.ts.map +1 -1
- package/development/loading-indicator.js +83 -45
- package/development/logo/logo.d.ts +2 -2
- package/development/logo/logo.d.ts.map +1 -1
- package/development/logo.js +64 -32
- package/development/map-container/map-container.d.ts +2 -2
- package/development/map-container/map-container.d.ts.map +1 -1
- package/development/map-container.js +107 -75
- package/development/menu/common/menu-action-common.d.ts +2 -2
- package/development/menu/common/menu-action-common.d.ts.map +1 -1
- package/development/menu/common.js +41 -20
- package/development/menu/menu/menu.d.ts +1 -1
- package/development/menu/menu/menu.d.ts.map +1 -1
- package/development/menu/menu-button/menu-button.d.ts.map +1 -1
- package/development/menu/menu-button.js +19 -18
- package/development/menu/menu-link/menu-link.d.ts.map +1 -1
- package/development/menu/menu-link.js +19 -18
- package/development/menu/menu.js +261 -241
- package/development/message/message.d.ts +2 -2
- package/development/message/message.d.ts.map +1 -1
- package/development/message.js +65 -32
- package/development/navigation/common/navigation-action-common.d.ts +1 -1
- package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
- package/development/navigation/common.js +63 -52
- package/development/navigation/navigation/navigation.d.ts +2 -2
- package/development/navigation/navigation/navigation.d.ts.map +1 -1
- package/development/navigation/navigation-button/navigation-button.d.ts.map +1 -1
- package/development/navigation/navigation-button.js +19 -18
- package/development/navigation/navigation-link/navigation-link.d.ts.map +1 -1
- package/development/navigation/navigation-link.js +19 -18
- package/development/navigation/navigation-list/navigation-list.d.ts +1 -1
- package/development/navigation/navigation-list/navigation-list.d.ts.map +1 -1
- package/development/navigation/navigation-list.js +64 -41
- package/development/navigation/navigation-marker/navigation-marker.d.ts +1 -1
- package/development/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
- package/development/navigation/navigation-marker.js +108 -91
- package/development/navigation/navigation-section/navigation-section.d.ts +3 -3
- package/development/navigation/navigation-section/navigation-section.d.ts.map +1 -1
- package/development/navigation/navigation-section.js +282 -236
- package/development/navigation/navigation.js +278 -254
- package/development/notification/notification.d.ts +6 -6
- package/development/notification/notification.d.ts.map +1 -1
- package/development/notification.js +212 -146
- package/development/option/optgroup/optgroup-base-element.d.ts +3 -3
- package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
- package/development/option/optgroup/optgroup.d.ts.map +1 -1
- package/development/option/optgroup.js +187 -142
- package/development/option/option/option-base-element.d.ts +7 -7
- package/development/option/option/option-base-element.d.ts.map +1 -1
- package/development/option/option/option.d.ts.map +1 -1
- package/development/option/option.js +392 -296
- package/development/overlay/overlay-base-element.d.ts +1 -1
- package/development/overlay/overlay-base-element.d.ts.map +1 -1
- package/development/overlay/overlay.d.ts +4 -4
- package/development/overlay/overlay.d.ts.map +1 -1
- package/development/overlay.js +260 -207
- package/development/paginator/common/paginator-common.d.ts +26 -0
- package/development/paginator/common/paginator-common.d.ts.map +1 -0
- package/development/paginator/common.d.ts +2 -0
- package/development/paginator/common.d.ts.map +1 -0
- package/development/paginator/common.js +189 -0
- package/development/paginator/compact-paginator/compact-paginator.d.ts +20 -0
- package/development/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
- package/development/paginator/compact-paginator.d.ts +2 -0
- package/development/paginator/compact-paginator.d.ts.map +1 -0
- package/development/paginator/compact-paginator.js +96 -0
- package/development/paginator/paginator/paginator.d.ts +51 -0
- package/development/paginator/paginator/paginator.d.ts.map +1 -0
- package/development/paginator/paginator.d.ts +1 -90
- package/development/paginator/paginator.d.ts.map +1 -1
- package/development/paginator/paginator.js +449 -0
- package/development/paginator.d.ts +2 -0
- package/development/paginator.d.ts.map +1 -1
- package/development/paginator.js +4 -519
- package/development/popover/popover/popover.d.ts +6 -7
- package/development/popover/popover/popover.d.ts.map +1 -1
- package/development/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
- package/development/popover/popover-trigger.js +29 -30
- package/development/popover/popover.js +358 -303
- package/development/radio-button/common/radio-button-common.d.ts +1 -1
- package/development/radio-button/common/radio-button-common.d.ts.map +1 -1
- package/development/radio-button/common.js +170 -127
- package/development/radio-button/radio-button/radio-button.d.ts +2 -6
- package/development/radio-button/radio-button/radio-button.d.ts.map +1 -1
- package/development/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
- package/development/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/development/radio-button/radio-button-group.js +269 -199
- package/development/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
- package/development/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
- package/development/radio-button/radio-button-panel.js +60 -48
- package/development/radio-button/radio-button.js +54 -40
- package/development/screen-reader-only/screen-reader-only.d.ts.map +1 -1
- package/development/screen-reader-only.js +22 -21
- package/development/select/select.d.ts +17 -9
- package/development/select/select.d.ts.map +1 -1
- package/development/select.js +557 -524
- package/development/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
- package/development/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/development/selection-expansion-panel.js +223 -193
- package/development/signet/signet.d.ts +2 -2
- package/development/signet/signet.d.ts.map +1 -1
- package/development/signet.js +65 -33
- package/development/skiplink-list/skiplink-list.d.ts +2 -2
- package/development/skiplink-list/skiplink-list.d.ts.map +1 -1
- package/development/skiplink-list.js +74 -41
- package/development/slider/slider.d.ts +7 -5
- package/development/slider/slider.d.ts.map +1 -1
- package/development/slider.js +260 -181
- package/development/status/status.d.ts +3 -3
- package/development/status/status.d.ts.map +1 -1
- package/development/status.js +96 -51
- package/development/stepper/step/step.d.ts.map +1 -1
- package/development/stepper/step-label/step-label.d.ts.map +1 -1
- package/development/stepper/step-label.js +86 -90
- package/development/stepper/step.js +122 -126
- package/development/stepper/stepper/stepper.d.ts +3 -3
- package/development/stepper/stepper/stepper.d.ts.map +1 -1
- package/development/stepper/stepper.js +291 -241
- package/development/table/table-wrapper/table-wrapper.d.ts.map +1 -1
- package/development/table/table-wrapper.js +37 -39
- package/development/tabs/tab/tab.d.ts.map +1 -1
- package/development/tabs/tab-group/tab-group.d.ts +2 -2
- package/development/tabs/tab-group/tab-group.d.ts.map +1 -1
- package/development/tabs/tab-group.js +296 -279
- package/development/tabs/tab-label/tab-label.d.ts +3 -3
- package/development/tabs/tab-label/tab-label.d.ts.map +1 -1
- package/development/tabs/tab-label.js +83 -37
- package/development/tabs/tab.js +40 -39
- package/development/tag/tag/tag.d.ts +3 -5
- package/development/tag/tag/tag.d.ts.map +1 -1
- package/development/tag/tag-group/tag-group.d.ts +3 -3
- package/development/tag/tag-group/tag-group.d.ts.map +1 -1
- package/development/tag/tag-group.js +143 -88
- package/development/tag/tag.js +126 -89
- package/development/teaser/teaser.d.ts +4 -4
- package/development/teaser/teaser.d.ts.map +1 -1
- package/development/teaser-hero/teaser-hero.d.ts +3 -3
- package/development/teaser-hero/teaser-hero.d.ts.map +1 -1
- package/development/teaser-hero.js +83 -36
- package/development/teaser-product/common/teaser-product-common.d.ts +1 -1
- package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -1
- package/development/teaser-product/common.js +51 -26
- package/development/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
- package/development/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
- package/development/teaser-product/teaser-product-static.js +18 -19
- package/development/teaser-product/teaser-product.js +18 -19
- package/development/teaser.js +94 -40
- package/development/time-input/time-input.d.ts +1 -1
- package/development/time-input/time-input.d.ts.map +1 -1
- package/development/time-input.js +225 -219
- package/development/timetable-occupancy/timetable-occupancy.d.ts +2 -2
- package/development/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
- package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
- package/development/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
- package/development/timetable-occupancy-icon.js +78 -57
- package/development/timetable-occupancy.js +67 -35
- package/development/title/title-base.d.ts +3 -3
- package/development/title/title-base.d.ts.map +1 -1
- package/development/title/title.d.ts.map +1 -1
- package/development/title.js +106 -58
- package/development/toast/toast.d.ts +4 -4
- package/development/toast/toast.d.ts.map +1 -1
- package/development/toast.js +204 -146
- package/development/toggle/toggle/toggle.d.ts +3 -5
- package/development/toggle/toggle/toggle.d.ts.map +1 -1
- package/development/toggle/toggle-option/toggle-option.d.ts +2 -2
- package/development/toggle/toggle-option/toggle-option.d.ts.map +1 -1
- package/development/toggle/toggle-option.js +127 -93
- package/development/toggle/toggle.js +200 -163
- package/development/toggle-check/toggle-check.d.ts +4 -3
- package/development/toggle-check/toggle-check.d.ts.map +1 -1
- package/development/toggle-check.js +87 -49
- package/development/train/train/train.d.ts +5 -5
- package/development/train/train/train.d.ts.map +1 -1
- package/development/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
- package/development/train/train-blocked-passage.js +22 -21
- package/development/train/train-formation/train-formation.d.ts +2 -2
- package/development/train/train-formation/train-formation.d.ts.map +1 -1
- package/development/train/train-formation.js +113 -90
- package/development/train/train-wagon/train-wagon.d.ts +7 -9
- package/development/train/train-wagon/train-wagon.d.ts.map +1 -1
- package/development/train/train-wagon.js +166 -87
- package/development/train/train.js +142 -75
- package/development/visual-checkbox/visual-checkbox.d.ts +3 -3
- package/development/visual-checkbox/visual-checkbox.d.ts.map +1 -1
- package/development/visual-checkbox.js +79 -36
- package/dialog/dialog/dialog.d.ts +1 -1
- package/dialog/dialog/dialog.d.ts.map +1 -1
- package/dialog/dialog-actions/dialog-actions.d.ts.map +1 -1
- package/dialog/dialog-actions.js +18 -19
- package/dialog/dialog-content/dialog-content.d.ts.map +1 -1
- package/dialog/dialog-content.js +17 -18
- package/dialog/dialog-title/dialog-title.d.ts +3 -3
- package/dialog/dialog-title/dialog-title.d.ts.map +1 -1
- package/dialog/dialog-title.js +98 -66
- package/dialog/dialog.js +120 -114
- package/divider/divider.d.ts +1 -1
- package/divider/divider.d.ts.map +1 -1
- package/divider.js +41 -30
- package/expansion-panel/expansion-panel/expansion-panel.d.ts +4 -4
- package/expansion-panel/expansion-panel/expansion-panel.d.ts.map +1 -1
- package/expansion-panel/expansion-panel-content/expansion-panel-content.d.ts.map +1 -1
- package/expansion-panel/expansion-panel-content.js +20 -22
- package/expansion-panel/expansion-panel-header/expansion-panel-header.d.ts.map +1 -1
- package/expansion-panel/expansion-panel-header.js +53 -61
- package/expansion-panel/expansion-panel.js +145 -130
- package/file-selector/file-selector.d.ts +26 -15
- package/file-selector/file-selector.d.ts.map +1 -1
- package/file-selector.js +227 -153
- package/flip-card/flip-card/flip-card.d.ts +2 -2
- package/flip-card/flip-card/flip-card.d.ts.map +1 -1
- package/flip-card/flip-card-details/flip-card-details.d.ts.map +1 -1
- package/flip-card/flip-card-details.js +36 -38
- package/flip-card/flip-card-summary/flip-card-summary.d.ts +1 -1
- package/flip-card/flip-card-summary/flip-card-summary.d.ts.map +1 -1
- package/flip-card/flip-card-summary.js +42 -31
- package/flip-card/flip-card.js +88 -69
- package/footer/footer.d.ts +4 -4
- package/footer/footer.d.ts.map +1 -1
- package/footer.js +78 -37
- package/form-error/form-error.d.ts.map +1 -1
- package/form-error.js +24 -25
- package/form-field/form-field/form-field.d.ts +10 -10
- package/form-field/form-field/form-field.d.ts.map +1 -1
- package/form-field/form-field-clear/form-field-clear.d.ts.map +1 -1
- package/form-field/form-field-clear.js +39 -41
- package/form-field/form-field.js +295 -239
- package/header/common/header-action-common.d.ts +2 -2
- package/header/common/header-action-common.d.ts.map +1 -1
- package/header/common.js +36 -21
- package/header/header/header.d.ts +4 -4
- package/header/header/header.d.ts.map +1 -1
- package/header/header-button/header-button.d.ts.map +1 -1
- package/header/header-button.js +14 -16
- package/header/header-link/header-link.d.ts.map +1 -1
- package/header/header-link.js +14 -14
- package/header/header.js +138 -109
- package/icon/icon-base.d.ts +3 -4
- package/icon/icon-base.d.ts.map +1 -1
- package/icon/icon-name-mixin.d.ts +1 -1
- package/icon/icon-name-mixin.d.ts.map +1 -1
- package/icon/icon.d.ts +2 -2
- package/icon/icon.d.ts.map +1 -1
- package/icon.js +230 -165
- package/image/image.d.ts +17 -17
- package/image/image.d.ts.map +1 -1
- package/image.js +465 -195
- package/index.d.ts +3 -1
- package/index.js +3 -1
- package/journey-header/journey-header.d.ts +5 -5
- package/journey-header/journey-header.d.ts.map +1 -1
- package/journey-header.js +89 -49
- package/lead-container/lead-container.d.ts.map +1 -1
- package/lead-container.js +17 -18
- package/link/block-link/block-link.d.ts.map +1 -1
- package/link/block-link-button/block-link-button.d.ts.map +1 -1
- package/link/block-link-button.js +15 -17
- package/link/block-link-static/block-link-static.d.ts.map +1 -1
- package/link/block-link-static.js +14 -16
- package/link/block-link.js +15 -17
- package/link/common/block-link-common.d.ts +4 -3
- package/link/common/block-link-common.d.ts.map +1 -1
- package/link/common/link-common.d.ts +1 -1
- package/link/common/link-common.d.ts.map +1 -1
- package/link/common.js +64 -46
- package/link/link/link.d.ts.map +1 -1
- package/link/link-button/link-button.d.ts.map +1 -1
- package/link/link-button.js +15 -17
- package/link/link-static/link-static.d.ts.map +1 -1
- package/link/link-static.js +15 -17
- package/link/link.js +15 -17
- package/link-list/common/link-list-base.d.ts +3 -3
- package/link-list/common/link-list-base.d.ts.map +1 -1
- package/link-list/common.js +72 -44
- package/link-list/link-list/link-list.d.ts +2 -2
- package/link-list/link-list/link-list.d.ts.map +1 -1
- package/link-list/link-list-anchor/link-list-anchor.d.ts.map +1 -1
- package/link-list/link-list-anchor.js +15 -16
- package/link-list/link-list.js +43 -24
- package/loading-indicator/loading-indicator.d.ts +3 -3
- package/loading-indicator/loading-indicator.d.ts.map +1 -1
- package/loading-indicator.js +61 -36
- package/logo/logo.d.ts +2 -2
- package/logo/logo.d.ts.map +1 -1
- package/logo.js +47 -27
- package/map-container/map-container.d.ts +2 -2
- package/map-container/map-container.d.ts.map +1 -1
- package/map-container.js +84 -65
- package/menu/common/menu-action-common.d.ts +2 -2
- package/menu/common/menu-action-common.d.ts.map +1 -1
- package/menu/common.js +37 -22
- package/menu/menu/menu.d.ts +1 -1
- package/menu/menu/menu.d.ts.map +1 -1
- package/menu/menu-button/menu-button.d.ts.map +1 -1
- package/menu/menu-button.js +14 -16
- package/menu/menu-link/menu-link.d.ts.map +1 -1
- package/menu/menu-link.js +15 -17
- package/menu/menu.js +175 -170
- package/message/message.d.ts +2 -2
- package/message/message.d.ts.map +1 -1
- package/message.js +47 -27
- package/navigation/common/navigation-action-common.d.ts +1 -1
- package/navigation/common/navigation-action-common.d.ts.map +1 -1
- package/navigation/common.js +38 -33
- package/navigation/navigation/navigation.d.ts +2 -2
- package/navigation/navigation/navigation.d.ts.map +1 -1
- package/navigation/navigation-button/navigation-button.d.ts.map +1 -1
- package/navigation/navigation-button.js +14 -16
- package/navigation/navigation-link/navigation-link.d.ts.map +1 -1
- package/navigation/navigation-link.js +14 -16
- package/navigation/navigation-list/navigation-list.d.ts +1 -1
- package/navigation/navigation-list/navigation-list.d.ts.map +1 -1
- package/navigation/navigation-list.js +48 -35
- package/navigation/navigation-marker/navigation-marker.d.ts +1 -1
- package/navigation/navigation-marker/navigation-marker.d.ts.map +1 -1
- package/navigation/navigation-marker.js +77 -69
- package/navigation/navigation-section/navigation-section.d.ts +3 -3
- package/navigation/navigation-section/navigation-section.d.ts.map +1 -1
- package/navigation/navigation-section.js +192 -171
- package/navigation/navigation.js +185 -181
- package/notification/notification.d.ts +6 -6
- package/notification/notification.d.ts.map +1 -1
- package/notification.js +147 -116
- package/option/optgroup/optgroup-base-element.d.ts +3 -3
- package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
- package/option/optgroup/optgroup.d.ts.map +1 -1
- package/option/optgroup.js +131 -112
- package/option/option/option-base-element.d.ts +7 -7
- package/option/option/option-base-element.d.ts.map +1 -1
- package/option/option/option.d.ts.map +1 -1
- package/option/option.js +295 -252
- package/overlay/overlay-base-element.d.ts +1 -1
- package/overlay/overlay-base-element.d.ts.map +1 -1
- package/overlay/overlay.d.ts +4 -4
- package/overlay/overlay.d.ts.map +1 -1
- package/overlay.js +194 -165
- package/package.json +19 -3
- package/paginator/common/paginator-common.d.ts +26 -0
- package/paginator/common/paginator-common.d.ts.map +1 -0
- package/paginator/common.d.ts +2 -0
- package/paginator/common.d.ts.map +1 -0
- package/paginator/common.js +145 -0
- package/paginator/compact-paginator/compact-paginator.d.ts +20 -0
- package/paginator/compact-paginator/compact-paginator.d.ts.map +1 -0
- package/paginator/compact-paginator.d.ts +2 -0
- package/paginator/compact-paginator.d.ts.map +1 -0
- package/paginator/compact-paginator.js +40 -0
- package/paginator/paginator/paginator.d.ts +51 -0
- package/paginator/paginator/paginator.d.ts.map +1 -0
- package/paginator/paginator.d.ts +1 -90
- package/paginator/paginator.d.ts.map +1 -1
- package/paginator/paginator.js +171 -0
- package/paginator.d.ts +2 -0
- package/paginator.d.ts.map +1 -1
- package/paginator.js +3 -263
- package/popover/popover/popover.d.ts +6 -7
- package/popover/popover/popover.d.ts.map +1 -1
- package/popover/popover-trigger/popover-trigger.d.ts.map +1 -1
- package/popover/popover-trigger.js +26 -29
- package/popover/popover.js +230 -208
- package/radio-button/common/radio-button-common.d.ts +1 -1
- package/radio-button/common/radio-button-common.d.ts.map +1 -1
- package/radio-button/common.js +67 -43
- package/radio-button/radio-button/radio-button.d.ts +2 -6
- package/radio-button/radio-button/radio-button.d.ts.map +1 -1
- package/radio-button/radio-button-group/radio-button-group.d.ts +6 -6
- package/radio-button/radio-button-group/radio-button-group.d.ts.map +1 -1
- package/radio-button/radio-button-group.js +192 -156
- package/radio-button/radio-button-panel/radio-button-panel.d.ts +2 -6
- package/radio-button/radio-button-panel/radio-button-panel.d.ts.map +1 -1
- package/radio-button/radio-button-panel.js +49 -45
- package/radio-button/radio-button.js +43 -37
- package/screen-reader-only/screen-reader-only.d.ts.map +1 -1
- package/screen-reader-only.js +17 -18
- package/select/select.d.ts +17 -9
- package/select/select.d.ts.map +1 -1
- package/select.js +377 -373
- package/selection-expansion-panel/selection-expansion-panel.d.ts +3 -3
- package/selection-expansion-panel/selection-expansion-panel.d.ts.map +1 -1
- package/selection-expansion-panel.js +157 -148
- package/signet/signet.d.ts +2 -2
- package/signet/signet.d.ts.map +1 -1
- package/signet.js +48 -28
- package/skiplink-list/skiplink-list.d.ts +2 -2
- package/skiplink-list/skiplink-list.d.ts.map +1 -1
- package/skiplink-list.js +54 -36
- package/slider/slider.d.ts +7 -5
- package/slider/slider.d.ts.map +1 -1
- package/slider.js +197 -155
- package/standard-theme.css +5 -1
- package/status/status.d.ts +3 -3
- package/status/status.d.ts.map +1 -1
- package/status.js +71 -46
- package/stepper/step/step.d.ts.map +1 -1
- package/stepper/step-label/step-label.d.ts.map +1 -1
- package/stepper/step-label.js +69 -75
- package/stepper/step.js +99 -104
- package/stepper/stepper/stepper.d.ts +3 -3
- package/stepper/stepper/stepper.d.ts.map +1 -1
- package/stepper/stepper.js +208 -188
- package/table/table-wrapper/table-wrapper.d.ts.map +1 -1
- package/table/table-wrapper.js +32 -36
- package/tabs/tab/tab.d.ts.map +1 -1
- package/tabs/tab-group/tab-group.d.ts +2 -2
- package/tabs/tab-group/tab-group.d.ts.map +1 -1
- package/tabs/tab-group.js +200 -193
- package/tabs/tab-label/tab-label.d.ts +3 -3
- package/tabs/tab-label/tab-label.d.ts.map +1 -1
- package/tabs/tab-label.js +65 -37
- package/tabs/tab.js +34 -35
- package/tag/tag/tag.d.ts +3 -5
- package/tag/tag/tag.d.ts.map +1 -1
- package/tag/tag-group/tag-group.d.ts +3 -3
- package/tag/tag-group/tag-group.d.ts.map +1 -1
- package/tag/tag-group.js +107 -75
- package/tag/tag.js +92 -73
- package/teaser/teaser.d.ts +4 -4
- package/teaser/teaser.d.ts.map +1 -1
- package/teaser-hero/teaser-hero.d.ts +3 -3
- package/teaser-hero/teaser-hero.d.ts.map +1 -1
- package/teaser-hero.js +66 -38
- package/teaser-product/common/teaser-product-common.d.ts +1 -1
- package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
- package/teaser-product/common.js +36 -21
- package/teaser-product/teaser-product/teaser-product.d.ts.map +1 -1
- package/teaser-product/teaser-product-static/teaser-product-static.d.ts.map +1 -1
- package/teaser-product/teaser-product-static.js +14 -17
- package/teaser-product/teaser-product.js +14 -17
- package/teaser.js +69 -37
- package/time-input/time-input.d.ts +1 -1
- package/time-input/time-input.d.ts.map +1 -1
- package/time-input.js +160 -166
- package/timetable-occupancy/timetable-occupancy.d.ts +2 -2
- package/timetable-occupancy/timetable-occupancy.d.ts.map +1 -1
- package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts +1 -1
- package/timetable-occupancy-icon/timetable-occupancy-icon.d.ts.map +1 -1
- package/timetable-occupancy-icon.js +60 -48
- package/timetable-occupancy.js +55 -38
- package/title/title-base.d.ts +3 -3
- package/title/title-base.d.ts.map +1 -1
- package/title/title.d.ts.map +1 -1
- package/title.js +81 -53
- package/toast/toast.d.ts +4 -4
- package/toast/toast.d.ts.map +1 -1
- package/toast.js +156 -123
- package/toggle/toggle/toggle.d.ts +3 -5
- package/toggle/toggle/toggle.d.ts.map +1 -1
- package/toggle/toggle-option/toggle-option.d.ts +2 -2
- package/toggle/toggle-option/toggle-option.d.ts.map +1 -1
- package/toggle/toggle-option.js +89 -72
- package/toggle/toggle.js +139 -122
- package/toggle-check/toggle-check.d.ts +4 -3
- package/toggle-check/toggle-check.d.ts.map +1 -1
- package/toggle-check.js +63 -41
- package/train/train/train.d.ts +5 -5
- package/train/train/train.d.ts.map +1 -1
- package/train/train-blocked-passage/train-blocked-passage.d.ts.map +1 -1
- package/train/train-blocked-passage.js +17 -18
- package/train/train-formation/train-formation.d.ts +2 -2
- package/train/train-formation/train-formation.d.ts.map +1 -1
- package/train/train-formation.js +96 -87
- package/train/train-wagon/train-wagon.d.ts +7 -9
- package/train/train-wagon/train-wagon.d.ts.map +1 -1
- package/train/train-wagon.js +150 -110
- package/train/train.js +108 -71
- package/visual-checkbox/visual-checkbox.d.ts +3 -3
- package/visual-checkbox/visual-checkbox.d.ts.map +1 -1
- package/visual-checkbox.js +59 -32
- package/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts +0 -2
- package/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts.map +0 -1
- package/button/mini-button-group/index.d.ts +0 -2
- package/button/mini-button-group/index.d.ts.map +0 -1
- package/development/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts +0 -2
- package/development/autocomplete-grid/autocomplete-grid-optgroup/index.d.ts.map +0 -1
- package/development/button/mini-button-group/index.d.ts +0 -2
- package/development/button/mini-button-group/index.d.ts.map +0 -1
- package/development/flip-card/flip-card/index.d.ts +0 -2
- package/development/flip-card/flip-card/index.d.ts.map +0 -1
- package/development/flip-card/flip-card-details/index.d.ts +0 -2
- package/development/flip-card/flip-card-details/index.d.ts.map +0 -1
- package/development/flip-card/flip-card-summary/index.d.ts +0 -2
- package/development/flip-card/flip-card-summary/index.d.ts.map +0 -1
- package/development/link-list/link-list-anchor/index.d.ts +0 -2
- package/development/link-list/link-list-anchor/index.d.ts.map +0 -1
- package/development/paginator/index.d.ts +0 -2
- package/development/paginator/index.d.ts.map +0 -1
- package/development/radio-button/radio-button-panel/index.d.ts +0 -2
- package/development/radio-button/radio-button-panel/index.d.ts.map +0 -1
- package/development/tabs/tab/index.d.ts +0 -2
- package/development/tabs/tab/index.d.ts.map +0 -1
- package/flip-card/flip-card/index.d.ts +0 -2
- package/flip-card/flip-card/index.d.ts.map +0 -1
- package/flip-card/flip-card-details/index.d.ts +0 -2
- package/flip-card/flip-card-details/index.d.ts.map +0 -1
- package/flip-card/flip-card-summary/index.d.ts +0 -2
- package/flip-card/flip-card-summary/index.d.ts.map +0 -1
- package/link-list/link-list-anchor/index.d.ts +0 -2
- package/link-list/link-list-anchor/index.d.ts.map +0 -1
- package/paginator/index.d.ts +0 -2
- package/paginator/index.d.ts.map +0 -1
- package/radio-button/radio-button-panel/index.d.ts +0 -2
- package/radio-button/radio-button-panel/index.d.ts.map +0 -1
- package/tabs/tab/index.d.ts +0 -2
- package/tabs/tab/index.d.ts.map +0 -1
package/development/calendar.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
3
|
+
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
+
import { __esDecorate, __runInitializers } from "tslib";
|
|
1
9
|
import { css, LitElement, isServer, html, nothing } from "lit";
|
|
2
|
-
import { property, state
|
|
10
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
3
11
|
import { classMap } from "lit/directives/class-map.js";
|
|
4
12
|
import { sbbInputModalityDetector, isArrowKeyOrPageKeysPressed } from "./core/a11y.js";
|
|
5
13
|
import { readConfig } from "./core/config.js";
|
|
6
14
|
import { SbbConnectedAbortController, SbbLanguageController } from "./core/controllers.js";
|
|
7
15
|
import { defaultDateAdapter, YEARS_PER_PAGE, DAYS_PER_ROW, MONTHS_PER_ROW, YEARS_PER_ROW } from "./core/datetime.js";
|
|
16
|
+
import { forceType } from "./core/decorators.js";
|
|
8
17
|
import { isBreakpoint } from "./core/dom.js";
|
|
9
18
|
import { EventEmitter } from "./core/eventing.js";
|
|
10
19
|
import { i18nPreviousMonth, i18nNextMonth, i18nYearMonthSelection, i18nPreviousYear, i18nNextYear, i18nCalendarDateSelection, i18nPreviousYearRange, i18nNextYearRange } from "./core/i18n.js";
|
|
@@ -322,573 +331,597 @@ const style = css`*,
|
|
|
322
331
|
transform: translateY(var(--sbb-calendar-table-animation-shift));
|
|
323
332
|
}
|
|
324
333
|
}`;
|
|
325
|
-
|
|
326
|
-
var
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
let
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
334
|
+
let SbbCalendarElement = (() => {
|
|
335
|
+
var _wide_accessor_storage, _view_accessor_storage, _dateFilter_accessor_storage, __activeDate_accessor_storage, __selected_accessor_storage, __calendarView_accessor_storage, __initialized_accessor_storage, _a;
|
|
336
|
+
let _classDecorators = [customElement("sbb-calendar")];
|
|
337
|
+
let _classDescriptor;
|
|
338
|
+
let _classExtraInitializers = [];
|
|
339
|
+
let _classThis;
|
|
340
|
+
let _classSuper = SbbHydrationMixin(LitElement);
|
|
341
|
+
let _instanceExtraInitializers = [];
|
|
342
|
+
let _wide_decorators;
|
|
343
|
+
let _wide_initializers = [];
|
|
344
|
+
let _wide_extraInitializers = [];
|
|
345
|
+
let _view_decorators;
|
|
346
|
+
let _view_initializers = [];
|
|
347
|
+
let _view_extraInitializers = [];
|
|
348
|
+
let _set_min_decorators;
|
|
349
|
+
let _set_max_decorators;
|
|
350
|
+
let _set_now_decorators;
|
|
351
|
+
let _set_selected_decorators;
|
|
352
|
+
let _dateFilter_decorators;
|
|
353
|
+
let _dateFilter_initializers = [];
|
|
354
|
+
let _dateFilter_extraInitializers = [];
|
|
355
|
+
let __activeDate_decorators;
|
|
356
|
+
let __activeDate_initializers = [];
|
|
357
|
+
let __activeDate_extraInitializers = [];
|
|
358
|
+
let __selected_decorators;
|
|
359
|
+
let __selected_initializers = [];
|
|
360
|
+
let __selected_extraInitializers = [];
|
|
361
|
+
let _set__wide_decorators;
|
|
362
|
+
let __calendarView_decorators;
|
|
363
|
+
let __calendarView_initializers = [];
|
|
364
|
+
let __calendarView_extraInitializers = [];
|
|
365
|
+
let __initialized_decorators;
|
|
366
|
+
let __initialized_initializers = [];
|
|
367
|
+
let __initialized_extraInitializers = [];
|
|
368
|
+
var SbbCalendarElement2 = (_a = class extends _classSuper {
|
|
369
|
+
constructor() {
|
|
370
|
+
var _a2;
|
|
371
|
+
super();
|
|
372
|
+
__privateAdd(this, _wide_accessor_storage);
|
|
373
|
+
__privateAdd(this, _view_accessor_storage);
|
|
374
|
+
__privateAdd(this, _dateFilter_accessor_storage);
|
|
375
|
+
__privateAdd(this, __activeDate_accessor_storage);
|
|
376
|
+
__privateAdd(this, __selected_accessor_storage);
|
|
377
|
+
__privateAdd(this, __calendarView_accessor_storage);
|
|
378
|
+
__privateAdd(this, __initialized_accessor_storage);
|
|
379
|
+
__privateSet(this, _wide_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _wide_initializers, false)));
|
|
380
|
+
__privateSet(this, _view_accessor_storage, (__runInitializers(this, _wide_extraInitializers), __runInitializers(this, _view_initializers, "day")));
|
|
381
|
+
this._min = __runInitializers(this, _view_extraInitializers);
|
|
382
|
+
this._now = null;
|
|
383
|
+
__privateSet(this, _dateFilter_accessor_storage, __runInitializers(this, _dateFilter_initializers, null));
|
|
384
|
+
this._dateAdapter = (__runInitializers(this, _dateFilter_extraInitializers), ((_a2 = readConfig().datetime) == null ? void 0 : _a2.dateAdapter) ?? defaultDateAdapter);
|
|
385
|
+
this._dateSelected = new EventEmitter(this, SbbCalendarElement2.events.dateSelected);
|
|
386
|
+
__privateSet(this, __activeDate_accessor_storage, __runInitializers(this, __activeDate_initializers, this.now));
|
|
387
|
+
__privateSet(this, __selected_accessor_storage, (__runInitializers(this, __activeDate_extraInitializers), __runInitializers(this, __selected_initializers, void 0)));
|
|
388
|
+
__privateSet(this, __calendarView_accessor_storage, (__runInitializers(this, __selected_extraInitializers), __runInitializers(this, __calendarView_initializers, "day")));
|
|
389
|
+
this._nextCalendarView = (__runInitializers(this, __calendarView_extraInitializers), "day");
|
|
390
|
+
this._weeks = [];
|
|
356
391
|
this._monthNames = this._dateAdapter.getMonthNames("long");
|
|
392
|
+
this._resetFocus = false;
|
|
393
|
+
__privateSet(this, __initialized_accessor_storage, __runInitializers(this, __initialized_initializers, false));
|
|
394
|
+
this._abort = (__runInitializers(this, __initialized_extraInitializers), new SbbConnectedAbortController(this));
|
|
395
|
+
this._language = new SbbLanguageController(this).withHandler(() => {
|
|
396
|
+
this._monthNames = this._dateAdapter.getMonthNames("long");
|
|
397
|
+
this._createMonthRows();
|
|
398
|
+
});
|
|
357
399
|
this._createMonthRows();
|
|
358
|
-
|
|
359
|
-
this._createMonthRows();
|
|
360
|
-
this._setWeekdays();
|
|
361
|
-
}
|
|
362
|
-
set min(value) {
|
|
363
|
-
this._min = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
364
|
-
}
|
|
365
|
-
get min() {
|
|
366
|
-
return this._min ?? null;
|
|
367
|
-
}
|
|
368
|
-
set max(value) {
|
|
369
|
-
this._max = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
370
|
-
}
|
|
371
|
-
get max() {
|
|
372
|
-
return this._max ?? null;
|
|
373
|
-
}
|
|
374
|
-
set now(value) {
|
|
375
|
-
this._now = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
376
|
-
}
|
|
377
|
-
get now() {
|
|
378
|
-
return this._now ?? this._dateAdapter.today();
|
|
379
|
-
}
|
|
380
|
-
set selected(value) {
|
|
381
|
-
this._selectedDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
382
|
-
if (!!this._selectedDate && (!this._isDayInRange(this._dateAdapter.toIso8601(this._selectedDate)) || this._dateFilter(this._selectedDate))) {
|
|
383
|
-
this._selected = this._dateAdapter.toIso8601(this._selectedDate);
|
|
384
|
-
} else {
|
|
385
|
-
this._selected = void 0;
|
|
400
|
+
this._setWeekdays();
|
|
386
401
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
}
|
|
391
|
-
set _wide(wide) {
|
|
392
|
-
this.toggleAttribute("data-wide", wide);
|
|
393
|
-
}
|
|
394
|
-
get _wide() {
|
|
395
|
-
return this.hasAttribute("data-wide");
|
|
396
|
-
}
|
|
397
|
-
/** A list of buttons corresponding to days, months or years depending on the view. */
|
|
398
|
-
get _cells() {
|
|
399
|
-
return Array.from(
|
|
400
|
-
this.shadowRoot.querySelectorAll(".sbb-calendar__cell") ?? []
|
|
401
|
-
);
|
|
402
|
-
}
|
|
403
|
-
_dateFilter(date) {
|
|
404
|
-
var _a;
|
|
405
|
-
return ((_a = this.dateFilter) == null ? void 0 : _a.call(this, date)) ?? true;
|
|
406
|
-
}
|
|
407
|
-
/** Resets the active month according to the new state of the calendar. */
|
|
408
|
-
resetPosition() {
|
|
409
|
-
this._resetCalendarView();
|
|
410
|
-
this._init();
|
|
411
|
-
}
|
|
412
|
-
connectedCallback() {
|
|
413
|
-
var _a;
|
|
414
|
-
super.connectedCallback();
|
|
415
|
-
this.resetPosition();
|
|
416
|
-
this.focus = () => {
|
|
417
|
-
this._resetFocus = true;
|
|
418
|
-
this._focusCell();
|
|
419
|
-
};
|
|
420
|
-
(_a = globalThis.window) == null ? void 0 : _a.addEventListener("resize", () => this._init(), {
|
|
421
|
-
passive: true,
|
|
422
|
-
signal: this._abort.signal
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
willUpdate(changedProperties) {
|
|
426
|
-
super.willUpdate(changedProperties);
|
|
427
|
-
if (!this._initialized) {
|
|
428
|
-
return;
|
|
402
|
+
/** If set to true, two months are displayed */
|
|
403
|
+
get wide() {
|
|
404
|
+
return __privateGet(this, _wide_accessor_storage);
|
|
429
405
|
}
|
|
430
|
-
|
|
431
|
-
this
|
|
406
|
+
set wide(value) {
|
|
407
|
+
__privateSet(this, _wide_accessor_storage, value);
|
|
432
408
|
}
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
this
|
|
436
|
-
this._nextCalendarView = this._calendarView = this.view;
|
|
409
|
+
/** The initial view of the calendar which should be displayed on opening. */
|
|
410
|
+
get view() {
|
|
411
|
+
return __privateGet(this, _view_accessor_storage);
|
|
437
412
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
super.updated(changedProperties);
|
|
441
|
-
this._setTabIndex();
|
|
442
|
-
if (sbbInputModalityDetector.mostRecentModality === "keyboard") {
|
|
443
|
-
this._focusCell();
|
|
413
|
+
set view(value) {
|
|
414
|
+
__privateSet(this, _view_accessor_storage, value);
|
|
444
415
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
if (isServer) {
|
|
449
|
-
return;
|
|
450
|
-
} else if (this.hydrationRequired) {
|
|
451
|
-
this.hydrationComplete.then(() => this._init());
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
if (activeDate) {
|
|
455
|
-
this._assignActiveDate(activeDate);
|
|
456
|
-
}
|
|
457
|
-
this._wide = isBreakpoint("medium") && this.wide;
|
|
458
|
-
this._weeks = this._createWeekRows(this._activeDate);
|
|
459
|
-
this._years = this._createYearRows();
|
|
460
|
-
this._nextMonthWeeks = [[]];
|
|
461
|
-
this._nextMonthYears = [[]];
|
|
462
|
-
if (this._wide) {
|
|
463
|
-
const nextMonthDate = this._dateAdapter.addCalendarMonths(this._activeDate, 1);
|
|
464
|
-
this._nextMonthWeeks = this._createWeekRows(nextMonthDate);
|
|
465
|
-
this._nextMonthYears = this._createYearRows(YEARS_PER_PAGE);
|
|
466
|
-
}
|
|
467
|
-
this._initialized = true;
|
|
468
|
-
}
|
|
469
|
-
/** Focuses on a day cell prioritizing the selected day, the current day, and lastly, the first selectable day. */
|
|
470
|
-
_focusCell() {
|
|
471
|
-
var _a;
|
|
472
|
-
if (this._resetFocus) {
|
|
473
|
-
(_a = this._getFirstFocusable()) == null ? void 0 : _a.focus();
|
|
474
|
-
this._resetFocus = false;
|
|
416
|
+
/** The minimum valid date. Takes T Object, ISOString, and Unix Timestamp (number of seconds since Jan 1, 1970). */
|
|
417
|
+
set min(value) {
|
|
418
|
+
this._min = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
475
419
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
420
|
+
get min() {
|
|
421
|
+
return this._min ?? null;
|
|
422
|
+
}
|
|
423
|
+
/** The maximum valid date. Takes T Object, ISOString, and Unix Timestamp (number of seconds since Jan 1, 1970). */
|
|
424
|
+
set max(value) {
|
|
425
|
+
this._max = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
426
|
+
}
|
|
427
|
+
get max() {
|
|
428
|
+
return this._max ?? null;
|
|
429
|
+
}
|
|
430
|
+
/** A configured date which acts as the current date instead of the real current date. Recommended for testing purposes. */
|
|
431
|
+
set now(value) {
|
|
432
|
+
this._now = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
433
|
+
}
|
|
434
|
+
get now() {
|
|
435
|
+
return this._now ?? this._dateAdapter.today();
|
|
436
|
+
}
|
|
437
|
+
/** The selected date. Takes T Object, ISOString, and Unix Timestamp (number of seconds since Jan 1, 1970). */
|
|
438
|
+
set selected(value) {
|
|
439
|
+
this._selectedDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
|
|
440
|
+
if (!!this._selectedDate && (!this._isDayInRange(this._dateAdapter.toIso8601(this._selectedDate)) || this._dateFilter(this._selectedDate))) {
|
|
441
|
+
this._selected = this._dateAdapter.toIso8601(this._selectedDate);
|
|
442
|
+
} else {
|
|
443
|
+
this._selected = void 0;
|
|
498
444
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
445
|
+
}
|
|
446
|
+
get selected() {
|
|
447
|
+
return this._selectedDate ?? null;
|
|
448
|
+
}
|
|
449
|
+
/** A function used to filter out dates. */
|
|
450
|
+
get dateFilter() {
|
|
451
|
+
return __privateGet(this, _dateFilter_accessor_storage);
|
|
452
|
+
}
|
|
453
|
+
set dateFilter(value) {
|
|
454
|
+
__privateSet(this, _dateFilter_accessor_storage, value);
|
|
455
|
+
}
|
|
456
|
+
/** The currently active date. */
|
|
457
|
+
get _activeDate() {
|
|
458
|
+
return __privateGet(this, __activeDate_accessor_storage);
|
|
459
|
+
}
|
|
460
|
+
set _activeDate(value) {
|
|
461
|
+
__privateSet(this, __activeDate_accessor_storage, value);
|
|
462
|
+
}
|
|
463
|
+
/** The selected date as ISOString. */
|
|
464
|
+
get _selected() {
|
|
465
|
+
return __privateGet(this, __selected_accessor_storage);
|
|
466
|
+
}
|
|
467
|
+
set _selected(value) {
|
|
468
|
+
__privateSet(this, __selected_accessor_storage, value);
|
|
469
|
+
}
|
|
470
|
+
/** The current wide property considering property value and breakpoints. From zero to small `wide` has always to be false. */
|
|
471
|
+
set _wide(wide) {
|
|
472
|
+
this.toggleAttribute("data-wide", wide);
|
|
473
|
+
}
|
|
474
|
+
get _wide() {
|
|
475
|
+
return this.hasAttribute("data-wide");
|
|
476
|
+
}
|
|
477
|
+
get _calendarView() {
|
|
478
|
+
return __privateGet(this, __calendarView_accessor_storage);
|
|
479
|
+
}
|
|
480
|
+
set _calendarView(value) {
|
|
481
|
+
__privateSet(this, __calendarView_accessor_storage, value);
|
|
482
|
+
}
|
|
483
|
+
/** A list of buttons corresponding to days, months or years depending on the view. */
|
|
484
|
+
get _cells() {
|
|
485
|
+
return Array.from(this.shadowRoot.querySelectorAll(".sbb-calendar__cell") ?? []);
|
|
486
|
+
}
|
|
487
|
+
get _initialized() {
|
|
488
|
+
return __privateGet(this, __initialized_accessor_storage);
|
|
489
|
+
}
|
|
490
|
+
set _initialized(value) {
|
|
491
|
+
__privateSet(this, __initialized_accessor_storage, value);
|
|
492
|
+
}
|
|
493
|
+
_dateFilter(date) {
|
|
494
|
+
var _a2;
|
|
495
|
+
return ((_a2 = this.dateFilter) == null ? void 0 : _a2.call(this, date)) ?? true;
|
|
496
|
+
}
|
|
497
|
+
/** Resets the active month according to the new state of the calendar. */
|
|
498
|
+
resetPosition() {
|
|
499
|
+
this._resetCalendarView();
|
|
500
|
+
this._init();
|
|
501
|
+
}
|
|
502
|
+
connectedCallback() {
|
|
503
|
+
var _a2;
|
|
504
|
+
super.connectedCallback();
|
|
505
|
+
this.resetPosition();
|
|
506
|
+
this.focus = () => {
|
|
507
|
+
this._resetFocus = true;
|
|
508
|
+
this._focusCell();
|
|
509
|
+
};
|
|
510
|
+
(_a2 = globalThis.window) == null ? void 0 : _a2.addEventListener("resize", () => this._init(), {
|
|
511
|
+
passive: true,
|
|
512
|
+
signal: this._abort.signal
|
|
509
513
|
});
|
|
510
514
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
515
|
+
willUpdate(changedProperties) {
|
|
516
|
+
super.willUpdate(changedProperties);
|
|
517
|
+
if (!this._initialized) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
if (changedProperties.has("wide")) {
|
|
521
|
+
this.resetPosition();
|
|
522
|
+
}
|
|
523
|
+
if (changedProperties.has("view")) {
|
|
524
|
+
this._setChosenYear();
|
|
525
|
+
this._chosenMonth = void 0;
|
|
526
|
+
this._nextCalendarView = this._calendarView = this.view;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
updated(changedProperties) {
|
|
530
|
+
super.updated(changedProperties);
|
|
531
|
+
this._setTabIndex();
|
|
532
|
+
if (sbbInputModalityDetector.mostRecentModality === "keyboard") {
|
|
533
|
+
this._focusCell();
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
/** Initializes the component. */
|
|
537
|
+
_init(activeDate) {
|
|
538
|
+
if (isServer) {
|
|
539
|
+
return;
|
|
540
|
+
} else if (this.hydrationRequired) {
|
|
541
|
+
this.hydrationComplete.then(() => this._init());
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
if (activeDate) {
|
|
545
|
+
this._assignActiveDate(activeDate);
|
|
546
|
+
}
|
|
547
|
+
this._wide = isBreakpoint("medium") && this.wide;
|
|
548
|
+
this._weeks = this._createWeekRows(this._activeDate);
|
|
549
|
+
this._years = this._createYearRows();
|
|
550
|
+
this._nextMonthWeeks = [[]];
|
|
551
|
+
this._nextMonthYears = [[]];
|
|
552
|
+
if (this._wide) {
|
|
553
|
+
const nextMonthDate = this._dateAdapter.addCalendarMonths(this._activeDate, 1);
|
|
554
|
+
this._nextMonthWeeks = this._createWeekRows(nextMonthDate);
|
|
555
|
+
this._nextMonthYears = this._createYearRows(YEARS_PER_PAGE);
|
|
556
|
+
}
|
|
557
|
+
this._initialized = true;
|
|
558
|
+
}
|
|
559
|
+
/** Focuses on a day cell prioritizing the selected day, the current day, and lastly, the first selectable day. */
|
|
560
|
+
_focusCell() {
|
|
561
|
+
var _a2;
|
|
562
|
+
if (this._resetFocus) {
|
|
563
|
+
(_a2 = this._getFirstFocusable()) == null ? void 0 : _a2.focus();
|
|
564
|
+
this._resetFocus = false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
/** Creates the array of weekdays. */
|
|
568
|
+
_setWeekdays() {
|
|
569
|
+
const narrowWeekdays = this._dateAdapter.getDayOfWeekNames("narrow");
|
|
570
|
+
const longWeekdays = this._dateAdapter.getDayOfWeekNames("long");
|
|
571
|
+
const weekdays = longWeekdays.map((long, i) => ({
|
|
572
|
+
long,
|
|
573
|
+
narrow: narrowWeekdays[i]
|
|
574
|
+
}));
|
|
575
|
+
const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();
|
|
576
|
+
this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
|
|
577
|
+
}
|
|
578
|
+
/** Creates the rows for each week. */
|
|
579
|
+
_createWeekRows(value) {
|
|
580
|
+
const daysInMonth = this._dateAdapter.getNumDaysInMonth(value);
|
|
581
|
+
const dateNames = this._dateAdapter.getDateNames();
|
|
582
|
+
const weeks = [[]];
|
|
583
|
+
const weekOffset = this._dateAdapter.getFirstWeekOffset(value);
|
|
584
|
+
for (let i = 0, cell = weekOffset; i < daysInMonth; i++, cell++) {
|
|
585
|
+
if (cell === DAYS_PER_ROW) {
|
|
586
|
+
weeks.push([]);
|
|
587
|
+
cell = 0;
|
|
588
|
+
}
|
|
589
|
+
const date = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), i + 1);
|
|
590
|
+
weeks[weeks.length - 1].push({
|
|
591
|
+
value: this._dateAdapter.toIso8601(date),
|
|
592
|
+
dayValue: dateNames[i],
|
|
593
|
+
monthValue: String(this._dateAdapter.getMonth(date)),
|
|
594
|
+
yearValue: String(this._dateAdapter.getYear(date))
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
return weeks;
|
|
598
|
+
}
|
|
599
|
+
/** Creates the rows for the month selection view. */
|
|
600
|
+
_createMonthRows() {
|
|
601
|
+
const shortNames = this._dateAdapter.getMonthNames("short");
|
|
602
|
+
const months = new Array(12).fill(null).map((_, i) => ({
|
|
518
603
|
value: shortNames[i],
|
|
519
604
|
longValue: this._monthNames[i],
|
|
520
605
|
monthValue: i + 1
|
|
521
|
-
})
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
this._months = monthArray;
|
|
529
|
-
}
|
|
530
|
-
/** Creates the rows for the year selection view. */
|
|
531
|
-
_createYearRows(offset = 0) {
|
|
532
|
-
const startValueYearView = this._getStartValueYearView();
|
|
533
|
-
const allYears = new Array(YEARS_PER_PAGE).fill(0).map((_, i) => startValueYearView + offset + i);
|
|
534
|
-
const rows = YEARS_PER_PAGE / YEARS_PER_ROW;
|
|
535
|
-
const yearArray = [];
|
|
536
|
-
for (let i = 0; i < rows; i++) {
|
|
537
|
-
yearArray.push(allYears.slice(YEARS_PER_ROW * i, YEARS_PER_ROW * (i + 1)));
|
|
538
|
-
}
|
|
539
|
-
return yearArray;
|
|
540
|
-
}
|
|
541
|
-
/**
|
|
542
|
-
* Calculates the first year that will be shown in the year selection panel.
|
|
543
|
-
* If `minDate` and `maxDate` are both null, the starting year is calculated as
|
|
544
|
-
* the multiple of YEARS_PER_PAGE closest to and less than activeDate,
|
|
545
|
-
* e.g., with `YEARS_PER_PAGE` = 24 and `activeDate` = 2020, the function will return 2016 (24 * 83),
|
|
546
|
-
* while with `activeDate` = 2000, the function will return 1992 (24 * 82).
|
|
547
|
-
* If `minDate` is not null, it returns the corresponding year; if `maxDate` is not null,
|
|
548
|
-
* it returns the corresponding year minus `YEARS_PER_PAGE`, so that the `maxDate` is the last rendered year.
|
|
549
|
-
* If both are not null, `maxDate` has priority over `minDate`.
|
|
550
|
-
*/
|
|
551
|
-
_getStartValueYearView() {
|
|
552
|
-
let startingYear = 0;
|
|
553
|
-
if (this.max) {
|
|
554
|
-
startingYear = this._dateAdapter.getYear(this.max) - YEARS_PER_PAGE + 1;
|
|
555
|
-
} else if (this.min) {
|
|
556
|
-
startingYear = this._dateAdapter.getYear(this.min);
|
|
557
|
-
}
|
|
558
|
-
const activeYear = this._dateAdapter.getYear(this._activeDate);
|
|
559
|
-
return activeYear - ((activeYear - startingYear) % YEARS_PER_PAGE + YEARS_PER_PAGE) % YEARS_PER_PAGE;
|
|
560
|
-
}
|
|
561
|
-
/** Checks if date is within the min-max range. */
|
|
562
|
-
_isDayInRange(date) {
|
|
563
|
-
if (!this._min && !this._max) {
|
|
564
|
-
return true;
|
|
565
|
-
}
|
|
566
|
-
const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.compareDate(this._min, this._dateAdapter.deserialize(date)) > 0;
|
|
567
|
-
const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.compareDate(this._max, this._dateAdapter.deserialize(date)) < 0;
|
|
568
|
-
return !(isBeforeMin || isAfterMax);
|
|
569
|
-
}
|
|
570
|
-
_isMonthInRange(month) {
|
|
571
|
-
if (!this._min && !this._max) {
|
|
572
|
-
return true;
|
|
606
|
+
}));
|
|
607
|
+
const rows = 12 / MONTHS_PER_ROW;
|
|
608
|
+
const monthArray = [];
|
|
609
|
+
for (let i = 0; i < rows; i++) {
|
|
610
|
+
monthArray.push(months.slice(MONTHS_PER_ROW * i, MONTHS_PER_ROW * (i + 1)));
|
|
611
|
+
}
|
|
612
|
+
this._months = monthArray;
|
|
573
613
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
614
|
+
/** Creates the rows for the year selection view. */
|
|
615
|
+
_createYearRows(offset = 0) {
|
|
616
|
+
const startValueYearView = this._getStartValueYearView();
|
|
617
|
+
const allYears = new Array(YEARS_PER_PAGE).fill(0).map((_, i) => startValueYearView + offset + i);
|
|
618
|
+
const rows = YEARS_PER_PAGE / YEARS_PER_ROW;
|
|
619
|
+
const yearArray = [];
|
|
620
|
+
for (let i = 0; i < rows; i++) {
|
|
621
|
+
yearArray.push(allYears.slice(YEARS_PER_ROW * i, YEARS_PER_ROW * (i + 1)));
|
|
622
|
+
}
|
|
623
|
+
return yearArray;
|
|
581
624
|
}
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
625
|
+
/**
|
|
626
|
+
* Calculates the first year that will be shown in the year selection panel.
|
|
627
|
+
* If `minDate` and `maxDate` are both null, the starting year is calculated as
|
|
628
|
+
* the multiple of YEARS_PER_PAGE closest to and less than activeDate,
|
|
629
|
+
* e.g., with `YEARS_PER_PAGE` = 24 and `activeDate` = 2020, the function will return 2016 (24 * 83),
|
|
630
|
+
* while with `activeDate` = 2000, the function will return 1992 (24 * 82).
|
|
631
|
+
* If `minDate` is not null, it returns the corresponding year; if `maxDate` is not null,
|
|
632
|
+
* it returns the corresponding year minus `YEARS_PER_PAGE`, so that the `maxDate` is the last rendered year.
|
|
633
|
+
* If both are not null, `maxDate` has priority over `minDate`.
|
|
634
|
+
*/
|
|
635
|
+
_getStartValueYearView() {
|
|
636
|
+
let startingYear = 0;
|
|
637
|
+
if (this.max) {
|
|
638
|
+
startingYear = this._dateAdapter.getYear(this.max) - YEARS_PER_PAGE + 1;
|
|
639
|
+
} else if (this.min) {
|
|
640
|
+
startingYear = this._dateAdapter.getYear(this.min);
|
|
641
|
+
}
|
|
642
|
+
const activeYear = this._dateAdapter.getYear(this._activeDate);
|
|
643
|
+
return activeYear - ((activeYear - startingYear) % YEARS_PER_PAGE + YEARS_PER_PAGE) % YEARS_PER_PAGE;
|
|
644
|
+
}
|
|
645
|
+
/** Checks if date is within the min-max range. */
|
|
646
|
+
_isDayInRange(date) {
|
|
647
|
+
if (!this._min && !this._max) {
|
|
594
648
|
return true;
|
|
595
649
|
}
|
|
650
|
+
const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.compareDate(this._min, this._dateAdapter.deserialize(date)) > 0;
|
|
651
|
+
const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.compareDate(this._max, this._dateAdapter.deserialize(date)) < 0;
|
|
652
|
+
return !(isBeforeMin || isAfterMax);
|
|
596
653
|
}
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
// Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/multi-year-view.ts#L351
|
|
600
|
-
_isYearFilteredOut(year) {
|
|
601
|
-
if (!this.dateFilter) {
|
|
602
|
-
return true;
|
|
603
|
-
}
|
|
604
|
-
const firstOfYear = this._dateAdapter.createDate(year, 1, 1);
|
|
605
|
-
for (let date = firstOfYear; this._dateAdapter.getYear(date) == year; date = this._dateAdapter.addCalendarDays(date, 1)) {
|
|
606
|
-
if (this.dateFilter(date)) {
|
|
654
|
+
_isMonthInRange(month) {
|
|
655
|
+
if (!this._min && !this._max) {
|
|
607
656
|
return true;
|
|
608
657
|
}
|
|
658
|
+
const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.getYear(this._min) >= this._chosenYear && this._dateAdapter.getMonth(this._min) > month;
|
|
659
|
+
const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.getYear(this._max) <= this._chosenYear && this._dateAdapter.getMonth(this._max) < month;
|
|
660
|
+
return !(isBeforeMin || isAfterMax);
|
|
609
661
|
}
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
this._selected = day;
|
|
618
|
-
this._dateSelected.emit(this._dateAdapter.deserialize(day));
|
|
662
|
+
_isYearInRange(year) {
|
|
663
|
+
if (!this._min && !this._max) {
|
|
664
|
+
return true;
|
|
665
|
+
}
|
|
666
|
+
const isBeforeMin = this._dateAdapter.isValid(this._min) && this._dateAdapter.getYear(this._min) > year;
|
|
667
|
+
const isAfterMax = this._dateAdapter.isValid(this._max) && this._dateAdapter.getYear(this._max) < year;
|
|
668
|
+
return !(isBeforeMin || isAfterMax);
|
|
619
669
|
}
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
);
|
|
626
|
-
|
|
627
|
-
|
|
670
|
+
// Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/year-view.ts#L366
|
|
671
|
+
_isMonthFilteredOut(month) {
|
|
672
|
+
if (!this.dateFilter) {
|
|
673
|
+
return true;
|
|
674
|
+
}
|
|
675
|
+
const firstOfMonth = this._dateAdapter.createDate(this._chosenYear, month, 1);
|
|
676
|
+
for (let date = firstOfMonth; this._dateAdapter.getMonth(date) == month; date = this._dateAdapter.addCalendarDays(date, 1)) {
|
|
677
|
+
if (this.dateFilter(date)) {
|
|
678
|
+
return true;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
return false;
|
|
628
682
|
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
683
|
+
// Implementation adapted from https://github.com/angular/components/blob/main/src/material/datepicker/multi-year-view.ts#L351
|
|
684
|
+
_isYearFilteredOut(year) {
|
|
685
|
+
if (!this.dateFilter) {
|
|
686
|
+
return true;
|
|
687
|
+
}
|
|
688
|
+
const firstOfYear = this._dateAdapter.createDate(year, 1, 1);
|
|
689
|
+
for (let date = firstOfYear; this._dateAdapter.getYear(date) == year; date = this._dateAdapter.addCalendarDays(date, 1)) {
|
|
690
|
+
if (this.dateFilter(date)) {
|
|
691
|
+
return true;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
return false;
|
|
634
695
|
}
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
696
|
+
/** Emits the selected date and sets it internally. */
|
|
697
|
+
_selectDate(day) {
|
|
698
|
+
this._chosenMonth = void 0;
|
|
699
|
+
this._setChosenYear();
|
|
700
|
+
if (this._selected !== day) {
|
|
701
|
+
this._selected = day;
|
|
702
|
+
this._dateSelected.emit(this._dateAdapter.deserialize(day));
|
|
703
|
+
}
|
|
638
704
|
}
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
_goToDifferentYear(years) {
|
|
646
|
-
this._chosenYear += years;
|
|
647
|
-
this._activeDate = this._dateAdapter.createDate(
|
|
648
|
-
this._chosenYear,
|
|
649
|
-
this._dateAdapter.getMonth(this._activeDate),
|
|
650
|
-
this._dateAdapter.getDate(this._activeDate)
|
|
651
|
-
);
|
|
652
|
-
this._init();
|
|
653
|
-
}
|
|
654
|
-
_goToDifferentYearRange(years) {
|
|
655
|
-
this._init(this._dateAdapter.addCalendarYears(this._activeDate, years));
|
|
656
|
-
}
|
|
657
|
-
_prevDisabled(prevDate) {
|
|
658
|
-
if (!this._min) {
|
|
659
|
-
return false;
|
|
705
|
+
_setChosenYear() {
|
|
706
|
+
if (this.view === "month") {
|
|
707
|
+
this._chosenYear = this._dateAdapter.getYear(this._dateAdapter.deserialize(this._selected) ?? this.selected ?? this.now);
|
|
708
|
+
} else {
|
|
709
|
+
this._chosenYear = void 0;
|
|
710
|
+
}
|
|
660
711
|
}
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
712
|
+
_assignActiveDate(date) {
|
|
713
|
+
if (this._min && this._dateAdapter.compareDate(this._min, date) > 0) {
|
|
714
|
+
this._activeDate = this._min;
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
if (this._max && this._dateAdapter.compareDate(this._max, date) < 0) {
|
|
718
|
+
this._activeDate = this._max;
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
this._activeDate = date;
|
|
666
722
|
}
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
_previousMonthDisabled() {
|
|
671
|
-
const prevMonth = this._dateAdapter.addCalendarDays(
|
|
672
|
-
this._activeDate,
|
|
673
|
-
this._dateAdapter.getDate(this._activeDate) * -1
|
|
674
|
-
);
|
|
675
|
-
return this._prevDisabled(prevMonth);
|
|
676
|
-
}
|
|
677
|
-
/** Checks if the "next month" button should be disabled. */
|
|
678
|
-
_nextMonthDisabled() {
|
|
679
|
-
let nextMonth = this._dateAdapter.addCalendarMonths(this._activeDate, this._wide ? 2 : 1);
|
|
680
|
-
nextMonth = this._dateAdapter.createDate(
|
|
681
|
-
this._dateAdapter.getYear(nextMonth),
|
|
682
|
-
this._dateAdapter.getMonth(nextMonth),
|
|
683
|
-
1
|
|
684
|
-
);
|
|
685
|
-
return this._nextDisabled(nextMonth);
|
|
686
|
-
}
|
|
687
|
-
_previousYearDisabled() {
|
|
688
|
-
const prevYear = this._dateAdapter.createDate(
|
|
689
|
-
this._dateAdapter.getYear(this._activeDate) - 1,
|
|
690
|
-
12,
|
|
691
|
-
31
|
|
692
|
-
);
|
|
693
|
-
return this._prevDisabled(prevYear);
|
|
694
|
-
}
|
|
695
|
-
_nextYearDisabled() {
|
|
696
|
-
const nextYear = this._dateAdapter.createDate(
|
|
697
|
-
this._dateAdapter.getYear(this._activeDate) + 1,
|
|
698
|
-
1,
|
|
699
|
-
1
|
|
700
|
-
);
|
|
701
|
-
return this._nextDisabled(nextYear);
|
|
702
|
-
}
|
|
703
|
-
_previousYearRangeDisabled() {
|
|
704
|
-
const prevYear = this._dateAdapter.createDate(this._years[0][0] - 1, 12, 31);
|
|
705
|
-
return this._prevDisabled(prevYear);
|
|
706
|
-
}
|
|
707
|
-
_nextYearRangeDisabled() {
|
|
708
|
-
const years = isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years;
|
|
709
|
-
const lastYearRange = years[years.length - 1];
|
|
710
|
-
const lastYear = lastYearRange[lastYearRange.length - 1];
|
|
711
|
-
const nextYear = this._dateAdapter.createDate(lastYear + 1, 1, 1);
|
|
712
|
-
return this._nextDisabled(nextYear);
|
|
713
|
-
}
|
|
714
|
-
_handleTableBlur(eventTarget) {
|
|
715
|
-
if ((eventTarget == null ? void 0 : eventTarget.localName) !== "button") {
|
|
716
|
-
this._setTabIndex();
|
|
723
|
+
/** Goes to the month identified by the shift. */
|
|
724
|
+
_goToDifferentMonth(months) {
|
|
725
|
+
this._init(this._dateAdapter.addCalendarMonths(this._activeDate, months));
|
|
717
726
|
}
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
this.
|
|
722
|
-
).forEach((day) => day.tabIndex = -1);
|
|
723
|
-
const firstFocusable = this._getFirstFocusable();
|
|
724
|
-
if (firstFocusable) {
|
|
725
|
-
firstFocusable.tabIndex = 0;
|
|
727
|
+
_goToDifferentYear(years) {
|
|
728
|
+
this._chosenYear += years;
|
|
729
|
+
this._activeDate = this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate));
|
|
730
|
+
this._init();
|
|
726
731
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
const active = this._selected ? this._dateAdapter.deserialize(this._selected) : this.now;
|
|
730
|
-
let firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__selected") ?? this.shadowRoot.querySelector(
|
|
731
|
-
`[data-day="${this._dateAdapter.getDate(active)} ${this._dateAdapter.getMonth(
|
|
732
|
-
active
|
|
733
|
-
)} ${this._dateAdapter.getYear(active)}"]`
|
|
734
|
-
) ?? this.shadowRoot.querySelector(`[data-month="${this._dateAdapter.getMonth(active)}"]`) ?? this.shadowRoot.querySelector(`[data-year="${this._dateAdapter.getYear(active)}"]`);
|
|
735
|
-
if (!firstFocusable || (firstFocusable == null ? void 0 : firstFocusable.disabled)) {
|
|
736
|
-
firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__cell:not([disabled])");
|
|
737
|
-
}
|
|
738
|
-
return firstFocusable || null;
|
|
739
|
-
}
|
|
740
|
-
_handleKeyboardEvent(event, day) {
|
|
741
|
-
if (isArrowKeyOrPageKeysPressed(event)) {
|
|
742
|
-
event.preventDefault();
|
|
743
|
-
}
|
|
744
|
-
const cells = this._cells;
|
|
745
|
-
const index = cells.findIndex((e) => e === event.target);
|
|
746
|
-
const nextEl = this._navigateByKeyboard(event, index, cells, day);
|
|
747
|
-
const activeEl = this.shadowRoot.activeElement;
|
|
748
|
-
if (nextEl !== activeEl) {
|
|
749
|
-
nextEl.tabIndex = 0;
|
|
750
|
-
nextEl == null ? void 0 : nextEl.focus();
|
|
751
|
-
activeEl.tabIndex = -1;
|
|
732
|
+
_goToDifferentYearRange(years) {
|
|
733
|
+
this._init(this._dateAdapter.addCalendarYears(this._activeDate, years));
|
|
752
734
|
}
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
* while in month and year view it's not due to the fixed amount of rendered cells.
|
|
759
|
-
*/
|
|
760
|
-
_navigateByKeyboard(evt, index, cells, day) {
|
|
761
|
-
const {
|
|
762
|
-
elementIndexForWideMode,
|
|
763
|
-
offsetForWideMode,
|
|
764
|
-
lastElementIndexForWideMode,
|
|
765
|
-
verticalOffset
|
|
766
|
-
} = this._calculateParametersForKeyboardNavigation(
|
|
767
|
-
cells,
|
|
768
|
-
index,
|
|
769
|
-
day
|
|
770
|
-
);
|
|
771
|
-
switch (evt.key) {
|
|
772
|
-
case "ArrowUp":
|
|
773
|
-
return this._findNext(cells, index, -verticalOffset);
|
|
774
|
-
case "ArrowDown":
|
|
775
|
-
return this._findNext(cells, index, verticalOffset);
|
|
776
|
-
case "ArrowLeft":
|
|
777
|
-
return this._findNext(cells, index, -1);
|
|
778
|
-
case "ArrowRight":
|
|
779
|
-
return this._findNext(cells, index, 1);
|
|
780
|
-
case "Home":
|
|
781
|
-
return this._findFirst(cells, offsetForWideMode);
|
|
782
|
-
case "PageUp":
|
|
783
|
-
return this._findFirstOnColumn(
|
|
784
|
-
cells,
|
|
785
|
-
elementIndexForWideMode,
|
|
786
|
-
offsetForWideMode,
|
|
787
|
-
verticalOffset
|
|
788
|
-
);
|
|
789
|
-
case "PageDown":
|
|
790
|
-
return this._findLastOnColumn(cells, index, lastElementIndexForWideMode, verticalOffset);
|
|
791
|
-
case "End":
|
|
792
|
-
return this._findLast(cells, lastElementIndexForWideMode - 1);
|
|
793
|
-
default:
|
|
794
|
-
return cells[index];
|
|
735
|
+
_prevDisabled(prevDate) {
|
|
736
|
+
if (!this._min) {
|
|
737
|
+
return false;
|
|
738
|
+
}
|
|
739
|
+
return this._dateAdapter.compareDate(prevDate, this._min) < 0;
|
|
795
740
|
}
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
* Since three views are now available, the function creates and returns the correct parameters for each of them
|
|
800
|
-
* by considering the number of cells per each row and the correction for the wide mode.
|
|
801
|
-
* @param cells The array of rendered table cells; they are buttons that can represent days, months or years.
|
|
802
|
-
* @param index The starting element's index in the cell array.
|
|
803
|
-
* @param day (optional) Only in the day view, the day represented by the starting cell.
|
|
804
|
-
*/
|
|
805
|
-
_calculateParametersForKeyboardNavigation(cells, index, day) {
|
|
806
|
-
switch (this._calendarView) {
|
|
807
|
-
case "day": {
|
|
808
|
-
const indexInView = +day.dayValue - 1;
|
|
809
|
-
return {
|
|
810
|
-
verticalOffset: DAYS_PER_ROW,
|
|
811
|
-
elementIndexForWideMode: indexInView,
|
|
812
|
-
offsetForWideMode: index - indexInView,
|
|
813
|
-
lastElementIndexForWideMode: index === indexInView ? this._dateAdapter.getNumDaysInMonth(
|
|
814
|
-
this._dateAdapter.addCalendarMonths(
|
|
815
|
-
this._dateAdapter.deserialize(day.value),
|
|
816
|
-
-1
|
|
817
|
-
)
|
|
818
|
-
) : cells.length
|
|
819
|
-
};
|
|
741
|
+
_nextDisabled(nextDate) {
|
|
742
|
+
if (!this._max) {
|
|
743
|
+
return false;
|
|
820
744
|
}
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
745
|
+
return this._dateAdapter.compareDate(nextDate, this._max) > 0;
|
|
746
|
+
}
|
|
747
|
+
/** Checks if the "previous month" button should be disabled. */
|
|
748
|
+
_previousMonthDisabled() {
|
|
749
|
+
const prevMonth = this._dateAdapter.addCalendarDays(this._activeDate, this._dateAdapter.getDate(this._activeDate) * -1);
|
|
750
|
+
return this._prevDisabled(prevMonth);
|
|
751
|
+
}
|
|
752
|
+
/** Checks if the "next month" button should be disabled. */
|
|
753
|
+
_nextMonthDisabled() {
|
|
754
|
+
let nextMonth = this._dateAdapter.addCalendarMonths(this._activeDate, this._wide ? 2 : 1);
|
|
755
|
+
nextMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(nextMonth), this._dateAdapter.getMonth(nextMonth), 1);
|
|
756
|
+
return this._nextDisabled(nextMonth);
|
|
757
|
+
}
|
|
758
|
+
_previousYearDisabled() {
|
|
759
|
+
const prevYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) - 1, 12, 31);
|
|
760
|
+
return this._prevDisabled(prevYear);
|
|
761
|
+
}
|
|
762
|
+
_nextYearDisabled() {
|
|
763
|
+
const nextYear = this._dateAdapter.createDate(this._dateAdapter.getYear(this._activeDate) + 1, 1, 1);
|
|
764
|
+
return this._nextDisabled(nextYear);
|
|
765
|
+
}
|
|
766
|
+
_previousYearRangeDisabled() {
|
|
767
|
+
const prevYear = this._dateAdapter.createDate(this._years[0][0] - 1, 12, 31);
|
|
768
|
+
return this._prevDisabled(prevYear);
|
|
769
|
+
}
|
|
770
|
+
_nextYearRangeDisabled() {
|
|
771
|
+
const years = isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years;
|
|
772
|
+
const lastYearRange = years[years.length - 1];
|
|
773
|
+
const lastYear = lastYearRange[lastYearRange.length - 1];
|
|
774
|
+
const nextYear = this._dateAdapter.createDate(lastYear + 1, 1, 1);
|
|
775
|
+
return this._nextDisabled(nextYear);
|
|
776
|
+
}
|
|
777
|
+
_handleTableBlur(eventTarget) {
|
|
778
|
+
if ((eventTarget == null ? void 0 : eventTarget.localName) !== "button") {
|
|
779
|
+
this._setTabIndex();
|
|
828
780
|
}
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
offsetForWideMode: index - indexInView,
|
|
836
|
-
lastElementIndexForWideMode: offset === 0 ? YEARS_PER_PAGE : YEARS_PER_PAGE * 2
|
|
837
|
-
};
|
|
781
|
+
}
|
|
782
|
+
_setTabIndex() {
|
|
783
|
+
Array.from(this.shadowRoot.querySelectorAll('.sbb-calendar__cell[tabindex="0"]') ?? []).forEach((day) => day.tabIndex = -1);
|
|
784
|
+
const firstFocusable = this._getFirstFocusable();
|
|
785
|
+
if (firstFocusable) {
|
|
786
|
+
firstFocusable.tabIndex = 0;
|
|
838
787
|
}
|
|
839
788
|
}
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
let nextIndex = index + delta;
|
|
848
|
-
while (nextIndex < days.length && ((_a = days[nextIndex]) == null ? void 0 : _a.disabled)) {
|
|
849
|
-
nextIndex += delta;
|
|
850
|
-
}
|
|
851
|
-
return days[nextIndex] ?? days[index];
|
|
852
|
-
}
|
|
853
|
-
/** Find the first enabled element in the provided array. */
|
|
854
|
-
_findFirst(days, firstOfCurrentMonth) {
|
|
855
|
-
return !days[firstOfCurrentMonth].disabled ? days[firstOfCurrentMonth] : this._findNext(days, firstOfCurrentMonth, 1);
|
|
856
|
-
}
|
|
857
|
-
/** Find the last enabled element in the provided array. */
|
|
858
|
-
_findLast(days, lastOfCurrentMonth) {
|
|
859
|
-
return !days[lastOfCurrentMonth].disabled ? days[lastOfCurrentMonth] : this._findNext(days, lastOfCurrentMonth, -1);
|
|
860
|
-
}
|
|
861
|
-
/** Find the first enabled element in the same column of the provided array. */
|
|
862
|
-
_findFirstOnColumn(days, index, offset, verticalOffset) {
|
|
863
|
-
const nextIndex = index % verticalOffset + offset;
|
|
864
|
-
return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, verticalOffset);
|
|
865
|
-
}
|
|
866
|
-
/** Find the last enabled element in the same column of the provided array. */
|
|
867
|
-
_findLastOnColumn(days, index, offset, verticalOffset) {
|
|
868
|
-
const nextIndex = index + Math.trunc((offset - index - 1) / verticalOffset) * verticalOffset;
|
|
869
|
-
return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, -verticalOffset);
|
|
870
|
-
}
|
|
871
|
-
_resetCalendarView(initTransition = false) {
|
|
872
|
-
this._resetFocus = true;
|
|
873
|
-
this._activeDate = this.selected ?? this.now;
|
|
874
|
-
this._setChosenYear();
|
|
875
|
-
this._chosenMonth = void 0;
|
|
876
|
-
this._nextCalendarView = this._calendarView = this.view;
|
|
877
|
-
if (initTransition) {
|
|
878
|
-
this._startTableTransition();
|
|
789
|
+
_getFirstFocusable() {
|
|
790
|
+
const active = this._selected ? this._dateAdapter.deserialize(this._selected) : this.now;
|
|
791
|
+
let firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__selected") ?? this.shadowRoot.querySelector(`[data-day="${this._dateAdapter.getDate(active)} ${this._dateAdapter.getMonth(active)} ${this._dateAdapter.getYear(active)}"]`) ?? this.shadowRoot.querySelector(`[data-month="${this._dateAdapter.getMonth(active)}"]`) ?? this.shadowRoot.querySelector(`[data-year="${this._dateAdapter.getYear(active)}"]`);
|
|
792
|
+
if (!firstFocusable || (firstFocusable == null ? void 0 : firstFocusable.disabled)) {
|
|
793
|
+
firstFocusable = this.shadowRoot.querySelector(".sbb-calendar__cell:not([disabled])");
|
|
794
|
+
}
|
|
795
|
+
return firstFocusable || null;
|
|
879
796
|
}
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
797
|
+
_handleKeyboardEvent(event, day) {
|
|
798
|
+
if (isArrowKeyOrPageKeysPressed(event)) {
|
|
799
|
+
event.preventDefault();
|
|
800
|
+
}
|
|
801
|
+
const cells = this._cells;
|
|
802
|
+
const index = cells.findIndex((e) => e === event.target);
|
|
803
|
+
const nextEl = this._navigateByKeyboard(event, index, cells, day);
|
|
804
|
+
const activeEl = this.shadowRoot.activeElement;
|
|
805
|
+
if (nextEl !== activeEl) {
|
|
806
|
+
nextEl.tabIndex = 0;
|
|
807
|
+
nextEl == null ? void 0 : nextEl.focus();
|
|
808
|
+
activeEl.tabIndex = -1;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Gets the index of the element to move to, based on a list of elements (which can be potentially disabled),
|
|
813
|
+
* the keyboard input and the position of the current element in the list.
|
|
814
|
+
* In the day view, the `day?: Day` parameter is mandatory for calculation,
|
|
815
|
+
* while in month and year view it's not due to the fixed amount of rendered cells.
|
|
816
|
+
*/
|
|
817
|
+
_navigateByKeyboard(evt, index, cells, day) {
|
|
818
|
+
const { elementIndexForWideMode, offsetForWideMode, lastElementIndexForWideMode, verticalOffset } = this._calculateParametersForKeyboardNavigation(cells, index, day);
|
|
819
|
+
switch (evt.key) {
|
|
820
|
+
case "ArrowUp":
|
|
821
|
+
return this._findNext(cells, index, -verticalOffset);
|
|
822
|
+
case "ArrowDown":
|
|
823
|
+
return this._findNext(cells, index, verticalOffset);
|
|
824
|
+
case "ArrowLeft":
|
|
825
|
+
return this._findNext(cells, index, -1);
|
|
826
|
+
case "ArrowRight":
|
|
827
|
+
return this._findNext(cells, index, 1);
|
|
828
|
+
case "Home":
|
|
829
|
+
return this._findFirst(cells, offsetForWideMode);
|
|
830
|
+
case "PageUp":
|
|
831
|
+
return this._findFirstOnColumn(cells, elementIndexForWideMode, offsetForWideMode, verticalOffset);
|
|
832
|
+
case "PageDown":
|
|
833
|
+
return this._findLastOnColumn(cells, index, lastElementIndexForWideMode, verticalOffset);
|
|
834
|
+
case "End":
|
|
835
|
+
return this._findLast(cells, lastElementIndexForWideMode - 1);
|
|
836
|
+
default:
|
|
837
|
+
return cells[index];
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* Calculates the parameter needed in keyboard navigation.
|
|
842
|
+
* Since three views are now available, the function creates and returns the correct parameters for each of them
|
|
843
|
+
* by considering the number of cells per each row and the correction for the wide mode.
|
|
844
|
+
* @param cells The array of rendered table cells; they are buttons that can represent days, months or years.
|
|
845
|
+
* @param index The starting element's index in the cell array.
|
|
846
|
+
* @param day (optional) Only in the day view, the day represented by the starting cell.
|
|
847
|
+
*/
|
|
848
|
+
_calculateParametersForKeyboardNavigation(cells, index, day) {
|
|
849
|
+
switch (this._calendarView) {
|
|
850
|
+
case "day": {
|
|
851
|
+
const indexInView = +day.dayValue - 1;
|
|
852
|
+
return {
|
|
853
|
+
verticalOffset: DAYS_PER_ROW,
|
|
854
|
+
elementIndexForWideMode: indexInView,
|
|
855
|
+
offsetForWideMode: index - indexInView,
|
|
856
|
+
lastElementIndexForWideMode: index === indexInView ? this._dateAdapter.getNumDaysInMonth(this._dateAdapter.addCalendarMonths(this._dateAdapter.deserialize(day.value), -1)) : cells.length
|
|
857
|
+
};
|
|
858
|
+
}
|
|
859
|
+
case "month": {
|
|
860
|
+
return {
|
|
861
|
+
verticalOffset: MONTHS_PER_ROW,
|
|
862
|
+
elementIndexForWideMode: index,
|
|
863
|
+
offsetForWideMode: 0,
|
|
864
|
+
lastElementIndexForWideMode: 12
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
case "year": {
|
|
868
|
+
const offset = Math.trunc(index / YEARS_PER_PAGE) * YEARS_PER_PAGE;
|
|
869
|
+
const indexInView = offset === 0 ? index : index - YEARS_PER_PAGE;
|
|
870
|
+
return {
|
|
871
|
+
verticalOffset: YEARS_PER_ROW,
|
|
872
|
+
elementIndexForWideMode: indexInView,
|
|
873
|
+
offsetForWideMode: index - indexInView,
|
|
874
|
+
lastElementIndexForWideMode: offset === 0 ? YEARS_PER_PAGE : YEARS_PER_PAGE * 2
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* Gets the next element of the provided array starting from `index` by adding `delta`.
|
|
881
|
+
* If the found element is disabled, it continues adding `delta` until it finds an enabled one in the array bounds.
|
|
882
|
+
*/
|
|
883
|
+
_findNext(days, index, delta) {
|
|
884
|
+
var _a2;
|
|
885
|
+
let nextIndex = index + delta;
|
|
886
|
+
while (nextIndex < days.length && ((_a2 = days[nextIndex]) == null ? void 0 : _a2.disabled)) {
|
|
887
|
+
nextIndex += delta;
|
|
888
|
+
}
|
|
889
|
+
return days[nextIndex] ?? days[index];
|
|
890
|
+
}
|
|
891
|
+
/** Find the first enabled element in the provided array. */
|
|
892
|
+
_findFirst(days, firstOfCurrentMonth) {
|
|
893
|
+
return !days[firstOfCurrentMonth].disabled ? days[firstOfCurrentMonth] : this._findNext(days, firstOfCurrentMonth, 1);
|
|
894
|
+
}
|
|
895
|
+
/** Find the last enabled element in the provided array. */
|
|
896
|
+
_findLast(days, lastOfCurrentMonth) {
|
|
897
|
+
return !days[lastOfCurrentMonth].disabled ? days[lastOfCurrentMonth] : this._findNext(days, lastOfCurrentMonth, -1);
|
|
898
|
+
}
|
|
899
|
+
/** Find the first enabled element in the same column of the provided array. */
|
|
900
|
+
_findFirstOnColumn(days, index, offset, verticalOffset) {
|
|
901
|
+
const nextIndex = index % verticalOffset + offset;
|
|
902
|
+
return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, verticalOffset);
|
|
903
|
+
}
|
|
904
|
+
/** Find the last enabled element in the same column of the provided array. */
|
|
905
|
+
_findLastOnColumn(days, index, offset, verticalOffset) {
|
|
906
|
+
const nextIndex = index + Math.trunc((offset - index - 1) / verticalOffset) * verticalOffset;
|
|
907
|
+
return !days[nextIndex].disabled ? days[nextIndex] : this._findNext(days, nextIndex, -verticalOffset);
|
|
908
|
+
}
|
|
909
|
+
_resetCalendarView(initTransition = false) {
|
|
910
|
+
this._resetFocus = true;
|
|
911
|
+
this._activeDate = this.selected ?? this.now;
|
|
912
|
+
this._setChosenYear();
|
|
913
|
+
this._chosenMonth = void 0;
|
|
914
|
+
this._nextCalendarView = this._calendarView = this.view;
|
|
915
|
+
if (initTransition) {
|
|
916
|
+
this._startTableTransition();
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
/** Render the view for the day selection. */
|
|
920
|
+
_renderDayView() {
|
|
921
|
+
const nextMonthActiveDate = this._wide ? this._dateAdapter.addCalendarMonths(this._activeDate, 1) : void 0;
|
|
922
|
+
return html`
|
|
885
923
|
<div class="sbb-calendar__controls">
|
|
886
|
-
${this._getArrow(
|
|
887
|
-
"left",
|
|
888
|
-
() => this._goToDifferentMonth(-1),
|
|
889
|
-
i18nPreviousMonth[this._language.current],
|
|
890
|
-
this._previousMonthDisabled()
|
|
891
|
-
)}
|
|
924
|
+
${this._getArrow("left", () => this._goToDifferentMonth(-1), i18nPreviousMonth[this._language.current], this._previousMonthDisabled())}
|
|
892
925
|
<div class="sbb-calendar__controls-month">
|
|
893
926
|
${this._createLabelForDayView(this._activeDate)}
|
|
894
927
|
${this._wide ? this._createLabelForDayView(nextMonthActiveDate) : nothing}
|
|
@@ -896,52 +929,47 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
896
929
|
${this._createAriaLabelForDayView(this._activeDate, nextMonthActiveDate)}
|
|
897
930
|
</sbb-screen-reader-only>
|
|
898
931
|
</div>
|
|
899
|
-
${this._getArrow(
|
|
900
|
-
"right",
|
|
901
|
-
() => this._goToDifferentMonth(1),
|
|
902
|
-
i18nNextMonth[this._language.current],
|
|
903
|
-
this._nextMonthDisabled()
|
|
904
|
-
)}
|
|
932
|
+
${this._getArrow("right", () => this._goToDifferentMonth(1), i18nNextMonth[this._language.current], this._nextMonthDisabled())}
|
|
905
933
|
</div>
|
|
906
934
|
<div class="sbb-calendar__table-container sbb-calendar__table-day-view">
|
|
907
935
|
${this._createDayTable(this._weeks)}
|
|
908
936
|
${this._wide ? this._createDayTable(this._nextMonthWeeks) : nothing}
|
|
909
937
|
</div>
|
|
910
938
|
`;
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
939
|
+
}
|
|
940
|
+
/** Creates the label with the month for the daily view. */
|
|
941
|
+
_createLabelForDayView(d) {
|
|
942
|
+
const monthLabel = `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)}`;
|
|
943
|
+
return html`
|
|
916
944
|
<button
|
|
917
945
|
type="button"
|
|
918
946
|
id="sbb-calendar__date-selection"
|
|
919
947
|
class="sbb-calendar__controls-change-date"
|
|
920
948
|
aria-label="${i18nYearMonthSelection[this._language.current]} ${monthLabel}"
|
|
921
949
|
@click=${() => {
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
950
|
+
this._resetFocus = true;
|
|
951
|
+
this._nextCalendarView = "year";
|
|
952
|
+
this._startTableTransition();
|
|
953
|
+
}}
|
|
926
954
|
>
|
|
927
955
|
${monthLabel}
|
|
928
956
|
<sbb-icon name="chevron-small-down-small"></sbb-icon>
|
|
929
957
|
</button>
|
|
930
958
|
`;
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
959
|
+
}
|
|
960
|
+
/** Creates the aria-label for the daily view. */
|
|
961
|
+
_createAriaLabelForDayView(...dates) {
|
|
962
|
+
let monthLabel = "";
|
|
963
|
+
for (const d of dates) {
|
|
964
|
+
if (d) {
|
|
965
|
+
monthLabel += `${this._monthNames[this._dateAdapter.getMonth(d) - 1]} ${this._dateAdapter.getYear(d)} `;
|
|
966
|
+
}
|
|
938
967
|
}
|
|
968
|
+
return monthLabel;
|
|
939
969
|
}
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
_createDayTable(weeks) {
|
|
944
|
-
return html`
|
|
970
|
+
/** Creates the calendar table for the daily view. */
|
|
971
|
+
_createDayTable(weeks) {
|
|
972
|
+
return html`
|
|
945
973
|
<table
|
|
946
974
|
class="sbb-calendar__table"
|
|
947
975
|
@focusout=${(event) => this._handleTableBlur(event.relatedTarget)}
|
|
@@ -957,64 +985,60 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
957
985
|
</tbody>
|
|
958
986
|
</table>
|
|
959
987
|
`;
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
(day) => html`
|
|
988
|
+
}
|
|
989
|
+
/** Creates the table header with the month header cells. */
|
|
990
|
+
_createDayTableHeader() {
|
|
991
|
+
return this._weekdays.map((day) => html`
|
|
965
992
|
<th class="sbb-calendar__table-header">
|
|
966
993
|
<sbb-screen-reader-only>${day.long}</sbb-screen-reader-only>
|
|
967
994
|
<span aria-hidden="true">${day.narrow}</span>
|
|
968
995
|
</th>
|
|
969
|
-
`
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
return html`
|
|
996
|
+
`);
|
|
997
|
+
}
|
|
998
|
+
/** Creates the table body with the day cells. For the first row, it also considers the possible day's offset. */
|
|
999
|
+
_createDayTableBody(weeks) {
|
|
1000
|
+
const today = this._dateAdapter.toIso8601(this.now);
|
|
1001
|
+
return weeks.map((week, rowIndex) => {
|
|
1002
|
+
const firstRowOffset = DAYS_PER_ROW - week.length;
|
|
1003
|
+
if (rowIndex === 0 && firstRowOffset) {
|
|
1004
|
+
return html`
|
|
979
1005
|
<tr>
|
|
980
|
-
${[...Array(firstRowOffset).keys()].map(
|
|
981
|
-
() => html`<td
|
|
1006
|
+
${[...Array(firstRowOffset).keys()].map(() => html`<td
|
|
982
1007
|
class="sbb-calendar__table-data"
|
|
983
1008
|
data-day=${`0 ${week[0].monthValue} ${week[0].yearValue}`}
|
|
984
|
-
></td>`
|
|
985
|
-
)}
|
|
1009
|
+
></td>`)}
|
|
986
1010
|
${this._createDayCells(week, today)}
|
|
987
1011
|
</tr>
|
|
988
1012
|
`;
|
|
989
|
-
|
|
990
|
-
|
|
1013
|
+
}
|
|
1014
|
+
return html`<tr>
|
|
991
1015
|
${this._createDayCells(week, today)}
|
|
992
1016
|
</tr>`;
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
/** Creates the cells for the daily view. */
|
|
1020
|
+
_createDayCells(week, today) {
|
|
1021
|
+
return week.map((day) => {
|
|
1022
|
+
const isOutOfRange = !this._isDayInRange(day.value);
|
|
1023
|
+
const isFilteredOut = !this._dateFilter(this._dateAdapter.deserialize(day.value));
|
|
1024
|
+
const selected = !!this._selected && day.value === this._selected;
|
|
1025
|
+
const dayValue = `${day.dayValue} ${day.monthValue} ${day.yearValue}`;
|
|
1026
|
+
const isToday = day.value === today;
|
|
1027
|
+
return html`
|
|
1004
1028
|
<td
|
|
1005
1029
|
class=${classMap({
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1030
|
+
"sbb-calendar__table-data": true,
|
|
1031
|
+
"sbb-calendar__table-data-selected": selected
|
|
1032
|
+
})}
|
|
1009
1033
|
>
|
|
1010
1034
|
<button
|
|
1011
1035
|
class=${classMap({
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1036
|
+
"sbb-calendar__cell": true,
|
|
1037
|
+
"sbb-calendar__day": true,
|
|
1038
|
+
"sbb-calendar__cell-current": isToday,
|
|
1039
|
+
"sbb-calendar__selected": selected,
|
|
1040
|
+
"sbb-calendar__crossed-out": !isOutOfRange && isFilteredOut
|
|
1041
|
+
})}
|
|
1018
1042
|
@click=${() => this._selectDate(day.value)}
|
|
1019
1043
|
?disabled=${isOutOfRange || isFilteredOut}
|
|
1020
1044
|
aria-label=${this._dateAdapter.getAccessibilityFormatDate(day.value)}
|
|
@@ -1030,35 +1054,25 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1030
1054
|
</button>
|
|
1031
1055
|
</td>
|
|
1032
1056
|
`;
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
1059
|
+
/** Render the view for the month selection. */
|
|
1060
|
+
_renderMonthView() {
|
|
1061
|
+
return html`
|
|
1038
1062
|
<div class="sbb-calendar__controls">
|
|
1039
|
-
${this._getArrow(
|
|
1040
|
-
"left",
|
|
1041
|
-
() => this._goToDifferentYear(-1),
|
|
1042
|
-
i18nPreviousYear[this._language.current],
|
|
1043
|
-
this._previousYearDisabled()
|
|
1044
|
-
)}
|
|
1063
|
+
${this._getArrow("left", () => this._goToDifferentYear(-1), i18nPreviousYear[this._language.current], this._previousYearDisabled())}
|
|
1045
1064
|
<div class="sbb-calendar__controls-month">${this._createLabelForMonthView()}</div>
|
|
1046
|
-
${this._getArrow(
|
|
1047
|
-
"right",
|
|
1048
|
-
() => this._goToDifferentYear(1),
|
|
1049
|
-
i18nNextYear[this._language.current],
|
|
1050
|
-
this._nextYearDisabled()
|
|
1051
|
-
)}
|
|
1065
|
+
${this._getArrow("right", () => this._goToDifferentYear(1), i18nNextYear[this._language.current], this._nextYearDisabled())}
|
|
1052
1066
|
</div>
|
|
1053
1067
|
<div class="sbb-calendar__table-container sbb-calendar__table-month-view">
|
|
1054
1068
|
${this._createMonthTable(this._months, this._chosenYear)}
|
|
1055
1069
|
${this._wide ? this._createMonthTable(this._months, this._chosenYear + 1, true) : nothing}
|
|
1056
1070
|
</div>
|
|
1057
1071
|
`;
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1072
|
+
}
|
|
1073
|
+
/** Creates the label with the year for the monthly view. */
|
|
1074
|
+
_createLabelForMonthView() {
|
|
1075
|
+
return html` <button
|
|
1062
1076
|
type="button"
|
|
1063
1077
|
id="sbb-calendar__month-selection"
|
|
1064
1078
|
class="sbb-calendar__controls-change-date"
|
|
@@ -1069,10 +1083,10 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1069
1083
|
<sbb-icon name="chevron-small-up-small"></sbb-icon>
|
|
1070
1084
|
</button>
|
|
1071
1085
|
<sbb-screen-reader-only role="status"> ${this._chosenYear} </sbb-screen-reader-only>`;
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1086
|
+
}
|
|
1087
|
+
/** Creates the table for the month selection view. */
|
|
1088
|
+
_createMonthTable(months, year, shiftRight = false) {
|
|
1089
|
+
return html`
|
|
1076
1090
|
<table
|
|
1077
1091
|
class="sbb-calendar__table"
|
|
1078
1092
|
@animationend=${(e) => this._tableAnimationEnd(e)}
|
|
@@ -1083,8 +1097,7 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1083
1097
|
</tr>
|
|
1084
1098
|
</thead>` : nothing}
|
|
1085
1099
|
<tbody class="sbb-calendar__table-body">
|
|
1086
|
-
${months.map(
|
|
1087
|
-
(row) => html`
|
|
1100
|
+
${months.map((row) => html`
|
|
1088
1101
|
<tr>
|
|
1089
1102
|
${row.map((month) => {
|
|
1090
1103
|
const isOutOfRange = !this._isMonthInRange(month.monthValue);
|
|
@@ -1121,52 +1134,35 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1121
1134
|
</td>`;
|
|
1122
1135
|
})}
|
|
1123
1136
|
</tr>
|
|
1124
|
-
`
|
|
1125
|
-
)}
|
|
1137
|
+
`)}
|
|
1126
1138
|
</tbody>
|
|
1127
1139
|
</table>
|
|
1128
1140
|
`;
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
this.
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
);
|
|
1141
|
-
this._startTableTransition();
|
|
1142
|
-
}
|
|
1143
|
-
/** Render the view for the year selection. */
|
|
1144
|
-
_renderYearView() {
|
|
1145
|
-
return html`
|
|
1141
|
+
}
|
|
1142
|
+
/** Select the month and change the view to day selection. */
|
|
1143
|
+
_onMonthSelection(month, year, shiftRight) {
|
|
1144
|
+
this._chosenMonth = shiftRight ? month + 1 : month;
|
|
1145
|
+
this._nextCalendarView = "day";
|
|
1146
|
+
this._init(this._dateAdapter.createDate(year, this._chosenMonth, this._dateAdapter.getDate(this._activeDate)));
|
|
1147
|
+
this._startTableTransition();
|
|
1148
|
+
}
|
|
1149
|
+
/** Render the view for the year selection. */
|
|
1150
|
+
_renderYearView() {
|
|
1151
|
+
return html`
|
|
1146
1152
|
<div class="sbb-calendar__controls">
|
|
1147
|
-
${this._getArrow(
|
|
1148
|
-
"left",
|
|
1149
|
-
() => this._goToDifferentYearRange(-YEARS_PER_PAGE),
|
|
1150
|
-
i18nPreviousYearRange(YEARS_PER_PAGE)[this._language.current],
|
|
1151
|
-
this._previousYearRangeDisabled()
|
|
1152
|
-
)}
|
|
1153
|
+
${this._getArrow("left", () => this._goToDifferentYearRange(-YEARS_PER_PAGE), i18nPreviousYearRange(YEARS_PER_PAGE)[this._language.current], this._previousYearRangeDisabled())}
|
|
1153
1154
|
<div class="sbb-calendar__controls-month">${this._createLabelForYearView()}</div>
|
|
1154
|
-
${this._getArrow(
|
|
1155
|
-
"right",
|
|
1156
|
-
() => this._goToDifferentYearRange(YEARS_PER_PAGE),
|
|
1157
|
-
i18nNextYearRange(YEARS_PER_PAGE)[this._language.current],
|
|
1158
|
-
this._nextYearRangeDisabled()
|
|
1159
|
-
)}
|
|
1155
|
+
${this._getArrow("right", () => this._goToDifferentYearRange(YEARS_PER_PAGE), i18nNextYearRange(YEARS_PER_PAGE)[this._language.current], this._nextYearRangeDisabled())}
|
|
1160
1156
|
</div>
|
|
1161
1157
|
<div class="sbb-calendar__table-container sbb-calendar__table-year-view">
|
|
1162
1158
|
${this._createYearTable(this._years)}
|
|
1163
1159
|
${this._wide ? this._createYearTable(this._nextMonthYears, true) : nothing}
|
|
1164
1160
|
</div>
|
|
1165
1161
|
`;
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1162
|
+
}
|
|
1163
|
+
/** Creates the button arrow for all the views. */
|
|
1164
|
+
_getArrow(direction, click, ariaLabel, disabled) {
|
|
1165
|
+
return html`<sbb-secondary-button
|
|
1170
1166
|
size="m"
|
|
1171
1167
|
icon-name="chevron-small-${direction}-small"
|
|
1172
1168
|
aria-label=${ariaLabel}
|
|
@@ -1174,14 +1170,14 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1174
1170
|
?disabled=${disabled}
|
|
1175
1171
|
id="sbb-calendar__controls-${direction === "left" ? "previous" : "next"}"
|
|
1176
1172
|
></sbb-secondary-button>`;
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1173
|
+
}
|
|
1174
|
+
/** Creates the label with the year range for the yearly view. */
|
|
1175
|
+
_createLabelForYearView() {
|
|
1176
|
+
const firstYear = this._years.flat()[0];
|
|
1177
|
+
const lastYearArray = (isBreakpoint("medium") && this.wide ? this._nextMonthYears : this._years).flat();
|
|
1178
|
+
const lastYear = lastYearArray[lastYearArray.length - 1];
|
|
1179
|
+
const yearLabel = `${firstYear} - ${lastYear}`;
|
|
1180
|
+
return html`
|
|
1185
1181
|
<button
|
|
1186
1182
|
type="button"
|
|
1187
1183
|
id="sbb-calendar__year-selection"
|
|
@@ -1194,17 +1190,16 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1194
1190
|
</button>
|
|
1195
1191
|
<sbb-screen-reader-only role="status"> ${yearLabel} </sbb-screen-reader-only>
|
|
1196
1192
|
`;
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1193
|
+
}
|
|
1194
|
+
/** Creates the table for the year selection view. */
|
|
1195
|
+
_createYearTable(years, shiftRight = false) {
|
|
1196
|
+
const now = this.now;
|
|
1197
|
+
return html` <table
|
|
1202
1198
|
class="sbb-calendar__table"
|
|
1203
1199
|
@animationend=${(e) => this._tableAnimationEnd(e)}
|
|
1204
1200
|
>
|
|
1205
1201
|
<tbody class="sbb-calendar__table-body">
|
|
1206
|
-
${years.map(
|
|
1207
|
-
(row) => html` <tr>
|
|
1202
|
+
${years.map((row) => html` <tr>
|
|
1208
1203
|
${row.map((year) => {
|
|
1209
1204
|
const isOutOfRange = !this._isYearInRange(year);
|
|
1210
1205
|
const isFilteredOut = !this._isYearFilteredOut(year);
|
|
@@ -1233,101 +1228,108 @@ let SbbCalendarElement = class extends SbbHydrationMixin(LitElement) {
|
|
|
1233
1228
|
</button>
|
|
1234
1229
|
</td>`;
|
|
1235
1230
|
})}
|
|
1236
|
-
</tr>`
|
|
1237
|
-
)}
|
|
1231
|
+
</tr>`)}
|
|
1238
1232
|
</tbody>
|
|
1239
1233
|
</table>`;
|
|
1240
|
-
}
|
|
1241
|
-
/** Select the year and change the view to month selection. */
|
|
1242
|
-
_onYearSelection(year, rightSide) {
|
|
1243
|
-
this._chosenYear = rightSide ? year - 1 : year;
|
|
1244
|
-
this._nextCalendarView = "month";
|
|
1245
|
-
this._assignActiveDate(
|
|
1246
|
-
this._dateAdapter.createDate(
|
|
1247
|
-
this._chosenYear,
|
|
1248
|
-
this._dateAdapter.getMonth(this._activeDate),
|
|
1249
|
-
this._dateAdapter.getDate(this._activeDate)
|
|
1250
|
-
)
|
|
1251
|
-
);
|
|
1252
|
-
this._startTableTransition();
|
|
1253
|
-
}
|
|
1254
|
-
_getView() {
|
|
1255
|
-
if (isServer || this.hydrationRequired) {
|
|
1256
|
-
return html`${nothing}`;
|
|
1257
|
-
}
|
|
1258
|
-
switch (this._calendarView) {
|
|
1259
|
-
case "year":
|
|
1260
|
-
return this._renderYearView();
|
|
1261
|
-
case "month":
|
|
1262
|
-
return this._renderMonthView();
|
|
1263
|
-
case "day":
|
|
1264
|
-
default:
|
|
1265
|
-
return this._renderDayView();
|
|
1266
1234
|
}
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
this.
|
|
1273
|
-
this._calendarView = this._nextCalendarView;
|
|
1274
|
-
} else if (event.animationName === "show") {
|
|
1275
|
-
this.removeAttribute("data-transition");
|
|
1235
|
+
/** Select the year and change the view to month selection. */
|
|
1236
|
+
_onYearSelection(year, rightSide) {
|
|
1237
|
+
this._chosenYear = rightSide ? year - 1 : year;
|
|
1238
|
+
this._nextCalendarView = "month";
|
|
1239
|
+
this._assignActiveDate(this._dateAdapter.createDate(this._chosenYear, this._dateAdapter.getMonth(this._activeDate), this._dateAdapter.getDate(this._activeDate)));
|
|
1240
|
+
this._startTableTransition();
|
|
1276
1241
|
}
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
}
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1242
|
+
_getView() {
|
|
1243
|
+
if (isServer || this.hydrationRequired) {
|
|
1244
|
+
return html`${nothing}`;
|
|
1245
|
+
}
|
|
1246
|
+
switch (this._calendarView) {
|
|
1247
|
+
case "year":
|
|
1248
|
+
return this._renderYearView();
|
|
1249
|
+
case "month":
|
|
1250
|
+
return this._renderMonthView();
|
|
1251
|
+
case "day":
|
|
1252
|
+
default:
|
|
1253
|
+
return this._renderDayView();
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
_tableAnimationEnd(event) {
|
|
1257
|
+
const table = event.target;
|
|
1258
|
+
if (event.animationName === "hide") {
|
|
1259
|
+
table.classList.remove("sbb-calendar__table-hide");
|
|
1260
|
+
this._resetFocus = true;
|
|
1261
|
+
this._calendarView = this._nextCalendarView;
|
|
1262
|
+
} else if (event.animationName === "show") {
|
|
1263
|
+
this.removeAttribute("data-transition");
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
_startTableTransition() {
|
|
1267
|
+
var _a2, _b;
|
|
1268
|
+
this.toggleAttribute("data-transition", true);
|
|
1269
|
+
(_b = (_a2 = this.shadowRoot) == null ? void 0 : _a2.querySelectorAll("table")) == null ? void 0 : _b.forEach((e) => e.classList.toggle("sbb-calendar__table-hide"));
|
|
1270
|
+
}
|
|
1271
|
+
render() {
|
|
1272
|
+
return html`<div class="sbb-calendar__wrapper">${this._getView()}</div>`;
|
|
1273
|
+
}
|
|
1274
|
+
}, _wide_accessor_storage = new WeakMap(), _view_accessor_storage = new WeakMap(), _dateFilter_accessor_storage = new WeakMap(), __activeDate_accessor_storage = new WeakMap(), __selected_accessor_storage = new WeakMap(), __calendarView_accessor_storage = new WeakMap(), __initialized_accessor_storage = new WeakMap(), _classThis = _a, (() => {
|
|
1275
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
1276
|
+
_wide_decorators = [forceType(), property({ type: Boolean })];
|
|
1277
|
+
_view_decorators = [property()];
|
|
1278
|
+
_set_min_decorators = [property()];
|
|
1279
|
+
_set_max_decorators = [property()];
|
|
1280
|
+
_set_now_decorators = [property()];
|
|
1281
|
+
_set_selected_decorators = [property()];
|
|
1282
|
+
_dateFilter_decorators = [property({ attribute: "date-filter" })];
|
|
1283
|
+
__activeDate_decorators = [state()];
|
|
1284
|
+
__selected_decorators = [state()];
|
|
1285
|
+
_set__wide_decorators = [state()];
|
|
1286
|
+
__calendarView_decorators = [state()];
|
|
1287
|
+
__initialized_decorators = [state()];
|
|
1288
|
+
__esDecorate(_a, null, _wide_decorators, { kind: "accessor", name: "wide", static: false, private: false, access: { has: (obj) => "wide" in obj, get: (obj) => obj.wide, set: (obj, value) => {
|
|
1289
|
+
obj.wide = value;
|
|
1290
|
+
} }, metadata: _metadata }, _wide_initializers, _wide_extraInitializers);
|
|
1291
|
+
__esDecorate(_a, null, _view_decorators, { kind: "accessor", name: "view", static: false, private: false, access: { has: (obj) => "view" in obj, get: (obj) => obj.view, set: (obj, value) => {
|
|
1292
|
+
obj.view = value;
|
|
1293
|
+
} }, metadata: _metadata }, _view_initializers, _view_extraInitializers);
|
|
1294
|
+
__esDecorate(_a, null, _set_min_decorators, { kind: "setter", name: "min", static: false, private: false, access: { has: (obj) => "min" in obj, set: (obj, value) => {
|
|
1295
|
+
obj.min = value;
|
|
1296
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
1297
|
+
__esDecorate(_a, null, _set_max_decorators, { kind: "setter", name: "max", static: false, private: false, access: { has: (obj) => "max" in obj, set: (obj, value) => {
|
|
1298
|
+
obj.max = value;
|
|
1299
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
1300
|
+
__esDecorate(_a, null, _set_now_decorators, { kind: "setter", name: "now", static: false, private: false, access: { has: (obj) => "now" in obj, set: (obj, value) => {
|
|
1301
|
+
obj.now = value;
|
|
1302
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
1303
|
+
__esDecorate(_a, null, _set_selected_decorators, { kind: "setter", name: "selected", static: false, private: false, access: { has: (obj) => "selected" in obj, set: (obj, value) => {
|
|
1304
|
+
obj.selected = value;
|
|
1305
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
1306
|
+
__esDecorate(_a, null, _dateFilter_decorators, { kind: "accessor", name: "dateFilter", static: false, private: false, access: { has: (obj) => "dateFilter" in obj, get: (obj) => obj.dateFilter, set: (obj, value) => {
|
|
1307
|
+
obj.dateFilter = value;
|
|
1308
|
+
} }, metadata: _metadata }, _dateFilter_initializers, _dateFilter_extraInitializers);
|
|
1309
|
+
__esDecorate(_a, null, __activeDate_decorators, { kind: "accessor", name: "_activeDate", static: false, private: false, access: { has: (obj) => "_activeDate" in obj, get: (obj) => obj._activeDate, set: (obj, value) => {
|
|
1310
|
+
obj._activeDate = value;
|
|
1311
|
+
} }, metadata: _metadata }, __activeDate_initializers, __activeDate_extraInitializers);
|
|
1312
|
+
__esDecorate(_a, null, __selected_decorators, { kind: "accessor", name: "_selected", static: false, private: false, access: { has: (obj) => "_selected" in obj, get: (obj) => obj._selected, set: (obj, value) => {
|
|
1313
|
+
obj._selected = value;
|
|
1314
|
+
} }, metadata: _metadata }, __selected_initializers, __selected_extraInitializers);
|
|
1315
|
+
__esDecorate(_a, null, _set__wide_decorators, { kind: "setter", name: "_wide", static: false, private: false, access: { has: (obj) => "_wide" in obj, set: (obj, value) => {
|
|
1316
|
+
obj._wide = value;
|
|
1317
|
+
} }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
1318
|
+
__esDecorate(_a, null, __calendarView_decorators, { kind: "accessor", name: "_calendarView", static: false, private: false, access: { has: (obj) => "_calendarView" in obj, get: (obj) => obj._calendarView, set: (obj, value) => {
|
|
1319
|
+
obj._calendarView = value;
|
|
1320
|
+
} }, metadata: _metadata }, __calendarView_initializers, __calendarView_extraInitializers);
|
|
1321
|
+
__esDecorate(_a, null, __initialized_decorators, { kind: "accessor", name: "_initialized", static: false, private: false, access: { has: (obj) => "_initialized" in obj, get: (obj) => obj._initialized, set: (obj, value) => {
|
|
1322
|
+
obj._initialized = value;
|
|
1323
|
+
} }, metadata: _metadata }, __initialized_initializers, __initialized_extraInitializers);
|
|
1324
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
1325
|
+
SbbCalendarElement2 = _classThis = _classDescriptor.value;
|
|
1326
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1327
|
+
})(), _a.styles = style, _a.events = {
|
|
1328
|
+
dateSelected: "dateSelected"
|
|
1329
|
+
}, __runInitializers(_classThis, _classExtraInitializers), _a);
|
|
1330
|
+
return SbbCalendarElement2 = _classThis;
|
|
1331
|
+
})();
|
|
1330
1332
|
export {
|
|
1331
1333
|
SbbCalendarElement
|
|
1332
1334
|
};
|
|
1333
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLCBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9jb3JlL2ExMXkuanMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9ST1csXG4gIFlFQVJTX1BFUl9QQUdFLFxuICBZRUFSU19QRVJfUk9XLFxufSBmcm9tICcuLi9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGlzQnJlYWtwb2ludCB9IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvcmUvZXZlbnRpbmcuanMnO1xuaW1wb3J0IHtcbiAgaTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvbixcbiAgaTE4bk5leHRNb250aCxcbiAgaTE4bk5leHRZZWFyLFxuICBpMThuTmV4dFllYXJSYW5nZSxcbiAgaTE4blByZXZpb3VzTW9udGgsXG4gIGkxOG5QcmV2aW91c1llYXIsXG4gIGkxOG5QcmV2aW91c1llYXJSYW5nZSxcbiAgaTE4blllYXJNb250aFNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29yZS9pMThuLmpzJztcbmltcG9ydCB0eXBlIHsgU2JiRGF0ZUxpa2UgfSBmcm9tICcuLi9jb3JlL2ludGVyZmFjZXMuanMnO1xuaW1wb3J0IHsgU2JiSHlkcmF0aW9uTWl4aW4gfSBmcm9tICcuLi9jb3JlL21peGlucy5qcyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2NhbGVuZGFyLnNjc3M/bGl0JmlubGluZSc7XG5cbmltcG9ydCAnLi4vYnV0dG9uL3NlY29uZGFyeS1idXR0b24uanMnO1xuaW1wb3J0ICcuLi9pY29uLmpzJztcbmltcG9ydCAnLi4vc2NyZWVuLXJlYWRlci1vbmx5LmpzJztcblxuLyoqXG4gKiBJbiBrZXlib2FyZCBuYXZpZ2F0aW9uLCB0aGUgY2VsbCdzIGluZGV4IGFuZCB0aGUgZWxlbWVudCdzIGluZGV4IGluIGl0cyBtb250aCAvIHllYXIgYmF0Y2ggbXVzdCBiZSBkaXN0aW5ndWlzaGVkO1xuICogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgbmF2aWdhdGlvbiBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uIHVzaW5nIHNvbWUga2V5cyBpcyByZXN0cmljdGVkIHRvIGEgc2luZ2xlIG1vbnRoIGZvciBkYXlzLFxuICogYW5kIHRvIGEgc2luZ2xlIHJhbmdlIG9mIDI0IHllYXJzIGZvciB5ZWFycy4gV2hpbGUgdGhlIGxhdHRlciBpcyBlYXN5IHRvIHVuZGVyc3RhbmQsIHRoZSBjZWxsJ3MgaW5kZXggaXMgdGhlIGluZGV4XG4gKiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXkgb2YgYWxsIHRoZSByZW5kZXJlZCBjZWxscy4gSW4gbm9uLXdpZGUgbW9kZSwgdGhlcmUncyBubyBpc3N1ZSBiZWNhdXNlIHRoZSBlbGVtZW50IGluZGV4XG4gKiBpcyBiYXNpY2FsbHkgdGhlIGNlbGwncyBpbmRleCBwbHVzIDEgKGVsZW1lbnQgd2l0aCBpbmRleCAwIGRpc3BsYXlzIHRoZSAxc3Qgb2YgbW9udGgsIGVsZW1lbnQgd2l0aCBpbmRleCAxIGRpc3BsYXlzIHRoZSAybmQgYW5kIHNvIG9uKS5cbiAqIEluIHdpZGUgbW9kZSwgdGhlIGNlbGwncyBpbmRleCBjYW4gZ28gZnJvbSAwIHRvIDQ3IGZvciB5ZWFycyAodHdvIGJhdGNoZXMgb2YgMjQgeWVhcnMpLCBhbmQgZnJvbSAwIHRvIGEgbWF4aW11bSBvZiA2MSBmb3IgZGF5c1xuICogKHR3byBjb25zZWN1dGl2ZSBtb250aHMgb2YgMzEgZGF5cywgYXMgSnVseS1BdWd1c3Qgb3IgRGVjZW1iZXItSmFudWFyeSksIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RocyBvZiB0aGUgcmVuZGVyZWQgbW9udGhzO1xuICogdGhlIGVsZW1lbnQgaW5kZXggaW5zdGVhZCBnb2VzIGZyb20gMCB0byBhIG1heCB2YWx1ZSBvZiAyNCBmb3IgeWVhcnMgYW5kIDMxIGZvciBkYXlzLlxuICogTW9yZW92ZXIsIGluIGRheSB2aWV3LCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgc2Vjb25kIHJlbmRlcmVkIG1vbnRoIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgcmVuZGVyZWQgZGF5XG4gKiBjYW4gYWxzbyB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaCBtb250aHMgYXJlIHJlbmRlcmVkOyBmb3IgSnVseS1BdWd1c3QgdGhleSBhcmUgZXF1YWxzIHRvIDMxIGFuZCA2MSwgd2hpbGUgZm9yIEZlYnJ1YXJ5LU1hcmNoIHRoZXkgYXJlIDI4IGFuZCA1OC5cbiAqIFNvLCBzb21lIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgbmVlZGVkLCBiZXNpZGUgdGhlIGNlbGwncyBpbmRleCwgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgZWxlbWVudCB0byBuYXZpZ2F0ZSB0by5cbiAqL1xuaW50ZXJmYWNlIENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyB7XG4gIC8qKiBUaGUgZWxlbWVudCBpbmRleCB3aXRoaW4gaXRzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIEluIHdpZGUgbW9kZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZWNvbmQgcGFuZWwsIG9yLCBhbHRlcm5hdGl2ZWx5LCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBwYW5lbC4gKi9cbiAgb2Zmc2V0Rm9yV2lkZU1vZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IHdpdGhpbiB0aGUgZWxlbWVudCdzIG1vbnRoIChvciB5ZWFyIHJhbmdlKS4gKi9cbiAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIGNlbGxzIGRpc3BsYXllZCBpbiBhIHNpbmdsZSByb3csIGRlcGVuZGluZyBvbiB0aGUgcmVuZGVyZWQgdmlldy4gKi9cbiAgdmVydGljYWxPZmZzZXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXkge1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXlWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBzdHJpbmc7XG4gIHllYXJWYWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgbG9uZ1ZhbHVlOiBzdHJpbmc7XG4gIG1vbnRoVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrZGF5IHtcbiAgbG9uZzogc3RyaW5nO1xuICBuYXJyb3c6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ2FsZW5kYXJWaWV3ID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInO1xuXG4vKipcbiAqIEl0IGRpc3BsYXlzIGEgY2FsZW5kYXIgd2hpY2ggYWxsb3dzIHRvIGNob29zZSBhIGRhdGUuXG4gKlxuICogQGV2ZW50IHtDdXN0b21FdmVudDxUPn0gZGF0ZVNlbGVjdGVkIC0gRXZlbnQgZW1pdHRlZCBvbiBkYXRlIHNlbGVjdGlvbi5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5leHBvcnQgY2xhc3MgU2JiQ2FsZW5kYXJFbGVtZW50PFQgPSBEYXRlPiBleHRlbmRzIFNiYkh5ZHJhdGlvbk1peGluKExpdEVsZW1lbnQpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGRhdGVTZWxlY3RlZDogJ2RhdGVTZWxlY3RlZCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIElmIHNldCB0byB0cnVlLCB0d28gbW9udGhzIGFyZSBkaXNwbGF5ZWQgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBwdWJsaWMgd2lkZSA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBTYmJEYXRlTGlrZTxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX21pbj86IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBUYWtlcyBUIE9iamVjdCwgSVNPU3RyaW5nLCBhbmQgVW5peCBUaW1lc3RhbXAgKG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwKS4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXggPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIF9tYXg/OiBUIHwgbnVsbDtcblxuICAvKiogQSBjb25maWd1cmVkIGRhdGUgd2hpY2ggYWN0cyBhcyB0aGUgY3VycmVudCBkYXRlIGluc3RlYWQgb2YgdGhlIHJlYWwgY3VycmVudCBkYXRlLiBSZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBub3codmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm93ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zZWxlY3RlZERhdGUgJiZcbiAgICAgICghdGhpcy5faXNEYXlJblJhbmdlKHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpKSB8fFxuICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX3NlbGVjdGVkRGF0ZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZT86IFQgfCBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pIHB1YmxpYyBkYXRlRmlsdGVyPzogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9kYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJDYWxlbmRhckVsZW1lbnQuZXZlbnRzLmRhdGVTZWxlY3RlZCxcbiAgKTtcblxuICAvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGF0ZS4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBfYWN0aXZlRGF0ZTogVCA9IHRoaXMubm93O1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZSBhcyBJU09TdHJpbmcuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgX3NlbGVjdGVkPzogc3RyaW5nO1xuXG4gIC8qKiBUaGUgY3VycmVudCB3aWRlIHByb3BlcnR5IGNvbnNpZGVyaW5nIHByb3BlcnR5IHZhbHVlIGFuZCBicmVha3BvaW50cy4gRnJvbSB6ZXJvIHRvIHNtYWxsIGB3aWRlYCBoYXMgYWx3YXlzIHRvIGJlIGZhbHNlLiAqL1xuICBAc3RhdGUoKVxuICBwcml2YXRlIHNldCBfd2lkZSh3aWRlOiBib29sZWFuKSB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtd2lkZScsIHdpZGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0IF93aWRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS13aWRlJyk7XG4gIH1cblxuICBAc3RhdGUoKSBwcml2YXRlIF9jYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIHByaXZhdGUgX25leHRDYWxlbmRhclZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIC8qKiBBIGxpc3Qgb2YgZGF5cywgaW4gdHdvIGZvcm1hdHMgKGxvbmcgYW5kIHNpbmdsZSBjaGFyKS4gKi9cbiAgcHJpdmF0ZSBfd2Vla2RheXMhOiBXZWVrZGF5W107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHRoZSBkYXRlcyBvZiB0aGUgbW9udGguICovXG4gIHByaXZhdGUgX3dlZWtzOiBEYXlbXVtdID0gW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIG1vbnRocy4gKi9cbiAgcHJpdmF0ZSBfbW9udGhzITogTW9udGhbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycy4gKi9cbiAgcHJpdmF0ZSBfeWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB5ZWFycyBmb3IgdGhlIHdpZGUgdmlldy4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoWWVhcnMhOiBudW1iZXJbXVtdO1xuXG4gIC8qKiBHcmlkIG9mIGNhbGVuZGFyIGNlbGxzIHJlcHJlc2VudGluZyB0aGUgZGF0ZXMgb2YgdGhlIG5leHQgbW9udGguICovXG4gIHByaXZhdGUgX25leHRNb250aFdlZWtzITogRGF5W11bXTtcblxuICAvKiogQW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG1vbnRoIG5hbWVzIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqL1xuICBwcml2YXRlIF9tb250aE5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKTtcblxuICAvKiogQSBsaXN0IG9mIGJ1dHRvbnMgY29ycmVzcG9uZGluZyB0byBkYXlzLCBtb250aHMgb3IgeWVhcnMgZGVwZW5kaW5nIG9uIHRoZSB2aWV3LiAqL1xuICBwcml2YXRlIGdldCBfY2VsbHMoKTogSFRNTEJ1dHRvbkVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGwnKSA/PyBbXSxcbiAgICApIGFzIEhUTUxCdXR0b25FbGVtZW50W107XG4gIH1cblxuICAvKiogVGhlIGNob3NlbiB5ZWFyIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5ZZWFyPzogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY2hvc2VuIG1vbnRoIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jaG9zZW5Nb250aD86IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgZm9jdXMgc2hvdWxkIGJlIHJlc2V0IG9uIGZvY3VzQ2VsbC4gKi9cbiAgcHJpdmF0ZSBfcmVzZXRGb2N1cyA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYWJvcnQgPSBuZXcgU2JiQ29ubmVjdGVkQWJvcnRDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcykud2l0aEhhbmRsZXIoKCkgPT4ge1xuICAgIHRoaXMuX21vbnRoTmFtZXMgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJyk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NyZWF0ZU1vbnRoUm93cygpO1xuICAgIHRoaXMuX3NldFdlZWtkYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRlRmlsdGVyKGRhdGU6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRmlsdGVyPy4oZGF0ZSkgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGFjdGl2ZSBtb250aCBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY2FsZW5kYXIuICovXG4gIHB1YmxpYyByZXNldFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KCk7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gICAgdGhpcy5mb2N1cyA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5faW5pdCgpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9hYm9ydC5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd3aWRlJykpIHtcbiAgICAgIHRoaXMucmVzZXRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZpZXcnKSkge1xuICAgICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIC8vIFRoZSBjYWxlbmRhciBuZWVkcyB0byBjYWxjdWxhdGUgdGFiLWluZGV4ZXMgb24gZmlyc3QgcmVuZGVyLFxuICAgIC8vIGFuZCBldmVyeSB0aW1lIGEgZGF0ZSBpcyBzZWxlY3RlZCBvciB0aGUgbW9udGggdmlldyBjaGFuZ2VzLlxuICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgLy8gV2hlbiBjaGFuZ2luZyB2aWV3IHRvIHllYXIvbW9udGgsIHRoZSB0YWJpbmRleCBpcyBjaGFuZ2VkLCBidXQgdGhlIGZvY3VzZWQgZWxlbWVudCBpcyBub3QsXG4gICAgLy8gc28gaWYgdGhlIG5hdmlnYXRpb24gaXMgZG9uZSB2aWEga2V5Ym9hcmQsIHRoZXJlJ3MgdGhlIG5lZWRcbiAgICAvLyB0byBjYWxsIHRoZSBgX2ZvY3VzQ2VsbCgpYCBtZXRob2QgZXhwbGljaXRseSB0byBjb3JyZWN0bHkgc2V0IHRoZSBmb2N1cy5cbiAgICBpZiAoc2JiSW5wdXRNb2RhbGl0eURldGVjdG9yLm1vc3RSZWNlbnRNb2RhbGl0eSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgdGhpcy5fZm9jdXNDZWxsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQuICovXG4gIHByaXZhdGUgX2luaXQoYWN0aXZlRGF0ZT86IFQpOiB2b2lkIHtcbiAgICAvL0R1ZSB0byBpdHMgY29tcGxleGl0eSwgdGhlIGNhbGVkYXIgaXMgb25seSBpbml0aWFsaXplZCBvbiBjbGllbnQgc2lkZVxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgdGhpcy5oeWRyYXRpb25Db21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX2luaXQoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZURhdGUpIHtcbiAgICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoYWN0aXZlRGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuX3dpZGUgPSBpc0JyZWFrcG9pbnQoJ21lZGl1bScpICYmIHRoaXMud2lkZTtcbiAgICB0aGlzLl93ZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHRoaXMuX3llYXJzID0gdGhpcy5fY3JlYXRlWWVhclJvd3MoKTtcbiAgICB0aGlzLl9uZXh0TW9udGhXZWVrcyA9IFtbXV07XG4gICAgdGhpcy5fbmV4dE1vbnRoWWVhcnMgPSBbW11dO1xuICAgIGlmICh0aGlzLl93aWRlKSB7XG4gICAgICBjb25zdCBuZXh0TW9udGhEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgMSk7XG4gICAgICB0aGlzLl9uZXh0TW9udGhXZWVrcyA9IHRoaXMuX2NyZWF0ZVdlZWtSb3dzKG5leHRNb250aERhdGUpO1xuICAgICAgdGhpcy5fbmV4dE1vbnRoWWVhcnMgPSB0aGlzLl9jcmVhdGVZZWFyUm93cyhZRUFSU19QRVJfUEFHRSk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIG9uIGEgZGF5IGNlbGwgcHJpb3JpdGl6aW5nIHRoZSBzZWxlY3RlZCBkYXksIHRoZSBjdXJyZW50IGRheSwgYW5kIGxhc3RseSwgdGhlIGZpcnN0IHNlbGVjdGFibGUgZGF5LiAqL1xuICBwcml2YXRlIF9mb2N1c0NlbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jlc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk/LmZvY3VzKCk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFycmF5IG9mIHdlZWtkYXlzLiAqL1xuICBwcml2YXRlIF9zZXRXZWVrZGF5cygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXJyb3dXZWVrZGF5czogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbmFycm93Jyk7XG4gICAgY29uc3QgbG9uZ1dlZWtkYXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdsb25nJyk7XG4gICAgY29uc3Qgd2Vla2RheXM6IFdlZWtkYXlbXSA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmc6IHN0cmluZywgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgbG9uZyxcbiAgICAgIG5hcnJvdzogbmFycm93V2Vla2RheXNbaV0sXG4gICAgfSkpO1xuXG4gICAgLy8gUm90YXRlcyB0aGUgbGFiZWxzIGZvciBkYXlzIG9mIHRoZSB3ZWVrIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICBjb25zdCBmaXJzdERheU9mV2VlazogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0Rmlyc3REYXlPZldlZWsoKTtcbiAgICB0aGlzLl93ZWVrZGF5cyA9IHdlZWtkYXlzLnNsaWNlKGZpcnN0RGF5T2ZXZWVrKS5jb25jYXQod2Vla2RheXMuc2xpY2UoMCwgZmlyc3REYXlPZldlZWspKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSByb3dzIGZvciBlYWNoIHdlZWsuICovXG4gIHByaXZhdGUgX2NyZWF0ZVdlZWtSb3dzKHZhbHVlOiBUKTogRGF5W11bXSB7XG4gICAgY29uc3QgZGF5c0luTW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHZhbHVlKTtcbiAgICBjb25zdCBkYXRlTmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgY29uc3Qgd2Vla3M6IERheVtdW10gPSBbW11dO1xuICAgIGNvbnN0IHdlZWtPZmZzZXQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdFdlZWtPZmZzZXQodmFsdWUpO1xuICAgIGZvciAobGV0IGkgPSAwLCBjZWxsID0gd2Vla09mZnNldDsgaSA8IGRheXNJbk1vbnRoOyBpKyssIGNlbGwrKykge1xuICAgICAgaWYgKGNlbGwgPT09IERBWVNfUEVSX1JPVykge1xuICAgICAgICB3ZWVrcy5wdXNoKFtdKTtcbiAgICAgICAgY2VsbCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih2YWx1ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHZhbHVlKSxcbiAgICAgICAgaSArIDEsXG4gICAgICApITtcbiAgICAgIHdlZWtzW3dlZWtzLmxlbmd0aCAtIDFdLnB1c2goe1xuICAgICAgICB2YWx1ZTogdGhpcy5fZGF0ZUFkYXB0ZXIudG9Jc284NjAxKGRhdGUpLFxuICAgICAgICBkYXlWYWx1ZTogZGF0ZU5hbWVzW2ldLFxuICAgICAgICBtb250aFZhbHVlOiBTdHJpbmcodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkpLFxuICAgICAgICB5ZWFyVmFsdWU6IFN0cmluZyh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgdGhlIG1vbnRoIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVNb250aFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvcnROYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdzaG9ydCcpO1xuICAgIGNvbnN0IG1vbnRoczogTW9udGhbXSA9IG5ldyBBcnJheSgxMikuZmlsbChudWxsKS5tYXAoXG4gICAgICAoXywgaTogbnVtYmVyKTogTW9udGggPT4gKHtcbiAgICAgICAgdmFsdWU6IHNob3J0TmFtZXNbaV0sXG4gICAgICAgIGxvbmdWYWx1ZTogdGhpcy5fbW9udGhOYW1lc1tpXSxcbiAgICAgICAgbW9udGhWYWx1ZTogaSArIDEsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IDEyIC8gTU9OVEhTX1BFUl9ST1c7XG4gICAgY29uc3QgbW9udGhBcnJheTogTW9udGhbXVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgbW9udGhBcnJheS5wdXNoKG1vbnRocy5zbGljZShNT05USFNfUEVSX1JPVyAqIGksIE1PTlRIU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICB0aGlzLl9tb250aHMgPSBtb250aEFycmF5O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyUm93cyhvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXJbXVtdIHtcbiAgICBjb25zdCBzdGFydFZhbHVlWWVhclZpZXc6IG51bWJlciA9IHRoaXMuX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpO1xuICAgIGNvbnN0IGFsbFllYXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShZRUFSU19QRVJfUEFHRSlcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChfLCBpOiBudW1iZXIpID0+IHN0YXJ0VmFsdWVZZWFyVmlldyArIG9mZnNldCArIGkpO1xuICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IFlFQVJTX1BFUl9QQUdFIC8gWUVBUlNfUEVSX1JPVztcbiAgICBjb25zdCB5ZWFyQXJyYXk6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICB5ZWFyQXJyYXkucHVzaChhbGxZZWFycy5zbGljZShZRUFSU19QRVJfUk9XICogaSwgWUVBUlNfUEVSX1JPVyAqIChpICsgMSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHllYXJBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBmaXJzdCB5ZWFyIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgeWVhciBzZWxlY3Rpb24gcGFuZWwuXG4gICAqIElmIGBtaW5EYXRlYCBhbmQgYG1heERhdGVgIGFyZSBib3RoIG51bGwsIHRoZSBzdGFydGluZyB5ZWFyIGlzIGNhbGN1bGF0ZWQgYXNcbiAgICogdGhlIG11bHRpcGxlIG9mIFlFQVJTX1BFUl9QQUdFIGNsb3Nlc3QgdG8gYW5kIGxlc3MgdGhhbiBhY3RpdmVEYXRlLFxuICAgKiBlLmcuLCB3aXRoIGBZRUFSU19QRVJfUEFHRWAgPSAyNCBhbmQgYGFjdGl2ZURhdGVgID0gMjAyMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDIwMTYgKDI0ICogODMpLFxuICAgKiB3aGlsZSB3aXRoIGBhY3RpdmVEYXRlYCA9IDIwMDAsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAxOTkyICgyNCAqIDgyKS5cbiAgICogSWYgYG1pbkRhdGVgIGlzIG5vdCBudWxsLCBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXI7IGlmIGBtYXhEYXRlYCBpcyBub3QgbnVsbCxcbiAgICogaXQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB5ZWFyIG1pbnVzIGBZRUFSU19QRVJfUEFHRWAsIHNvIHRoYXQgdGhlIGBtYXhEYXRlYCBpcyB0aGUgbGFzdCByZW5kZXJlZCB5ZWFyLlxuICAgKiBJZiBib3RoIGFyZSBub3QgbnVsbCwgYG1heERhdGVgIGhhcyBwcmlvcml0eSBvdmVyIGBtaW5EYXRlYC5cbiAgICovXG4gIHByaXZhdGUgX2dldFN0YXJ0VmFsdWVZZWFyVmlldygpOiBudW1iZXIge1xuICAgIGxldCBzdGFydGluZ1llYXIgPSAwO1xuICAgIGlmICh0aGlzLm1heCkge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heCkgLSBZRUFSU19QRVJfUEFHRSArIDE7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbikge1xuICAgICAgc3RhcnRpbmdZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1pbik7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZVllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpO1xuICAgIHJldHVybiAoXG4gICAgICBhY3RpdmVZZWFyIC1cbiAgICAgICgoKChhY3RpdmVZZWFyIC0gc3RhcnRpbmdZZWFyKSAlIFlFQVJTX1BFUl9QQUdFKSArIFlFQVJTX1BFUl9QQUdFKSAlIFlFQVJTX1BFUl9QQUdFKVxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGRhdGUgaXMgd2l0aGluIHRoZSBtaW4tbWF4IHJhbmdlLiAqL1xuICBwcml2YXRlIF9pc0RheUluUmFuZ2UoZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWluISwgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkhKSA+IDA7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuX21heCEsIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpISkgPCAwO1xuICAgIHJldHVybiAhKGlzQmVmb3JlTWluIHx8IGlzQWZ0ZXJNYXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNNb250aEluUmFuZ2UobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWluISkgPj0gdGhpcy5fY2hvc2VuWWVhciEgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX21pbiEpID4gbW9udGg7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fbWF4ISkgPD0gdGhpcy5fY2hvc2VuWWVhciEgJiZcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX21heCEpIDwgbW9udGg7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICBwcml2YXRlIF9pc1llYXJJblJhbmdlKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluICYmICF0aGlzLl9tYXgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0JlZm9yZU1pbjogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21pbikgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9taW4hKSA+IHllYXI7XG4gICAgY29uc3QgaXNBZnRlck1heDogYm9vbGVhbiA9XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMuX21heCkgJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9tYXghKSA8IHllYXI7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICAvLyBJbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL21hdGVyaWFsL2RhdGVwaWNrZXIveWVhci12aWV3LnRzI0wzNjZcbiAgcHJpdmF0ZSBfaXNNb250aEZpbHRlcmVkT3V0KG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGF0ZUZpbHRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RPZk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh0aGlzLl9jaG9zZW5ZZWFyISwgbW9udGgsIDEpITtcbiAgICBmb3IgKFxuICAgICAgbGV0IGRhdGU6IFQgPSBmaXJzdE9mTW9udGg7XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSA9PSBtb250aDtcbiAgICAgIGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW1wbGVtZW50YXRpb24gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL211bHRpLXllYXItdmlldy50cyNMMzUxXG4gIHByaXZhdGUgX2lzWWVhckZpbHRlcmVkT3V0KHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9mWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgMSwgMSkhO1xuICAgIGZvciAoXG4gICAgICBsZXQgZGF0ZTogVCA9IGZpcnN0T2ZZZWFyO1xuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSA9PSB5ZWFyO1xuICAgICAgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGUgYW5kIHNldHMgaXQgaW50ZXJuYWxseS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0RGF0ZShkYXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWQgIT09IGRheSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBkYXk7XG4gICAgICB0aGlzLl9kYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkpISk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2hvc2VuWWVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpID8/IHRoaXMuc2VsZWN0ZWQgPz8gdGhpcy5ub3csXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2lnbkFjdGl2ZURhdGUoZGF0ZTogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9taW4gJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWluLCBkYXRlKSA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9taW47XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXggJiYgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWF4LCBkYXRlKSA8IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9tYXg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICB9XG5cbiAgLyoqIEdvZXMgdG8gdGhlIG1vbnRoIGlkZW50aWZpZWQgYnkgdGhlIHNoaWZ0LiAqL1xuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50TW9udGgobW9udGhzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIG1vbnRocykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ29Ub0RpZmZlcmVudFllYXIoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIhICs9IHllYXJzO1xuICAgIC8vIENhbid0IHVzZSBgX2Fzc2lnbkFjdGl2ZURhdGUoLi4uKWAgaGVyZSwgYmVjYXVzZSBpdCB3aWxsIHNldCBpdCB0byBtaW4vbWF4IHZhbHVlIGlmIGFyZ3VtZW50IGlzIG91dCBvZiByYW5nZVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fY2hvc2VuWWVhciEsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50WWVhclJhbmdlKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0KHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwgeWVhcnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZEaXNhYmxlZChwcmV2RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWluKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShwcmV2RGF0ZSwgdGhpcy5fbWluKSA8IDA7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0RGlzYWJsZWQobmV4dERhdGU6IFQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUobmV4dERhdGUsIHRoaXMuX21heCkgPiAwO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJwcmV2aW91cyBtb250aFwiIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoXG4gICAgICB0aGlzLl9hY3RpdmVEYXRlLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSAqIC0xLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2TW9udGgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiB0aGUgXCJuZXh0IG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5leHRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIHRoaXMuX3dpZGUgPyAyIDogMSk7XG4gICAgbmV4dE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIobmV4dE1vbnRoKSxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKG5leHRNb250aCksXG4gICAgICAxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0TW9udGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmlvdXNZZWFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKSAtIDEsXG4gICAgICAxMixcbiAgICAgIDMxLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXZEaXNhYmxlZChwcmV2WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9uZXh0WWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSkgKyAxLFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldlllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX3llYXJzWzBdWzBdIC0gMSwgMTIsIDMxKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX25leHRZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB5ZWFycyA9IGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFycztcbiAgICBjb25zdCBsYXN0WWVhclJhbmdlID0geWVhcnNbeWVhcnMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbGFzdFllYXIgPSBsYXN0WWVhclJhbmdlW2xhc3RZZWFyUmFuZ2UubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbmV4dFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGxhc3RZZWFyICsgMSwgMSwgMSk7XG4gICAgcmV0dXJuIHRoaXMuX25leHREaXNhYmxlZChuZXh0WWVhcik7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUYWJsZUJsdXIoZXZlbnRUYXJnZXQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50VGFyZ2V0Py5sb2NhbE5hbWUgIT09ICdidXR0b24nKSB7XG4gICAgICB0aGlzLl9zZXRUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFRhYkluZGV4KCk6IHZvaWQge1xuICAgIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYmItY2FsZW5kYXJfX2NlbGxbdGFiaW5kZXg9XCIwXCJdJykgPz8gW10sXG4gICAgKS5mb3JFYWNoKChkYXkpID0+ICgoZGF5IGFzIEhUTUxFbGVtZW50KS50YWJJbmRleCA9IC0xKSk7XG4gICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPSB0aGlzLl9nZXRGaXJzdEZvY3VzYWJsZSgpO1xuICAgIGlmIChmaXJzdEZvY3VzYWJsZSkge1xuICAgICAgZmlyc3RGb2N1c2FibGUudGFiSW5kZXggPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEZpcnN0Rm9jdXNhYmxlKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLl9zZWxlY3RlZCA/IHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEgOiB0aGlzLm5vdztcbiAgICBsZXQgZmlyc3RGb2N1c2FibGUgPVxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLWNhbGVuZGFyX19zZWxlY3RlZCcpID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGBbZGF0YS1kYXk9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUoYWN0aXZlKX0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChcbiAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICl9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihhY3RpdmUpfVwiXWAsXG4gICAgICApID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1vbnRoPVwiJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChhY3RpdmUpfVwiXWApID8/XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXllYXI9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoYWN0aXZlKX1cIl1gKTtcbiAgICBpZiAoIWZpcnN0Rm9jdXNhYmxlIHx8IChmaXJzdEZvY3VzYWJsZSBhcyBIVE1MQnV0dG9uRWxlbWVudCk/LmRpc2FibGVkKSB7XG4gICAgICBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1jYWxlbmRhcl9fY2VsbDpub3QoW2Rpc2FibGVkXSknKTtcbiAgICB9XG4gICAgcmV0dXJuIChmaXJzdEZvY3VzYWJsZSBhcyBIVE1MQnV0dG9uRWxlbWVudCkgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRheT86IERheSk6IHZvaWQge1xuICAgIGlmIChpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyBHZXRzIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgdGFibGUncyBjZWxsO1xuICAgIC8vIHRoZXkgY291bGQgYmUgZGF5cywgbW9udGhzIG9yIHllYXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB2aWV3LlxuICAgIC8vIElmIGB3aWRlYCBpcyB0cnVlLCB5ZWFycyBhcmUgZG91YmxlZCBpbiBudW1iZXIgYW5kIGRheXMgYXJlIChyb3VnaGx5KSBkb3VibGVkIHRvbywgYWZmZWN0aW5nIHRoZSBgaW5kZXhgIGNhbGN1bGF0aW9uLlxuICAgIGNvbnN0IGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdID0gdGhpcy5fY2VsbHM7XG4gICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGNlbGxzLmZpbmRJbmRleCgoZTogSFRNTEJ1dHRvbkVsZW1lbnQpID0+IGUgPT09IGV2ZW50LnRhcmdldCk7XG4gICAgY29uc3QgbmV4dEVsOiBIVE1MQnV0dG9uRWxlbWVudCA9IHRoaXMuX25hdmlnYXRlQnlLZXlib2FyZChldmVudCwgaW5kZXgsIGNlbGxzLCBkYXkpO1xuICAgIGNvbnN0IGFjdGl2ZUVsOiBIVE1MQnV0dG9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdCEuYWN0aXZlRWxlbWVudCBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBpZiAobmV4dEVsICE9PSBhY3RpdmVFbCkge1xuICAgICAgKG5leHRFbCBhcyBIVE1MQnV0dG9uRWxlbWVudCkudGFiSW5kZXggPSAwO1xuICAgICAgbmV4dEVsPy5mb2N1cygpO1xuICAgICAgKGFjdGl2ZUVsIGFzIEhUTUxCdXR0b25FbGVtZW50KS50YWJJbmRleCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRvLCBiYXNlZCBvbiBhIGxpc3Qgb2YgZWxlbWVudHMgKHdoaWNoIGNhbiBiZSBwb3RlbnRpYWxseSBkaXNhYmxlZCksXG4gICAqIHRoZSBrZXlib2FyZCBpbnB1dCBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIGxpc3QuXG4gICAqIEluIHRoZSBkYXkgdmlldywgdGhlIGBkYXk/OiBEYXlgIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgZm9yIGNhbGN1bGF0aW9uLFxuICAgKiB3aGlsZSBpbiBtb250aCBhbmQgeWVhciB2aWV3IGl0J3Mgbm90IGR1ZSB0byB0aGUgZml4ZWQgYW1vdW50IG9mIHJlbmRlcmVkIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBfbmF2aWdhdGVCeUtleWJvYXJkKFxuICAgIGV2dDogS2V5Ym9hcmRFdmVudCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGRheT86IERheSxcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlLFxuICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICB2ZXJ0aWNhbE9mZnNldCxcbiAgICB9OiBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB0aGlzLl9jYWxjdWxhdGVQYXJhbWV0ZXJzRm9yS2V5Ym9hcmROYXZpZ2F0aW9uKFxuICAgICAgY2VsbHMsXG4gICAgICBpbmRleCxcbiAgICAgIGRheSxcbiAgICApO1xuXG4gICAgc3dpdGNoIChldnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgLXZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIC0xKTtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAxKTtcbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0KGNlbGxzLCBvZmZzZXRGb3JXaWRlTW9kZSk7XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEZpcnN0T25Db2x1bW4oXG4gICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGUsXG4gICAgICAgICAgdmVydGljYWxPZmZzZXQsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTGFzdE9uQ29sdW1uKGNlbGxzLCBpbmRleCwgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlLCB2ZXJ0aWNhbE9mZnNldCk7XG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZExhc3QoY2VsbHMsIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSAtIDEpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNlbGxzW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgcGFyYW1ldGVyIG5lZWRlZCBpbiBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgKiBTaW5jZSB0aHJlZSB2aWV3cyBhcmUgbm93IGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgZWFjaCBvZiB0aGVtXG4gICAqIGJ5IGNvbnNpZGVyaW5nIHRoZSBudW1iZXIgb2YgY2VsbHMgcGVyIGVhY2ggcm93IGFuZCB0aGUgY29ycmVjdGlvbiBmb3IgdGhlIHdpZGUgbW9kZS5cbiAgICogQHBhcmFtIGNlbGxzIFRoZSBhcnJheSBvZiByZW5kZXJlZCB0YWJsZSBjZWxsczsgdGhleSBhcmUgYnV0dG9ucyB0aGF0IGNhbiByZXByZXNlbnQgZGF5cywgbW9udGhzIG9yIHllYXJzLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHN0YXJ0aW5nIGVsZW1lbnQncyBpbmRleCBpbiB0aGUgY2VsbCBhcnJheS5cbiAgICogQHBhcmFtIGRheSAob3B0aW9uYWwpIE9ubHkgaW4gdGhlIGRheSB2aWV3LCB0aGUgZGF5IHJlcHJlc2VudGVkIGJ5IHRoZSBzdGFydGluZyBjZWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlUGFyYW1ldGVyc0ZvcktleWJvYXJkTmF2aWdhdGlvbihcbiAgICBjZWxsczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGRheT86IERheSxcbiAgKTogQ2FsZW5kYXJLZXlib2FyZE5hdmlnYXRpb25QYXJhbWV0ZXJzIHtcbiAgICBzd2l0Y2ggKHRoaXMuX2NhbGVuZGFyVmlldykge1xuICAgICAgY2FzZSAnZGF5Jzoge1xuICAgICAgICBjb25zdCBpbmRleEluVmlldyA9ICtkYXkhLmRheVZhbHVlIC0gMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogREFZU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleEluVmlldyxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogaW5kZXggLSBpbmRleEluVmlldyxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6XG4gICAgICAgICAgICBpbmRleCA9PT0gaW5kZXhJblZpZXdcbiAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXkhLnZhbHVlKSEsXG4gICAgICAgICAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY2VsbHMubGVuZ3RoLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gTW9udGggdmlldyBpcyBub3QgZGVwZW5kZW50IGZyb20gYHdpZGVgIHZhbHVlLCBzbyBzb21lIHBhcmFtZXRlcnMgYXJlIGZpeGVkLlxuICAgICAgY2FzZSAnbW9udGgnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IE1PTlRIU19QRVJfUk9XLFxuICAgICAgICAgIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBpbmRleCxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZTogMCxcbiAgICAgICAgICBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IDEyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAneWVhcic6IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSBNYXRoLnRydW5jKGluZGV4IC8gWUVBUlNfUEVSX1BBR0UpICogWUVBUlNfUEVSX1BBR0U7XG4gICAgICAgIGNvbnN0IGluZGV4SW5WaWV3OiBudW1iZXIgPSBvZmZzZXQgPT09IDAgPyBpbmRleCA6IGluZGV4IC0gWUVBUlNfUEVSX1BBR0U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVydGljYWxPZmZzZXQ6IFlFQVJTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4SW5WaWV3LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiBpbmRleCAtIGluZGV4SW5WaWV3LFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogb2Zmc2V0ID09PSAwID8gWUVBUlNfUEVSX1BBR0UgOiBZRUFSU19QRVJfUEFHRSAqIDIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgcHJvdmlkZWQgYXJyYXkgc3RhcnRpbmcgZnJvbSBgaW5kZXhgIGJ5IGFkZGluZyBgZGVsdGFgLlxuICAgKiBJZiB0aGUgZm91bmQgZWxlbWVudCBpcyBkaXNhYmxlZCwgaXQgY29udGludWVzIGFkZGluZyBgZGVsdGFgIHVudGlsIGl0IGZpbmRzIGFuIGVuYWJsZWQgb25lIGluIHRoZSBhcnJheSBib3VuZHMuXG4gICAqL1xuICBwcml2YXRlIF9maW5kTmV4dChkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLCBpbmRleDogbnVtYmVyLCBkZWx0YTogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGxldCBuZXh0SW5kZXggPSBpbmRleCArIGRlbHRhO1xuICAgIHdoaWxlIChuZXh0SW5kZXggPCBkYXlzLmxlbmd0aCAmJiBkYXlzW25leHRJbmRleF0/LmRpc2FibGVkKSB7XG4gICAgICBuZXh0SW5kZXggKz0gZGVsdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXlzW25leHRJbmRleF0gPz8gZGF5c1tpbmRleF07XG4gIH1cblxuICAvKiogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGZpcnN0T2ZDdXJyZW50TW9udGg6IG51bWJlcik6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICByZXR1cm4gIWRheXNbZmlyc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBmaXJzdE9mQ3VycmVudE1vbnRoLCAxKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGxhc3RPZkN1cnJlbnRNb250aDogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiAhZGF5c1tsYXN0T2ZDdXJyZW50TW9udGhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbGFzdE9mQ3VycmVudE1vbnRoXVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBsYXN0T2ZDdXJyZW50TW9udGgsIC0xKTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZEZpcnN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSAoaW5kZXggJSB2ZXJ0aWNhbE9mZnNldCkgKyBvZmZzZXQ7XG4gICAgcmV0dXJuICFkYXlzW25leHRJbmRleF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tuZXh0SW5kZXhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIG5leHRJbmRleCwgdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxhc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgcHJvdmlkZWQgYXJyYXkuICovXG4gIHByaXZhdGUgX2ZpbmRMYXN0T25Db2x1bW4oXG4gICAgZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXIsXG4gICk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBpbmRleCArIE1hdGgudHJ1bmMoKG9mZnNldCAtIGluZGV4IC0gMSkgLyB2ZXJ0aWNhbE9mZnNldCkgKiB2ZXJ0aWNhbE9mZnNldDtcbiAgICByZXR1cm4gIWRheXNbbmV4dEluZGV4XS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW25leHRJbmRleF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbmV4dEluZGV4LCAtdmVydGljYWxPZmZzZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRDYWxlbmRhclZpZXcoaW5pdFRyYW5zaXRpb24gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLnNlbGVjdGVkID8/IHRoaXMubm93O1xuICAgIHRoaXMuX3NldENob3NlblllYXIoKTtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gdGhpcy5fY2FsZW5kYXJWaWV3ID0gdGhpcy52aWV3O1xuXG4gICAgaWYgKGluaXRUcmFuc2l0aW9uKSB7XG4gICAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSBkYXkgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJEYXlWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBuZXh0TW9udGhBY3RpdmVEYXRlID0gdGhpcy5fd2lkZVxuICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50TW9udGgoLTEpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c01vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTW9udGhEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlTGFiZWxGb3JEYXlWaWV3KHRoaXMuX2FjdGl2ZURhdGUpfVxuICAgICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZUxhYmVsRm9yRGF5VmlldyhuZXh0TW9udGhBY3RpdmVEYXRlISkgOiBub3RoaW5nfVxuICAgICAgICAgIDxzYmItc2NyZWVuLXJlYWRlci1vbmx5IHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlQXJpYUxhYmVsRm9yRGF5Vmlldyh0aGlzLl9hY3RpdmVEYXRlLCBuZXh0TW9udGhBY3RpdmVEYXRlISl9XG4gICAgICAgICAgPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRNb250aCgxKSxcbiAgICAgICAgICBpMThuTmV4dE1vbnRoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRNb250aERpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLWRheS12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGUodGhpcy5fd2Vla3MpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVEYXlUYWJsZSh0aGlzLl9uZXh0TW9udGhXZWVrcykgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSBtb250aCBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yRGF5VmlldyhkOiBUKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG1vbnRoTGFiZWwgPSBgJHtcbiAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgIH0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQpfWA7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBpZD1cInNiYi1jYWxlbmRhcl9fZGF0ZS1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiJHtpMThuWWVhck1vbnRoU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke21vbnRoTGFiZWx9XCJcbiAgICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAneWVhcic7XG4gICAgICAgICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgJHttb250aExhYmVsfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtZG93bi1zbWFsbFwiPjwvc2JiLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGFyaWEtbGFiZWwgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KC4uLmRhdGVzOiBUW10pOiBzdHJpbmcge1xuICAgIGxldCBtb250aExhYmVsID0gJyc7XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGVzKSB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICBtb250aExhYmVsICs9IGAke1xuICAgICAgICAgIHRoaXMuX21vbnRoTmFtZXNbdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZCkgLSAxXVxuICAgICAgICB9ICR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1vbnRoTGFiZWw7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgY2FsZW5kYXIgdGFibGUgZm9yIHRoZSBkYWlseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZSh3ZWVrczogRGF5W11bXSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDx0YWJsZVxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgICBAZm9jdXNvdXQ9JHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+XG4gICAgICAgICAgdGhpcy5faGFuZGxlVGFibGVCbHVyKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpfVxuICAgICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICAgID5cbiAgICAgICAgPHRoZWFkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGVIZWFkZXIoKX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheVRhYmxlQm9keSh3ZWVrcyl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgaGVhZGVyIHdpdGggdGhlIG1vbnRoIGhlYWRlciBjZWxscy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5VGFibGVIZWFkZXIoKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzLm1hcChcbiAgICAgIChkYXk6IFdlZWtkYXkpID0+IGh0bWxgXG4gICAgICAgIDx0aCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHk+JHtkYXkubG9uZ308L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JHtkYXkubmFycm93fTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgIGAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBib2R5IHdpdGggdGhlIGRheSBjZWxscy4gRm9yIHRoZSBmaXJzdCByb3csIGl0IGFsc28gY29uc2lkZXJzIHRoZSBwb3NzaWJsZSBkYXkncyBvZmZzZXQuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlQm9keSh3ZWVrczogRGF5W11bXSk6IFRlbXBsYXRlUmVzdWx0W10ge1xuICAgIGNvbnN0IHRvZGF5OiBzdHJpbmcgPSB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEodGhpcy5ub3cpO1xuICAgIHJldHVybiB3ZWVrcy5tYXAoKHdlZWs6IERheVtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvd09mZnNldDogbnVtYmVyID0gREFZU19QRVJfUk9XIC0gd2Vlay5sZW5ndGg7XG4gICAgICBpZiAocm93SW5kZXggPT09IDAgJiYgZmlyc3RSb3dPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgJHtbLi4uQXJyYXkoZmlyc3RSb3dPZmZzZXQpLmtleXMoKV0ubWFwKFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIGh0bWxgPHRkXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YVwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWRheT0ke2AwICR7d2Vla1swXS5tb250aFZhbHVlfSAke3dlZWtbMF0ueWVhclZhbHVlfWB9XG4gICAgICAgICAgICAgICAgPjwvdGQ+YCxcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWssIHRvZGF5KX1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICBgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGh0bWxgPHRyPlxuICAgICAgICAke3RoaXMuX2NyZWF0ZURheUNlbGxzKHdlZWssIHRvZGF5KX1cbiAgICAgIDwvdHI+YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBjZWxscyBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheUNlbGxzKHdlZWs6IERheVtdLCB0b2RheTogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHdlZWsubWFwKChkYXk6IERheSkgPT4ge1xuICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzRGF5SW5SYW5nZShkYXkudmFsdWUpO1xuICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheS52YWx1ZSkhKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkOiBib29sZWFuID0gISF0aGlzLl9zZWxlY3RlZCAmJiBkYXkudmFsdWUgPT09IHRoaXMuX3NlbGVjdGVkO1xuICAgICAgY29uc3QgZGF5VmFsdWUgPSBgJHtkYXkuZGF5VmFsdWV9ICR7ZGF5Lm1vbnRoVmFsdWV9ICR7ZGF5LnllYXJWYWx1ZX1gO1xuICAgICAgY29uc3QgaXNUb2RheSA9IGRheS52YWx1ZSA9PT0gdG9kYXk7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPHRkXG4gICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAnc2JiLWNhbGVuZGFyX190YWJsZS1kYXRhJzogdHJ1ZSxcbiAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEtc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fZGF5JzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbC1jdXJyZW50JzogaXNUb2RheSxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3NlbGVjdERhdGUoZGF5LnZhbHVlKX1cbiAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgYXJpYS1sYWJlbD0ke3RoaXMuX2RhdGVBZGFwdGVyLmdldEFjY2Vzc2liaWxpdHlGb3JtYXREYXRlKGRheS52YWx1ZSl9XG4gICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgIGFyaWEtY3VycmVudD0ke2lzVG9kYXkgPyAnZGF0ZScgOiBub3RoaW5nfVxuICAgICAgICAgICAgZGF0YS1kYXk9JHtkYXlWYWx1ZSB8fCBub3RoaW5nfVxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0LCBkYXkpfVxuICAgICAgICAgICAgc2JiLXBvcG92ZXItY2xvc2VcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke2RheS5kYXlWYWx1ZX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIGA7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9yZW5kZXJNb250aFZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHNcIj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXIoLTEpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c1llYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNZZWFyRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj4ke3RoaXMuX2NyZWF0ZUxhYmVsRm9yTW9udGhWaWV3KCl9PC9kaXY+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhcigxKSxcbiAgICAgICAgICBpMThuTmV4dFllYXJbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dFllYXJEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1jb250YWluZXIgc2JiLWNhbGVuZGFyX190YWJsZS1tb250aC12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlTW9udGhUYWJsZSh0aGlzLl9tb250aHMsIHRoaXMuX2Nob3NlblllYXIhICsgMSwgdHJ1ZSkgOiBub3RoaW5nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSB5ZWFyIGZvciB0aGUgbW9udGhseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvck1vbnRoVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19tb250aC1zZWxlY3Rpb25cIlxuICAgICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtY2hhbmdlLWRhdGVcIlxuICAgICAgICBhcmlhLWxhYmVsPSR7YCR7aTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt0aGlzLl9jaG9zZW5ZZWFyfWB9XG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX2Nob3NlblllYXJ9ICR7dGhpcy5fd2lkZSA/IGAgLSAke3RoaXMuX2Nob3NlblllYXIhICsgMX1gIDogbm90aGluZ31cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3RoaXMuX2Nob3NlblllYXJ9IDwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5gO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGZvciB0aGUgbW9udGggc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZU1vbnRoVGFibGUobW9udGhzOiBNb250aFtdW10sIHllYXI6IG51bWJlciwgc2hpZnRSaWdodCA9IGZhbHNlKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHRhYmxlXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgIEBhbmltYXRpb25lbmQ9JHsoZTogQW5pbWF0aW9uRXZlbnQpID0+IHRoaXMuX3RhYmxlQW5pbWF0aW9uRW5kKGUpfVxuICAgICAgPlxuICAgICAgICAke3RoaXMuX3dpZGVcbiAgICAgICAgICA/IGh0bWxgPHRoZWFkIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIiBjb2xzcGFuPSR7TU9OVEhTX1BFUl9ST1d9PiR7eWVhcn08L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgICAke21vbnRocy5tYXAoXG4gICAgICAgICAgICAocm93OiBNb250aFtdKSA9PiBodG1sYFxuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgJHtyb3cubWFwKChtb250aDogTW9udGgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc01vbnRoSW5SYW5nZShtb250aC5tb250aFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5faXNNb250aEZpbHRlcmVkT3V0KG1vbnRoLm1vbnRoVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHRoaXMuX3NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICEhdGhpcy5fc2VsZWN0ZWQgJiYgeWVhciA9PT0gc2VsZWN0ZWRZZWFyICYmIG1vbnRoLm1vbnRoVmFsdWUgPT09IHNlbGVjdGVkTW9udGg7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudE1vbnRoID1cbiAgICAgICAgICAgICAgICAgICAgeWVhciA9PT0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm5vdykgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5ub3cpID09PSBtb250aC5tb250aFZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGAgPHRkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLW1vbnRoJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fcGlsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2Nyb3NzZWQtb3V0JzogIWlzT3V0T2ZSYW5nZSAmJiBpc0ZpbHRlcmVkT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLl9vbk1vbnRoU2VsZWN0aW9uKG1vbnRoLm1vbnRoVmFsdWUsIHllYXIsIHNoaWZ0UmlnaHQpfVxuICAgICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtgJHttb250aC5sb25nVmFsdWV9ICR7dGhpcy5fY2hvc2VuWWVhcn1gfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9JHtTdHJpbmcoaXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXQpfVxuICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbW9udGg9JHttb250aC5tb250aFZhbHVlIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAke21vbnRoLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIG1vbnRoIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gZGF5IHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfb25Nb250aFNlbGVjdGlvbihtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNoaWZ0UmlnaHQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHNoaWZ0UmlnaHQgPyBtb250aCArIDEgOiBtb250aDtcbiAgICB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3ID0gJ2RheSc7XG4gICAgdGhpcy5faW5pdChcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHllYXIsXG4gICAgICAgIHRoaXMuX2Nob3Nlbk1vbnRoLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gIH1cblxuICAvKiogUmVuZGVyIHRoZSB2aWV3IGZvciB0aGUgeWVhciBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoLVlFQVJTX1BFUl9QQUdFKSxcbiAgICAgICAgICBpMThuUHJldmlvdXNZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHMtbW9udGhcIj4ke3RoaXMuX2NyZWF0ZUxhYmVsRm9yWWVhclZpZXcoKX08L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpLFxuICAgICAgICAgIGkxOG5OZXh0WWVhclJhbmdlKFlFQVJTX1BFUl9QQUdFKVt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9uZXh0WWVhclJhbmdlRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUteWVhci12aWV3XCI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX3llYXJzKX1cbiAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlWWVhclRhYmxlKHRoaXMuX25leHRNb250aFllYXJzLCB0cnVlKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGJ1dHRvbiBhcnJvdyBmb3IgYWxsIHRoZSB2aWV3cy4gKi9cbiAgcHJpdmF0ZSBfZ2V0QXJyb3coXG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnLFxuICAgIGNsaWNrOiAoKSA9PiB2b2lkLFxuICAgIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgIGRpc2FibGVkOiBib29sZWFuLFxuICApOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPHNiYi1zZWNvbmRhcnktYnV0dG9uXG4gICAgICBzaXplPVwibVwiXG4gICAgICBpY29uLW5hbWU9XCJjaGV2cm9uLXNtYWxsLSR7ZGlyZWN0aW9ufS1zbWFsbFwiXG4gICAgICBhcmlhLWxhYmVsPSR7YXJpYUxhYmVsfVxuICAgICAgQGNsaWNrPSR7Y2xpY2t9XG4gICAgICA/ZGlzYWJsZWQ9JHtkaXNhYmxlZH1cbiAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19jb250cm9scy0ke2RpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJ3ByZXZpb3VzJyA6ICduZXh0J31cIlxuICAgID48L3NiYi1zZWNvbmRhcnktYnV0dG9uPmA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgbGFiZWwgd2l0aCB0aGUgeWVhciByYW5nZSBmb3IgdGhlIHllYXJseSB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVMYWJlbEZvclllYXJWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBmaXJzdFllYXI6IG51bWJlciA9IHRoaXMuX3llYXJzLmZsYXQoKVswXTtcbiAgICBjb25zdCBsYXN0WWVhckFycmF5OiBudW1iZXJbXSA9IChcbiAgICAgIGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlID8gdGhpcy5fbmV4dE1vbnRoWWVhcnMgOiB0aGlzLl95ZWFyc1xuICAgICkuZmxhdCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyOiBudW1iZXIgPSBsYXN0WWVhckFycmF5W2xhc3RZZWFyQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgeWVhckxhYmVsID0gYCR7Zmlyc3RZZWFyfSAtICR7bGFzdFllYXJ9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX195ZWFyLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2kxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7eWVhckxhYmVsfVwiXG4gICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX3Jlc2V0Q2FsZW5kYXJWaWV3KHRydWUpfVxuICAgICAgPlxuICAgICAgICAke3llYXJMYWJlbH1cbiAgICAgICAgPHNiYi1pY29uIG5hbWU9XCJjaGV2cm9uLXNtYWxsLXVwLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPiAke3llYXJMYWJlbH0gPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbiB2aWV3LiAqL1xuICBwcml2YXRlIF9jcmVhdGVZZWFyVGFibGUoeWVhcnM6IG51bWJlcltdW10sIHNoaWZ0UmlnaHQgPSBmYWxzZSk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBjb25zdCBub3cgPSB0aGlzLm5vdztcbiAgICByZXR1cm4gaHRtbGAgPHRhYmxlXG4gICAgICBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGVcIlxuICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgPlxuICAgICAgPHRib2R5IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1ib2R5XCI+XG4gICAgICAgICR7eWVhcnMubWFwKFxuICAgICAgICAgIChyb3c6IG51bWJlcltdKSA9PlxuICAgICAgICAgICAgaHRtbGAgPHRyPlxuICAgICAgICAgICAgICAke3Jvdy5tYXAoKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0T2ZSYW5nZSA9ICF0aGlzLl9pc1llYXJJblJhbmdlKHllYXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyZWRPdXQgPSAhdGhpcy5faXNZZWFyRmlsdGVyZWRPdXQoeWVhcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQ6IGJvb2xlYW4gPSAhIXRoaXMuX3NlbGVjdGVkICYmIHllYXIgPT09IHNlbGVjdGVkWWVhcjtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihub3cpID09PSB5ZWFyO1xuICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEgc2JiLWNhbGVuZGFyX190YWJsZS15ZWFyXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3BpbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudFllYXIsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fc2VsZWN0ZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uWWVhclNlbGVjdGlvbih5ZWFyLCBzaGlmdFJpZ2h0KX1cbiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHt5ZWFyfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLXByZXNzZWQ9JHtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXllYXI9JHt5ZWFyIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAke3llYXJ9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPmA7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC90cj5gLFxuICAgICAgICApfVxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPmA7XG4gIH1cblxuICAvKiogU2VsZWN0IHRoZSB5ZWFyIGFuZCBjaGFuZ2UgdGhlIHZpZXcgdG8gbW9udGggc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vblllYXJTZWxlY3Rpb24oeWVhcjogbnVtYmVyLCByaWdodFNpZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jaG9zZW5ZZWFyID0gcmlnaHRTaWRlID8geWVhciAtIDEgOiB5ZWFyO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAnbW9udGgnO1xuICAgIHRoaXMuX2Fzc2lnbkFjdGl2ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9jaG9zZW5ZZWFyLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgaWYgKGlzU2VydmVyIHx8IHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIC8vIFRPRE86IFdlIGRpc2FibGUgU1NSIGZvciBjYWxlbmRhciBmb3Igbm93LiBGaWd1cmUgb3VyLCBpZiB0aGVyZSBpcyBhIHdheVxuICAgICAgLy8gdG8gZW5hYmxlIGl0LCB3aGlsZSBjb25zaWRlcmluZyBpMThuIGFuZCBkYXRlIGluZm9ybWF0aW9uLlxuICAgICAgcmV0dXJuIGh0bWxgJHtub3RoaW5nfWA7XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5fY2FsZW5kYXJWaWV3KSB7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclllYXJWaWV3KCk7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJNb250aFZpZXcoKTtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRGF5VmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlQW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnaGlkZScpIHtcbiAgICAgIHRhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ3NiYi1jYWxlbmRhcl9fdGFibGUtaGlkZScpO1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLl9uZXh0Q2FsZW5kYXJWaWV3O1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ3Nob3cnKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUYWJsZVRyYW5zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtdHJhbnNpdGlvbicsIHRydWUpO1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yQWxsKCd0YWJsZScpXG4gICAgICA/LmZvckVhY2goKGUpID0+IGUuY2xhc3NMaXN0LnRvZ2dsZSgnc2JiLWNhbGVuZGFyX190YWJsZS1oaWRlJykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fd3JhcHBlclwiPiR7dGhpcy5fZ2V0VmlldygpfTwvZGl2PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgJ3NiYi1jYWxlbmRhcic6IFNiYkNhbGVuZGFyRWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4Rk8sSUFBTSxxQkFBTixjQUEyQyxrQkFBa0IsVUFBVSxFQUFFO0FBQUEsRUF5SXZFLGNBQWM7O0FBQ2I7QUFuSXFCLFNBQU8sT0FBTztBQUcvQixTQUFPLE9BQXFCO0FBOEJ4QyxTQUFRLE9BQWlCO0FBd0J6QixTQUFRLGlCQUErQixnQkFBQSxFQUFhLGFBQWIsbUJBQXVCLGdCQUFlO0FBRzdFLFNBQVEsZ0JBQWlDLElBQUk7QUFBQSxNQUMzQztBQUFBLE1BQ0EsbUJBQW1CLE9BQU87QUFBQSxJQUFBO0FBSW5CLFNBQVEsY0FBaUIs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
|
|
1335
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9jYWxlbmRhci9jYWxlbmRhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIENTU1Jlc3VsdEdyb3VwLFxuICBodG1sLFxuICBpc1NlcnZlcixcbiAgTGl0RWxlbWVudCxcbiAgbm90aGluZyxcbiAgdHlwZSBQcm9wZXJ0eVZhbHVlcyxcbiAgdHlwZSBUZW1wbGF0ZVJlc3VsdCxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzJztcblxuaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkLCBzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IgfSBmcm9tICcuLi9jb3JlL2ExMXkuanMnO1xuaW1wb3J0IHsgcmVhZENvbmZpZyB9IGZyb20gJy4uL2NvcmUvY29uZmlnLmpzJztcbmltcG9ydCB7IFNiYkNvbm5lY3RlZEFib3J0Q29udHJvbGxlciwgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vY29yZS9kYXRldGltZS5qcyc7XG5pbXBvcnQge1xuICBEQVlTX1BFUl9ST1csXG4gIGRlZmF1bHREYXRlQWRhcHRlcixcbiAgTU9OVEhTX1BFUl9ST1csXG4gIFlFQVJTX1BFUl9QQUdFLFxuICBZRUFSU19QRVJfUk9XLFxufSBmcm9tICcuLi9jb3JlL2RhdGV0aW1lLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpc0JyZWFrcG9pbnQgfSBmcm9tICcuLi9jb3JlL2RvbS5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb3JlL2V2ZW50aW5nLmpzJztcbmltcG9ydCB7XG4gIGkxOG5DYWxlbmRhckRhdGVTZWxlY3Rpb24sXG4gIGkxOG5OZXh0TW9udGgsXG4gIGkxOG5OZXh0WWVhcixcbiAgaTE4bk5leHRZZWFyUmFuZ2UsXG4gIGkxOG5QcmV2aW91c01vbnRoLFxuICBpMThuUHJldmlvdXNZZWFyLFxuICBpMThuUHJldmlvdXNZZWFyUmFuZ2UsXG4gIGkxOG5ZZWFyTW9udGhTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvcmUvaTE4bi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYkRhdGVMaWtlIH0gZnJvbSAnLi4vY29yZS9pbnRlcmZhY2VzLmpzJztcbmltcG9ydCB7IFNiYkh5ZHJhdGlvbk1peGluIH0gZnJvbSAnLi4vY29yZS9taXhpbnMuanMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9jYWxlbmRhci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5pbXBvcnQgJy4uL2J1dHRvbi9zZWNvbmRhcnktYnV0dG9uLmpzJztcbmltcG9ydCAnLi4vaWNvbi5qcyc7XG5pbXBvcnQgJy4uL3NjcmVlbi1yZWFkZXItb25seS5qcyc7XG5cbi8qKlxuICogSW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiwgdGhlIGNlbGwncyBpbmRleCBhbmQgdGhlIGVsZW1lbnQncyBpbmRleCBpbiBpdHMgbW9udGggLyB5ZWFyIGJhdGNoIG11c3QgYmUgZGlzdGluZ3Vpc2hlZDtcbiAqIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5hdmlnYXRpb24gaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiB1c2luZyBzb21lIGtleXMgaXMgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBtb250aCBmb3IgZGF5cyxcbiAqIGFuZCB0byBhIHNpbmdsZSByYW5nZSBvZiAyNCB5ZWFycyBmb3IgeWVhcnMuIFdoaWxlIHRoZSBsYXR0ZXIgaXMgZWFzeSB0byB1bmRlcnN0YW5kLCB0aGUgY2VsbCdzIGluZGV4IGlzIHRoZSBpbmRleFxuICogb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGFycmF5IG9mIGFsbCB0aGUgcmVuZGVyZWQgY2VsbHMuIEluIG5vbi13aWRlIG1vZGUsIHRoZXJlJ3Mgbm8gaXNzdWUgYmVjYXVzZSB0aGUgZWxlbWVudCBpbmRleFxuICogaXMgYmFzaWNhbGx5IHRoZSBjZWxsJ3MgaW5kZXggcGx1cyAxIChlbGVtZW50IHdpdGggaW5kZXggMCBkaXNwbGF5cyB0aGUgMXN0IG9mIG1vbnRoLCBlbGVtZW50IHdpdGggaW5kZXggMSBkaXNwbGF5cyB0aGUgMm5kIGFuZCBzbyBvbikuXG4gKiBJbiB3aWRlIG1vZGUsIHRoZSBjZWxsJ3MgaW5kZXggY2FuIGdvIGZyb20gMCB0byA0NyBmb3IgeWVhcnMgKHR3byBiYXRjaGVzIG9mIDI0IHllYXJzKSwgYW5kIGZyb20gMCB0byBhIG1heGltdW0gb2YgNjEgZm9yIGRheXNcbiAqICh0d28gY29uc2VjdXRpdmUgbW9udGhzIG9mIDMxIGRheXMsIGFzIEp1bHktQXVndXN0IG9yIERlY2VtYmVyLUphbnVhcnkpLCBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aHMgb2YgdGhlIHJlbmRlcmVkIG1vbnRocztcbiAqIHRoZSBlbGVtZW50IGluZGV4IGluc3RlYWQgZ29lcyBmcm9tIDAgdG8gYSBtYXggdmFsdWUgb2YgMjQgZm9yIHllYXJzIGFuZCAzMSBmb3IgZGF5cy5cbiAqIE1vcmVvdmVyLCBpbiBkYXkgdmlldywgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHNlY29uZCByZW5kZXJlZCBtb250aCBhbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHJlbmRlcmVkIGRheVxuICogY2FuIGFsc28gdmFyeSBkZXBlbmRpbmcgb24gd2hpY2ggbW9udGhzIGFyZSByZW5kZXJlZDsgZm9yIEp1bHktQXVndXN0IHRoZXkgYXJlIGVxdWFscyB0byAzMSBhbmQgNjEsIHdoaWxlIGZvciBGZWJydWFyeS1NYXJjaCB0aGV5IGFyZSAyOCBhbmQgNTguXG4gKiBTbywgc29tZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZCwgYmVzaWRlIHRoZSBjZWxsJ3MgaW5kZXgsIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgdG8gbmF2aWdhdGUgdG8uXG4gKi9cbmludGVyZmFjZSBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMge1xuICAvKiogVGhlIGVsZW1lbnQgaW5kZXggd2l0aGluIGl0cyBtb250aCAob3IgeWVhciByYW5nZSkuICovXG4gIGVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBJbiB3aWRlIG1vZGUsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2Vjb25kIHBhbmVsLCBvciwgYWx0ZXJuYXRpdmVseSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZmlyc3QgcGFuZWwuICovXG4gIG9mZnNldEZvcldpZGVNb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCB3aXRoaW4gdGhlIGVsZW1lbnQncyBtb250aCAob3IgeWVhciByYW5nZSkuICovXG4gIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogbnVtYmVyO1xuICAvKiogVGhlIG51bWJlciBvZiBjZWxscyBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgcm93LCBkZXBlbmRpbmcgb24gdGhlIHJlbmRlcmVkIHZpZXcuICovXG4gIHZlcnRpY2FsT2Zmc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF5IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgZGF5VmFsdWU6IHN0cmluZztcbiAgbW9udGhWYWx1ZTogc3RyaW5nO1xuICB5ZWFyVmFsdWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aCB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxvbmdWYWx1ZTogc3RyaW5nO1xuICBtb250aFZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vla2RheSB7XG4gIGxvbmc6IHN0cmluZztcbiAgbmFycm93OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENhbGVuZGFyVmlldyA9ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJztcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIGNhbGVuZGFyIHdoaWNoIGFsbG93cyB0byBjaG9vc2UgYSBkYXRlLlxuICpcbiAqIEBldmVudCB7Q3VzdG9tRXZlbnQ8VD59IGRhdGVTZWxlY3RlZCAtIEV2ZW50IGVtaXR0ZWQgb24gZGF0ZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydFxuQGN1c3RvbUVsZW1lbnQoJ3NiYi1jYWxlbmRhcicpXG5jbGFzcyBTYmJDYWxlbmRhckVsZW1lbnQ8VCA9IERhdGU+IGV4dGVuZHMgU2JiSHlkcmF0aW9uTWl4aW4oTGl0RWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgZGF0ZVNlbGVjdGVkOiAnZGF0ZVNlbGVjdGVkJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogSWYgc2V0IHRvIHRydWUsIHR3byBtb250aHMgYXJlIGRpc3BsYXllZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igd2lkZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCB2aWV3IG9mIHRoZSBjYWxlbmRhciB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkIG9uIG9wZW5pbmcuICovXG4gIEBwcm9wZXJ0eSgpIHB1YmxpYyBhY2Nlc3NvciB2aWV3OiBDYWxlbmRhclZpZXcgPSAnZGF5JztcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBTYmJEYXRlTGlrZTxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9taW4gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbigpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX21pbj86IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBUYWtlcyBUIE9iamVjdCwgSVNPU3RyaW5nLCBhbmQgVW5peCBUaW1lc3RhbXAgKG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwKS4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBtYXgodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBtYXgoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXggPz8gbnVsbDtcbiAgfVxuICBwcml2YXRlIF9tYXg/OiBUIHwgbnVsbDtcblxuICAvKiogQSBjb25maWd1cmVkIGRhdGUgd2hpY2ggYWN0cyBhcyB0aGUgY3VycmVudCBkYXRlIGluc3RlYWQgb2YgdGhlIHJlYWwgY3VycmVudCBkYXRlLiBSZWNvbW1lbmRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIHNldCBub3codmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm93ID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHVibGljIGdldCBub3coKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdyA/PyB0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO1xuICB9XG4gIHByaXZhdGUgX25vdzogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZS4gVGFrZXMgVCBPYmplY3QsIElTT1N0cmluZywgYW5kIFVuaXggVGltZXN0YW1wIChudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCkuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodmFsdWU6IFNiYkRhdGVMaWtlPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zZWxlY3RlZERhdGUgJiZcbiAgICAgICghdGhpcy5faXNEYXlJblJhbmdlKHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpKSB8fFxuICAgICAgICB0aGlzLl9kYXRlRmlsdGVyKHRoaXMuX3NlbGVjdGVkRGF0ZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkRGF0ZT86IFQgfCBudWxsO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIG91dCBkYXRlcy4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0ZS1maWx0ZXInIH0pIHB1YmxpYyBhY2Nlc3NvciBkYXRlRmlsdGVyOlxuICAgIHwgKChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbilcbiAgICB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2RhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxUPiA9IHJlYWRDb25maWcoKS5kYXRldGltZT8uZGF0ZUFkYXB0ZXIgPz8gZGVmYXVsdERhdGVBZGFwdGVyO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9kYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXIoXG4gICAgdGhpcyxcbiAgICBTYmJDYWxlbmRhckVsZW1lbnQuZXZlbnRzLmRhdGVTZWxlY3RlZCxcbiAgKTtcblxuICAvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGF0ZS4gKi9cbiAgQHN0YXRlKCkgcHJpdmF0ZSBhY2Nlc3NvciBfYWN0aXZlRGF0ZTogVCA9IHRoaXMubm93O1xuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgZGF0ZSBhcyBJU09TdHJpbmcuICovXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX3NlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBjdXJyZW50IHdpZGUgcHJvcGVydHkgY29uc2lkZXJpbmcgcHJvcGVydHkgdmFsdWUgYW5kIGJyZWFrcG9pbnRzLiBGcm9tIHplcm8gdG8gc21hbGwgYHdpZGVgIGhhcyBhbHdheXMgdG8gYmUgZmFsc2UuICovXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgc2V0IF93aWRlKHdpZGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS13aWRlJywgd2lkZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgX3dpZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXdpZGUnKTtcbiAgfVxuXG4gIEBzdGF0ZSgpIHByaXZhdGUgYWNjZXNzb3IgX2NhbGVuZGFyVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgcHJpdmF0ZSBfbmV4dENhbGVuZGFyVmlldzogQ2FsZW5kYXJWaWV3ID0gJ2RheSc7XG5cbiAgLyoqIEEgbGlzdCBvZiBkYXlzLCBpbiB0d28gZm9ybWF0cyAobG9uZyBhbmQgc2luZ2xlIGNoYXIpLiAqL1xuICBwcml2YXRlIF93ZWVrZGF5cyE6IFdlZWtkYXlbXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgdGhlIGRhdGVzIG9mIHRoZSBtb250aC4gKi9cbiAgcHJpdmF0ZSBfd2Vla3M6IERheVtdW10gPSBbXTtcblxuICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgbW9udGhzLiAqL1xuICBwcml2YXRlIF9tb250aHMhOiBNb250aFtdW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHllYXJzLiAqL1xuICBwcml2YXRlIF95ZWFycyE6IG51bWJlcltdW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHllYXJzIGZvciB0aGUgd2lkZSB2aWV3LiAqL1xuICBwcml2YXRlIF9uZXh0TW9udGhZZWFycyE6IG51bWJlcltdW107XG5cbiAgLyoqIEdyaWQgb2YgY2FsZW5kYXIgY2VsbHMgcmVwcmVzZW50aW5nIHRoZSBkYXRlcyBvZiB0aGUgbmV4dCBtb250aC4gKi9cbiAgcHJpdmF0ZSBfbmV4dE1vbnRoV2Vla3MhOiBEYXlbXVtdO1xuXG4gIC8qKiBBbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgbW9udGggbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICovXG4gIHByaXZhdGUgX21vbnRoTmFtZXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygnbG9uZycpO1xuXG4gIC8qKiBBIGxpc3Qgb2YgYnV0dG9ucyBjb3JyZXNwb25kaW5nIHRvIGRheXMsIG1vbnRocyBvciB5ZWFycyBkZXBlbmRpbmcgb24gdGhlIHZpZXcuICovXG4gIHByaXZhdGUgZ2V0IF9jZWxscygpOiBIVE1MQnV0dG9uRWxlbWVudFtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvckFsbCgnLnNiYi1jYWxlbmRhcl9fY2VsbCcpID8/IFtdLFxuICAgICkgYXMgSFRNTEJ1dHRvbkVsZW1lbnRbXTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hvc2VuIHllYXIgaW4gdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2Nob3NlblllYXI/OiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjaG9zZW4gbW9udGggaW4gdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2Nob3Nlbk1vbnRoPzogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBmb2N1cyBzaG91bGQgYmUgcmVzZXQgb24gZm9jdXNDZWxsLiAqL1xuICBwcml2YXRlIF9yZXNldEZvY3VzID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBhY2Nlc3NvciBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9hYm9ydCA9IG5ldyBTYmJDb25uZWN0ZWRBYm9ydENvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKS53aXRoSGFuZGxlcigoKSA9PiB7XG4gICAgdGhpcy5fbW9udGhOYW1lcyA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKTtcbiAgICB0aGlzLl9jcmVhdGVNb250aFJvd3MoKTtcbiAgfSk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY3JlYXRlTW9udGhSb3dzKCk7XG4gICAgdGhpcy5fc2V0V2Vla2RheXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGVGaWx0ZXIoZGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGVGaWx0ZXI/LihkYXRlKSA/PyB0cnVlO1xuICB9XG5cbiAgLyoqIFJlc2V0cyB0aGUgYWN0aXZlIG1vbnRoIGFjY29yZGluZyB0byB0aGUgbmV3IHN0YXRlIG9mIHRoZSBjYWxlbmRhci4gKi9cbiAgcHVibGljIHJlc2V0UG9zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzZXRDYWxlbmRhclZpZXcoKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTtcbiAgICB0aGlzLmZvY3VzID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLl9mb2N1c0NlbGwoKTtcbiAgICB9O1xuICAgIGdsb2JhbFRoaXMud2luZG93Py5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9pbml0KCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX2Fib3J0LnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3dpZGUnKSkge1xuICAgICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygndmlldycpKSB7XG4gICAgICB0aGlzLl9zZXRDaG9zZW5ZZWFyKCk7XG4gICAgICB0aGlzLl9jaG9zZW5Nb250aCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLnZpZXc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgLy8gVGhlIGNhbGVuZGFyIG5lZWRzIHRvIGNhbGN1bGF0ZSB0YWItaW5kZXhlcyBvbiBmaXJzdCByZW5kZXIsXG4gICAgLy8gYW5kIGV2ZXJ5IHRpbWUgYSBkYXRlIGlzIHNlbGVjdGVkIG9yIHRoZSBtb250aCB2aWV3IGNoYW5nZXMuXG4gICAgdGhpcy5fc2V0VGFiSW5kZXgoKTtcbiAgICAvLyBXaGVuIGNoYW5naW5nIHZpZXcgdG8geWVhci9tb250aCwgdGhlIHRhYmluZGV4IGlzIGNoYW5nZWQsIGJ1dCB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIG5vdCxcbiAgICAvLyBzbyBpZiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lIHZpYSBrZXlib2FyZCwgdGhlcmUncyB0aGUgbmVlZFxuICAgIC8vIHRvIGNhbGwgdGhlIGBfZm9jdXNDZWxsKClgIG1ldGhvZCBleHBsaWNpdGx5IHRvIGNvcnJlY3RseSBzZXQgdGhlIGZvY3VzLlxuICAgIGlmIChzYmJJbnB1dE1vZGFsaXR5RGV0ZWN0b3IubW9zdFJlY2VudE1vZGFsaXR5ID09PSAna2V5Ym9hcmQnKSB7XG4gICAgICB0aGlzLl9mb2N1c0NlbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudC4gKi9cbiAgcHJpdmF0ZSBfaW5pdChhY3RpdmVEYXRlPzogVCk6IHZvaWQge1xuICAgIC8vRHVlIHRvIGl0cyBjb21wbGV4aXR5LCB0aGUgY2FsZWRhciBpcyBvbmx5IGluaXRpYWxpemVkIG9uIGNsaWVudCBzaWRlXG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5faW5pdCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlRGF0ZSkge1xuICAgICAgdGhpcy5fYXNzaWduQWN0aXZlRGF0ZShhY3RpdmVEYXRlKTtcbiAgICB9XG4gICAgdGhpcy5fd2lkZSA9IGlzQnJlYWtwb2ludCgnbWVkaXVtJykgJiYgdGhpcy53aWRlO1xuICAgIHRoaXMuX3dlZWtzID0gdGhpcy5fY3JlYXRlV2Vla1Jvd3ModGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgdGhpcy5feWVhcnMgPSB0aGlzLl9jcmVhdGVZZWFyUm93cygpO1xuICAgIHRoaXMuX25leHRNb250aFdlZWtzID0gW1tdXTtcbiAgICB0aGlzLl9uZXh0TW9udGhZZWFycyA9IFtbXV07XG4gICAgaWYgKHRoaXMuX3dpZGUpIHtcbiAgICAgIGNvbnN0IG5leHRNb250aERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLCAxKTtcbiAgICAgIHRoaXMuX25leHRNb250aFdlZWtzID0gdGhpcy5fY3JlYXRlV2Vla1Jvd3MobmV4dE1vbnRoRGF0ZSk7XG4gICAgICB0aGlzLl9uZXh0TW9udGhZZWFycyA9IHRoaXMuX2NyZWF0ZVllYXJSb3dzKFlFQVJTX1BFUl9QQUdFKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqIEZvY3VzZXMgb24gYSBkYXkgY2VsbCBwcmlvcml0aXppbmcgdGhlIHNlbGVjdGVkIGRheSwgdGhlIGN1cnJlbnQgZGF5LCBhbmQgbGFzdGx5LCB0aGUgZmlyc3Qgc2VsZWN0YWJsZSBkYXkuICovXG4gIHByaXZhdGUgX2ZvY3VzQ2VsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVzZXRGb2N1cykge1xuICAgICAgdGhpcy5fZ2V0Rmlyc3RGb2N1c2FibGUoKT8uZm9jdXMoKTtcbiAgICAgIHRoaXMuX3Jlc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgYXJyYXkgb2Ygd2Vla2RheXMuICovXG4gIHByaXZhdGUgX3NldFdlZWtkYXlzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hcnJvd1dlZWtkYXlzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCduYXJyb3cnKTtcbiAgICBjb25zdCBsb25nV2Vla2RheXM6IHN0cmluZ1tdID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcbiAgICBjb25zdCB3ZWVrZGF5czogV2Vla2RheVtdID0gbG9uZ1dlZWtkYXlzLm1hcCgobG9uZzogc3RyaW5nLCBpOiBudW1iZXIpID0+ICh7XG4gICAgICBsb25nLFxuICAgICAgbmFycm93OiBuYXJyb3dXZWVrZGF5c1tpXSxcbiAgICB9KSk7XG5cbiAgICAvLyBSb3RhdGVzIHRoZSBsYWJlbHMgZm9yIGRheXMgb2YgdGhlIHdlZWsgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgIGNvbnN0IGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdERheU9mV2VlaygpO1xuICAgIHRoaXMuX3dlZWtkYXlzID0gd2Vla2RheXMuc2xpY2UoZmlyc3REYXlPZldlZWspLmNvbmNhdCh3ZWVrZGF5cy5zbGljZSgwLCBmaXJzdERheU9mV2VlaykpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHJvd3MgZm9yIGVhY2ggd2Vlay4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlV2Vla1Jvd3ModmFsdWU6IFQpOiBEYXlbXVtdIHtcbiAgICBjb25zdCBkYXlzSW5Nb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodmFsdWUpO1xuICAgIGNvbnN0IGRhdGVOYW1lczogc3RyaW5nW10gPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlTmFtZXMoKTtcbiAgICBjb25zdCB3ZWVrczogRGF5W11bXSA9IFtbXV07XG4gICAgY29uc3Qgd2Vla09mZnNldCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0V2Vla09mZnNldCh2YWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGNlbGwgPSB3ZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICBpZiAoY2VsbCA9PT0gREFZU19QRVJfUk9XKSB7XG4gICAgICAgIHdlZWtzLnB1c2goW10pO1xuICAgICAgICBjZWxsID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHZhbHVlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodmFsdWUpLFxuICAgICAgICBpICsgMSxcbiAgICAgICkhO1xuICAgICAgd2Vla3Nbd2Vla3MubGVuZ3RoIC0gMV0ucHVzaCh7XG4gICAgICAgIHZhbHVlOiB0aGlzLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoZGF0ZSksXG4gICAgICAgIGRheVZhbHVlOiBkYXRlTmFtZXNbaV0sXG4gICAgICAgIG1vbnRoVmFsdWU6IFN0cmluZyh0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSksXG4gICAgICAgIHllYXJWYWx1ZTogU3RyaW5nKHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSkpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB3ZWVrcztcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSByb3dzIGZvciB0aGUgbW9udGggc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZU1vbnRoUm93cygpOiB2b2lkIHtcbiAgICBjb25zdCBzaG9ydE5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ3Nob3J0Jyk7XG4gICAgY29uc3QgbW9udGhzOiBNb250aFtdID0gbmV3IEFycmF5KDEyKS5maWxsKG51bGwpLm1hcChcbiAgICAgIChfLCBpOiBudW1iZXIpOiBNb250aCA9PiAoe1xuICAgICAgICB2YWx1ZTogc2hvcnROYW1lc1tpXSxcbiAgICAgICAgbG9uZ1ZhbHVlOiB0aGlzLl9tb250aE5hbWVzW2ldLFxuICAgICAgICBtb250aFZhbHVlOiBpICsgMSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3Qgcm93czogbnVtYmVyID0gMTIgLyBNT05USFNfUEVSX1JPVztcbiAgICBjb25zdCBtb250aEFycmF5OiBNb250aFtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBtb250aEFycmF5LnB1c2gobW9udGhzLnNsaWNlKE1PTlRIU19QRVJfUk9XICogaSwgTU9OVEhTX1BFUl9ST1cgKiAoaSArIDEpKSk7XG4gICAgfVxuICAgIHRoaXMuX21vbnRocyA9IG1vbnRoQXJyYXk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgcm93cyBmb3IgdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZVllYXJSb3dzKG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlcltdW10ge1xuICAgIGNvbnN0IHN0YXJ0VmFsdWVZZWFyVmlldzogbnVtYmVyID0gdGhpcy5fZ2V0U3RhcnRWYWx1ZVllYXJWaWV3KCk7XG4gICAgY29uc3QgYWxsWWVhcnM6IG51bWJlcltdID0gbmV3IEFycmF5KFlFQVJTX1BFUl9QQUdFKVxuICAgICAgLmZpbGwoMClcbiAgICAgIC5tYXAoKF8sIGk6IG51bWJlcikgPT4gc3RhcnRWYWx1ZVllYXJWaWV3ICsgb2Zmc2V0ICsgaSk7XG4gICAgY29uc3Qgcm93czogbnVtYmVyID0gWUVBUlNfUEVSX1BBR0UgLyBZRUFSU19QRVJfUk9XO1xuICAgIGNvbnN0IHllYXJBcnJheTogbnVtYmVyW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgIHllYXJBcnJheS5wdXNoKGFsbFllYXJzLnNsaWNlKFlFQVJTX1BFUl9ST1cgKiBpLCBZRUFSU19QRVJfUk9XICogKGkgKyAxKSkpO1xuICAgIH1cbiAgICByZXR1cm4geWVhckFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGZpcnN0IHllYXIgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSB5ZWFyIHNlbGVjdGlvbiBwYW5lbC5cbiAgICogSWYgYG1pbkRhdGVgIGFuZCBgbWF4RGF0ZWAgYXJlIGJvdGggbnVsbCwgdGhlIHN0YXJ0aW5nIHllYXIgaXMgY2FsY3VsYXRlZCBhc1xuICAgKiB0aGUgbXVsdGlwbGUgb2YgWUVBUlNfUEVSX1BBR0UgY2xvc2VzdCB0byBhbmQgbGVzcyB0aGFuIGFjdGl2ZURhdGUsXG4gICAqIGUuZy4sIHdpdGggYFlFQVJTX1BFUl9QQUdFYCA9IDI0IGFuZCBgYWN0aXZlRGF0ZWAgPSAyMDIwLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gMjAxNiAoMjQgKiA4MyksXG4gICAqIHdoaWxlIHdpdGggYGFjdGl2ZURhdGVgID0gMjAwMCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDE5OTIgKDI0ICogODIpLlxuICAgKiBJZiBgbWluRGF0ZWAgaXMgbm90IG51bGwsIGl0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgeWVhcjsgaWYgYG1heERhdGVgIGlzIG5vdCBudWxsLFxuICAgKiBpdCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHllYXIgbWludXMgYFlFQVJTX1BFUl9QQUdFYCwgc28gdGhhdCB0aGUgYG1heERhdGVgIGlzIHRoZSBsYXN0IHJlbmRlcmVkIHllYXIuXG4gICAqIElmIGJvdGggYXJlIG5vdCBudWxsLCBgbWF4RGF0ZWAgaGFzIHByaW9yaXR5IG92ZXIgYG1pbkRhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3RhcnRWYWx1ZVllYXJWaWV3KCk6IG51bWJlciB7XG4gICAgbGV0IHN0YXJ0aW5nWWVhciA9IDA7XG4gICAgaWYgKHRoaXMubWF4KSB7XG4gICAgICBzdGFydGluZ1llYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWF4KSAtIFlFQVJTX1BFUl9QQUdFICsgMTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWluKSB7XG4gICAgICBzdGFydGluZ1llYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubWluKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGFjdGl2ZVllYXIgLVxuICAgICAgKCgoKGFjdGl2ZVllYXIgLSBzdGFydGluZ1llYXIpICUgWUVBUlNfUEVSX1BBR0UpICsgWUVBUlNfUEVSX1BBR0UpICUgWUVBUlNfUEVSX1BBR0UpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgZGF0ZSBpcyB3aXRoaW4gdGhlIG1pbi1tYXggcmFuZ2UuICovXG4gIHByaXZhdGUgX2lzRGF5SW5SYW5nZShkYXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX21pbiAmJiAhdGhpcy5fbWF4KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaXNCZWZvcmVNaW46IGJvb2xlYW4gPVxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLl9taW4pICYmXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9taW4hLCB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShkYXRlKSEpID4gMDtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWF4KSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5fbWF4ISwgdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkhKSA8IDA7XG4gICAgcmV0dXJuICEoaXNCZWZvcmVNaW4gfHwgaXNBZnRlck1heCk7XG4gIH1cblxuICBwcml2YXRlIF9pc01vbnRoSW5SYW5nZShtb250aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9taW4hKSA+PSB0aGlzLl9jaG9zZW5ZZWFyISAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fbWluISkgPiBtb250aDtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWF4KSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9tYXghKSA8PSB0aGlzLl9jaG9zZW5ZZWFyISAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fbWF4ISkgPCBtb250aDtcbiAgICByZXR1cm4gIShpc0JlZm9yZU1pbiB8fCBpc0FmdGVyTWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzWWVhckluUmFuZ2UoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4gJiYgIXRoaXMuX21heCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGlzQmVmb3JlTWluOiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWluKSAmJiB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX21pbiEpID4geWVhcjtcbiAgICBjb25zdCBpc0FmdGVyTWF4OiBib29sZWFuID1cbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmlzVmFsaWQodGhpcy5fbWF4KSAmJiB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX21heCEpIDwgeWVhcjtcbiAgICByZXR1cm4gIShpc0JlZm9yZU1pbiB8fCBpc0FmdGVyTWF4KTtcbiAgfVxuXG4gIC8vIEltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFpbi9zcmMvbWF0ZXJpYWwvZGF0ZXBpY2tlci95ZWFyLXZpZXcudHMjTDM2NlxuICBwcml2YXRlIF9pc01vbnRoRmlsdGVyZWRPdXQobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRlRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX2Nob3NlblllYXIhLCBtb250aCwgMSkhO1xuICAgIGZvciAoXG4gICAgICBsZXQgZGF0ZTogVCA9IGZpcnN0T2ZNb250aDtcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpID09IG1vbnRoO1xuICAgICAgZGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZGF0ZUZpbHRlcihkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL21hdGVyaWFsL2RhdGVwaWNrZXIvbXVsdGkteWVhci12aWV3LnRzI0wzNTFcbiAgcHJpdmF0ZSBfaXNZZWFyRmlsdGVyZWRPdXQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRhdGVGaWx0ZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2ZZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCAxLCAxKSE7XG4gICAgZm9yIChcbiAgICAgIGxldCBkYXRlOiBUID0gZmlyc3RPZlllYXI7XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpID09IHllYXI7XG4gICAgICBkYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKGRhdGUsIDEpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5kYXRlRmlsdGVyKGRhdGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgc2VsZWN0ZWQgZGF0ZSBhbmQgc2V0cyBpdCBpbnRlcm5hbGx5LiAqL1xuICBwcml2YXRlIF9zZWxlY3REYXRlKGRheTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY2hvc2VuTW9udGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZCAhPT0gZGF5KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IGRheTtcbiAgICAgIHRoaXMuX2RhdGVTZWxlY3RlZC5lbWl0KHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheSkhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRDaG9zZW5ZZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuX2Nob3NlblllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkgPz8gdGhpcy5zZWxlY3RlZCA/PyB0aGlzLm5vdyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Nob3NlblllYXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXNzaWduQWN0aXZlRGF0ZShkYXRlOiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21pbiAmJiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9taW4sIGRhdGUpID4gMCkge1xuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX21pbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21heCAmJiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl9tYXgsIGRhdGUpIDwgMCkge1xuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX21heDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IGRhdGU7XG4gIH1cblxuICAvKiogR29lcyB0byB0aGUgbW9udGggaWRlbnRpZmllZCBieSB0aGUgc2hpZnQuICovXG4gIHByaXZhdGUgX2dvVG9EaWZmZXJlbnRNb250aChtb250aHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2luaXQodGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgbW9udGhzKSk7XG4gIH1cblxuICBwcml2YXRlIF9nb1RvRGlmZmVyZW50WWVhcih5ZWFyczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fY2hvc2VuWWVhciEgKz0geWVhcnM7XG4gICAgLy8gQ2FuJ3QgdXNlIGBfYXNzaWduQWN0aXZlRGF0ZSguLi4pYCBoZXJlLCBiZWNhdXNlIGl0IHdpbGwgc2V0IGl0IHRvIG1pbi9tYXggdmFsdWUgaWYgYXJndW1lbnQgaXMgb3V0IG9mIHJhbmdlXG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9jaG9zZW5ZZWFyISxcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLl9hY3RpdmVEYXRlKSxcbiAgICApO1xuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dvVG9EaWZmZXJlbnRZZWFyUmFuZ2UoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2luaXQodGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLCB5ZWFycykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldkRpc2FibGVkKHByZXZEYXRlOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9taW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHByZXZEYXRlLCB0aGlzLl9taW4pIDwgMDtcbiAgfVxuXG4gIHByaXZhdGUgX25leHREaXNhYmxlZChuZXh0RGF0ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fbWF4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShuZXh0RGF0ZSwgdGhpcy5fbWF4KSA+IDA7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcInByZXZpb3VzIG1vbnRoXCIgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfcHJldmlvdXNNb250aERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhcbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUsXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpICogLTEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZNb250aCk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIHRoZSBcIm5leHQgbW9udGhcIiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF9uZXh0TW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBsZXQgbmV4dE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5fd2lkZSA/IDIgOiAxKTtcbiAgICBuZXh0TW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihuZXh0TW9udGgpLFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgobmV4dE1vbnRoKSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRNb250aCk7XG4gIH1cblxuICBwcml2YXRlIF9wcmV2aW91c1llYXJEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2FjdGl2ZURhdGUpIC0gMSxcbiAgICAgIDEyLFxuICAgICAgMzEsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcHJldkRpc2FibGVkKHByZXZZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX25leHRZZWFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmV4dFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKSArIDEsXG4gICAgICAxLFxuICAgICAgMSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9uZXh0RGlzYWJsZWQobmV4dFllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmlvdXNZZWFyUmFuZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5feWVhcnNbMF1bMF0gLSAxLCAxMiwgMzEpO1xuICAgIHJldHVybiB0aGlzLl9wcmV2RGlzYWJsZWQocHJldlllYXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmV4dFllYXJSYW5nZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHllYXJzID0gaXNCcmVha3BvaW50KCdtZWRpdW0nKSAmJiB0aGlzLndpZGUgPyB0aGlzLl9uZXh0TW9udGhZZWFycyA6IHRoaXMuX3llYXJzO1xuICAgIGNvbnN0IGxhc3RZZWFyUmFuZ2UgPSB5ZWFyc1t5ZWFycy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBsYXN0WWVhciA9IGxhc3RZZWFyUmFuZ2VbbGFzdFllYXJSYW5nZS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBuZXh0WWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUobGFzdFllYXIgKyAxLCAxLCAxKTtcbiAgICByZXR1cm4gdGhpcy5fbmV4dERpc2FibGVkKG5leHRZZWFyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVRhYmxlQmx1cihldmVudFRhcmdldDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnRUYXJnZXQ/LmxvY2FsTmFtZSAhPT0gJ2J1dHRvbicpIHtcbiAgICAgIHRoaXMuX3NldFRhYkluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VGFiSW5kZXgoKTogdm9pZCB7XG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvckFsbCgnLnNiYi1jYWxlbmRhcl9fY2VsbFt0YWJpbmRleD1cIjBcIl0nKSA/PyBbXSxcbiAgICApLmZvckVhY2goKGRheSkgPT4gKChkYXkgYXMgSFRNTEVsZW1lbnQpLnRhYkluZGV4ID0gLTEpKTtcbiAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuX2dldEZpcnN0Rm9jdXNhYmxlKCk7XG4gICAgaWYgKGZpcnN0Rm9jdXNhYmxlKSB7XG4gICAgICBmaXJzdEZvY3VzYWJsZS50YWJJbmRleCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RGb2N1c2FibGUoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX3NlbGVjdGVkID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodGhpcy5fc2VsZWN0ZWQpISA6IHRoaXMubm93O1xuICAgIGxldCBmaXJzdEZvY3VzYWJsZSA9XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QhLnF1ZXJ5U2VsZWN0b3IoJy5zYmItY2FsZW5kYXJfX3NlbGVjdGVkJykgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYFtkYXRhLWRheT1cIiR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShhY3RpdmUpfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKFxuICAgICAgICAgIGFjdGl2ZSxcbiAgICAgICAgKX0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGFjdGl2ZSl9XCJdYCxcbiAgICAgICkgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcihgW2RhdGEtbW9udGg9XCIke3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGFjdGl2ZSl9XCJdYCkgPz9cbiAgICAgIHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcihgW2RhdGEteWVhcj1cIiR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihhY3RpdmUpfVwiXWApO1xuICAgIGlmICghZmlyc3RGb2N1c2FibGUgfHwgKGZpcnN0Rm9jdXNhYmxlIGFzIEhUTUxCdXR0b25FbGVtZW50KT8uZGlzYWJsZWQpIHtcbiAgICAgIGZpcnN0Rm9jdXNhYmxlID0gdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLWNhbGVuZGFyX19jZWxsOm5vdChbZGlzYWJsZWRdKScpO1xuICAgIH1cbiAgICByZXR1cm4gKGZpcnN0Rm9jdXNhYmxlIGFzIEhUTUxCdXR0b25FbGVtZW50KSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCwgZGF5PzogRGF5KTogdm9pZCB7XG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0YWJsZSdzIGNlbGw7XG4gICAgLy8gdGhleSBjb3VsZCBiZSBkYXlzLCBtb250aHMgb3IgeWVhcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZpZXcuXG4gICAgLy8gSWYgYHdpZGVgIGlzIHRydWUsIHllYXJzIGFyZSBkb3VibGVkIGluIG51bWJlciBhbmQgZGF5cyBhcmUgKHJvdWdobHkpIGRvdWJsZWQgdG9vLCBhZmZlY3RpbmcgdGhlIGBpbmRleGAgY2FsY3VsYXRpb24uXG4gICAgY29uc3QgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10gPSB0aGlzLl9jZWxscztcbiAgICBjb25zdCBpbmRleDogbnVtYmVyID0gY2VsbHMuZmluZEluZGV4KChlOiBIVE1MQnV0dG9uRWxlbWVudCkgPT4gZSA9PT0gZXZlbnQudGFyZ2V0KTtcbiAgICBjb25zdCBuZXh0RWw6IEhUTUxCdXR0b25FbGVtZW50ID0gdGhpcy5fbmF2aWdhdGVCeUtleWJvYXJkKGV2ZW50LCBpbmRleCwgY2VsbHMsIGRheSk7XG4gICAgY29uc3QgYWN0aXZlRWw6IEhUTUxCdXR0b25FbGVtZW50ID0gdGhpcy5zaGFkb3dSb290IS5hY3RpdmVFbGVtZW50IGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGlmIChuZXh0RWwgIT09IGFjdGl2ZUVsKSB7XG4gICAgICAobmV4dEVsIGFzIEhUTUxCdXR0b25FbGVtZW50KS50YWJJbmRleCA9IDA7XG4gICAgICBuZXh0RWw/LmZvY3VzKCk7XG4gICAgICAoYWN0aXZlRWwgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLnRhYkluZGV4ID0gLTE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdG8sIGJhc2VkIG9uIGEgbGlzdCBvZiBlbGVtZW50cyAod2hpY2ggY2FuIGJlIHBvdGVudGlhbGx5IGRpc2FibGVkKSxcbiAgICogdGhlIGtleWJvYXJkIGlucHV0IGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAgICogSW4gdGhlIGRheSB2aWV3LCB0aGUgYGRheT86IERheWAgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgY2FsY3VsYXRpb24sXG4gICAqIHdoaWxlIGluIG1vbnRoIGFuZCB5ZWFyIHZpZXcgaXQncyBub3QgZHVlIHRvIHRoZSBmaXhlZCBhbW91bnQgb2YgcmVuZGVyZWQgY2VsbHMuXG4gICAqL1xuICBwcml2YXRlIF9uYXZpZ2F0ZUJ5S2V5Ym9hcmQoXG4gICAgZXZ0OiBLZXlib2FyZEV2ZW50LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgY2VsbHM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgZGF5PzogRGF5LFxuICApOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsXG4gICAgICBvZmZzZXRGb3JXaWRlTW9kZSxcbiAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgIHZlcnRpY2FsT2Zmc2V0LFxuICAgIH06IENhbGVuZGFyS2V5Ym9hcmROYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHRoaXMuX2NhbGN1bGF0ZVBhcmFtZXRlcnNGb3JLZXlib2FyZE5hdmlnYXRpb24oXG4gICAgICBjZWxscyxcbiAgICAgIGluZGV4LFxuICAgICAgZGF5LFxuICAgICk7XG5cbiAgICBzd2l0Y2ggKGV2dC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZE5leHQoY2VsbHMsIGluZGV4LCAtdmVydGljYWxPZmZzZXQpO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgdmVydGljYWxPZmZzZXQpO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmROZXh0KGNlbGxzLCBpbmRleCwgLTEpO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTmV4dChjZWxscywgaW5kZXgsIDEpO1xuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRmlyc3QoY2VsbHMsIG9mZnNldEZvcldpZGVNb2RlKTtcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kRmlyc3RPbkNvbHVtbihcbiAgICAgICAgICBjZWxscyxcbiAgICAgICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZSxcbiAgICAgICAgICBvZmZzZXRGb3JXaWRlTW9kZSxcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRMYXN0T25Db2x1bW4oY2VsbHMsIGluZGV4LCBsYXN0RWxlbWVudEluZGV4Rm9yV2lkZU1vZGUsIHZlcnRpY2FsT2Zmc2V0KTtcbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kTGFzdChjZWxscywgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlIC0gMSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY2VsbHNbaW5kZXhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBwYXJhbWV0ZXIgbmVlZGVkIGluIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAqIFNpbmNlIHRocmVlIHZpZXdzIGFyZSBub3cgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzIGZvciBlYWNoIG9mIHRoZW1cbiAgICogYnkgY29uc2lkZXJpbmcgdGhlIG51bWJlciBvZiBjZWxscyBwZXIgZWFjaCByb3cgYW5kIHRoZSBjb3JyZWN0aW9uIGZvciB0aGUgd2lkZSBtb2RlLlxuICAgKiBAcGFyYW0gY2VsbHMgVGhlIGFycmF5IG9mIHJlbmRlcmVkIHRhYmxlIGNlbGxzOyB0aGV5IGFyZSBidXR0b25zIHRoYXQgY2FuIHJlcHJlc2VudCBkYXlzLCBtb250aHMgb3IgeWVhcnMuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgc3RhcnRpbmcgZWxlbWVudCdzIGluZGV4IGluIHRoZSBjZWxsIGFycmF5LlxuICAgKiBAcGFyYW0gZGF5IChvcHRpb25hbCkgT25seSBpbiB0aGUgZGF5IHZpZXcsIHRoZSBkYXkgcmVwcmVzZW50ZWQgYnkgdGhlIHN0YXJ0aW5nIGNlbGwuXG4gICAqL1xuICBwcml2YXRlIF9jYWxjdWxhdGVQYXJhbWV0ZXJzRm9yS2V5Ym9hcmROYXZpZ2F0aW9uKFxuICAgIGNlbGxzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZGF5PzogRGF5LFxuICApOiBDYWxlbmRhcktleWJvYXJkTmF2aWdhdGlvblBhcmFtZXRlcnMge1xuICAgIHN3aXRjaCAodGhpcy5fY2FsZW5kYXJWaWV3KSB7XG4gICAgICBjYXNlICdkYXknOiB7XG4gICAgICAgIGNvbnN0IGluZGV4SW5WaWV3ID0gK2RheSEuZGF5VmFsdWUgLSAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0OiBEQVlTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4SW5WaWV3LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiBpbmRleCAtIGluZGV4SW5WaWV3LFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTpcbiAgICAgICAgICAgIGluZGV4ID09PSBpbmRleEluVmlld1xuICAgICAgICAgICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGRheSEudmFsdWUpISxcbiAgICAgICAgICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjZWxscy5sZW5ndGgsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBNb250aCB2aWV3IGlzIG5vdCBkZXBlbmRlbnQgZnJvbSBgd2lkZWAgdmFsdWUsIHNvIHNvbWUgcGFyYW1ldGVycyBhcmUgZml4ZWQuXG4gICAgICBjYXNlICdtb250aCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogTU9OVEhTX1BFUl9ST1csXG4gICAgICAgICAgZWxlbWVudEluZGV4Rm9yV2lkZU1vZGU6IGluZGV4LFxuICAgICAgICAgIG9mZnNldEZvcldpZGVNb2RlOiAwLFxuICAgICAgICAgIGxhc3RFbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogMTIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICd5ZWFyJzoge1xuICAgICAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IE1hdGgudHJ1bmMoaW5kZXggLyBZRUFSU19QRVJfUEFHRSkgKiBZRUFSU19QRVJfUEFHRTtcbiAgICAgICAgY29uc3QgaW5kZXhJblZpZXc6IG51bWJlciA9IG9mZnNldCA9PT0gMCA/IGluZGV4IDogaW5kZXggLSBZRUFSU19QRVJfUEFHRTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2ZXJ0aWNhbE9mZnNldDogWUVBUlNfUEVSX1JPVyxcbiAgICAgICAgICBlbGVtZW50SW5kZXhGb3JXaWRlTW9kZTogaW5kZXhJblZpZXcsXG4gICAgICAgICAgb2Zmc2V0Rm9yV2lkZU1vZGU6IGluZGV4IC0gaW5kZXhJblZpZXcsXG4gICAgICAgICAgbGFzdEVsZW1lbnRJbmRleEZvcldpZGVNb2RlOiBvZmZzZXQgPT09IDAgPyBZRUFSU19QRVJfUEFHRSA6IFlFQVJTX1BFUl9QQUdFICogMixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBwcm92aWRlZCBhcnJheSBzdGFydGluZyBmcm9tIGBpbmRleGAgYnkgYWRkaW5nIGBkZWx0YWAuXG4gICAqIElmIHRoZSBmb3VuZCBlbGVtZW50IGlzIGRpc2FibGVkLCBpdCBjb250aW51ZXMgYWRkaW5nIGBkZWx0YWAgdW50aWwgaXQgZmluZHMgYW4gZW5hYmxlZCBvbmUgaW4gdGhlIGFycmF5IGJvdW5kcy5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmROZXh0KGRheXM6IEhUTUxCdXR0b25FbGVtZW50W10sIGluZGV4OiBudW1iZXIsIGRlbHRhOiBudW1iZXIpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgbGV0IG5leHRJbmRleCA9IGluZGV4ICsgZGVsdGE7XG4gICAgd2hpbGUgKG5leHRJbmRleCA8IGRheXMubGVuZ3RoICYmIGRheXNbbmV4dEluZGV4XT8uZGlzYWJsZWQpIHtcbiAgICAgIG5leHRJbmRleCArPSBkZWx0YTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNbbmV4dEluZGV4XSA/PyBkYXlzW2luZGV4XTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kRmlyc3QoZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSwgZmlyc3RPZkN1cnJlbnRNb250aDogbnVtYmVyKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiAhZGF5c1tmaXJzdE9mQ3VycmVudE1vbnRoXS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW2ZpcnN0T2ZDdXJyZW50TW9udGhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIGZpcnN0T2ZDdXJyZW50TW9udGgsIDEpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxhc3QgZW5hYmxlZCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZExhc3QoZGF5czogSFRNTEJ1dHRvbkVsZW1lbnRbXSwgbGFzdE9mQ3VycmVudE1vbnRoOiBudW1iZXIpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgcmV0dXJuICFkYXlzW2xhc3RPZkN1cnJlbnRNb250aF0uZGlzYWJsZWRcbiAgICAgID8gZGF5c1tsYXN0T2ZDdXJyZW50TW9udGhdXG4gICAgICA6IHRoaXMuX2ZpbmROZXh0KGRheXMsIGxhc3RPZkN1cnJlbnRNb250aCwgLTEpO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGZpcnN0IGVuYWJsZWQgZWxlbWVudCBpbiB0aGUgc2FtZSBjb2x1bW4gb2YgdGhlIHByb3ZpZGVkIGFycmF5LiAqL1xuICBwcml2YXRlIF9maW5kRmlyc3RPbkNvbHVtbihcbiAgICBkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgdmVydGljYWxPZmZzZXQ6IG51bWJlcixcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IChpbmRleCAlIHZlcnRpY2FsT2Zmc2V0KSArIG9mZnNldDtcbiAgICByZXR1cm4gIWRheXNbbmV4dEluZGV4XS5kaXNhYmxlZFxuICAgICAgPyBkYXlzW25leHRJbmRleF1cbiAgICAgIDogdGhpcy5fZmluZE5leHQoZGF5cywgbmV4dEluZGV4LCB2ZXJ0aWNhbE9mZnNldCk7XG4gIH1cblxuICAvKiogRmluZCB0aGUgbGFzdCBlbmFibGVkIGVsZW1lbnQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBwcm92aWRlZCBhcnJheS4gKi9cbiAgcHJpdmF0ZSBfZmluZExhc3RPbkNvbHVtbihcbiAgICBkYXlzOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgdmVydGljYWxPZmZzZXQ6IG51bWJlcixcbiAgKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgTWF0aC50cnVuYygob2Zmc2V0IC0gaW5kZXggLSAxKSAvIHZlcnRpY2FsT2Zmc2V0KSAqIHZlcnRpY2FsT2Zmc2V0O1xuICAgIHJldHVybiAhZGF5c1tuZXh0SW5kZXhdLmRpc2FibGVkXG4gICAgICA/IGRheXNbbmV4dEluZGV4XVxuICAgICAgOiB0aGlzLl9maW5kTmV4dChkYXlzLCBuZXh0SW5kZXgsIC12ZXJ0aWNhbE9mZnNldCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldENhbGVuZGFyVmlldyhpbml0VHJhbnNpdGlvbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuc2VsZWN0ZWQgPz8gdGhpcy5ub3c7XG4gICAgdGhpcy5fc2V0Q2hvc2VuWWVhcigpO1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSB0aGlzLl9jYWxlbmRhclZpZXcgPSB0aGlzLnZpZXc7XG5cbiAgICBpZiAoaW5pdFRyYW5zaXRpb24pIHtcbiAgICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbmRlciB0aGUgdmlldyBmb3IgdGhlIGRheSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlckRheVZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG5leHRNb250aEFjdGl2ZURhdGUgPSB0aGlzLl93aWRlXG4gICAgICA/IHRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsIDEpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzXCI+XG4gICAgICAgICR7dGhpcy5fZ2V0QXJyb3coXG4gICAgICAgICAgJ2xlZnQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRNb250aCgtMSksXG4gICAgICAgICAgaTE4blByZXZpb3VzTW9udGhbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNNb250aERpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLW1vbnRoXCI+XG4gICAgICAgICAgJHt0aGlzLl9jcmVhdGVMYWJlbEZvckRheVZpZXcodGhpcy5fYWN0aXZlRGF0ZSl9XG4gICAgICAgICAgJHt0aGlzLl93aWRlID8gdGhpcy5fY3JlYXRlTGFiZWxGb3JEYXlWaWV3KG5leHRNb250aEFjdGl2ZURhdGUhKSA6IG5vdGhpbmd9XG4gICAgICAgICAgPHNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVBcmlhTGFiZWxGb3JEYXlWaWV3KHRoaXMuX2FjdGl2ZURhdGUsIG5leHRNb250aEFjdGl2ZURhdGUhKX1cbiAgICAgICAgICA8L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudE1vbnRoKDEpLFxuICAgICAgICAgIGkxOG5OZXh0TW9udGhbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fbmV4dE1vbnRoRGlzYWJsZWQoKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtY29udGFpbmVyIHNiYi1jYWxlbmRhcl9fdGFibGUtZGF5LXZpZXdcIj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlUYWJsZSh0aGlzLl93ZWVrcyl9XG4gICAgICAgICR7dGhpcy5fd2lkZSA/IHRoaXMuX2NyZWF0ZURheVRhYmxlKHRoaXMuX25leHRNb250aFdlZWtzKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGxhYmVsIHdpdGggdGhlIG1vbnRoIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTGFiZWxGb3JEYXlWaWV3KGQ6IFQpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgY29uc3QgbW9udGhMYWJlbCA9IGAke1xuICAgICAgdGhpcy5fbW9udGhOYW1lc1t0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkKSAtIDFdXG4gICAgfSAke3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZCl9YDtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGlkPVwic2JiLWNhbGVuZGFyX19kYXRlLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCIke2kxOG5ZZWFyTW9udGhTZWxlY3Rpb25bdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF19ICR7bW9udGhMYWJlbH1cIlxuICAgICAgICBAY2xpY2s9JHsoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9ICd5ZWFyJztcbiAgICAgICAgICB0aGlzLl9zdGFydFRhYmxlVHJhbnNpdGlvbigpO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICAke21vbnRoTGFiZWx9XG4gICAgICAgIDxzYmItaWNvbiBuYW1lPVwiY2hldnJvbi1zbWFsbC1kb3duLXNtYWxsXCI+PC9zYmItaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgYXJpYS1sYWJlbCBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUFyaWFMYWJlbEZvckRheVZpZXcoLi4uZGF0ZXM6IFRbXSk6IHN0cmluZyB7XG4gICAgbGV0IG1vbnRoTGFiZWwgPSAnJztcbiAgICBmb3IgKGNvbnN0IGQgb2YgZGF0ZXMpIHtcbiAgICAgIGlmIChkKSB7XG4gICAgICAgIG1vbnRoTGFiZWwgKz0gYCR7XG4gICAgICAgICAgdGhpcy5fbW9udGhOYW1lc1t0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChkKSAtIDFdXG4gICAgICAgIH0gJHt0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGQpfSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9udGhMYWJlbDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBjYWxlbmRhciB0YWJsZSBmb3IgdGhlIGRhaWx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZURheVRhYmxlKHdlZWtzOiBEYXlbXVtdKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHRhYmxlXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICAgIEBmb2N1c291dD0keyhldmVudDogRm9jdXNFdmVudCkgPT5cbiAgICAgICAgICB0aGlzLl9oYW5kbGVUYWJsZUJsdXIoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCl9XG4gICAgICAgIEBhbmltYXRpb25lbmQ9JHsoZTogQW5pbWF0aW9uRXZlbnQpID0+IHRoaXMuX3RhYmxlQW5pbWF0aW9uRW5kKGUpfVxuICAgICAgPlxuICAgICAgICA8dGhlYWQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiPlxuICAgICAgICAgIDx0ciBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgJHt0aGlzLl9jcmVhdGVEYXlUYWJsZUhlYWRlcigpfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtYm9keVwiPlxuICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5VGFibGVCb2R5KHdlZWtzKX1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBoZWFkZXIgd2l0aCB0aGUgbW9udGggaGVhZGVyIGNlbGxzLiAqL1xuICBwcml2YXRlIF9jcmVhdGVEYXlUYWJsZUhlYWRlcigpOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2Vla2RheXMubWFwKFxuICAgICAgKGRheTogV2Vla2RheSkgPT4gaHRtbGBcbiAgICAgICAgPHRoIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seT4ke2RheS5sb25nfTwvc2JiLXNjcmVlbi1yZWFkZXItb25seT5cbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2RheS5uYXJyb3d9PC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgYCxcbiAgICApO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHRhYmxlIGJvZHkgd2l0aCB0aGUgZGF5IGNlbGxzLiBGb3IgdGhlIGZpcnN0IHJvdywgaXQgYWxzbyBjb25zaWRlcnMgdGhlIHBvc3NpYmxlIGRheSdzIG9mZnNldC4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5VGFibGVCb2R5KHdlZWtzOiBEYXlbXVtdKTogVGVtcGxhdGVSZXN1bHRbXSB7XG4gICAgY29uc3QgdG9kYXk6IHN0cmluZyA9IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLm5vdyk7XG4gICAgcmV0dXJuIHdlZWtzLm1hcCgod2VlazogRGF5W10sIHJvd0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Um93T2Zmc2V0OiBudW1iZXIgPSBEQVlTX1BFUl9ST1cgLSB3ZWVrLmxlbmd0aDtcbiAgICAgIGlmIChyb3dJbmRleCA9PT0gMCAmJiBmaXJzdFJvd09mZnNldCkge1xuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAke1suLi5BcnJheShmaXJzdFJvd09mZnNldCkua2V5cygpXS5tYXAoXG4gICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgaHRtbGA8dGRcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1kYXRhXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtZGF5PSR7YDAgJHt3ZWVrWzBdLm1vbnRoVmFsdWV9ICR7d2Vla1swXS55ZWFyVmFsdWV9YH1cbiAgICAgICAgICAgICAgICA+PC90ZD5gLFxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICR7dGhpcy5fY3JlYXRlRGF5Q2VsbHMod2VlaywgdG9kYXkpfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIGA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaHRtbGA8dHI+XG4gICAgICAgICR7dGhpcy5fY3JlYXRlRGF5Q2VsbHMod2VlaywgdG9kYXkpfVxuICAgICAgPC90cj5gO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGNlbGxzIGZvciB0aGUgZGFpbHkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlRGF5Q2VsbHMod2VlazogRGF5W10sIHRvZGF5OiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdFtdIHtcbiAgICByZXR1cm4gd2Vlay5tYXAoKGRheTogRGF5KSA9PiB7XG4gICAgICBjb25zdCBpc091dE9mUmFuZ2UgPSAhdGhpcy5faXNEYXlJblJhbmdlKGRheS52YWx1ZSk7XG4gICAgICBjb25zdCBpc0ZpbHRlcmVkT3V0ID0gIXRoaXMuX2RhdGVGaWx0ZXIodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF5LnZhbHVlKSEpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQ6IGJvb2xlYW4gPSAhIXRoaXMuX3NlbGVjdGVkICYmIGRheS52YWx1ZSA9PT0gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgICBjb25zdCBkYXlWYWx1ZSA9IGAke2RheS5kYXlWYWx1ZX0gJHtkYXkubW9udGhWYWx1ZX0gJHtkYXkueWVhclZhbHVlfWA7XG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LnZhbHVlID09PSB0b2RheTtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICA8dGRcbiAgICAgICAgICBjbGFzcz0ke2NsYXNzTWFwKHtcbiAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX3RhYmxlLWRhdGEnOiB0cnVlLFxuICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YS1zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwnOiB0cnVlLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19kYXknOiB0cnVlLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jZWxsLWN1cnJlbnQnOiBpc1RvZGF5LFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jcm9zc2VkLW91dCc6ICFpc091dE9mUmFuZ2UgJiYgaXNGaWx0ZXJlZE91dCxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fc2VsZWN0RGF0ZShkYXkudmFsdWUpfVxuICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPSR7dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0QWNjZXNzaWJpbGl0eUZvcm1hdERhdGUoZGF5LnZhbHVlKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke2lzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0fVxuICAgICAgICAgICAgYXJpYS1jdXJyZW50PSR7aXNUb2RheSA/ICdkYXRlJyA6IG5vdGhpbmd9XG4gICAgICAgICAgICBkYXRhLWRheT0ke2RheVZhbHVlIHx8IG5vdGhpbmd9XG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIEBrZXlkb3duPSR7KGV2dDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5faGFuZGxlS2V5Ym9hcmRFdmVudChldnQsIGRheSl9XG4gICAgICAgICAgICBzYmItcG9wb3Zlci1jbG9zZVxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7ZGF5LmRheVZhbHVlfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgYDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSBtb250aCBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX3JlbmRlck1vbnRoVmlldygpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9sc1wiPlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9nb1RvRGlmZmVyZW50WWVhcigtMSksXG4gICAgICAgICAgaTE4blByZXZpb3VzWWVhclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1llYXJEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPiR7dGhpcy5fY3JlYXRlTGFiZWxGb3JNb250aFZpZXcoKX08L2Rpdj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICgpID0+IHRoaXMuX2dvVG9EaWZmZXJlbnRZZWFyKDEpLFxuICAgICAgICAgIGkxOG5OZXh0WWVhclt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XSxcbiAgICAgICAgICB0aGlzLl9uZXh0WWVhckRpc2FibGVkKCksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWNvbnRhaW5lciBzYmItY2FsZW5kYXJfX3RhYmxlLW1vbnRoLXZpZXdcIj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVNb250aFRhYmxlKHRoaXMuX21vbnRocywgdGhpcy5fY2hvc2VuWWVhciEpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVNb250aFRhYmxlKHRoaXMuX21vbnRocywgdGhpcy5fY2hvc2VuWWVhciEgKyAxLCB0cnVlKSA6IG5vdGhpbmd9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIGxhYmVsIHdpdGggdGhlIHllYXIgZm9yIHRoZSBtb250aGx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yTW9udGhWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX21vbnRoLXNlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1jaGFuZ2UtZGF0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9JHtgJHtpMThuQ2FsZW5kYXJEYXRlU2VsZWN0aW9uW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdfSAke3RoaXMuX2Nob3NlblllYXJ9YH1cbiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fcmVzZXRDYWxlbmRhclZpZXcodHJ1ZSl9XG4gICAgICA+XG4gICAgICAgICR7dGhpcy5fY2hvc2VuWWVhcn0gJHt0aGlzLl93aWRlID8gYCAtICR7dGhpcy5fY2hvc2VuWWVhciEgKyAxfWAgOiBub3RoaW5nfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtdXAtc21hbGxcIj48L3NiYi1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seSByb2xlPVwic3RhdHVzXCI+ICR7dGhpcy5fY2hvc2VuWWVhcn0gPC9zYmItc2NyZWVuLXJlYWRlci1vbmx5PmA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgdGFibGUgZm9yIHRoZSBtb250aCBzZWxlY3Rpb24gdmlldy4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlTW9udGhUYWJsZShtb250aHM6IE1vbnRoW11bXSwgeWVhcjogbnVtYmVyLCBzaGlmdFJpZ2h0ID0gZmFsc2UpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8dGFibGVcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlXCJcbiAgICAgICAgQGFuaW1hdGlvbmVuZD0keyhlOiBBbmltYXRpb25FdmVudCkgPT4gdGhpcy5fdGFibGVBbmltYXRpb25FbmQoZSl9XG4gICAgICA+XG4gICAgICAgICR7dGhpcy5fd2lkZVxuICAgICAgICAgID8gaHRtbGA8dGhlYWQgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWhlYWRlclwiIGNvbHNwYW49JHtNT05USFNfUEVSX1JPV30+JHt5ZWFyfTwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPmBcbiAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgIDx0Ym9keSBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtYm9keVwiPlxuICAgICAgICAgICR7bW9udGhzLm1hcChcbiAgICAgICAgICAgIChyb3c6IE1vbnRoW10pID0+IGh0bWxgXG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAke3Jvdy5tYXAoKG1vbnRoOiBNb250aCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzTW9udGhJblJhbmdlKG1vbnRoLm1vbnRoVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9pc01vbnRoRmlsdGVyZWRPdXQobW9udGgubW9udGhWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHRoaXMuX3NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh0aGlzLl9zZWxlY3RlZCkhKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgISF0aGlzLl9zZWxlY3RlZCAmJiB5ZWFyID09PSBzZWxlY3RlZFllYXIgJiYgbW9udGgubW9udGhWYWx1ZSA9PT0gc2VsZWN0ZWRNb250aDtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50TW9udGggPVxuICAgICAgICAgICAgICAgICAgICB5ZWFyID09PSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMubm93KSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLm5vdykgPT09IG1vbnRoLm1vbnRoVmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sYCA8dGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fdGFibGUtbW9udGgnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSR7Y2xhc3NNYXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19waWxsJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzYmItY2FsZW5kYXJfX2NlbGwtY3VycmVudCc6IGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY3Jvc3NlZC1vdXQnOiAhaXNPdXRPZlJhbmdlICYmIGlzRmlsdGVyZWRPdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuX29uTW9udGhTZWxlY3Rpb24obW9udGgubW9udGhWYWx1ZSwgeWVhciwgc2hpZnRSaWdodCl9XG4gICAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7aXNPdXRPZlJhbmdlIHx8IGlzRmlsdGVyZWRPdXR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0ke2Ake21vbnRoLmxvbmdWYWx1ZX0gJHt0aGlzLl9jaG9zZW5ZZWFyfWB9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPSR7c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD0ke1N0cmluZyhpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dCl9XG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1tb250aD0ke21vbnRoLm1vbnRoVmFsdWUgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0keyhldnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2hhbmRsZUtleWJvYXJkRXZlbnQoZXZ0KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICR7bW9udGgudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICApfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG5cbiAgLyoqIFNlbGVjdCB0aGUgbW9udGggYW5kIGNoYW5nZSB0aGUgdmlldyB0byBkYXkgc2VsZWN0aW9uLiAqL1xuICBwcml2YXRlIF9vbk1vbnRoU2VsZWN0aW9uKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlciwgc2hpZnRSaWdodDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3Nlbk1vbnRoID0gc2hpZnRSaWdodCA/IG1vbnRoICsgMSA6IG1vbnRoO1xuICAgIHRoaXMuX25leHRDYWxlbmRhclZpZXcgPSAnZGF5JztcbiAgICB0aGlzLl9pbml0KFxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgeWVhcixcbiAgICAgICAgdGhpcy5fY2hvc2VuTW9udGgsXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5fYWN0aXZlRGF0ZSksXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5fc3RhcnRUYWJsZVRyYW5zaXRpb24oKTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIHZpZXcgZm9yIHRoZSB5ZWFyIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfcmVuZGVyWWVhclZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1jYWxlbmRhcl9fY29udHJvbHNcIj5cbiAgICAgICAgJHt0aGlzLl9nZXRBcnJvdyhcbiAgICAgICAgICAnbGVmdCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXJSYW5nZSgtWUVBUlNfUEVSX1BBR0UpLFxuICAgICAgICAgIGkxOG5QcmV2aW91c1llYXJSYW5nZShZRUFSU19QRVJfUEFHRSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0sXG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNZZWFyUmFuZ2VEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX19jb250cm9scy1tb250aFwiPiR7dGhpcy5fY3JlYXRlTGFiZWxGb3JZZWFyVmlldygpfTwvZGl2PlxuICAgICAgICAke3RoaXMuX2dldEFycm93KFxuICAgICAgICAgICdyaWdodCcsXG4gICAgICAgICAgKCkgPT4gdGhpcy5fZ29Ub0RpZmZlcmVudFllYXJSYW5nZShZRUFSU19QRVJfUEFHRSksXG4gICAgICAgICAgaTE4bk5leHRZZWFyUmFuZ2UoWUVBUlNfUEVSX1BBR0UpW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdLFxuICAgICAgICAgIHRoaXMuX25leHRZZWFyUmFuZ2VEaXNhYmxlZCgpLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZS1jb250YWluZXIgc2JiLWNhbGVuZGFyX190YWJsZS15ZWFyLXZpZXdcIj5cbiAgICAgICAgJHt0aGlzLl9jcmVhdGVZZWFyVGFibGUodGhpcy5feWVhcnMpfVxuICAgICAgICAke3RoaXMuX3dpZGUgPyB0aGlzLl9jcmVhdGVZZWFyVGFibGUodGhpcy5fbmV4dE1vbnRoWWVhcnMsIHRydWUpIDogbm90aGluZ31cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgYnV0dG9uIGFycm93IGZvciBhbGwgdGhlIHZpZXdzLiAqL1xuICBwcml2YXRlIF9nZXRBcnJvdyhcbiAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcsXG4gICAgY2xpY2s6ICgpID0+IHZvaWQsXG4gICAgYXJpYUxhYmVsOiBzdHJpbmcsXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4sXG4gICk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGA8c2JiLXNlY29uZGFyeS1idXR0b25cbiAgICAgIHNpemU9XCJtXCJcbiAgICAgIGljb24tbmFtZT1cImNoZXZyb24tc21hbGwtJHtkaXJlY3Rpb259LXNtYWxsXCJcbiAgICAgIGFyaWEtbGFiZWw9JHthcmlhTGFiZWx9XG4gICAgICBAY2xpY2s9JHtjbGlja31cbiAgICAgID9kaXNhYmxlZD0ke2Rpc2FibGVkfVxuICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLSR7ZGlyZWN0aW9uID09PSAnbGVmdCcgPyAncHJldmlvdXMnIDogJ25leHQnfVwiXG4gICAgPjwvc2JiLXNlY29uZGFyeS1idXR0b24+YDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSBsYWJlbCB3aXRoIHRoZSB5ZWFyIHJhbmdlIGZvciB0aGUgeWVhcmx5IHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZUxhYmVsRm9yWWVhclZpZXcoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IGZpcnN0WWVhcjogbnVtYmVyID0gdGhpcy5feWVhcnMuZmxhdCgpWzBdO1xuICAgIGNvbnN0IGxhc3RZZWFyQXJyYXk6IG51bWJlcltdID0gKFxuICAgICAgaXNCcmVha3BvaW50KCdtZWRpdW0nKSAmJiB0aGlzLndpZGUgPyB0aGlzLl9uZXh0TW9udGhZZWFycyA6IHRoaXMuX3llYXJzXG4gICAgKS5mbGF0KCk7XG4gICAgY29uc3QgbGFzdFllYXI6IG51bWJlciA9IGxhc3RZZWFyQXJyYXlbbGFzdFllYXJBcnJheS5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB5ZWFyTGFiZWwgPSBgJHtmaXJzdFllYXJ9IC0gJHtsYXN0WWVhcn1gO1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWQ9XCJzYmItY2FsZW5kYXJfX3llYXItc2VsZWN0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJzYmItY2FsZW5kYXJfX2NvbnRyb2xzLWNoYW5nZS1kYXRlXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIiR7aTE4bkNhbGVuZGFyRGF0ZVNlbGVjdGlvblt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX0gJHt5ZWFyTGFiZWx9XCJcbiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fcmVzZXRDYWxlbmRhclZpZXcodHJ1ZSl9XG4gICAgICA+XG4gICAgICAgICR7eWVhckxhYmVsfVxuICAgICAgICA8c2JiLWljb24gbmFtZT1cImNoZXZyb24tc21hbGwtdXAtc21hbGxcIj48L3NiYi1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c2JiLXNjcmVlbi1yZWFkZXItb25seSByb2xlPVwic3RhdHVzXCI+ICR7eWVhckxhYmVsfSA8L3NiYi1zY3JlZW4tcmVhZGVyLW9ubHk+XG4gICAgYDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIHRoZSB0YWJsZSBmb3IgdGhlIHllYXIgc2VsZWN0aW9uIHZpZXcuICovXG4gIHByaXZhdGUgX2NyZWF0ZVllYXJUYWJsZSh5ZWFyczogbnVtYmVyW11bXSwgc2hpZnRSaWdodCA9IGZhbHNlKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIGNvbnN0IG5vdyA9IHRoaXMubm93O1xuICAgIHJldHVybiBodG1sYCA8dGFibGVcbiAgICAgIGNsYXNzPVwic2JiLWNhbGVuZGFyX190YWJsZVwiXG4gICAgICBAYW5pbWF0aW9uZW5kPSR7KGU6IEFuaW1hdGlvbkV2ZW50KSA9PiB0aGlzLl90YWJsZUFuaW1hdGlvbkVuZChlKX1cbiAgICA+XG4gICAgICA8dGJvZHkgY2xhc3M9XCJzYmItY2FsZW5kYXJfX3RhYmxlLWJvZHlcIj5cbiAgICAgICAgJHt5ZWFycy5tYXAoXG4gICAgICAgICAgKHJvdzogbnVtYmVyW10pID0+XG4gICAgICAgICAgICBodG1sYCA8dHI+XG4gICAgICAgICAgICAgICR7cm93Lm1hcCgoeWVhcjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdXRPZlJhbmdlID0gIXRoaXMuX2lzWWVhckluUmFuZ2UoeWVhcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaWx0ZXJlZE91dCA9ICF0aGlzLl9pc1llYXJGaWx0ZXJlZE91dCh5ZWFyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHRoaXMuX3NlbGVjdGVkKSEpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZDogYm9vbGVhbiA9ICEhdGhpcy5fc2VsZWN0ZWQgJiYgeWVhciA9PT0gc2VsZWN0ZWRZZWFyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKG5vdykgPT09IHllYXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgIDx0ZCBjbGFzcz1cInNiYi1jYWxlbmRhcl9fdGFibGUtZGF0YSBzYmItY2FsZW5kYXJfX3RhYmxlLXllYXJcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9JHtjbGFzc01hcCh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fcGlsbCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgJ3NiYi1jYWxlbmRhcl9fY2VsbC1jdXJyZW50JzogaXNDdXJyZW50WWVhcixcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19jcm9zc2VkLW91dCc6ICFpc091dE9mUmFuZ2UgJiYgaXNGaWx0ZXJlZE91dCxcbiAgICAgICAgICAgICAgICAgICAgICAnc2JiLWNhbGVuZGFyX19zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5fb25ZZWFyU2VsZWN0aW9uKHllYXIsIHNoaWZ0UmlnaHQpfVxuICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHtpc091dE9mUmFuZ2UgfHwgaXNGaWx0ZXJlZE91dH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0ke3llYXJ9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtcHJlc3NlZD0ke3NlbGVjdGVkfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7U3RyaW5nKGlzT3V0T2ZSYW5nZSB8fCBpc0ZpbHRlcmVkT3V0KX1cbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEteWVhcj0ke3llYXIgfHwgbm90aGluZ31cbiAgICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9oYW5kbGVLZXlib2FyZEV2ZW50KGV2dCl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICR7eWVhcn1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmAsXG4gICAgICAgICl9XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+YDtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgdGhlIHllYXIgYW5kIGNoYW5nZSB0aGUgdmlldyB0byBtb250aCBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgX29uWWVhclNlbGVjdGlvbih5ZWFyOiBudW1iZXIsIHJpZ2h0U2lkZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Nob3NlblllYXIgPSByaWdodFNpZGUgPyB5ZWFyIC0gMSA6IHllYXI7XG4gICAgdGhpcy5fbmV4dENhbGVuZGFyVmlldyA9ICdtb250aCc7XG4gICAgdGhpcy5fYXNzaWduQWN0aXZlRGF0ZShcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHRoaXMuX2Nob3NlblllYXIsXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgICB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuX3N0YXJ0VGFibGVUcmFuc2l0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRWaWV3KCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICBpZiAoaXNTZXJ2ZXIgfHwgdGhpcy5oeWRyYXRpb25SZXF1aXJlZCkge1xuICAgICAgLy8gVE9ETzogV2UgZGlzYWJsZSBTU1IgZm9yIGNhbGVuZGFyIGZvciBub3cuIEZpZ3VyZSBvdXIsIGlmIHRoZXJlIGlzIGEgd2F5XG4gICAgICAvLyB0byBlbmFibGUgaXQsIHdoaWxlIGNvbnNpZGVyaW5nIGkxOG4gYW5kIGRhdGUgaW5mb3JtYXRpb24uXG4gICAgICByZXR1cm4gaHRtbGAke25vdGhpbmd9YDtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLl9jYWxlbmRhclZpZXcpIHtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyWWVhclZpZXcoKTtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlck1vbnRoVmlldygpO1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJEYXlWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGFibGVBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFibGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdoaWRlJykge1xuICAgICAgdGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnc2JiLWNhbGVuZGFyX190YWJsZS1oaWRlJyk7XG4gICAgICB0aGlzLl9yZXNldEZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NhbGVuZGFyVmlldyA9IHRoaXMuX25leHRDYWxlbmRhclZpZXc7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbmltYXRpb25OYW1lID09PSAnc2hvdycpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRyYW5zaXRpb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRhYmxlVHJhbnNpdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS10cmFuc2l0aW9uJywgdHJ1ZSk7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJylcbiAgICAgID8uZm9yRWFjaCgoZSkgPT4gZS5jbGFzc0xpc3QudG9nZ2xlKCdzYmItY2FsZW5kYXJfX3RhYmxlLWhpZGUnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwic2JiLWNhbGVuZGFyX193cmFwcGVyXCI+JHt0aGlzLl9nZXRWaWV3KCl9PC9kaXY+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLWNhbGVuZGFyJzogU2JiQ2FsZW5kYXJFbGVtZW50O1xuICB9XG59XG4iXSwibmFtZXMiOlsiU2JiQ2FsZW5kYXJFbGVtZW50IiwiX2EiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWdHTSxzQkFBa0IsTUFBQTs7MEJBRHZCLGNBQWMsY0FBYyxDQUFD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
|