ids-enterprise-wc 1.15.9-patch.3 → 1.15.9-patch.4

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.
Files changed (42) hide show
  1. package/chunks/{ids-chunk-PLPR5GKJ-full.js → ids-chunk-INOASOWB-full.js} +2 -2
  2. package/chunks/{ids-chunk-FBSXIEML-full.js → ids-chunk-LBCYQLZV-full.js} +2 -2
  3. package/chunks/{ids-chunk-FBSXIEML-full.js.map → ids-chunk-LBCYQLZV-full.js.map} +2 -2
  4. package/chunks/{ids-chunk-TUTTQTPT-full.js → ids-chunk-LFAI3KCS-full.js} +16 -5
  5. package/chunks/{ids-chunk-TUTTQTPT-full.js.map → ids-chunk-LFAI3KCS-full.js.map} +2 -2
  6. package/chunks/{ids-chunk-YNW5W3PP-full.js → ids-chunk-PNETRNHG-full.js} +35 -12
  7. package/chunks/ids-chunk-PNETRNHG-full.js.map +7 -0
  8. package/chunks/{ids-chunk-GLMW7DMU-full.js → ids-chunk-TJ35QP4Y-full.js} +4 -3
  9. package/chunks/{ids-chunk-GLMW7DMU-full.js.map → ids-chunk-TJ35QP4Y-full.js.map} +2 -2
  10. package/components/ids-accordion/ids-accordion.css +156 -8
  11. package/components/ids-calendar/ids-calendar.js +4 -4
  12. package/components/ids-card/ids-card.css +4 -344
  13. package/components/ids-data-grid/ids-data-grid-editors.js +3 -3
  14. package/components/ids-data-grid/ids-data-grid-filters.js +2 -2
  15. package/components/ids-data-grid/ids-data-grid.js +4 -4
  16. package/components/ids-date-picker/ids-date-picker-popup.js +2 -2
  17. package/components/ids-date-picker/ids-date-picker.css +389 -31
  18. package/components/ids-date-picker/ids-date-picker.d.ts +5 -0
  19. package/components/ids-date-picker/ids-date-picker.js +3 -3
  20. package/components/ids-hierarchy/ids-hierarchy.css +117 -14
  21. package/components/ids-hyperlink/ids-hyperlink.css +15 -188
  22. package/components/ids-layout-flex/ids-layout-flex.css +69 -6
  23. package/components/ids-layout-grid/ids-layout-grid.css +10 -21300
  24. package/components/ids-list-view/ids-list-view.css +112 -15
  25. package/components/ids-menu/ids-menu.css +11 -7
  26. package/components/ids-modal/ids-modal.css +23 -94
  27. package/components/ids-module-nav/ids-module-nav.css +1 -182
  28. package/components/ids-month-view/ids-month-view.js +1 -1
  29. package/components/ids-pager/ids-pager.css +28 -25
  30. package/components/ids-swappable/ids-swappable.css +84 -19
  31. package/components/ids-tabs/ids-tabs.css +542 -11
  32. package/components/ids-tag/ids-tag.css +8 -152
  33. package/components/ids-time-picker/ids-time-picker.css +49 -67
  34. package/components/ids-week-view/ids-week-view.js +3 -3
  35. package/custom-elements.json +964 -942
  36. package/enterprise-wc.all.iife.js +53 -18
  37. package/enterprise-wc.all.iife.js.map +3 -3
  38. package/enterprise-wc.js +5 -5
  39. package/package.json +1 -1
  40. package/vscode.html-custom-data.json +1 -1
  41. package/chunks/ids-chunk-YNW5W3PP-full.js.map +0 -7
  42. /package/chunks/{ids-chunk-PLPR5GKJ-full.js.map → ids-chunk-INOASOWB-full.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/components/ids-data-grid/ids-data-grid.scss", "../../../../src/components/ids-data-grid/ids-data-grid.ts"],
4
- "sourcesContent": ["export default `/* Ids Data Grid Component - Filter */\n.ids-data-grid {\n --ids-button-formatter-color-text-default: var(--ids-data-grid-filter-icon-color);\n --ids-button-formatter-color-background-hover: var(--ids-data-grid-filter-icon-color-background-hover);\n --ids-button-formatter-color-text-hover: var(--ids-data-grid-filter-icon-color-hover);\n --ids-menu-item-width-min: 190px;\n --ids-trigger-field-button-inset-inline-start: 0;\n}\n.ids-data-grid .ids-data-grid-header-cell-filter-wrapper ids-dropdown {\n --ids-trigger-field-button-inset-inline-start: -1px;\n padding-top: 3px;\n}\n.ids-data-grid[data-row-height=md] ids-dropdown, .ids-data-grid[data-row-height=sm] ids-dropdown, .ids-data-grid[data-row-height=xs] ids-dropdown, .ids-data-grid[data-row-height=xxs] ids-dropdown {\n padding-top: 0;\n}\n.ids-data-grid ::slotted([slot^=filter-]) {\n align-items: center;\n display: flex;\n position: relative;\n}\n.ids-data-grid .ids-data-grid-header-cell-content.vertical-align-center {\n position: relative;\n top: calc(50% - var(--ids-space-sm));\n}\n.ids-data-grid .ids-data-grid-header-cell-filter-wrapper {\n align-items: center;\n display: flex;\n position: relative;\n padding-inline: calc(var(--ids-space-xs) + 4px);\n padding-block-end: var(--ids-space-xs);\n}\n.ids-data-grid .ids-data-grid-header-cell-filter-wrapper.hidden {\n display: none;\n}\n.ids-data-grid .ids-data-grid-header-cell-filter-wrapper ids-dropdown[compact] ids-list-box-option {\n font-size: unset;\n min-height: var(--ids-size-20);\n}\n.ids-data-grid .ids-data-grid-header-cell.is-uppercase .ids-data-grid-header-cell-filter-wrapper ids-list-box-option,\n.ids-data-grid .ids-data-grid-header-cell.is-uppercase .ids-data-grid-header-cell-filter-wrapper ids-dropdown::part(triggerfield-input),\n.ids-data-grid .ids-data-grid-header-cell.is-uppercase .ids-data-grid-header-cell-filter-wrapper ids-input::part(input) {\n text-transform: uppercase;\n}\n.ids-data-grid [data-filter-conditions-button] {\n --ids-button-icon-compact-height: 20px;\n --ids-button-icon-compact-width: 36px;\n margin-inline-end: 2px;\n margin-inline-start: 0;\n}\n.ids-data-grid [data-filter-conditions-button] ids-icon {\n margin-inline-start: 3px;\n margin-inline-end: -3px;\n}\n.ids-data-grid [data-filter-conditions-button] ids-icon-button {\n padding-inline-start: 0;\n}\n\n/* Ids Data Grid Component - Header */\n.ids-data-grid-header {\n position: sticky;\n top: var(--ids-space-none);\n z-index: 1;\n height: 34px;\n --ids-button-formatter-size: 28px;\n}\n.ids-data-grid-header.is-frozen {\n z-index: 2;\n}\n.ids-data-grid-header:has(.ids-data-grid-header-cell-filter-wrapper) {\n height: 62px;\n}\n\n.ids-data-grid-header-text .ids-data-grid-checkbox-container {\n width: 20px;\n}\n.ids-data-grid-header-text .ids-data-grid-checkbox-container[disabled=true] {\n cursor: default;\n}\n.ids-data-grid-header-text .ids-data-grid-checkbox-container .ids-data-grid-checkbox[disabled=true] {\n pointer-events: none;\n opacity: var(--ids-data-grid-header-checkbox-opacity-disabled);\n}\n.ids-data-grid-header-text .ids-data-grid-checkbox-container .ids-data-grid-checkbox:not(.checked):not(.indeterminate) {\n background-color: var(--ids-data-grid-header-checkbox-color-background);\n border-color: var(--ids-data-grid-header-checkbox-color-border);\n}\n\n.ids-data-grid-header-cell {\n box-sizing: border-box;\n border-inline-start: 1px solid var(--ids-data-grid-header-color-border);\n border-block-end: 1px solid var(--ids-data-grid-header-color-border);\n background-color: var(--ids-data-grid-header-color-background-default);\n min-height: 28px;\n position: relative;\n}\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) {\n height: 62px;\n}\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-text {\n padding-block-end: var(--ids-space-2xs);\n}\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper {\n height: var(--ids-data-grid-filter-height);\n}\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper ids-menu-button {\n height: var(--ids-data-grid-filter-height);\n}\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper ids-menu-button::part(button) {\n height: inherit;\n}\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper ids-dropdown::part(triggerfield-field-container),\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper ids-input::part(field-container),\n.ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper ids-trigger-field::part(field-container) {\n height: var(--ids-data-grid-filter-height);\n}\n.ids-data-grid-header-cell:first-child {\n border-inline-start-width: var(--ids-border-width-none);\n}\n.ids-data-grid-header-cell:hover.is-actionable {\n background-color: var(--ids-data-grid-header-color-background-hover);\n}\n.ids-data-grid-header-cell.align-center .ids-data-grid-header-cell-content, .ids-data-grid-header-cell.align-center .ids-data-grid-header-cell-filter-wrapper {\n justify-content: center;\n}\n.ids-data-grid-header-cell.align-right .ids-data-grid-header-cell-content, .ids-data-grid-header-cell.align-right .ids-data-grid-header-cell-filter-wrapper {\n justify-content: flex-end;\n}\n.ids-data-grid-header-cell.align-right .is-sortable .ids-data-grid-header-text {\n padding-inline-end: var(--ids-data-grid-padding-lg);\n padding-inline-start: 5px;\n}\n.ids-data-grid-header-cell.align-right .ids-data-grid-header-cell-filter-wrapper ids-menu-button {\n margin-inline-start: var(--ids-space-3xs);\n}\n.ids-data-grid-header-cell .resizer {\n cursor: var(--ids-cursor-resize);\n display: inline;\n height: 100%;\n position: absolute;\n margin-inline-start: calc(100% - 4px);\n top: var(--ids-space-none);\n width: 6px;\n z-index: 2;\n}\n.ids-data-grid-header-cell .reorderer {\n cursor: var(--ids-cursor-move);\n display: inline;\n height: 34px;\n opacity: 0;\n position: absolute;\n inset-inline-start: var(--ids-space-xs);\n top: var(--ids-space-none);\n width: var(--ids-space-2xs);\n}\n.ids-data-grid-header-cell .reorderer ids-icon {\n position: absolute;\n color: var(--ids-data-grid-header-color-icon);\n inset-inline-start: calc(-1 * var(--ids-space-xs));\n text-align: center;\n top: calc(50% - 9px);\n}\n.ids-data-grid-header-cell.align-right .reorderer {\n inset-inline-end: 5px;\n inset-inline-start: initial;\n}\n.ids-data-grid-header-cell:last-child .resizer {\n margin-inline-start: calc(100% - 6px);\n}\n.ids-data-grid-header-cell.dragging {\n background-color: var(--ids-data-grid-header-drag-background-color) !important;\n border-inline-start: var(--ids-space-none);\n display: block;\n left: -1000px;\n position: absolute;\n top: var(--ids-space-none);\n width: 110px;\n}\n.ids-data-grid-header-cell.active-drag-column {\n background-color: var(--ids-data-grid-header-color-background-default-placeholder-dragging);\n}\n.ids-data-grid-header-cell.active-drag-column .sort-indicator {\n opacity: 0;\n}\n.ids-data-grid-header-cell:hover .reorderer {\n opacity: 1;\n}\n.ids-data-grid-header-cell.frozen {\n background-color: var(--ids-data-grid-header-color-background-default);\n position: sticky;\n z-index: 3;\n}\n.ids-data-grid-header-cell.frozen-last {\n border-inline-end: 1px solid var(--ids-data-grid-header-color-border);\n}\n.ids-data-grid-header-cell.frozen-last + .ids-data-grid-header-cell {\n border-inline-start-width: var(--ids-border-width-none);\n}\n.ids-data-grid-header-cell.frozen-left {\n position: sticky;\n left: var(--ids-space-none);\n z-index: 2;\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(2) {\n left: var(--ids-data-grid-frozen-column-left-width-2);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(3) {\n left: var(--ids-data-grid-frozen-column-left-width-3);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(4) {\n left: var(--ids-data-grid-frozen-column-left-width-4);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(5) {\n left: var(--ids-data-grid-frozen-column-left-width-5);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(6) {\n left: var(--ids-data-grid-frozen-column-left-width-6);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(7) {\n left: var(--ids-data-grid-frozen-column-left-width-7);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(8) {\n left: var(--ids-data-grid-frozen-column-left-width-8);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(9) {\n left: var(--ids-data-grid-frozen-column-left-width-9);\n}\n.ids-data-grid-header-cell.frozen-left:nth-of-type(10) {\n left: var(--ids-data-grid-frozen-column-left-width-10);\n}\n.ids-data-grid-header-cell.frozen-right {\n position: sticky;\n right: var(--ids-space-none);\n}\n.ids-data-grid-header-cell.frozen-right .ids-data-grid-header-cell-content {\n display: inline-flex;\n}\n\n.ids-data-grid-header-cell-content {\n display: flex;\n}\n\n.ids-data-grid-header-text {\n display: block;\n padding: var(--ids-data-grid-header-lg-padding);\n font-weight: var(--ids-font-weight-semibold);\n font-size: var(--ids-data-grid-font-size-sm);\n color: var(--ids-data-grid-header-color-text);\n overflow: hidden;\n text-align: left;\n text-overflow: ellipsis;\n user-select: none;\n white-space: nowrap;\n}\n.ids-data-grid-header-text small {\n font-weight: var(--ids-font-weight-normal);\n font-size: var(--ids-data-grid-font-size-sm);\n}\n\n.header-text-content {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ids-data-grid-header-cell.is-required .header-text-content::after,\n.ids-data-grid-header-cell.is-required .ids-checkbox .label-text::after {\n content: \"*\";\n color: var(--ids-input-required-indicator-color-text-default);\n margin-inline-start: var(--ids-space-3xs);\n}\n\n.ids-data-grid-header-icon {\n align-self: center;\n color: var(--ids-data-grid-header-color-text);\n margin-inline-start: var(--ids-space-2xs);\n margin-block-start: var(--ids-space-2xs);\n}\n\n.sort-indicator {\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: relative;\n overflow: hidden;\n height: calc(var(--ids-space-lg) - 2px);\n width: 18px;\n}\n\n.is-sortable .sort-indicator ids-icon {\n color: var(--ids-data-grid-header-color-icon-unsorted);\n opacity: 0;\n transition: opacity 0.3s var(--ids-motion-ease) 0s;\n}\n.is-sortable .sort-indicator ids-icon:first-child {\n position: relative;\n top: var(--ids-space-2xs);\n transform: rotate(180deg);\n}\n.is-sortable .sort-indicator ids-icon:last-child {\n position: relative;\n top: -10px;\n}\n.is-sortable:hover {\n cursor: pointer;\n}\n.is-sortable:hover .sort-indicator ids-icon {\n opacity: 1;\n}\n\n.header-expander {\n display: none;\n max-height: 18px;\n cursor: var(--ids-cursor-pointer);\n color: var(--ids-data-grid-header-expander-color);\n margin-inline-start: var(--ids-space-12);\n}\n.header-expander:hover {\n color: var(--ids-data-grid-header-expander-color-active);\n}\n\n[data-row-height=xxs] .header-expander {\n top: var(--ids-space-3xs);\n}\n\n:host([show-header-expander]) .header-expander,\n.column-header-expander .header-expander {\n display: unset;\n}\n\n.has-selectioncheckbox .ids-data-grid-header-text {\n padding-inline-start: var(--ids-space-none);\n padding-inline-end: var(--ids-space-none);\n}\n\n.is-sortable .ids-data-grid-header-text,\n.has-headericon .ids-data-grid-header-text {\n padding-inline-end: var(--ids-space-none);\n}\n\n[aria-sort=ascending] .is-sortable .sort-indicator ids-icon:first-child {\n color: var(--ids-data-grid-header-color-icon-sorted);\n opacity: 1;\n}\n[aria-sort=ascending] .is-sortable .sort-indicator ids-icon:last-child {\n opacity: 1;\n}\n\n[aria-sort=descending] .is-sortable .sort-indicator ids-icon:first-child {\n opacity: 1;\n}\n[aria-sort=descending] .is-sortable .sort-indicator ids-icon:last-child {\n color: var(--ids-data-grid-header-color-icon-sorted);\n opacity: 1;\n}\n\n.ids-data-grid-sort-arrows {\n display: none;\n height: 34px;\n position: absolute;\n z-index: 1;\n}\n.ids-data-grid-sort-arrows::before, .ids-data-grid-sort-arrows::after {\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n content: \"\";\n display: inline-block;\n height: 0;\n left: -5px;\n position: absolute;\n width: 0;\n}\n.ids-data-grid-sort-arrows::before {\n border-top: 5px solid var(--ids-data-grid-header-drag-arrow-color-background);\n top: -6px;\n}\n.ids-data-grid-sort-arrows::after {\n border-bottom: 5px solid var(--ids-data-grid-header-drag-arrow-color-background);\n bottom: -9px;\n}\n\ntr.ids-data-grid-header {\n position: initial;\n}\n\nth.ids-data-grid-header-cell {\n display: table-cell;\n}\n\n.ids-data-grid.is-list-style .ids-data-grid-header-cell {\n background-color: var(--ids-data-grid-list-header-color-background);\n border-color: var(--ids-data-grid-list-header-color-border);\n}\n.ids-data-grid.is-list-style .ids-data-grid-header-text {\n color: var(--ids-data-grid-list-header-color-text);\n}\n.ids-data-grid.is-list-style .is-sortable ids-icon {\n color: var(--ids-data-grid-header-color-icon-unsorted);\n}\n.ids-data-grid.is-list-style [aria-sort=descending] .is-sortable ids-icon:last-child,\n.ids-data-grid.is-list-style [aria-sort=ascending] .is-sortable ids-icon:first-child {\n color: var(--ids-data-grid-list-header-color-icon-unsorted);\n}\n.ids-data-grid.is-list-style .ids-data-grid-header-text .ids-data-grid-checkbox-container .ids-data-grid-checkbox:not(.checked):not(.indeterminate) {\n border-color: var(--ids-data-grid-list-header-checkbox-color-background);\n}\n\n.ids-data-grid-body {\n min-width: fit-content;\n}\n\n.ids-data-grid[data-row-height=md] .ids-data-grid-header-text {\n padding: var(--ids-data-grid-header-md-padding);\n}\n.ids-data-grid[data-row-height=md] .reorderer ids-icon {\n inset-inline-start: -11px;\n}\n.ids-data-grid[data-row-height=md] .sort-indicator {\n margin-inline-start: -8px;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-header-cell.align-right .reorderer {\n inset-inline-end: 3px;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-text {\n padding-block-end: var(--ids-space-2xs);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-header-text {\n padding: var(--ids-data-grid-header-sm-padding);\n}\n.ids-data-grid[data-row-height=sm] .reorderer {\n display: none;\n}\n.ids-data-grid[data-row-height=sm] .sort-indicator {\n margin-inline-start: -4px;\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-text {\n padding-block-end: var(--ids-space-2xs);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper {\n padding-inline: var(--ids-space-xs);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header {\n height: 30px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header:has(.ids-data-grid-header-cell-filter-wrapper) {\n height: 58px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header-cell {\n min-height: 30px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) {\n height: 58px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-text {\n padding-block-end: var(--ids-space-2xs);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper {\n padding-inline: var(--ids-space-2xs);\n padding-block-end: 6px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header-text {\n padding: var(--ids-data-grid-header-xs-padding);\n}\n.ids-data-grid[data-row-height=xs] .reorderer {\n display: none;\n}\n.ids-data-grid[data-row-height=xs] .sort-indicator {\n margin-inline-start: -2px;\n margin-inline-end: -2px;\n margin-block-start: -3px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-checkbox-container {\n padding-top: var(--ids-space-3xs);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-header-cell.align-right .is-sortable .ids-data-grid-header-text {\n padding-inline-end: var(--ids-data-grid-padding-xs);\n padding-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header {\n height: 30px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header:has(.ids-data-grid-header-cell-filter-wrapper) {\n height: 58px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-cell {\n min-height: 30px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) {\n height: 58px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-text {\n padding: var(--ids-space-2xs);\n padding-block-start: 6px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-cell:has(.ids-data-grid-header-cell-filter-wrapper) .ids-data-grid-header-cell-filter-wrapper {\n padding-inline: var(--ids-space-2xs);\n padding-block-end: 6px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-text {\n padding: var(--ids-data-grid-header-xxs-padding);\n}\n.ids-data-grid[data-row-height=xxs] .reorderer {\n display: none;\n}\n.ids-data-grid[data-row-height=xxs] .sort-indicator {\n margin-inline-start: var(--ids-space-none);\n margin-block-start: -1px;\n height: 22px;\n}\n.ids-data-grid[data-row-height=xxs] .sort-indicator > ids-icon:first-child {\n top: 3px;\n}\n.ids-data-grid[data-row-height=xxs] .sort-indicator ids-icon:last-child {\n top: -11px;\n}\n.ids-data-grid[data-row-height=xxs] .align-right .sort-indicator {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-text .ids-data-grid-checkbox-container {\n padding-top: 3px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-cell.align-right .is-sortable .ids-data-grid-header-text {\n padding-inline-end: 3px;\n padding-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] ids-input,\n.ids-data-grid[data-row-height=xxs] ids-menu-button,\n.ids-data-grid[data-row-height=xxs] ids-trigger-field,\n.ids-data-grid[data-row-height=xxs] ids-dropdown {\n --ids-input-height-10: 24px;\n}\n.ids-data-grid[data-row-height=xxs] ids-dropdown {\n --ids-input-font-size-sm: var(--ids-input-font-size-xs);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-header-cell-filter-wrapper {\n padding-inline-start: calc(var(--ids-data-grid-padding-xxs) + 2px);\n padding-inline-end: calc(var(--ids-data-grid-padding-xxs) + 2px);\n padding-block-end: calc(var(--ids-data-grid-padding-xxs) - 1px);\n}\n\n.ids-data-grid .has-col-selection .ids-data-grid-header-cell:not([column-id=selectionCheckbox]) .ids-data-grid-header-cell-content {\n justify-content: flex-start;\n}\n.ids-data-grid .has-col-selection .ids-data-grid-header-cell:not([column-id=selectionCheckbox]) .ids-data-grid-header-cell-content .ids-data-grid-header-text .ids-checkbox .label-text {\n position: absolute;\n overflow: hidden;\n text-overflow: ellipsis;\n width: 80%;\n}\n.ids-data-grid .has-col-selection .ids-data-grid-header-cell:not([column-id=selectionCheckbox]) .ids-data-grid-header-cell-content.is-sortable .ids-data-grid-header-text .ids-checkbox .label-text, .ids-data-grid .has-col-selection .ids-data-grid-header-cell:not([column-id=selectionCheckbox]) .ids-data-grid-header-cell-content.is-reorderable .ids-data-grid-header-text .ids-checkbox .label-text {\n width: 70%;\n}\n.ids-data-grid .has-col-selection .ids-data-grid-header-cell:not([column-id=selectionCheckbox]) .ids-data-grid-header-cell-content.is-sortable.is-reorderable .ids-data-grid-header-text .ids-checkbox .label-text {\n width: 60%;\n}\n.ids-data-grid .has-col-selection .sort-indicator {\n margin-inline-start: auto;\n}\n\n:host([dir=rtl]) .ids-data-grid-header-cell.align-right .ids-data-grid-header-cell-content {\n direction: ltr;\n}\n:host([dir=rtl]) .ids-data-grid-header-cell:last-child {\n border-inline-end-width: var(--ids-border-width-none);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left {\n position: sticky;\n right: var(--ids-space-none);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(2) {\n right: var(--ids-data-grid-frozen-column-left-width-2);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(3) {\n right: var(--ids-data-grid-frozen-column-left-width-3);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(4) {\n right: var(--ids-data-grid-frozen-column-left-width-4);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(5) {\n right: var(--ids-data-grid-frozen-column-left-width-5);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(6) {\n right: var(--ids-data-grid-frozen-column-left-width-6);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(7) {\n right: var(--ids-data-grid-frozen-column-left-width-7);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(8) {\n right: var(--ids-data-grid-frozen-column-left-width-8);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(9) {\n right: var(--ids-data-grid-frozen-column-left-width-9);\n}\n:host([dir=rtl]) .ids-data-grid-header-cell.frozen-left:nth-of-type(10) {\n right: var(--ids-data-grid-frozen-column-left-width-10);\n}\n\n/* Ids Data Grid Component - Rows */\n.ids-data-grid-row {\n display: grid;\n grid-template-columns: var(--ids-data-grid-column-widths);\n width: 100%;\n height: inherit;\n}\n.ids-data-grid-row.is-drag-target {\n margin-top: 50px;\n border-top: 1px solid var(--ids-data-grid-cell-color-border);\n}\n.ids-data-grid-row.selected:not(.mixed) .ids-data-grid-cell, .ids-data-grid-row.activated .ids-data-grid-cell {\n background-color: var(--ids-data-grid-row-color-background-selected);\n}\n.ids-data-grid-row[hidden] {\n display: none;\n}\n.ids-data-grid-row[part*=row-]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-style: solid;\n border-width: 5px;\n content: \"\";\n position: absolute;\n z-index: 1;\n margin: 2px;\n top: 0;\n}\n.ids-data-grid-row[part=row-new] {\n background-color: var(--ids-data-grid-row-color-background-new);\n}\n.ids-data-grid-row[part=row-new]:not(.selected) .ids-data-grid-cell {\n background-color: var(--ids-data-grid-row-color-background-new);\n color: var(--ids-data-grid-cell-color-text-states-default);\n}\n.ids-data-grid-row[part=row-new]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-color: var(--ids-data-grid-row-color-border-new) transparent transparent var(--ids-data-grid-row-color-border-new);\n}\n.ids-data-grid-row[part=row-removed] {\n background-color: var(--ids-data-grid-row-color-background-removed);\n}\n.ids-data-grid-row[part=row-removed]:not(.selected) .ids-data-grid-cell {\n background-color: var(--ids-data-grid-row-color-background-removed);\n color: var(--ids-data-grid-cell-color-text-states-default);\n}\n.ids-data-grid-row[part=row-removed]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-color: var(--ids-data-grid-row-color-border-removed) transparent transparent var(--ids-data-grid-row-color-border-removed);\n}\n.ids-data-grid-row[part=row-error] {\n background-color: var(--ids-data-grid-row-color-background-error);\n}\n.ids-data-grid-row[part=row-error]:not(.selected) .ids-data-grid-cell {\n background-color: var(--ids-data-grid-row-color-background-error);\n color: var(--ids-data-grid-cell-color-text-states-default);\n}\n.ids-data-grid-row[part=row-error]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-color: var(--ids-data-grid-row-color-border-error) transparent transparent var(--ids-data-grid-row-color-border-error);\n}\n\n.ids-data-grid-row.is-group-row {\n background-color: var(--ids-data-grid-row-grouped-color-background);\n grid-template-columns: 100%;\n}\n.ids-data-grid-row.is-group-row .ids-data-grid-cell {\n color: var(--ids-data-grid-row-grouped-color-text, red);\n font-weight: var(--ids-data-grid-row-grouped-font-weight, 600);\n border-inline-start: 0;\n}\n.ids-data-grid-row.is-group-row ids-button {\n --ids-button-tertiary-color-background-hover: transparent;\n --ids-button-tertiary-color-border-hover: transparent;\n padding: 0 2px;\n}\n\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell {\n height: var(--ids-data-grid-row-height-md);\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell .text-ellipsis,\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell ids-badge {\n padding-inline-start: var(--ids-data-grid-padding-md);\n padding-inline-end: var(--ids-data-grid-padding-md);\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell-content:not(.vertical-align-center) .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-md);\n transition: padding var(--ids-motion-duration) var(--ids-motion-ease);\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell:hover .ids-data-grid-header-cell-content:not(.vertical-align-center).is-reorderable .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-md);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell {\n height: var(--ids-data-grid-row-height-sm);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell .text-ellipsis,\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell ids-badge {\n padding-inline-start: var(--ids-data-grid-padding-sm);\n padding-inline-end: var(--ids-data-grid-padding-sm);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell-content:not(.vertical-align-center) .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-sm);\n transition: padding var(--ids-motion-duration) var(--ids-motion-ease);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell:hover .ids-data-grid-header-cell-content:not(.vertical-align-center).is-reorderable .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-sm);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell {\n height: var(--ids-data-grid-row-height-xs);\n font-size: var(--ids-data-grid-font-size-sm);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell .text-ellipsis,\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell ids-badge {\n padding-inline-start: var(--ids-data-grid-padding-xs);\n padding-inline-end: var(--ids-data-grid-padding-xs);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell-content:not(.vertical-align-center) .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-xs);\n transition: padding var(--ids-motion-duration) var(--ids-motion-ease);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell:hover .ids-data-grid-header-cell-content:not(.vertical-align-center).is-reorderable .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-xs);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell {\n height: var(--ids-data-grid-row-height-xxs);\n font-size: var(--ids-data-grid-font-size-sm);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell .text-ellipsis,\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell ids-badge {\n padding-inline-start: var(--ids-data-grid-padding-xxs);\n padding-inline-end: var(--ids-data-grid-padding-xxs);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-inline .text-ellipsis {\n padding-inline-start: var(--ids-data-grid-padding-xs);\n padding-inline-end: var(--ids-data-grid-padding-xs);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell-content:not(.vertical-align-center) .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-xxs);\n transition: padding var(--ids-motion-duration) var(--ids-motion-ease);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell:not(.align-center) .ids-data-grid-header-cell:hover .ids-data-grid-header-cell-content:not(.vertical-align-center).is-reorderable .ids-data-grid-header-text {\n padding-inline-start: var(--ids-data-grid-padding-xxs);\n}\n\n.ids-data-grid.alt-row-shading ids-data-grid-row:nth-child(even) {\n background-color: var(--ids-data-grid-row-alternating-color-background);\n}\n\n.ids-data-grid-expandable-row {\n border-bottom: 1px solid var(--ids-data-grid-cell-color-border);\n grid-column: 1/-1;\n padding: var(--ids-space-xs);\n}\n\ntr.ids-data-grid-row {\n display: table-row;\n height: var(--ids-data-grid-row-height-lg);\n}\n\n.ids-data-grid.row-navigation .ids-data-grid-body .ids-data-grid-row:focus-within {\n transform-style: preserve-3d;\n}\n.ids-data-grid.row-navigation .ids-data-grid-body .ids-data-grid-row:focus-within::after {\n box-shadow: var(--ids-data-grid-row-shadow-focus);\n content: \" \";\n display: block;\n height: calc(100% - 1px);\n position: absolute;\n width: 100%;\n}\n.ids-data-grid.row-navigation .ids-data-grid-body .ids-data-grid-row .ids-data-grid-cell:focus {\n box-shadow: none;\n outline: none;\n}\n.ids-data-grid.row-navigation .ids-data-grid-body .ids-data-grid-row ids-hyperlink,\n.ids-data-grid.row-navigation .ids-data-grid-body .ids-data-grid-row .ids-hyperlink {\n transform: translateZ(1px);\n}\n\n:host([dir=rtl]) .ids-data-grid-row[part=row-new]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-color: var(--ids-data-grid-row-color-border-new) var(--ids-data-grid-row-color-border-new) transparent transparent;\n}\n:host([dir=rtl]) .ids-data-grid-row[part=row-removed]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-color: var(--ids-data-grid-row-color-border-removed) var(--ids-data-grid-row-color-border-removed) transparent transparent;\n}\n:host([dir=rtl]) .ids-data-grid-row[part=row-error]:not(.selected) .ids-data-grid-cell:first-child::before {\n border-color: var(--ids-data-grid-row-color-border-error) var(--ids-data-grid-row-color-border-error) transparent transparent;\n}\n\n/* Ids Data Grid Component - Cells */\n/* Generates a pseudo-element representing the dirty tracker */\nids-data-grid-cell[column-onscreen] {\n visibility: visible;\n}\n\nids-data-grid-cell[column-offscreen] {\n visibility: visible;\n}\n\nids-data-grid-cell[column-offscreen-left] {\n visibility: visible;\n}\n\nids-data-grid-cell[column-offscreen-right] {\n visibility: visible;\n}\n\n.ids-data-grid-row:not(.selected):not([part*=row-]) .ids-data-grid-cell:not(.is-readonly).frozen-left {\n background-color: var(--ids-data-grid-color-background);\n}\n.ids-data-grid-row:not(.selected):not([part*=row-]) .ids-data-grid-cell:not(.is-readonly).frozen-right {\n background-color: var(--ids-data-grid-color-background);\n}\n\n.ids-data-grid-cell {\n box-sizing: border-box;\n align-items: center;\n border-inline-start: 1px solid;\n border-block-end: 1px solid;\n border-color: var(--ids-data-grid-cell-color-border);\n display: inline-flex;\n color: var(--ids-data-grid-cell-color-text-default);\n height: 50px;\n overflow: hidden;\n position: relative;\n white-space: nowrap;\n}\n.ids-data-grid-cell:first-child {\n border-inline-start-width: var(--ids-border-width-none);\n}\n.ids-data-grid-cell ids-badge::part(badge) {\n margin-block-end: var(--ids-space-none);\n margin-inline-end: var(--ids-space-none);\n}\n.ids-data-grid-cell ids-badge {\n padding-inline-start: var(--ids-space-sm);\n padding-inline-end: var(--ids-space-sm);\n}\n.ids-data-grid-cell ids-icon[icon=dropdown] {\n color: var(--ids-trigger-field-icon-color);\n}\n.ids-data-grid-cell ids-hyperlink {\n margin: 0;\n padding-inline: 12px;\n width: -moz-available;\n width: -webkit-fill-available;\n width: fill-available;\n}\n.ids-data-grid-cell .text-ellipsis {\n display: inline-block;\n vertical-align: middle;\n padding-inline-start: calc(var(--ids-space-xs) + 4px);\n padding-inline-end: calc(var(--ids-space-xs) + 4px);\n height: auto;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ids-data-grid-cell ids-icon {\n vertical-align: middle;\n}\n.ids-data-grid-cell ids-icon + span {\n vertical-align: middle;\n line-height: 25px;\n padding-inline: var(--ids-space-2xs);\n}\n.ids-data-grid-cell.align-center > *:first-child {\n display: inline-flex;\n margin: var(--ids-space-none) auto;\n}\n.ids-data-grid-cell.align-right > *:first-child {\n margin-inline-start: auto;\n margin-inline-end: var(--ids-space-none);\n}\n.ids-data-grid-cell.align-right ids-input {\n text-align: right;\n}\n.ids-data-grid-cell.is-readonly:not(.exclude-readonly-style):not(.selected) {\n background-color: var(--ids-data-grid-cell-color-background-frozen-readonly);\n}\n.ids-data-grid-cell.is-readonly:not(.exclude-readonly-style):not(.selected) .editor-cell-icon {\n display: none;\n}\n.ids-data-grid-cell.is-disabled {\n color: var(--ids-data-grid-cell-color-text-disabled);\n}\n.ids-data-grid-cell.is-disabled .editor-cell-icon {\n display: none;\n}\n.ids-data-grid-cell.is-uppercase {\n text-transform: uppercase;\n}\n.ids-data-grid-cell:focus:not(.selected):not([tabindex=\"-1\"]), .ids-data-grid-cell.is-editing:not(.is-inline):focus-within:not(.selected):not([tabindex=\"-1\"]), .ids-data-grid-cell.is-focused:not(.selected):not([tabindex=\"-1\"]) {\n box-shadow: var(--ids-shadow-20);\n outline: 1px solid var(--ids-color-border-focus);\n outline-offset: -1px;\n}\n.ids-data-grid-cell.formatter-textmask.is-hoverable {\n justify-content: space-between;\n}\n.ids-data-grid-cell.formatter-textmask.is-hoverable .text-ellipsis {\n padding-inline-end: var(--ids-space-sm);\n}\n.ids-data-grid-cell.formatter-textmask .editor-cell-icon {\n margin-inline-end: 10px;\n margin-block-start: var(--ids-space-3xs);\n display: none;\n}\n.ids-data-grid-cell.formatter-textmask .editor-cell-icon.show-cell-icon-always {\n display: inline-flex;\n}\n.ids-data-grid-cell.formatter-textmask .editor-cell-icon.show-cell-icon-always:hover {\n cursor: pointer;\n}\n.ids-data-grid-cell.formatter-textmask:not(.is-inline):not(.is-invalid):hover .editor-cell-icon, .ids-data-grid-cell.formatter-textmask.is-editing .editor-cell-icon {\n display: flex;\n}\n.ids-data-grid-cell.formatter-textmask:not(.is-inline):not(.is-invalid):hover .text-ellipsis, .ids-data-grid-cell.formatter-textmask.is-editing .text-ellipsis {\n padding-inline-end: var(--ids-space-08);\n}\n.ids-data-grid-cell.formatter-textmask:not(.is-inline):not(.is-invalid):hover ids-alert, .ids-data-grid-cell.formatter-textmask.is-editing ids-alert {\n margin-inline: calc(100% - 48px);\n}\n.ids-data-grid-cell.is-editable.is-readonly:not(.exclude-readonly-style) .text-ellipsis::after {\n background-color: var(--ids-data-grid-cell-color-background-readonly);\n}\n.ids-data-grid-cell.is-editable.is-inline.formatter-tree .ids-data-grid-tree-container {\n height: 100%;\n width: 100%;\n}\n.ids-data-grid-cell.is-editable.is-inline.formatter-tree .ids-data-grid-tree-field-container {\n height: 100%;\n width: 100%;\n}\n.ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis {\n align-items: center;\n display: flex;\n height: 100%;\n justify-content: end;\n width: 100%;\n}\n.ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n margin-inline-end: -8px;\n}\n.ids-data-grid-cell.is-editable.is-inline ids-icon.editor-cell-icon {\n display: inline-flex;\n visibility: visible;\n margin-inline-end: 15px;\n}\n.ids-data-grid-cell.is-editable.is-inline ids-icon.editor-cell-icon[icon=dropdown] {\n margin-inline-end: 12px;\n}\n.ids-data-grid-cell.is-editable.is-lookup, .ids-data-grid-cell.is-editable.is-datepicker, .ids-data-grid-cell.is-editable.is-timepicker {\n justify-content: space-between;\n}\n.ids-data-grid-cell.is-editable.is-lookup .text-ellipsis, .ids-data-grid-cell.is-editable.is-datepicker .text-ellipsis, .ids-data-grid-cell.is-editable.is-timepicker .text-ellipsis {\n padding-inline-end: var(--ids-space-none);\n}\n.ids-data-grid-cell.is-editable.is-datepicker ids-trigger-field, .ids-data-grid-cell.is-editable.is-timepicker ids-trigger-field {\n margin-inline-start: -1px;\n margin-block-start: 1px;\n}\n.ids-data-grid-cell.is-editable.is-lookup ids-lookup {\n border: 0;\n outline: none;\n width: 100%;\n}\n.ids-data-grid-cell.is-editable.is-lookup ids-lookup::part(container),\n.ids-data-grid-cell.is-editable.is-lookup ids-lookup::part(field-container) {\n background-color: var(--ids-color-transparent);\n border: 0;\n border-radius: 0;\n box-shadow: none;\n outline: none;\n height: 100%;\n width: 100%;\n display: flex;\n margin: 0;\n}\n.ids-data-grid-cell.is-editable .editor-cell-icon {\n margin-inline-end: 10px;\n margin-block-start: var(--ids-space-3xs);\n display: none;\n}\n.ids-data-grid-cell.is-editable .editor-cell-icon.show-cell-icon-always {\n display: inline-flex;\n}\n.ids-data-grid-cell.is-editable .editor-cell-icon.show-cell-icon-always:hover {\n cursor: pointer;\n}\n.ids-data-grid-cell.is-editable ids-trigger-button::part(button) {\n color: inherit;\n}\n.ids-data-grid-cell.is-editable:not(.is-inline):not(.is-invalid):not(.is-readonly):focus .editor-cell-icon, .ids-data-grid-cell.is-editable:not(.is-inline):not(.is-invalid):not(.is-readonly):hover .editor-cell-icon {\n display: flex;\n}\n.ids-data-grid-cell.is-editable:not(.is-inline):not(.is-invalid):not(.is-readonly):focus ids-alert, .ids-data-grid-cell.is-editable:not(.is-inline):not(.is-invalid):not(.is-readonly):hover ids-alert {\n margin-inline: calc(100% - 48px);\n}\n.ids-data-grid-cell.is-editable.is-editable.is-invalid {\n justify-content: space-between;\n}\n.ids-data-grid-cell.is-editable.is-editable.is-invalid ids-alert {\n margin-inline-end: var(--ids-space-xs);\n}\n.ids-data-grid-cell.is-editing ids-checkbox {\n --ids-checkbox-margin-inline-end: 0;\n --ids-checkbox-shadow-focus: 0 0 0 2px transparent, 0 0 0 3px transparent;\n --ids-checkbox-color-border-focus: var(--ids-checkbox-border);\n display: flex;\n justify-content: center;\n width: 100%;\n position: relative;\n left: 6px;\n top: 3px;\n}\n.ids-data-grid-cell.is-editing ids-checkbox[checked] {\n --ids-checkbox-color-border-focus: var(--ids-checkbox-color-background-selected);\n}\n.ids-data-grid-cell.is-editing.is-lookup, .ids-data-grid-cell.is-editing.is-datepicker, .ids-data-grid-cell.is-editing.is-timepicker, .ids-data-grid-cell.is-editing.is-password {\n overflow: visible;\n}\n.ids-data-grid-cell.is-editing.is-inline ids-input {\n z-index: 99;\n}\n.ids-data-grid-cell.is-editable.is-dropdown .dropdown-cell-value {\n width: 100%;\n}\n.ids-data-grid-cell.is-editable.is-dropdown.is-editing:not(.is-inline) {\n border-inline-start-width: 0;\n}\n.ids-data-grid-cell.is-editing.is-dropdown.is-inline {\n box-shadow: none;\n}\n.ids-data-grid-cell.is-editing.is-dropdown.is-inline ids-dropdown {\n padding: 0 var(--ids-space-2xs);\n}\n.ids-data-grid-cell.formatter-text {\n white-space: pre;\n}\n.ids-data-grid-cell.formatter-row-reorder {\n cursor: move;\n}\n.ids-data-grid-cell.is-editing.is-uppercase {\n text-transform: uppercase;\n}\n.ids-data-grid-cell.is-editing.is-uppercase ids-list-box-option,\n.ids-data-grid-cell.is-editing.is-uppercase ids-dropdown::part(triggerfield-input),\n.ids-data-grid-cell.is-editing.is-uppercase ids-input::part(input) {\n text-transform: uppercase;\n}\n.ids-data-grid-cell.frozen {\n position: sticky;\n z-index: 1;\n}\n.ids-data-grid-cell.frozen-last {\n border-inline-end: 1px solid var(--ids-data-grid-cell-color-border);\n}\n.ids-data-grid-cell.frozen-last + .ids-data-grid-cell {\n border-inline-start-width: var(--ids-border-width-none);\n}\n.ids-data-grid-cell.frozen-left {\n position: sticky;\n left: var(--ids-space-none);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(2) {\n left: var(--ids-data-grid-frozen-column-left-width-2);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(3) {\n left: var(--ids-data-grid-frozen-column-left-width-3);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(4) {\n left: var(--ids-data-grid-frozen-column-left-width-4);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(5) {\n left: var(--ids-data-grid-frozen-column-left-width-5);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(6) {\n left: var(--ids-data-grid-frozen-column-left-width-6);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(7) {\n left: var(--ids-data-grid-frozen-column-left-width-7);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(8) {\n left: var(--ids-data-grid-frozen-column-left-width-8);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(9) {\n left: var(--ids-data-grid-frozen-column-left-width-9);\n}\n.ids-data-grid-cell.frozen-left:nth-of-type(10) {\n left: var(--ids-data-grid-frozen-column-left-width-10);\n}\n.ids-data-grid-cell.frozen-right {\n position: sticky;\n right: var(--ids-space-none);\n}\n.ids-data-grid-cell.is-dirty::before {\n border-color: var(--ids-input-dirty-indicator-color-background-dirty) transparent transparent var(--ids-input-dirty-indicator-color-background-dirty);\n border-style: solid;\n border-width: 5px;\n content: \"\";\n display: inline-block;\n margin-inline: var(--ids-space-3xs);\n position: absolute;\n inset-block-start: var(--ids-space-3xs);\n z-index: 1;\n}\n.ids-data-grid-cell.is-dirty.is-inline.formatter-tree::before {\n display: none;\n content: none;\n}\n.ids-data-grid-cell.is-dirty.is-inline.formatter-tree .ids-data-grid-tree-field-container {\n position: relative;\n}\n.ids-data-grid-cell.is-dirty.is-inline.formatter-tree .ids-data-grid-tree-field-container::before {\n border-color: var(--ids-input-dirty-indicator-color-background-dirty) transparent transparent var(--ids-input-dirty-indicator-color-background-dirty);\n border-style: solid;\n border-width: 5px;\n content: \"\";\n display: inline-block;\n margin-inline: var(--ids-space-3xs);\n position: absolute;\n inset-block-start: var(--ids-space-3xs);\n z-index: 1;\n}\n.ids-data-grid-cell.is-dirty.is-inline.is-dropdown::before {\n margin-inline: 6px;\n inset-block-start: 6px;\n}\n.ids-data-grid-cell.is-dirty.is-inline ids-input::part(dirty-tracker-icon) {\n --ids-icon-height-default: 12px !important;\n --ids-icon-width-default: 12px !important;\n}\n.ids-data-grid-cell.is-dirty.is-dropdown.is-editing:not(.is-inline)::before {\n inset-block-start: 3px;\n margin-inline: 3px;\n}\n.ids-data-grid-cell.is-invalid {\n background-color: var(--ids-data-grid-cell-color-background-error);\n}\n.ids-data-grid-cell.selected {\n background-color: var(--ids-data-grid-row-color-background-selected);\n}\n.ids-data-grid-cell ids-alert {\n margin-top: 3px;\n}\n.ids-data-grid-cell ids-tag {\n --ids-tag-margin-inline-end: 0;\n}\n.ids-data-grid-cell ids-progress-bar {\n margin: var(--ids-progress-bar-grid-cell-margin);\n}\n.ids-data-grid-cell.is-editing.is-timepicker .ids-trigger-field-slot-trigger-end[icon=clock][field-height=xs] {\n margin-inline-end: -5px;\n margin-block-start: 1px;\n}\n.ids-data-grid-cell.is-editing.is-timepicker .ids-trigger-field-slot-trigger-end[icon=clock][field-height=sm] {\n margin-inline-end: var(--ids-space-3xs);\n margin-block-start: 1px;\n}\n.ids-data-grid-cell.is-editing.is-datepicker .ids-trigger-field-slot-trigger-end[icon=calendar][field-height=xs] {\n margin-inline-end: -5px;\n margin-block-start: 1px;\n}\n.ids-data-grid-cell.is-editing.is-datepicker .ids-trigger-field-slot-trigger-end[icon=calendar][field-height=sm] {\n margin-inline-end: var(--ids-space-3xs);\n margin-block-start: 1px;\n}\n\n[data-row-height=xxs] .formatter-progress ids-progress-bar {\n margin: var(--ids-data-grid-padding-xxs);\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-dirty::before {\n border-width: 4px;\n inset-block-start: 1px;\n inset-inline-start: -1px;\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-dirty.is-inline::before {\n margin-inline: 3px;\n top: 3px;\n}\n[data-row-height=xxs] ids-button {\n --ids-button-icon-padding: var(--ids-space-3xs);\n}\n[data-row-height=xxs] ids-badge {\n --ids-badge-font-line-height: calc(var(--ids-data-grid-row-height-xxs) - 8px);\n}\n[data-row-height=xxs] ids-tag {\n --ids-tag-height: calc(var(--ids-data-grid-row-height-xxs) - 6px);\n}\n[data-row-height=xxs] ids-input,\n[data-row-height=xxs] ids-trigger-field {\n --ids-space-3xs: 0;\n --ids-input-font-size-sm: var(--ids-data-grid-font-size-sm);\n}\n[data-row-height=xxs] ids-input::part(dirty-tracker-icon) {\n --ids-icon-height-default: 10px !important;\n --ids-icon-width-default: 10px !important;\n}\n[data-row-height=xxs] ids-input::part(input) {\n height: calc(var(--ids-input-height-10));\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-editing ids-input::part(input) {\n height: calc(var(--ids-input-height-10) - 4px);\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-editable .editor-cell-icon {\n margin-inline-end: var(--ids-space-3xs);\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline ids-icon.editor-cell-icon {\n margin-inline-end: var(--ids-space-2xs);\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline {\n --ids-button-tertiary-color-background-hover: var(--ids-color-transparent);\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-editing.is-dropdown.is-inline ids-dropdown {\n padding: var(--ids-space-none) var(--ids-space-4xs);\n --ids-input-font-size-sm: var(--ids-data-grid-font-size-sm);\n}\n[data-row-height=xxs] .ids-data-grid-cell .ids-data-grid-checkbox-container:not(.is-selection-checkbox) {\n padding-inline: var(--ids-data-grid-padding-xxs);\n}\n[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-editable.is-invalid ids-alert {\n margin-inline-end: var(--ids-space-4xs);\n}\n[data-row-height=xxs] .ids-data-grid-cell ids-hyperlink {\n padding-inline: var(--ids-space-2xs);\n}\n\n[data-row-height=xs] .formatter-progress ids-progress-bar {\n margin: var(--ids-data-grid-padding-xs);\n}\n[data-row-height=xs] .ids-data-grid-cell.is-dirty::before {\n border-width: 4px;\n}\n[data-row-height=xs] .ids-data-grid-cell.is-dirty.is-inline::before {\n margin-inline: 3px;\n top: 3px;\n}\n[data-row-height=xs] ids-button {\n --ids-button-icon-padding: 3px;\n}\n[data-row-height=xs] ids-badge {\n --ids-badge-font-line-height: calc(var(--ids-data-grid-row-height-xs) - 12px);\n}\n[data-row-height=xs] ids-tag {\n --ids-tag-height: calc(var(--ids-data-grid-row-height-xxs) - 4px);\n}\n[data-row-height=xs] ids-input {\n --ids-input-font-size-sm: var(--ids-data-grid-font-size-sm);\n}\n[data-row-height=xs] ids-input::part(dirty-tracker-icon) {\n --ids-icon-height-default: 12px !important;\n --ids-icon-width-default: 12px !important;\n}\n[data-row-height=xs] .ids-data-grid-cell.is-editable .editor-cell-icon {\n margin-inline-end: var(--ids-space-3xs);\n}\n[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline ids-icon.editor-cell-icon {\n margin-inline-end: var(--ids-space-2xs);\n}\n[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline {\n --ids-button-tertiary-color-background-hover: var(--ids-color-transparent);\n --ids-input-font-size-sm: var(--ids-data-grid-font-size-sm);\n}\n[data-row-height=xs] .ids-data-grid-cell.is-editing.is-dropdown.is-inline ids-dropdown {\n padding: var(--ids-space-none) var(--ids-space-3xs);\n}\n[data-row-height=xs] .ids-data-grid-cell .ids-data-grid-checkbox-container:not(.is-selection-checkbox) {\n padding-inline: var(--ids-data-grid-padding-xs);\n}\n[data-row-height=xs] .ids-data-grid-cell ids-hyperlink {\n padding-inline: var(--ids-space-2xs);\n}\n\n[data-row-height=sm] .formatter-progress ids-progress-bar {\n margin: var(--ids-data-grid-padding-sm);\n}\n[data-row-height=sm] ids-button {\n --ids-button-icon-padding: var(--ids-space-2xs);\n}\n[data-row-height=sm] .ids-data-grid-cell.is-editable .editor-cell-icon {\n margin-inline-end: 6px;\n}\n[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline ids-icon.editor-cell-icon {\n margin-inline-end: 5px;\n margin-block-start: 0;\n}\n[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline {\n --ids-button-tertiary-color-background-hover: var(--ids-color-transparent);\n}\n[data-row-height=sm] .ids-data-grid-cell .ids-data-grid-checkbox-container:not(.is-selection-checkbox) {\n padding-inline: var(--ids-data-grid-padding-sm);\n}\n[data-row-height=sm] .ids-data-grid-cell ids-hyperlink {\n padding-inline: var(--ids-space-xs);\n}\n\n[data-row-height=md] .formatter-progress ids-progress-bar {\n margin: var(--ids-data-grid-padding-md);\n}\n[data-row-height=md] .ids-data-grid-cell.is-editable .editor-cell-icon {\n margin-inline-end: 7px;\n}\n[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline ids-icon.editor-cell-icon {\n margin-inline-end: var(--ids-data-grid-padding-sm);\n}\n[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline {\n --ids-button-tertiary-color-background-hover: var(--ids-color-transparent);\n}\n[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline ::slotted(ids-trigger-button) {\n position: relative;\n top: 100px;\n}\n[data-row-height=md] .ids-data-grid-cell .ids-data-grid-checkbox-container:not(.is-selection-checkbox) {\n padding-inline: var(--ids-data-grid-padding-md);\n}\n\n[data-row-height=lg] .ids-data-grid-cell .ids-data-grid-checkbox-container:not(.is-selection-checkbox) {\n padding-inline: var(--ids-data-grid-padding-lg);\n}\n\n.ids-data-grid.is-list-style .ids-data-grid-cell {\n border-inline-start-width: var(--ids-border-width-none);\n border-bottom: 1px solid var(--ids-data-grid-list-cell-color-border);\n}\n.ids-data-grid.is-list-style .ids-data-grid-cell.is-readonly:not(.exclude-readonly-style) {\n background-color: var(--ids-data-grid-cell-color-background-readonly);\n}\n.ids-data-grid.is-list-style .ids-data-grid-cell.is-disabled {\n color: var(--ids-data-grid-cell-color-text-disabled);\n}\n.ids-data-grid.is-list-style .ids-data-grid-body .ids-data-grid-row:first-child .ids-data-grid-cell {\n border-top: 0;\n}\n\ntd.ids-data-grid-cell {\n display: table-cell;\n padding-inline-start: var(--ids-space-sm);\n padding-inline-end: var(--ids-space-sm);\n}\n\n:host([dir=rtl]) .ids-data-grid.is-list-style .ids-data-grid-cell {\n border-inline-end-width: var(--ids-border-width-none);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left {\n position: sticky;\n right: var(--ids-space-none);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(2) {\n right: var(--ids-data-grid-frozen-column-left-width-2);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(3) {\n right: var(--ids-data-grid-frozen-column-left-width-3);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(4) {\n right: var(--ids-data-grid-frozen-column-left-width-4);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(5) {\n right: var(--ids-data-grid-frozen-column-left-width-5);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(6) {\n right: var(--ids-data-grid-frozen-column-left-width-6);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(7) {\n right: var(--ids-data-grid-frozen-column-left-width-7);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(8) {\n right: var(--ids-data-grid-frozen-column-left-width-8);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(9) {\n right: var(--ids-data-grid-frozen-column-left-width-9);\n}\n:host([dir=rtl]) .ids-data-grid-cell.frozen-left:nth-of-type(10) {\n right: var(--ids-data-grid-frozen-column-left-width-10);\n}\n:host([dir=rtl]) .ids-data-grid-cell:last-child {\n border-inline-end-width: var(--ids-border-width-none);\n}\n:host([dir=rtl]) .ids-data-grid-cell.is-dirty .ids-data-grid-tree-field-container::before, :host([dir=rtl]) .ids-data-grid-cell.is-dirty::before {\n border-color: var(--ids-input-dirty-indicator-color-background-dirty) var(--ids-input-dirty-indicator-color-background-dirty) transparent transparent;\n}\n:host([dir=rtl]) .ids-data-grid-cell.formatter-textmask .is-textmask {\n unicode-bidi: plaintext;\n}\n\n.ids-trigger-field-slot-trigger-end {\n margin-inline-end: var(--ids-space-none);\n}\n\n.hide {\n display: none;\n}\n\n@media all and (max-width: 1440px) {\n .hide-xxl-down {\n display: none;\n }\n}\n\n@media all and (min-width: 1440px) {\n .hide-xxl-up {\n display: none;\n }\n}\n\n@media all and (max-width: 1280px) {\n .hide-xl-down {\n display: none;\n }\n}\n\n@media all and (min-width: 1280px) {\n .hide-xl-up {\n display: none;\n }\n}\n\n@media all and (max-width: 1024px) {\n .hide-lg-down {\n display: none;\n }\n}\n\n@media all and (min-width: 1024px) {\n .hide-lg-up {\n display: none;\n }\n}\n\n@media all and (max-width: 840px) {\n .hide-md-down {\n display: none;\n }\n}\n\n@media all and (min-width: 840px) {\n .hide-md-up {\n display: none;\n }\n}\n\n@media all and (max-width: 600px) {\n .hide-sm-down {\n display: none;\n }\n}\n\n@media all and (min-width: 600px) {\n .hide-sm-up {\n display: none;\n }\n}\n\n@media all and (max-width: 320px) {\n .hide-xs-down {\n display: none;\n }\n}\n\n@media all and (min-width: 320px) {\n .hide-xs-up {\n display: none;\n }\n}\n\n@media all and (max-width: 600px) {\n :host(.hide-sm-down) {\n display: none;\n }\n}\n\n.ids-popup-menu:not([hidden]) {\n display: block;\n z-index: var(--ids-z-index-160);\n}\n\n/**\n * Checkbox Mixins.\n */\n@keyframes check {\n 0% {\n height: 0;\n left: 0;\n top: 8px;\n width: 0;\n }\n 50% {\n height: 0;\n left: 0;\n top: 8px;\n width: 4px;\n }\n 100% {\n height: 10px;\n left: 4px;\n top: 0;\n width: 4px;\n }\n}\n@keyframes checkindeterminate {\n 0% {\n width: 0;\n }\n 100% {\n width: 10px;\n }\n}\n/**\n * Radio Mixins.\n */\n:host {\n --ids-data-grid-column-widths: repeat(1, minmax(110px, 1fr));\n font-weight: normal;\n position: relative;\n}\n\n.ids-data-grid {\n background-color: var(--ids-data-grid-color-background);\n border: 1px solid var(--ids-data-grid-cell-color-border);\n border-radius: var(--ids-border-radius-2xs);\n border-collapse: collapse;\n box-sizing: border-box;\n overflow: auto;\n width: 100%;\n outline: none;\n display: inline-grid;\n align-content: flex-start;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-family: var(--ids-font-family-default), var(--ids-font-family-system-sans);\n font-size: var(--ids-font-size-sm);\n}\n.ids-data-grid .ids-data-grid-checkbox-container {\n cursor: var(--ids-cursor-pointer);\n display: flex;\n width: 100%;\n}\n.ids-data-grid .ids-data-grid-cell.align-left .ids-data-grid-tree-container,\n.ids-data-grid .ids-data-grid-cell.align-left .ids-data-grid-checkbox-container {\n justify-content: start;\n}\n.ids-data-grid .ids-data-grid-cell.align-center .ids-data-grid-checkbox-container {\n justify-content: center;\n}\n.ids-data-grid .ids-data-grid-cell.align-right .ids-data-grid-checkbox-container {\n justify-content: end;\n}\n.ids-data-grid .ids-data-grid-checkbox {\n position: absolute;\n border: var(--ids-checkbox-border);\n border-radius: var(--ids-checkbox-border-radius);\n height: 14px;\n width: 14px;\n left: 0;\n top: 3px;\n border-color: var(--ids-data-grid-cell-checkbox-color-border);\n position: relative;\n left: var(--ids-space-none);\n top: var(--ids-space-none);\n}\n.ids-data-grid .ids-data-grid-checkbox.editable {\n cursor: var(--ids-cursor-pointer);\n}\n.ids-data-grid .ids-data-grid-checkbox.disabled {\n background-color: var(--ids-checkbox-color-background-disabled);\n border-color: var(--ids-checkbox-color-border-disabled);\n cursor: var(--ids-cursor-default);\n opacity: 0.4;\n}\n.ids-data-grid .ids-data-grid-checkbox.checked {\n background-color: var(--ids-checkbox-color-background-selected);\n border-color: var(--ids-checkbox-color-border-selected);\n}\n.ids-data-grid .ids-data-grid-checkbox.checked::after {\n position: absolute;\n display: block;\n border: var(--ids-font-size-2xs) solid var(--ids-checkbox-color-border-selected-after);\n border-width: var(--ids-checkbox-border-width-selected-after);\n animation: check 0.15s;\n transform: rotate(45deg);\n content: \"\";\n height: 10px;\n left: 4px;\n top: 0;\n width: 4px;\n animation: none;\n}\n.ids-data-grid .ids-data-grid-checkbox.checked.disabled {\n background-color: var(--ids-checkbox-color-background-selected-disabled);\n border-color: var(--ids-checkbox-color-border-selected-disabled);\n}\n.ids-data-grid .ids-data-grid-checkbox.indeterminate {\n background-color: var(--ids-checkbox-color-background-indeterminate);\n border-color: var(--ids-checkbox-color-border-indeterminate);\n}\n.ids-data-grid .ids-data-grid-checkbox.indeterminate::after {\n position: absolute;\n animation: checkindeterminate 0.15s;\n display: block;\n border: 1px solid var(--ids-checkbox-color-border-indeterminate-after);\n border-width: var(--ids-checkbox-border-width-indeterminate);\n content: \"\";\n height: 6px;\n left: 2px;\n top: 0;\n transform: none;\n width: 10px;\n animation: none;\n}\n.ids-data-grid .ids-data-grid-radio-container {\n display: flex;\n justify-content: center;\n width: 100%;\n}\n.ids-data-grid .ids-data-grid-radio {\n position: absolute;\n border: 1px solid var(--ids-radio-color-border-default);\n border-radius: var(--ids-radio-border-radius);\n height: 14px;\n left: 0;\n top: 3px;\n transition: border-color var(--ids-motion-duration) var(--ids-motion-ease);\n width: 14px;\n cursor: var(--ids-cursor-pointer);\n position: relative;\n left: var(--ids-space-none);\n top: var(--ids-space-none);\n}\n.ids-data-grid .ids-data-grid-radio::after {\n position: absolute;\n background-color: var(--ids-radio-color-background);\n border: 1px solid var(--ids-radio-color-background);\n border-radius: var(--ids-radio-border-radius);\n content: \"\";\n height: 0;\n left: 6px;\n top: 6px;\n transition: all var(--ids-motion-duration) var(--ids-motion-ease);\n width: 0;\n}\n.ids-data-grid .ids-data-grid-radio.disabled {\n border-color: var(--ids-radio-color-border-disabled);\n cursor: var(--ids-cursor-default);\n box-shadow: none;\n opacity: var(--ids-radio-disabled-opacity);\n}\n.ids-data-grid .ids-data-grid-radio.checked {\n background-color: var(--ids-radio-color-background-selected);\n border-color: var(--ids-radio-color-border-selected);\n}\n.ids-data-grid .ids-data-grid-radio.checked::after {\n background-color: var(--ids-radio-inner-color-background-selected);\n border-color: var(--ids-radio-inner-color-background-selected);\n border-width: 2px;\n height: 4px;\n left: 3px;\n top: 3px;\n width: 4px;\n}\n.ids-data-grid .ids-data-grid-radio.checked.disabled {\n background-color: var(--ids-radio-color-background-selected-disabled);\n border-color: var(--ids-radio-color-border-selected-disabled);\n opacity: var(--ids-radio-disabled-opacity);\n}\n.ids-data-grid .ids-data-grid-cell .ids-data-grid-tree-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n.ids-data-grid .ids-data-grid-cell .ids-data-grid-tree-container ids-button + .ids-data-grid-tree-field-container .text-ellipsis {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid .ids-data-grid-cell .ids-data-grid-tree-container ids-button {\n padding-inline-start: var(--ids-space-2xs);\n padding-inline-end: var(--ids-space-none);\n}\n.ids-data-grid .ids-data-grid-cell .ids-data-grid-tree-container ids-button.expand-button {\n --ids-button-tertiary-color-background-hover: var(--ids-color-transparent);\n --ids-button-tertiary-color-border-hover: var(--ids-color-transparent);\n --ids-button-tertiary-color-background-pressed: var(--ids-color-transparent);\n --ids-button-tertiary-color-border-pressed: var(--ids-color-transparent);\n}\n.ids-data-grid .ids-data-grid-cell .ids-data-grid-tree-container .text-ellipsis ids-hyperlink {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid .ids-data-grid-cell .ids-data-grid-tree-field-container {\n display: inline-grid;\n align-items: center;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-dirty:not(.is-inline).formatter-text::before {\n inset-block-start: 1px;\n margin-inline-start: 1px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-dirty.is-inline.formatter-text::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree) {\n position: relative;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree)::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 1px;\n height: calc(100% - 2px);\n position: absolute;\n width: calc(100% - 2px);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis {\n position: relative;\n width: calc(100% - 5px);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 1px;\n height: calc(100% - 2px);\n position: absolute;\n width: calc(100% - 2px);\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n margin-inline-end: -1px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-tree-field-container .text-ellipsis {\n padding-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"1\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 30px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"1\"] .ids-data-grid-cell ids-button {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"1\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"1\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"2\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 54px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"2\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 24px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"2\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"2\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"3\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 66px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"3\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 36px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"3\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"3\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"4\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 78px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"4\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 48px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"4\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"4\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"5\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 90px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"5\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 60px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"5\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"5\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"6\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 102px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"6\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 72px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"6\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"6\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"7\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 114px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"7\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 84px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"7\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"7\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"8\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 126px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"8\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 96px;\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"8\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xxs] [aria-level=\"8\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 3px;\n margin-inline-start: 3px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-dirty:not(.is-inline).formatter-text::before {\n inset-block-start: 1px;\n margin-inline-start: 1px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-dirty.is-inline.formatter-text::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree) {\n position: relative;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree)::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 2px;\n height: calc(100% - 4px);\n position: absolute;\n width: calc(100% - 4px);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis {\n position: relative;\n width: calc(100% - 6px);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 2px;\n height: calc(100% - 4px);\n position: absolute;\n width: calc(100% - 4px);\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n margin-inline-end: -2px;\n}\n.ids-data-grid[data-row-height=xs] .ids-data-grid-tree-field-container .text-ellipsis {\n padding-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"1\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 32px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"1\"] .ids-data-grid-cell ids-button {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"1\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"1\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"2\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 55px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"2\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 23px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"2\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"2\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"3\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 68px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"3\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 36px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"3\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"3\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"4\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 81px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"4\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 49px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"4\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"4\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"5\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 94px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"5\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 62px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"5\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"5\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"6\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 107px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"6\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 75px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"6\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"6\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"7\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 120px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"7\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 88px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"7\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"7\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"8\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 133px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"8\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 101px;\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"8\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=xs] [aria-level=\"8\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 4px;\n margin-inline-start: 4px;\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-dirty:not(.is-inline).formatter-text::before {\n inset-block-start: 1px;\n margin-inline-start: 1px;\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-dirty.is-inline.formatter-text::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree) {\n position: relative;\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree)::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 3px;\n height: calc(100% - 6px);\n position: absolute;\n width: calc(100% - 6px);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis {\n position: relative;\n width: calc(100% - 9px);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 3px;\n height: calc(100% - 6px);\n position: absolute;\n width: calc(100% - 6px);\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n margin-inline-end: -5px;\n}\n.ids-data-grid[data-row-height=sm] .ids-data-grid-tree-field-container .text-ellipsis {\n padding-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"1\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 34px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"1\"] .ids-data-grid-cell ids-button {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"1\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"1\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"2\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 57px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"2\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 23px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"2\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"2\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"3\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 72px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"3\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 38px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"3\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"3\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"4\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 87px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"4\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 53px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"4\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"4\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"5\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 102px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"5\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 68px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"5\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"5\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"6\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 117px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"6\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 83px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"6\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"6\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"7\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 132px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"7\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 98px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"7\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"7\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"8\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 147px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"8\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 113px;\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"8\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=sm] [aria-level=\"8\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 5px;\n margin-inline-start: 5px;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-dirty:not(.is-inline).formatter-text::before {\n inset-block-start: 2px;\n margin-inline-start: 2px;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-dirty.is-inline.formatter-text::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree) {\n position: relative;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree)::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 4px;\n height: calc(100% - 8px);\n position: absolute;\n width: calc(100% - 8px);\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis {\n position: relative;\n width: calc(100% - 12px);\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 4px;\n height: calc(100% - 8px);\n position: absolute;\n width: calc(100% - 8px);\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n margin-inline-end: -8px;\n}\n.ids-data-grid[data-row-height=md] .ids-data-grid-tree-field-container .text-ellipsis {\n padding-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"1\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 40px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"1\"] .ids-data-grid-cell ids-button {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"1\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"1\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"2\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 60px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"2\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 20px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"2\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"2\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"3\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 77px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"3\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 37px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"3\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"3\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"4\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 94px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"4\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 54px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"4\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"4\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"5\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 111px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"5\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 71px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"5\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"5\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"6\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 128px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"6\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 88px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"6\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"6\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"7\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 145px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"7\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 105px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"7\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"7\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"8\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 162px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"8\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 122px;\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"8\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=md] [aria-level=\"8\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-dirty:not(.is-inline).formatter-text::before {\n inset-block-start: 2px;\n margin-inline-start: 2px;\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-dirty.is-inline.formatter-text::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree) {\n position: relative;\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-editable.is-inline:not(.formatter-tree)::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 4px;\n height: calc(100% - 8px);\n position: absolute;\n width: calc(100% - 8px);\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis {\n position: relative;\n width: calc(100% - 16px);\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n border: 1px solid var(--ids-input-color-border-default);\n border-radius: var(--ids-border-radius-2xs);\n box-sizing: border-box;\n display: block;\n content: \"\";\n margin: 4px;\n height: calc(100% - 8px);\n position: absolute;\n width: calc(100% - 8px);\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n margin-inline-end: -12px;\n}\n.ids-data-grid[data-row-height=lg] .ids-data-grid-tree-field-container .text-ellipsis {\n padding-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"1\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 40px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"1\"] .ids-data-grid-cell ids-button {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"1\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"1\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"2\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 60px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"2\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 20px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"2\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"2\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"3\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 77px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"3\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 37px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"3\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"3\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"4\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 94px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"4\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 54px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"4\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"4\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"5\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 111px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"5\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 71px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"5\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"5\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"6\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 128px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"6\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 88px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"6\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"6\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"7\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 145px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"7\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 105px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"7\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"7\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"8\"] .ids-data-grid-cell .ids-data-grid-tree-field-container {\n margin-inline-start: 162px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"8\"] .ids-data-grid-cell ids-button {\n margin-inline-start: 122px;\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"8\"] .ids-data-grid-cell ids-button + .ids-data-grid-tree-field-container {\n margin-inline-start: var(--ids-space-none);\n}\n.ids-data-grid[data-row-height=lg] [aria-level=\"8\"] .ids-data-grid-cell.is-dirty.is-inline .ids-data-grid-tree-field-container::before {\n inset-block-start: 6px;\n margin-inline-start: 6px;\n}\n.ids-data-grid[data-row-height=xxs] .ids-data-grid-cell.is-editable.is-inline.formatter-tree .text-ellipsis::after {\n width: calc(100% - 3px);\n}\n.ids-data-grid.is-list-style {\n border-width: var(--ids-border-width-none);\n}\n.ids-data-grid.waiting-load {\n visibility: hidden;\n overflow: hidden;\n}\n.ids-data-grid.waiting-load .ids-data-grid-body {\n visibility: hidden;\n}\n\n.ids-data-grid-body {\n min-width: fit-content;\n}\n\ntable.ids-data-grid {\n display: table;\n outline: 1px solid var(--ids-data-grid-cell-color-border);\n outline-offset: -1px;\n}\n\n.ids-data-grid-wrapper {\n position: relative;\n}\n.ids-data-grid-wrapper .ids-data-grid-toolbar {\n display: flex;\n width: 100%;\n margin: 6px var(--ids-space-none);\n align-items: center;\n justify-content: end;\n}\n\nids-empty-message:not([hidden]),\n::slotted(ids-empty-message:not([hidden])) {\n display: flex;\n width: 100%;\n height: 100%;\n position: absolute;\n justify-content: center;\n align-items: center;\n top: var(--ids-space-none);\n pointer-events: none;\n margin-top: var(--ids-space-sm);\n}\n\nids-empty-message.has-filter-row:not([hidden]).filter-row-size-xxs {\n margin-block-start: 24px;\n}\nids-empty-message.has-filter-row:not([hidden]).filter-row-size-xs {\n margin-block-start: 34px;\n}\nids-empty-message.has-filter-row:not([hidden]).filter-row-size-sm {\n margin-block-start: 34px;\n}\nids-empty-message.has-filter-row:not([hidden]).filter-row-size-md {\n margin-block-start: 34px;\n}\nids-empty-message.has-filter-row:not([hidden]).filter-row-size-lg {\n margin-block-start: 26px;\n}\nids-empty-message.has-filter-row:not([hidden]).has-pager {\n margin-block-start: 14px;\n}\n\n::slotted(ids-empty-message.has-filter-row:not([hidden])) {\n margin-block-start: 14px;\n}\n\n.has-empty-message .ids-data-grid {\n min-height: var(--ids-data-grid-height-min);\n}\n\nids-loading-indicator {\n display: flex;\n width: 100%;\n height: 100%;\n position: absolute;\n justify-content: center;\n align-items: center;\n top: var(--ids-space-none);\n}\nids-loading-indicator[stopped] {\n display: none;\n}\n\n:host(:not([disable-row-highlight])) ids-data-grid-row:hover:not([part*=row-]):not(.selected) ids-data-grid-cell,\n:host(:not([disable-row-highlight])) ids-data-grid-row:hover:not([part*=row-]):not(.selected) ids-data-grid-cell.is-readonly:not(.exclude-readonly-style) {\n background-color: var(--ids-data-grid-row-color-background-hover);\n}\n:host(:not([disable-row-highlight])) ids-data-grid-row:hover:not([part*=row-]):not(.selected) ids-data-grid-cell.is-invalid {\n background-color: var(--ids-data-grid-cell-color-background-error-hover);\n}\n:host(:not([disable-row-highlight])) ids-data-grid-row:hover:not([part*=row-]):not(.selected) .ids-data-grid-cell.frozen {\n background-color: var(--ids-data-grid-row-color-background-hover);\n}\n\n#datagrid-modal {\n --ids-modal-content-padding: var(--ids-space-none);\n --ids-modal-header-padding: var(--ids-space-sm) var(--ids-space-sm) var(--ids-space-xs) var(--ids-space-sm);\n --ids-popup-fit-height: 400px;\n}\n#datagrid-modal ids-swappable-item {\n --ids-swappable-item-color-background-selected: var(--ids-color-accent-blue-weakest);\n --ids-swappable-item-color-text-selected: var(--ids-color-foreground-default-default);\n align-items: center;\n height: var(--ids-data-grid-modal-row-height);\n}\n#datagrid-modal #datagrid-modal-title {\n position: relative;\n top: calc(var(--ids-space-04) * -1);\n}\n#datagrid-modal ids-search-field {\n --ids-input-color-background-default: var(--ids-color-accent-neutral-weakest);\n --ids-search-field-color-background-default: var(--ids-color-accent-neutral-weakest);\n --ids-input-color-border-default: var(--ids-color-accent-neutral-weak);\n --ids-input-color-border-hover: var(--ids-color-accent-neutral-weak);\n --ids-input-color-border-focus: var(--ids-color-accent-neutral-weak);\n --ids-input-color-border-shadow: none;\n --ids-search-field-border-radius: var(--ids-border-radius-none);\n --ids-search-field-border-width: var(--ids-border-width-sm) var(--ids-border-width-none);\n margin-bottom: -8px;\n margin-top: calc(var(--ids-space-08) * -1);\n min-width: 330px;\n position: sticky;\n top: var(--ids-space-none);\n z-index: 1;\n}\n#datagrid-modal ids-text {\n width: 100%;\n}\n#datagrid-modal ids-switch {\n position: relative;\n top: var(--ids-space-3xs);\n}\n#datagrid-modal ids-swappable {\n width: 100%;\n}\n#datagrid-modal .datagrid-modal-column-list {\n --ids-modal-column-list-height: calc(100% - 14px);\n overflow: auto;\n max-height: var(--ids-modal-column-list-height);\n}\n\n.selection-border {\n position: absolute;\n pointer-events: none;\n border: 1.5px solid var(--ids-button-primary-color-background-default);\n background: transparent;\n z-index: 2;\n transition: all 0.05s ease;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2J1aWxkcy9pbmZvci1kZXNpZ24vZW50ZXJwcmlzZS13Yy9zcmMvY29tcG9uZW50cy9pZHMtZGF0YS1ncmlkIiwic291cmNlcyI6WyJpZHMtZGF0YS1ncmlkLWZpbHRlcnMuc2NzcyIsImlkcy1kYXRhLWdyaWQtaGVhZGVyLnNjc3MiLCJpZHMtZGF0YS1ncmlkLXJvdy5zY3NzIiwiaWRzLWRhdGEtZ3JpZC1jZWxsLnNjc3MiLCIuLi8uLi90aGVtZXMvbWl4aW5zL2lkcy1oaWRlLW1peGluLnNjc3MiLCIuLi9pZHMtcG9wdXAtbWVudS9pZHMtcG9wdXAtbWVudS5zY3NzIiwiLi4vLi4vdGhlbWVzL21peGlucy9pZHMtY2hlY2tib3gtbWl4aW4uc2NzcyIsIi4uLy4uL3RoZW1lcy9taXhpbnMvaWRzLXJhZGlvLW1peGluLnNjc3MiLCJpZHMtZGF0YS1ncmlkLnNjc3MiLCIuLi8uLi90aGVtZXMvbWl4aW5zL2lkcy1jb3JlLW1peGlucy5zY3NzIiwiaWRzLWRhdGEtZ3JpZC1jb21tb24uc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBRUE7O0FBR0Y7RUFJRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBOztBQU1BO0FBQUE7QUFBQTtFQUdFOztBQUtOO0VBQ0U7RUFDQTtFQUVBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUdGO0VBQ0U7OztBQ3hFTjtBQUNBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFXQTs7QUFUQTtFQUNFOztBQUdGO0VBQ0U7OztBQVFKO0VBQ0U7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7O0FBSUY7RUFDRTtFQUNBOzs7QUFLSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUVBO0VBQ0U7O0FBR0Y7RUFDRTs7QUFFQTtFQUNFOztBQUVBO0VBQ0U7O0FBSUo7QUFBQTtBQUFBO0VBR0U7O0FBTU47RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBRUU7O0FBR0Y7RUFFRTs7QUFHRjtFQUNFO0VBQ0E7O0FBSUE7RUFDRTs7QUFLSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFJSjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0VBQ0U7O0FBRUE7RUFDRTs7QUFJSjtFQUNFOztBQUlGO0VBQ0U7RUFDQTtFQUNBOztBQUlGO0VBQ0U7O0FBRUE7RUFDRTs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7QUFJRTtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFLTjtFQUNFO0VBQ0E7O0FBR0E7RUFDRTs7O0FBS047RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBOzs7QUFLQTtBQUFBO0VBRUU7RUFDQTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFLQTtFQUNFO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7O0FBSUo7RUFDRTs7QUFFQTtFQUNFOzs7QUFLTjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBSUo7RUFDRTs7O0FBR0Y7QUFBQTtFQUVFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUtBO0FBQUE7RUFDRTs7O0FBTUY7RUFDRTtFQUNBOztBQUdGO0VBQ0U7OztBQU1GO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBOzs7QUFLSjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOzs7QUFLSjtFQUNFOzs7QUFHRjtFQUNFOzs7QUFNQTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTs7QUFLQTtFQUNFOztBQUlKO0FBQUE7RUFFRTs7QUFLQTtFQUNFOzs7QUFNTjtFQUNFOzs7QUFNRTtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBS0Y7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBSUE7RUFDRTs7QUFHRjtFQUNFOztBQU1KO0VBQ0U7O0FBRUE7RUFDRTs7QUFJSjtFQUNFOztBQUdGO0VBQ0U7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7O0FBSUo7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBOztBQUtGO0VBQ0U7O0FBRUE7RUFDRTs7QUFJSjtFQUNFOztBQUdGO0VBQ0U7O0FBRUE7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7QUFJSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFHRjtFQUNFOztBQUlKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7O0FBSUY7QUFBQTtBQUFBO0FBQUE7RUFJRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFPSjtFQUNFOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBS0E7RUFDRTs7QUFLRjtFQUNFOztBQUtOO0VBQ0U7OztBQVFBO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7O0FBSUU7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7OztBQzlvQlY7QUFDQTtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQU1BO0VBRUU7RUFDQTs7QUFHRjtFQUVFOztBQUdGO0VBQ0U7O0FBS0U7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFLTjtFQUNFOztBQUdFO0VBS0U7RUFDQTs7QUFMQTtFQUNJOztBQVNWO0VBQ0U7O0FBR0U7RUFLRTtFQUNBOztBQUxBO0VBQ0U7O0FBU1I7RUFDRTs7QUFHRTtFQUtFO0VBQ0E7O0FBTEE7RUFDRTs7O0FBV1Y7RUFDRTtFQUNBOztBQUdBO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUVBOzs7QUFRQTtFQUNFOztBQUVBO0FBQUE7RUFFRTtFQUNBOztBQUlKO0VBQ0U7RUFDQTs7QUFHRjtFQUNFOztBQUtGO0VBQ0U7O0FBRUE7QUFBQTtFQUVFO0VBQ0E7O0FBSUo7RUFDRTtFQUNBOztBQUdGO0VBQ0U7O0FBS0Y7RUFDRTtFQUNBOztBQUVBO0FBQUE7RUFFRTtFQUNBOztBQUlKO0VBQ0U7RUFDQTs7QUFHRjtFQUNFOztBQUtGO0VBQ0U7RUFDQTs7QUFFQTtBQUFBO0VBRUU7RUFDQTs7QUFNQTtFQUNFO0VBQ0E7O0FBS047RUFDRTtFQUNBOztBQUdGO0VBQ0U7OztBQU1OO0VBQ0U7OztBQUlGO0VBQ0U7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7OztBQUtBO0VBQ0U7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBSUo7RUFDRTtFQUNBOztBQUlGO0FBQUE7RUFFRTs7O0FBU007RUFDSTs7QUFTSjtFQUNJOztBQVNKO0VBQ0k7OztBQ3BSZDtBQUdBO0FBYUE7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBS0U7RUFDRTs7QUFHRjtFQUNFOzs7QUFLTjtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0E7RUFDRTs7QUFJRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOztBQUlGO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBSUY7RUFDRTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTs7QUFNRjtFQUNFO0VBQ0E7O0FBS0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7O0FBS0o7RUFDRTs7QUFFQTtFQUNFOztBQUlKO0VBQ0U7O0FBRUE7RUFDRTs7QUFJSjtFQUNFOztBQU9BO0VBQ0U7RUFDQTtFQUNBOztBQUtGO0VBQ0U7O0FBRUE7RUFDRTs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUVBO0VBQ0U7O0FBT0o7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBT0Y7RUFDRTs7QUFNQTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFOztBQUlKO0VBQ0U7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBS047RUFHRTs7QUFFQTtFQUNFOztBQU1GO0VBQ0U7RUFDQTs7QUFLRjtFQUNFO0VBQ0E7RUFDQTs7QUFHRjtBQUFBO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlKO0VBQ0U7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBRUE7RUFDRTs7QUFLTjtFQUNFOztBQU1BO0VBQ0U7O0FBR0Y7RUFDRTs7QUFJSjtFQUNFOztBQUVBO0VBQ0U7O0FBS047RUFDRTtFQUNBO0VBQ0E7RUFNQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBVEE7RUFDRTs7QUFZSjtFQUlFOztBQUdGO0VBQ0U7O0FBS0E7RUFDRTs7QUFHRjtFQUNFOztBQUtKO0VBQ0U7O0FBRUE7RUFDRTs7QUFLSjtFQUNFOztBQUdGO0VBQ0U7O0FBSUY7RUFDRTs7QUFFQTtBQUFBO0FBQUE7RUFHRTs7QUFLSjtFQUNFO0VBQ0E7O0FBSUY7RUFDRTs7QUFFQTtFQUNFOztBQUlKO0VBQ0U7RUFDQTs7QUFJRTtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFLTjtFQUNFO0VBQ0E7O0FBR0Y7RUEvWkE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQTZaSTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTs7QUFFQTtFQTdhTjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBMmFFO0VBQ0U7RUFDQTs7QUFJQTtFQUNFO0VBQ0E7O0FBS047RUFDRTtFQUNBOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFpQk07RUFDRTtFQUNBOztBQUZGO0VBQ0U7RUFDQTs7QUFGRjtFQUNFO0VBQ0E7O0FBRkY7RUFDRTtFQUNBOzs7QUFhUjtFQUNFOztBQUlKO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtBQUFBO0VBRUU7RUFDQTs7QUFJQTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTs7QUFLRjtFQUNFOztBQUtKO0VBQ0U7O0FBSUY7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7RUFFQTs7QUFJQTtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7O0FBV0Y7RUFDRTs7QUFJSjtFQUNFOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQUVBO0VBQ0U7RUFDQTs7QUFLSjtFQUNFOztBQUlGO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7O0FBSUE7RUFDRTs7QUFHRjtFQUNF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O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUE5RUY7RUFDRTtFQUNBOztBQU9GO0VBQ0U7RUFDQTs7QUFRTjtFRTlRUjs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUZ3UVE7RUVuUlY7RUZzUlk7O0FFcFJaO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBRjZRVTtFQUNFOztBQVFWO0VBQ0U7O0FBUUk7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBb0JBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQTlFRjtFQUNFO0VBQ0E7O0FBT0Y7RUFDRTtFQUNBOztBQVFOO0VFOVFSOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBRndRUTtFRW5SVjtFRnNSWTs7QUVwUlo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FGNlFVO0VBQ0U7O0FBUVY7RUFDRTs7QUFRSTtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFvQkE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBOUVGO0VBQ0U7RUFDQTs7QUFPRjtFQUNFO0VBQ0E7O0FBUU47RUU5UVI7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FGd1FRO0VFblJWO0VGc1JZOztBRXBSWjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUY2UVU7RUFDRTs7QUFRVjtFQUNFOztBQVFJO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQW9CQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFuQko7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBUUE7RUFDRTtFQUNBOztBQW5CSjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFRQTtFQUNFO0VBQ0E7O0FBbkJKO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQVFBO0VBQ0U7RUFDQTs7QUFZVjtFQUNFOztBQU1OO0VBQ0U7O0FBSUY7RUFDRTtFQUNBOztBQUVBO0VBQ0U7OztBQU1OO0VBQ0U7OztBQUlGO0VBQ0U7RUFDQTtFQUNBOzs7QUFJRjtFQUNFOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUo7QUFBQTtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBS0E7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7OztBQUlKO0VBQ0U7OztBQUdGO0VBQ0U7OztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBS0Y7QUFBQTtFQUVFOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBRUE7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTtFQUVBO0VBQ0E7OztBQUtKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiLyogSWRzIERhdGEgR3JpZCBDb21wb25lbnQgLSBGaWx0ZXIgKi9cbi5pZHMtZGF0YS1ncmlkIHtcbiAgLS1pZHMtYnV0dG9uLWZvcm1hdHRlci1jb2xvci10ZXh0LWRlZmF1bHQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtZmlsdGVyLWljb24tY29sb3IpO1xuICAtLWlkcy1idXR0b24tZm9ybWF0dGVyLWNvbG9yLWJhY2tncm91bmQtaG92ZXI6IHZhcigtLWlkcy1kYXRhLWdyaWQtZmlsdGVyLWljb24tY29sb3ItYmFja2dyb3VuZC1ob3Zlcik7XG4gIC0taWRzLWJ1dHRvbi1mb3JtYXR0ZXItY29sb3ItdGV4dC1ob3ZlcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1maWx0ZXItaWNvbi1jb2xvci1ob3Zlcik7XG4gIC0taWRzLW1lbnUtaXRlbS13aWR0aC1taW46IDE5MHB4O1xuICAtLWlkcy10cmlnZ2VyLWZpZWxkLWJ1dHRvbi1pbnNldC1pbmxpbmUtc3RhcnQ6IDA7XG5cbiAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtZmlsdGVyLXdyYXBwZXIgaWRzLWRyb3Bkb3duIHtcbiAgICAtLWlkcy10cmlnZ2VyLWZpZWxkLWJ1dHRvbi1pbnNldC1pbmxpbmUtc3RhcnQ6IC0xcHg7XG5cbiAgICBwYWRkaW5nLXRvcDogM3B4O1xuICB9XG5cbiAgJltkYXRhLXJvdy1oZWlnaHQ9J21kJ10gaWRzLWRyb3Bkb3duLFxuICAmW2RhdGEtcm93LWhlaWdodD0nc20nXSBpZHMtZHJvcGRvd24sXG4gICZbZGF0YS1yb3ctaGVpZ2h0PSd4cyddIGlkcy1kcm9wZG93bixcbiAgJltkYXRhLXJvdy1oZWlnaHQ9J3h4cyddIGlkcy1kcm9wZG93biB7XG4gICAgcGFkZGluZy10b3A6IDA7XG4gIH1cblxuICA6OnNsb3R0ZWQoW3Nsb3RePSdmaWx0ZXItJ10pIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtY29udGVudC52ZXJ0aWNhbC1hbGlnbi1jZW50ZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IGNhbGMoNTAlIC0gdmFyKC0taWRzLXNwYWNlLXNtKSk7XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlciB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBwYWRkaW5nLWlubGluZTogY2FsYyh2YXIoLS1pZHMtc3BhY2UteHMpICsgNHB4KTtcbiAgICBwYWRkaW5nLWJsb2NrLWVuZDogdmFyKC0taWRzLXNwYWNlLXhzKTtcblxuICAgICYuaGlkZGVuIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgaWRzLWRyb3Bkb3duW2NvbXBhY3RdIGlkcy1saXN0LWJveC1vcHRpb24ge1xuICAgICAgZm9udC1zaXplOiB1bnNldDtcbiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWlkcy1zaXplLTIwKTtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC5pcy11cHBlcmNhc2Uge1xuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyIHtcbiAgICAgIGlkcy1saXN0LWJveC1vcHRpb24sXG4gICAgICBpZHMtZHJvcGRvd246OnBhcnQodHJpZ2dlcmZpZWxkLWlucHV0KSxcbiAgICAgIGlkcy1pbnB1dDo6cGFydChpbnB1dCkge1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIFtkYXRhLWZpbHRlci1jb25kaXRpb25zLWJ1dHRvbl0ge1xuICAgIC0taWRzLWJ1dHRvbi1pY29uLWNvbXBhY3QtaGVpZ2h0OiAyMHB4O1xuICAgIC0taWRzLWJ1dHRvbi1pY29uLWNvbXBhY3Qtd2lkdGg6IDM2cHg7XG5cbiAgICBtYXJnaW4taW5saW5lLWVuZDogMnB4O1xuICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDA7XG5cbiAgICBpZHMtaWNvbiB7XG4gICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiAzcHg7XG4gICAgICBtYXJnaW4taW5saW5lLWVuZDogLTNweDtcbiAgICB9XG5cbiAgICBpZHMtaWNvbi1idXR0b24ge1xuICAgICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDA7XG4gICAgfVxuICB9XG59XG4iLCIvKiBJZHMgRGF0YSBHcmlkIENvbXBvbmVudCAtIEhlYWRlciAqL1xuLmlkcy1kYXRhLWdyaWQtaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gIHotaW5kZXg6IDE7IC8vIEhpZ2hlciB0aGFuIGJvZHkgY29sdW1uczsgei1pbmRleCBoaWdoZXIgdGhhbiAyIHdpbGwgYnJlYWsgaWRzLWxvYWRpbmctaW5kaWNhdG9yJ3Mgb3ZlcmxheVxuICBoZWlnaHQ6IDM0cHg7XG5cbiAgJi5pcy1mcm96ZW4ge1xuICAgIHotaW5kZXg6IDI7XG4gIH1cblxuICAmOmhhcyguaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlcikge1xuICAgIGhlaWdodDogNjJweDtcbiAgfVxuXG4gIC8vIEZpbHRlciBidXR0b24gaGVpZ2h0XG4gIC0taWRzLWJ1dHRvbi1mb3JtYXR0ZXItc2l6ZTogMjhweDtcbn1cblxuLy8gSGVhZGVyIENoZWNrYm94XG4uaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveC1jb250YWluZXIge1xuICB3aWR0aDogMjBweDtcblxuICAmW2Rpc2FibGVkPSd0cnVlJ10ge1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNoZWNrYm94W2Rpc2FibGVkPSd0cnVlJ10ge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIG9wYWNpdHk6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNoZWNrYm94LW9wYWNpdHktZGlzYWJsZWQpO1xuICB9XG5cblxuICAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveDpub3QoLmNoZWNrZWQpOm5vdCguaW5kZXRlcm1pbmF0ZSkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNoZWNrYm94LWNvbG9yLWJhY2tncm91bmQpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItY2hlY2tib3gtY29sb3ItYm9yZGVyKTtcbiAgfVxufVxuXG4vLyBIZWFkZXIgQ2VsbCBBcmVhXG4uaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1pbmxpbmUtc3RhcnQ6IDFweCBzb2xpZCB2YXIoLS1pZHMtZGF0YS1ncmlkLWhlYWRlci1jb2xvci1ib3JkZXIpO1xuICBib3JkZXItYmxvY2stZW5kOiAxcHggc29saWQgdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItY29sb3ItYm9yZGVyKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItY29sb3ItYmFja2dyb3VuZC1kZWZhdWx0KTtcbiAgbWluLWhlaWdodDogMjhweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICY6aGFzKC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyKSB7XG4gICAgaGVpZ2h0OiA2MnB4O1xuXG4gICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgICAgcGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyIHtcbiAgICAgIGhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1maWx0ZXItaGVpZ2h0KTtcblxuICAgICAgaWRzLW1lbnUtYnV0dG9uIHtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLWZpbHRlci1oZWlnaHQpO1xuXG4gICAgICAgICY6OnBhcnQoYnV0dG9uKSB7XG4gICAgICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlkcy1kcm9wZG93bjo6cGFydCh0cmlnZ2VyZmllbGQtZmllbGQtY29udGFpbmVyKSxcbiAgICAgIGlkcy1pbnB1dDo6cGFydChmaWVsZC1jb250YWluZXIpLFxuICAgICAgaWRzLXRyaWdnZXItZmllbGQ6OnBhcnQoZmllbGQtY29udGFpbmVyKSB7XG4gICAgICAgIGhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1maWx0ZXItaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBIaWRlIGZpcnN0IGJvcmRlclxuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoOiB2YXIoLS1pZHMtYm9yZGVyLXdpZHRoLW5vbmUpO1xuICB9XG5cbiAgJjpob3Zlci5pcy1hY3Rpb25hYmxlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWhlYWRlci1jb2xvci1iYWNrZ3JvdW5kLWhvdmVyKTtcbiAgfVxuXG4gICYuYWxpZ24tY2VudGVyIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQsXG4gICYuYWxpZ24tY2VudGVyIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgfVxuXG4gICYuYWxpZ24tcmlnaHQgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtY29udGVudCxcbiAgJi5hbGlnbi1yaWdodCAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlciB7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgfVxuXG4gICYuYWxpZ24tcmlnaHQgLmlzLXNvcnRhYmxlIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy1sZyk7XG4gICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDVweDtcbiAgfVxuXG4gICYuYWxpZ24tcmlnaHQgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtZmlsdGVyLXdyYXBwZXIge1xuICAgIGlkcy1tZW51LWJ1dHRvbiB7XG4gICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNpemluZyBDZWxsc1xuICAucmVzaXplciB7XG4gICAgY3Vyc29yOiB2YXIoLS1pZHMtY3Vyc29yLXJlc2l6ZSk7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWlubGluZS1zdGFydDogY2FsYygxMDAlIC0gNHB4KTtcbiAgICB0b3A6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICB3aWR0aDogNnB4O1xuICAgIHotaW5kZXg6IDI7XG4gIH1cblxuICAvLyBSZW9yZGVyYWJsZSBDZWxsc1xuICAucmVvcmRlcmVyIHtcbiAgICBjdXJzb3I6IHZhcigtLWlkcy1jdXJzb3ItbW92ZSk7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIGhlaWdodDogMzRweDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldC1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS14cyk7XG4gICAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgd2lkdGg6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuXG4gICAgaWRzLWljb24ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNvbG9yLWljb24pO1xuICAgICAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0taWRzLXNwYWNlLXhzKSk7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB0b3A6IGNhbGMoNTAlIC0gOXB4KTtcbiAgICB9XG4gIH1cblxuICAmLmFsaWduLXJpZ2h0IC5yZW9yZGVyZXIge1xuICAgIGluc2V0LWlubGluZS1lbmQ6IDVweDtcbiAgICBpbnNldC1pbmxpbmUtc3RhcnQ6IGluaXRpYWw7XG4gIH1cblxuICAmOmxhc3QtY2hpbGQgLnJlc2l6ZXIge1xuICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGNhbGMoMTAwJSAtIDZweCk7IC8vIFByZXZlbnRzIHVubmVlZGVkIHNjcm9sbGJhclxuICB9XG5cbiAgJi5kcmFnZ2luZyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItZHJhZy1iYWNrZ3JvdW5kLWNvbG9yKSAhaW1wb3J0YW50OyAvLyB0aGlzIGltcG9ydGFudCBpcyBuZWVkZWQgZm9yIGRyYWcgc3R5bGVzIHRvIHdvcmtcbiAgICBib3JkZXItaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbGVmdDogLTEwMDBweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgd2lkdGg6IDExMHB4O1xuICB9XG5cbiAgJi5hY3RpdmUtZHJhZy1jb2x1bW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNvbG9yLWJhY2tncm91bmQtZGVmYXVsdC1wbGFjZWhvbGRlci1kcmFnZ2luZyk7XG5cbiAgICAuc29ydC1pbmRpY2F0b3Ige1xuICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gIH1cblxuICAmOmhvdmVyIC5yZW9yZGVyZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICAvLyBSZW9yZGVyYWJsZSBDZWxsc1xuICAmLmZyb3plbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItY29sb3ItYmFja2dyb3VuZC1kZWZhdWx0KTtcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgIHotaW5kZXg6IDM7XG4gIH1cblxuICAvLyBDaGFuZ2UgYm9yZGVycyBmb3IgZnJvemVuIGNvbHVtbiBzY3JvbGxpbmdcbiAgJi5mcm96ZW4tbGFzdCB7XG4gICAgYm9yZGVyLWlubGluZS1lbmQ6IDFweCBzb2xpZCB2YXIoLS1pZHMtZGF0YS1ncmlkLWhlYWRlci1jb2xvci1ib3JkZXIpO1xuXG4gICAgKyAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbCB7XG4gICAgICBib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoOiB2YXIoLS1pZHMtYm9yZGVyLXdpZHRoLW5vbmUpO1xuICAgIH1cbiAgfVxuXG4gICYuZnJvemVuLWxlZnQge1xuICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgbGVmdDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuICAgIHotaW5kZXg6IDI7XG5cbiAgICAvLyBEeW5hbWljYWxseSBhZGRlZCB3aWR0aHNcbiAgICBAZm9yICRpIGZyb20gMiB0aHJvdWdoIDEwIHtcbiAgICAgICY6bnRoLW9mLXR5cGUoI3skaX0pIHtcbiAgICAgICAgbGVmdDogdmFyKC0taWRzLWRhdGEtZ3JpZC1mcm96ZW4tY29sdW1uLWxlZnQtd2lkdGgtI3skaX0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuZnJvemVuLXJpZ2h0IHtcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgIHJpZ2h0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG5cbiAgICAvLyBXaWVyZCBjZW50ZXJpbmcgYnVnIChmcm96ZW4gcmlnaHQpXG4gICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtY29udGVudCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICB9XG4gIH1cbn1cblxuLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtY29udGVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWxnLXBhZGRpbmcpO1xuICBmb250LXdlaWdodDogdmFyKC0taWRzLWZvbnQtd2VpZ2h0LXNlbWlib2xkKTtcbiAgZm9udC1zaXplOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWZvbnQtc2l6ZS1zbSk7XG4gIGNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWhlYWRlci1jb2xvci10ZXh0KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gIHNtYWxsIHtcbiAgICBmb250LXdlaWdodDogdmFyKC0taWRzLWZvbnQtd2VpZ2h0LW5vcm1hbCk7XG4gICAgZm9udC1zaXplOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWZvbnQtc2l6ZS1zbSk7XG4gIH1cbn1cblxuLmhlYWRlci10ZXh0LWNvbnRlbnQge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLy8gUmVxdWlyZWQgaW5kaWNhdG9yIHVzaW5nIENTUyBwc2V1ZG8tZWxlbWVudFxuLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwuaXMtcmVxdWlyZWQge1xuICAuaGVhZGVyLXRleHQtY29udGVudDo6YWZ0ZXIsXG4gIC5pZHMtY2hlY2tib3ggLmxhYmVsLXRleHQ6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnKic7XG4gICAgY29sb3I6IHZhcigtLWlkcy1pbnB1dC1yZXF1aXJlZC1pbmRpY2F0b3ItY29sb3ItdGV4dC1kZWZhdWx0KTtcbiAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgfVxufVxuXG4uaWRzLWRhdGEtZ3JpZC1oZWFkZXItaWNvbiB7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNvbG9yLXRleHQpO1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2UtMnhzKTtcbiAgbWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2UtMnhzKTtcbn1cblxuLy8gSGVhZGVyIHNvcnQgc3R5bGVzXG4uc29ydC1pbmRpY2F0b3Ige1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDRweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IGNhbGModmFyKC0taWRzLXNwYWNlLWxnKSAtIDJweCk7XG4gIHdpZHRoOiAxOHB4O1xufVxuXG4vLyBTb3J0IEhvdmVyIHN0YXRlc1xuLmlzLXNvcnRhYmxlIHtcbiAgLnNvcnQtaW5kaWNhdG9yIGlkcy1pY29uIHtcbiAgICBjb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItY29sb3ItaWNvbi11bnNvcnRlZCk7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgdmFyKC0taWRzLW1vdGlvbi1lYXNlKSAwcztcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdG9wOiB2YXIoLS1pZHMtc3BhY2UtMnhzKTtcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHRvcDogLTEwcHg7XG4gICAgfVxuICB9XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuXG4gICAgLnNvcnQtaW5kaWNhdG9yIGlkcy1pY29uIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuICB9XG59XG5cbi5oZWFkZXItZXhwYW5kZXIge1xuICBkaXNwbGF5OiBub25lO1xuICBtYXgtaGVpZ2h0OiAxOHB4O1xuICBjdXJzb3I6IHZhcigtLWlkcy1jdXJzb3ItcG9pbnRlcik7XG4gIGNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWhlYWRlci1leHBhbmRlci1jb2xvcik7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS0xMik7XG5cbiAgJjpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWV4cGFuZGVyLWNvbG9yLWFjdGl2ZSk7XG4gIH1cbn1cblxuW2RhdGEtcm93LWhlaWdodD0neHhzJ10gLmhlYWRlci1leHBhbmRlciB7XG4gIHRvcDogdmFyKC0taWRzLXNwYWNlLTN4cyk7XG59XG5cbjpob3N0KFtzaG93LWhlYWRlci1leHBhbmRlcl0pIC5oZWFkZXItZXhwYW5kZXIsXG4uY29sdW1uLWhlYWRlci1leHBhbmRlciAuaGVhZGVyLWV4cGFuZGVyIHtcbiAgZGlzcGxheTogdW5zZXQ7XG59XG5cbi5oYXMtc2VsZWN0aW9uY2hlY2tib3ggLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbn1cblxuLmlzLXNvcnRhYmxlLFxuLmhhcy1oZWFkZXJpY29uIHtcbiAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgIHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuICB9XG59XG5cbi8vIEFzY2VuZGluZyBzb3J0XG5bYXJpYS1zb3J0PSdhc2NlbmRpbmcnXSAuaXMtc29ydGFibGUgLnNvcnQtaW5kaWNhdG9yIGlkcy1pY29uIHtcbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNvbG9yLWljb24tc29ydGVkKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbi8vIERlc2NlbmRpbmcgc29ydFxuW2FyaWEtc29ydD0nZGVzY2VuZGluZyddIC5pcy1zb3J0YWJsZSAuc29ydC1pbmRpY2F0b3IgaWRzLWljb24ge1xuICAmOmZpcnN0LWNoaWxkIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBjb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItY29sb3ItaWNvbi1zb3J0ZWQpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuLy8gRHJhZyBhcnJvd3MgZm9yIHNvcnRpbmdcbi5pZHMtZGF0YS1ncmlkLXNvcnQtYXJyb3dzIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAzNHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG5cbiAgJjo6YmVmb3JlLFxuICAmOjphZnRlciB7XG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgaGVpZ2h0OiAwO1xuICAgIGxlZnQ6IC01cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAwO1xuICB9XG5cbiAgJjo6YmVmb3JlIHtcbiAgICBib3JkZXItdG9wOiA1cHggc29saWQgdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXItZHJhZy1hcnJvdy1jb2xvci1iYWNrZ3JvdW5kKTtcbiAgICB0b3A6IC02cHg7XG4gIH1cblxuICAmOjphZnRlciB7XG4gICAgYm9yZGVyLWJvdHRvbTogNXB4IHNvbGlkIHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWRyYWctYXJyb3ctY29sb3ItYmFja2dyb3VuZCk7XG4gICAgYm90dG9tOiAtOXB4O1xuICB9XG59XG5cbi8vIFN0YW5kYWxvbmUgQ3NzXG50ci5pZHMtZGF0YS1ncmlkLWhlYWRlciB7XG4gIHBvc2l0aW9uOiBpbml0aWFsO1xufVxuXG50aC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbn1cblxuLy8gTGlzdCBTdHlsZSBGZWF0dXJlXG4uaWRzLWRhdGEtZ3JpZC5pcy1saXN0LXN0eWxlIHtcbiAgLy8gQ2hhbmdlIEhlYWRlciBDb2xvclxuICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1saXN0LWhlYWRlci1jb2xvci1iYWNrZ3JvdW5kKTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtbGlzdC1oZWFkZXItY29sb3ItYm9yZGVyKTtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICBjb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1saXN0LWhlYWRlci1jb2xvci10ZXh0KTtcbiAgfVxuXG4gIC8vIENoYW5nZSBTb3J0IEljb24gQ29sb3JzXG4gIC5pcy1zb3J0YWJsZSB7XG4gICAgaWRzLWljb24ge1xuICAgICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLWNvbG9yLWljb24tdW5zb3J0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIFthcmlhLXNvcnQ9J2Rlc2NlbmRpbmcnXSAuaXMtc29ydGFibGUgaWRzLWljb246bGFzdC1jaGlsZCxcbiAgW2FyaWEtc29ydD0nYXNjZW5kaW5nJ10gLmlzLXNvcnRhYmxlIGlkcy1pY29uOmZpcnN0LWNoaWxkICB7XG4gICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtbGlzdC1oZWFkZXItY29sb3ItaWNvbi11bnNvcnRlZClcbiAgfVxuXG4gIC8vIENoYW5nZSBIZWFkZXIgQ2hlY2tib3hcbiAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQgLmlkcy1kYXRhLWdyaWQtY2hlY2tib3gtY29udGFpbmVyIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveDpub3QoLmNoZWNrZWQpOm5vdCguaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWxpc3QtaGVhZGVyLWNoZWNrYm94LWNvbG9yLWJhY2tncm91bmQpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBVc2VkIGZvciBGcm96ZW4gQ29sdW1uc1xuLmlkcy1kYXRhLWdyaWQtYm9keSB7XG4gIG1pbi13aWR0aDogZml0LWNvbnRlbnQ7XG59XG5cbi8vIEFkanVzdCBmb3IgUm93IEhlaWdodHMgKGxhcmdlIGlzIGRlZmF1bHQpXG4uaWRzLWRhdGEtZ3JpZCB7XG4gICZbZGF0YS1yb3ctaGVpZ2h0PSdtZCddIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCB7XG4gICAgICBwYWRkaW5nOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWhlYWRlci1tZC1wYWRkaW5nKTtcbiAgICB9XG5cbiAgICAucmVvcmRlcmVyIGlkcy1pY29uIHtcbiAgICAgIGluc2V0LWlubGluZS1zdGFydDogLTExcHg7XG4gICAgfVxuXG4gICAgLnNvcnQtaW5kaWNhdG9yIHtcbiAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IC04cHg7XG4gICAgfVxuXG4gICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwuYWxpZ24tcmlnaHQgLnJlb3JkZXJlciB7XG4gICAgICBpbnNldC1pbmxpbmUtZW5kOiAzcHg7XG4gICAgfVxuXG4gICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGw6aGFzKC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyKSAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCB7XG4gICAgICBwYWRkaW5nLWJsb2NrLWVuZDogdmFyKC0taWRzLXNwYWNlLTJ4cyk7XG4gICAgfVxuICB9XG5cbiAgJltkYXRhLXJvdy1oZWlnaHQ9J3NtJ10ge1xuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmc6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLXNtLXBhZGRpbmcpO1xuICAgIH1cblxuICAgIC5yZW9yZGVyZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG5cbiAgICAuc29ydC1pbmRpY2F0b3Ige1xuICAgICAgbWFyZ2luLWlubGluZS1zdGFydDogLTRweDtcbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbDpoYXMoLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtZmlsdGVyLXdyYXBwZXIpIHtcbiAgICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgICAgcGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuICAgICAgfVxuXG4gICAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlciB7XG4gICAgICAgIHBhZGRpbmctaW5saW5lOiB2YXIoLS1pZHMtc3BhY2UteHMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJltkYXRhLXJvdy1oZWlnaHQ9J3hzJ10ge1xuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlciB7XG4gICAgICBoZWlnaHQ6IDMwcHg7XG5cbiAgICAgICY6aGFzKC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyKSB7XG4gICAgICAgIGhlaWdodDogNThweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbCB7XG4gICAgICBtaW4taGVpZ2h0OiAzMHB4O1xuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsOmhhcyguaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlcikge1xuICAgICAgaGVpZ2h0OiA1OHB4O1xuXG4gICAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCB7XG4gICAgICAgIHBhZGRpbmctYmxvY2stZW5kOiB2YXIoLS1pZHMtc3BhY2UtMnhzKTtcbiAgICAgIH1cblxuICAgICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtZmlsdGVyLXdyYXBwZXIge1xuICAgICAgICBwYWRkaW5nLWlubGluZTogdmFyKC0taWRzLXNwYWNlLTJ4cyk7XG4gICAgICAgIHBhZGRpbmctYmxvY2stZW5kOiA2cHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgICAgcGFkZGluZzogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWFkZXIteHMtcGFkZGluZyk7XG4gICAgfVxuXG4gICAgLnJlb3JkZXJlciB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIC5zb3J0LWluZGljYXRvciB7XG4gICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiAtMnB4O1xuICAgICAgbWFyZ2luLWlubGluZS1lbmQ6IC0ycHg7XG4gICAgICBtYXJnaW4tYmxvY2stc3RhcnQ6IC0zcHg7XG4gICAgfVxuXG4gICAgLmlkcy1kYXRhLWdyaWQtY2hlY2tib3gtY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmctdG9wOiB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC5hbGlnbi1yaWdodCAuaXMtc29ydGFibGUgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgICAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmcteHMpO1xuICAgICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDVweDtcbiAgICB9XG4gIH1cblxuICAmW2RhdGEtcm93LWhlaWdodD0neHhzJ10ge1xuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlciB7XG4gICAgICBoZWlnaHQ6IDMwcHg7XG5cbiAgICAgICY6aGFzKC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyKSB7XG4gICAgICAgIGhlaWdodDogNThweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbCB7XG4gICAgICBtaW4taGVpZ2h0OiAzMHB4O1xuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsOmhhcyguaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlcikge1xuICAgICAgaGVpZ2h0OiA1OHB4O1xuXG4gICAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCB7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuICAgICAgICBwYWRkaW5nLWJsb2NrLXN0YXJ0OiA2cHg7XG4gICAgICB9XG5cbiAgICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWZpbHRlci13cmFwcGVyIHtcbiAgICAgICAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuICAgICAgICBwYWRkaW5nLWJsb2NrLWVuZDogNnB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmc6IHZhcigtLWlkcy1kYXRhLWdyaWQtaGVhZGVyLXh4cy1wYWRkaW5nKTtcbiAgICB9XG5cbiAgICAucmVvcmRlcmVyIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLnNvcnQtaW5kaWNhdG9yIHtcbiAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICAgIG1hcmdpbi1ibG9jay1zdGFydDogLTFweDtcbiAgICAgIGhlaWdodDogMjJweDtcblxuICAgICAgPiBpZHMtaWNvbjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIHRvcDogM3B4O1xuICAgICAgfVxuXG4gICAgICBpZHMtaWNvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgdG9wOiAtMTFweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuYWxpZ24tcmlnaHQgLnNvcnQtaW5kaWNhdG9yIHtcbiAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveC1jb250YWluZXIge1xuICAgICAgcGFkZGluZy10b3A6IDNweDtcbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC5hbGlnbi1yaWdodCAuaXMtc29ydGFibGUgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgICAgcGFkZGluZy1pbmxpbmUtZW5kOiAzcHg7XG4gICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogM3B4O1xuICAgIH1cblxuICAgIC8vIEZpbHRlciBBZGp1c3RtZW50c1xuICAgIGlkcy1pbnB1dCxcbiAgICBpZHMtbWVudS1idXR0b24sXG4gICAgaWRzLXRyaWdnZXItZmllbGQsXG4gICAgaWRzLWRyb3Bkb3duIHtcbiAgICAgIC0taWRzLWlucHV0LWhlaWdodC0xMDogMjRweDtcbiAgICB9XG5cbiAgICBpZHMtZHJvcGRvd24ge1xuICAgICAgLS1pZHMtaW5wdXQtZm9udC1zaXplLXNtOiB2YXIoLS1pZHMtaW5wdXQtZm9udC1zaXplLXhzKTtcbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1maWx0ZXItd3JhcHBlciB7XG4gICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmcteHhzKSArIDJweCk7XG4gICAgICBwYWRkaW5nLWlubGluZS1lbmQ6IGNhbGModmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXh4cykgKyAycHgpO1xuICAgICAgcGFkZGluZy1ibG9jay1lbmQ6IGNhbGModmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXh4cykgLSAxcHgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBDb2x1bW4gc2VsZWN0aW9uIGhlYWRlclxuLmlkcy1kYXRhLWdyaWQgLmhhcy1jb2wtc2VsZWN0aW9uIHtcbiAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGw6bm90KFtjb2x1bW4taWQ9J3NlbGVjdGlvbkNoZWNrYm94J10pIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQge1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcblxuICAgIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IC5pZHMtY2hlY2tib3ggLmxhYmVsLXRleHQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgd2lkdGg6IDgwJTtcbiAgICB9XG5cbiAgICAmLmlzLXNvcnRhYmxlLFxuICAgICYuaXMtcmVvcmRlcmFibGUge1xuICAgICAgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQgLmlkcy1jaGVja2JveCAubGFiZWwtdGV4dCB7XG4gICAgICAgIHdpZHRoOiA3MCU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5pcy1zb3J0YWJsZS5pcy1yZW9yZGVyYWJsZSB7XG4gICAgICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCAuaWRzLWNoZWNrYm94IC5sYWJlbC10ZXh0IHtcbiAgICAgICAgd2lkdGg6IDYwJTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuc29ydC1pbmRpY2F0b3Ige1xuICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGF1dG87XG4gIH1cbn1cblxuLy8gSGFuZGxlIFJUTFxuOmhvc3QoW2Rpcj0ncnRsJ10pIHtcbiAgLy8gTmVnYXRlIHJpZ2h0IGFsaWdubWVudFxuICAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbCB7XG4gICAgJi5hbGlnbi1yaWdodCAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1jb250ZW50IHtcbiAgICAgIGRpcmVjdGlvbjogbHRyO1xuICAgIH1cblxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBib3JkZXItaW5saW5lLWVuZC13aWR0aDogdmFyKC0taWRzLWJvcmRlci13aWR0aC1ub25lKTtcbiAgICB9XG5cbiAgICAmLmZyb3plbi1sZWZ0IHtcbiAgICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgICByaWdodDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuXG4gICAgICAvLyBEeW5hbWljYWxseSBhZGRlZCB3aWR0aHNcbiAgICAgIEBmb3IgJGkgZnJvbSAyIHRocm91Z2ggMTAge1xuICAgICAgICAmOm50aC1vZi10eXBlKCN7JGl9KSB7XG4gICAgICAgICAgcmlnaHQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtZnJvemVuLWNvbHVtbi1sZWZ0LXdpZHRoLSN7JGl9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLyogSWRzIERhdGEgR3JpZCBDb21wb25lbnQgLSBSb3dzICovXG4uaWRzLWRhdGEtZ3JpZC1yb3cge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWlkcy1kYXRhLWdyaWQtY29sdW1uLXdpZHRocyk7IC8vIEZpbGxlZCBpbiBkeW5hbWljYWxseVxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBpbmhlcml0O1xuXG4gICYuaXMtZHJhZy1zdGFydCB7XG4gICAgLy8gdmlzaWJpbGl0eTogaGlkZGVuO1xuICB9XG5cbiAgJi5pcy1kcmFnLXRhcmdldCB7XG4gICAgLy8gdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG1hcmdpbi10b3A6IDUwcHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jb2xvci1ib3JkZXIpO1xuICB9XG5cbiAgJi5zZWxlY3RlZDpub3QoLm1peGVkKSAuaWRzLWRhdGEtZ3JpZC1jZWxsLFxuICAmLmFjdGl2YXRlZCAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1iYWNrZ3JvdW5kLXNlbGVjdGVkKTtcbiAgfVxuXG4gICZbaGlkZGVuXSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gICZbcGFydCo9J3Jvdy0nXSB7XG4gICAgJjpub3QoLnNlbGVjdGVkKSB7XG4gICAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsOmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgICAgICBib3JkZXItd2lkdGg6IDVweDtcbiAgICAgICAgY29udGVudDogXCJcIjtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZbcGFydD0ncm93LW5ldyddIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1iYWNrZ3JvdW5kLW5ldyk7XG5cbiAgICAmOm5vdCguc2VsZWN0ZWQpIHtcbiAgICAgIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgICAgICAmOmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1ib3JkZXItbmV3KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1ib3JkZXItbmV3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJhY2tncm91bmQtbmV3KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jb2xvci10ZXh0LXN0YXRlcy1kZWZhdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmW3BhcnQ9J3Jvdy1yZW1vdmVkJ10ge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJhY2tncm91bmQtcmVtb3ZlZCk7XG5cbiAgICAmOm5vdCguc2VsZWN0ZWQpIHtcbiAgICAgIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgICAgICAmOmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYm9yZGVyLXJlbW92ZWQpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJvcmRlci1yZW1vdmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJhY2tncm91bmQtcmVtb3ZlZCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWNlbGwtY29sb3ItdGV4dC1zdGF0ZXMtZGVmYXVsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJltwYXJ0PSdyb3ctZXJyb3InXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYmFja2dyb3VuZC1lcnJvcik7XG5cbiAgICAmOm5vdCguc2VsZWN0ZWQpIHtcbiAgICAgIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgICAgICAmOmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYm9yZGVyLWVycm9yKSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1ib3JkZXItZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYmFja2dyb3VuZC1lcnJvcik7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWNlbGwtY29sb3ItdGV4dC1zdGF0ZXMtZGVmYXVsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEdyb3VwZWQgUm93c1xuLmlkcy1kYXRhLWdyaWQtcm93LmlzLWdyb3VwLXJvdyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWdyb3VwZWQtY29sb3ItYmFja2dyb3VuZCk7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTAwJTtcblxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgIGNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1ncm91cGVkLWNvbG9yLXRleHQsIHJlZCk7XG4gICAgZm9udC13ZWlnaHQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWdyb3VwZWQtZm9udC13ZWlnaHQsIDYwMCk7XG4gICAgYm9yZGVyLWlubGluZS1zdGFydDogMDtcbiAgfVxuXG4gIGlkcy1idXR0b24ge1xuICAgIC0taWRzLWJ1dHRvbi10ZXJ0aWFyeS1jb2xvci1iYWNrZ3JvdW5kLWhvdmVyOiB0cmFuc3BhcmVudDtcbiAgICAtLWlkcy1idXR0b24tdGVydGlhcnktY29sb3ItYm9yZGVyLWhvdmVyOiB0cmFuc3BhcmVudDtcblxuICAgIHBhZGRpbmc6IDAgMnB4O1xuICB9XG59XG5cbi8vIFJvdyBIZWlnaHQgRmVhdHVyZSB3aXRoIEZvcm1hdHRlcnMgc3BhY2luZ1xuLmlkcy1kYXRhLWdyaWQge1xuICAvLyBMYXJnZSBieSBkZWZhdWx0XG4gICZbZGF0YS1yb3ctaGVpZ2h0PSdtZCddIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgIGhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctaGVpZ2h0LW1kKTtcblxuICAgICAgLnRleHQtZWxsaXBzaXMsXG4gICAgICBpZHMtYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLW1kKTtcbiAgICAgICAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctbWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWNlbGw6bm90KC5hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQ6bm90KC52ZXJ0aWNhbC1hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctbWQpO1xuICAgICAgdHJhbnNpdGlvbjogcGFkZGluZyB2YXIoLS1pZHMtbW90aW9uLWR1cmF0aW9uKSB2YXIoLS1pZHMtbW90aW9uLWVhc2UpO1xuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWNlbGw6bm90KC5hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsOmhvdmVyIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQ6bm90KC52ZXJ0aWNhbC1hbGlnbi1jZW50ZXIpLmlzLXJlb3JkZXJhYmxlIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctbWQpO1xuICAgIH1cbiAgfVxuXG4gICZbZGF0YS1yb3ctaGVpZ2h0PSdzbSddIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgIGhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctaGVpZ2h0LXNtKTtcblxuICAgICAgLnRleHQtZWxsaXBzaXMsXG4gICAgICBpZHMtYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXNtKTtcbiAgICAgICAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctc20pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWNlbGw6bm90KC5hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQ6bm90KC52ZXJ0aWNhbC1hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctc20pO1xuICAgICAgdHJhbnNpdGlvbjogcGFkZGluZyB2YXIoLS1pZHMtbW90aW9uLWR1cmF0aW9uKSB2YXIoLS1pZHMtbW90aW9uLWVhc2UpO1xuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWNlbGw6bm90KC5hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsOmhvdmVyIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQ6bm90KC52ZXJ0aWNhbC1hbGlnbi1jZW50ZXIpLmlzLXJlb3JkZXJhYmxlIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctc20pO1xuICAgIH1cbiAgfVxuXG4gICZbZGF0YS1yb3ctaGVpZ2h0PSd4cyddIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgIGhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctaGVpZ2h0LXhzKTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taWRzLWRhdGEtZ3JpZC1mb250LXNpemUtc20pO1xuXG4gICAgICAudGV4dC1lbGxpcHNpcyxcbiAgICAgIGlkcy1iYWRnZSB7XG4gICAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmcteHMpO1xuICAgICAgICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy14cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmlkcy1kYXRhLWdyaWQtY2VsbDpub3QoLmFsaWduLWNlbnRlcikgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtY29udGVudDpub3QoLnZlcnRpY2FsLWFsaWduLWNlbnRlcikgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy14cyk7XG4gICAgICB0cmFuc2l0aW9uOiBwYWRkaW5nIHZhcigtLWlkcy1tb3Rpb24tZHVyYXRpb24pIHZhcigtLWlkcy1tb3Rpb24tZWFzZSk7XG4gICAgfVxuXG4gICAgLmlkcy1kYXRhLWdyaWQtY2VsbDpub3QoLmFsaWduLWNlbnRlcikgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGw6aG92ZXIgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLWNlbGwtY29udGVudDpub3QoLnZlcnRpY2FsLWFsaWduLWNlbnRlcikuaXMtcmVvcmRlcmFibGUgLmlkcy1kYXRhLWdyaWQtaGVhZGVyLXRleHQge1xuICAgICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy14cyk7XG4gICAgfVxuICB9XG5cbiAgJltkYXRhLXJvdy1oZWlnaHQ9J3h4cyddIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgIGhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctaGVpZ2h0LXh4cyk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWlkcy1kYXRhLWdyaWQtZm9udC1zaXplLXNtKTtcblxuICAgICAgLnRleHQtZWxsaXBzaXMsXG4gICAgICBpZHMtYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXh4cyk7XG4gICAgICAgIHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXh4cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9uICd4eHMnIHJvdyBoZWlnaHQsIGlubGluZS1lZGl0YWJsZSBjZWxscyBoYXZlIGEgc2xpZ2h0bHkgd2lkZXJcbiAgICAgIC8vIHBhZGRpbmcgYXBwZWFyYW5jZSB0byBhY2NvbW1vZGF0ZSB0aGUgaW5saW5lIGRpc3BsYXlcbiAgICAgICYuaXMtaW5saW5lIHtcbiAgICAgICAgLnRleHQtZWxsaXBzaXMge1xuICAgICAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmcteHMpO1xuICAgICAgICAgIHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC5pZHMtZGF0YS1ncmlkLWNlbGw6bm90KC5hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci1jZWxsLWNvbnRlbnQ6bm90KC52ZXJ0aWNhbC1hbGlnbi1jZW50ZXIpIC5pZHMtZGF0YS1ncmlkLWhlYWRlci10ZXh0IHtcbiAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmcteHhzKTtcbiAgICAgIHRyYW5zaXRpb246IHBhZGRpbmcgdmFyKC0taWRzLW1vdGlvbi1kdXJhdGlvbikgdmFyKC0taWRzLW1vdGlvbi1lYXNlKTtcbiAgICB9XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsOm5vdCguYWxpZ24tY2VudGVyKSAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbDpob3ZlciAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItY2VsbC1jb250ZW50Om5vdCgudmVydGljYWwtYWxpZ24tY2VudGVyKS5pcy1yZW9yZGVyYWJsZSAuaWRzLWRhdGEtZ3JpZC1oZWFkZXItdGV4dCB7XG4gICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXh4cyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFJvdyBBbHRlcm5hdGUgUm93IFNldHRpbmcgRmVhdHVyZVxuLmlkcy1kYXRhLWdyaWQuYWx0LXJvdy1zaGFkaW5nIGlkcy1kYXRhLWdyaWQtcm93Om50aC1jaGlsZChldmVuKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWFsdGVybmF0aW5nLWNvbG9yLWJhY2tncm91bmQpO1xufVxuXG4vLyBFeHBhbmRhYmxlIFJvd1xuLmlkcy1kYXRhLWdyaWQtZXhwYW5kYWJsZS1yb3cge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0taWRzLWRhdGEtZ3JpZC1jZWxsLWNvbG9yLWJvcmRlcik7XG4gIGdyaWQtY29sdW1uOiAxIC8gLTE7XG4gIHBhZGRpbmc6IHZhcigtLWlkcy1zcGFjZS14cyk7XG59XG5cbi8vIFN0YW5kYWxvbmUgQ3NzXG50ci5pZHMtZGF0YS1ncmlkLXJvdyB7XG4gIGRpc3BsYXk6IHRhYmxlLXJvdztcbiAgaGVpZ2h0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1oZWlnaHQtbGcpO1xufVxuXG4vLyBSb3cgTmF2aWdhdGlvbiBTdHlsZXNcbi5pZHMtZGF0YS1ncmlkLnJvdy1uYXZpZ2F0aW9uIC5pZHMtZGF0YS1ncmlkLWJvZHkgLmlkcy1kYXRhLWdyaWQtcm93IHtcbiAgJjpmb2N1cy13aXRoaW4ge1xuICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1zaGFkb3ctZm9jdXMpO1xuICAgICAgY29udGVudDogJyAnO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFweCk7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsOmZvY3VzIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gIH1cblxuICAvLyBGaXhlcyBhbiBpc3N1ZSB3aGVyZSBoeXBlcmxpbmtzIGluIHJvdy1uYXZpZ2F0aW9uIG1vZGUgY2Fubm90IGJlIGRpcmVjdGx5IGNsaWNrZWRcbiAgaWRzLWh5cGVybGluayxcbiAgLmlkcy1oeXBlcmxpbmsge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigxcHgpO1xuICB9XG59XG5cbjpob3N0KFtkaXI9J3J0bCddKSB7XG4gIC5pZHMtZGF0YS1ncmlkLXJvdyB7XG4gICAgJltwYXJ0PSdyb3ctbmV3J10ge1xuICAgICAgJjpub3QoLnNlbGVjdGVkKSB7XG4gICAgICAgIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgICAgICAgICY6Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7XG4gICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYm9yZGVyLW5ldykgdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYm9yZGVyLW5ldykgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJltwYXJ0PSdyb3ctcmVtb3ZlZCddIHtcbiAgICAgICY6bm90KC5zZWxlY3RlZCkge1xuICAgICAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgICAgICAmOmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJvcmRlci1yZW1vdmVkKSB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1ib3JkZXItcmVtb3ZlZCkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJltwYXJ0PSdyb3ctZXJyb3InXSB7XG4gICAgICAmOm5vdCguc2VsZWN0ZWQpIHtcbiAgICAgICAgLmlkcy1kYXRhLWdyaWQtY2VsbCB7XG4gICAgICAgICAgJjpmaXJzdC1jaGlsZDo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1ib3JkZXItZXJyb3IpIHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJvcmRlci1lcnJvcikgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKiBJZHMgRGF0YSBHcmlkIENvbXBvbmVudCAtIENlbGxzICovXG5AdXNlICdzYXNzOmxpc3QnO1xuXG4vKiBHZW5lcmF0ZXMgYSBwc2V1ZG8tZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGRpcnR5IHRyYWNrZXIgKi9cbkBtaXhpbiBpZHMtZGF0YS1ncmlkLWNlbGwtZGlydHktdHJhY2tlci1pY29uIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtaW5wdXQtZGlydHktaW5kaWNhdG9yLWNvbG9yLWJhY2tncm91bmQtZGlydHkpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHZhcigtLWlkcy1pbnB1dC1kaXJ0eS1pbmRpY2F0b3ItY29sb3ItYmFja2dyb3VuZC1kaXJ0eSk7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogNXB4O1xuICBjb250ZW50OiAnJztcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4taW5saW5lOiB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldC1ibG9jay1zdGFydDogdmFyKC0taWRzLXNwYWNlLTN4cyk7XG4gIHotaW5kZXg6IDE7XG59XG5cbmlkcy1kYXRhLWdyaWQtY2VsbFtjb2x1bW4tb25zY3JlZW5dIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbn1cblxuaWRzLWRhdGEtZ3JpZC1jZWxsW2NvbHVtbi1vZmZzY3JlZW5dIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbn1cblxuaWRzLWRhdGEtZ3JpZC1jZWxsW2NvbHVtbi1vZmZzY3JlZW4tbGVmdF0ge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG5pZHMtZGF0YS1ncmlkLWNlbGxbY29sdW1uLW9mZnNjcmVlbi1yaWdodF0ge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG4uaWRzLWRhdGEtZ3JpZC1yb3c6bm90KC5zZWxlY3RlZCk6bm90KFtwYXJ0Kj0ncm93LSddKSB7XG4gIC5pZHMtZGF0YS1ncmlkLWNlbGw6bm90KC5pcy1yZWFkb25seSkge1xuICAgICYuZnJvemVuLWxlZnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1jb2xvci1iYWNrZ3JvdW5kKTtcbiAgICB9XG5cbiAgICAmLmZyb3plbi1yaWdodCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWNvbG9yLWJhY2tncm91bmQpO1xuICAgIH1cbiAgfVxufVxuXG4uaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgLy8gQm9yZGVyIGFuZCBCYWNrZ3JvdW5kIGFuZCBTaXppbmdcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLWlubGluZS1zdGFydDogMXB4IHNvbGlkO1xuICBib3JkZXItYmxvY2stZW5kOiAxcHggc29saWQ7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1jZWxsLWNvbG9yLWJvcmRlcik7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBjb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1jZWxsLWNvbG9yLXRleHQtZGVmYXVsdCk7XG4gIGhlaWdodDogNTBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gIC8vIEhpZGUgZmlyc3QvbGFzdCBib3JkZXJcbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLWlubGluZS1zdGFydC13aWR0aDogdmFyKC0taWRzLWJvcmRlci13aWR0aC1ub25lKTtcbiAgfVxuXG4gIC8vIFJlc2V0IGJhZGdlIG1hcmdpbiB0byBjZW50ZXIgaXQgdmVydGljYWxseVxuICBpZHMtYmFkZ2U6OnBhcnQoYmFkZ2UpIHtcbiAgICBtYXJnaW4tYmxvY2stZW5kOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgfVxuXG4gIGlkcy1iYWRnZSB7XG4gICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS1zbSk7XG4gICAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2Utc20pO1xuICB9XG5cbiAgLy8gU28gdGhlIGNvbG9yIGlzIHRoZSBzYW1lIGFzIHRoZSBlZGl0b3JcbiAgaWRzLWljb25baWNvbj0nZHJvcGRvd24nXSB7XG4gICAgY29sb3I6IHZhcigtLWlkcy10cmlnZ2VyLWZpZWxkLWljb24tY29sb3IpXG4gIH1cblxuICBpZHMtaHlwZXJsaW5rIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZy1pbmxpbmU6IDEycHg7XG4gICAgd2lkdGg6IC1tb3otYXZhaWxhYmxlO1xuICAgIHdpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlO1xuICAgIHdpZHRoOiBmaWxsLWF2YWlsYWJsZTtcbiAgfVxuXG4gIC50ZXh0LWVsbGlwc2lzIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS1pZHMtc3BhY2UteHMpICsgNHB4KTtcbiAgICBwYWRkaW5nLWlubGluZS1lbmQ6IGNhbGModmFyKC0taWRzLXNwYWNlLXhzKSArIDRweCk7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIH1cblxuICAvLyBUZXh0IEFsaWdubWVudFxuICBpZHMtaWNvbiB7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcblxuICAgICsgc3BhbiB7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgbGluZS1oZWlnaHQ6IDI1cHg7XG4gICAgICBwYWRkaW5nLWlubGluZTogdmFyKC0taWRzLXNwYWNlLTJ4cyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGV4dCBBbGlnbm1lbnRcbiAgJi5hbGlnbi1jZW50ZXIge1xuICAgICYgPiAqOmZpcnN0LWNoaWxkIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgbWFyZ2luOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSkgYXV0bztcbiAgICB9XG4gIH1cblxuICAmLmFsaWduLXJpZ2h0IHtcbiAgICAmID4gKjpmaXJzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiBhdXRvO1xuICAgICAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICB9XG5cbiAgICBpZHMtaW5wdXQge1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVhZG9ubHkgYW5kIGRpc2FibGVkIENlbGxzXG4gICYuaXMtcmVhZG9ubHk6bm90KC5leGNsdWRlLXJlYWRvbmx5LXN0eWxlKTpub3QoLnNlbGVjdGVkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1jZWxsLWNvbG9yLWJhY2tncm91bmQtZnJvemVuLXJlYWRvbmx5KTtcblxuICAgIC5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgJi5pcy1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jb2xvci10ZXh0LWRpc2FibGVkKTtcblxuICAgIC5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgJi5pcy11cHBlcmNhc2Uge1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIH1cblxuICAvLyBGb2N1cyBTdGF0ZVxuICAmOmZvY3VzLFxuICAmLmlzLWVkaXRpbmc6bm90KC5pcy1pbmxpbmUpOmZvY3VzLXdpdGhpbixcbiAgJi5pcy1mb2N1c2VkIHtcbiAgICAmOm5vdCguc2VsZWN0ZWQpOm5vdChbdGFiaW5kZXg9Jy0xJ10pIHtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLWlkcy1zaGFkb3ctMjApO1xuICAgICAgb3V0bGluZTogMXB4IHNvbGlkIHZhcigtLWlkcy1jb2xvci1ib3JkZXItZm9jdXMpO1xuICAgICAgb3V0bGluZS1vZmZzZXQ6IC0xcHg7XG4gICAgfVxuICB9XG5cbiAgJi5mb3JtYXR0ZXItdGV4dG1hc2sge1xuICAgICYuaXMtaG92ZXJhYmxlIHtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcblxuICAgICAgLnRleHQtZWxsaXBzaXMge1xuICAgICAgICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS1zbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmVkaXRvci1jZWxsLWljb24ge1xuICAgICAgbWFyZ2luLWlubGluZS1lbmQ6IDEwcHg7XG4gICAgICBtYXJnaW4tYmxvY2stc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS0zeHMpO1xuICAgICAgZGlzcGxheTogbm9uZTtcblxuICAgICAgJi5zaG93LWNlbGwtaWNvbi1hbHdheXMge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxuICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmOm5vdCguaXMtaW5saW5lKTpub3QoLmlzLWludmFsaWQpOmhvdmVyLFxuICAgICYuaXMtZWRpdGluZyB7XG4gICAgICAuZWRpdG9yLWNlbGwtaWNvbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIC50ZXh0LWVsbGlwc2lzIHtcbiAgICAgICAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2UtMDgpO1xuICAgICAgfVxuXG4gICAgICBpZHMtYWxlcnQge1xuICAgICAgICBtYXJnaW4taW5saW5lOiBjYWxjKDEwMCUgLSA0OHB4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmLmlzLWVkaXRhYmxlIHtcbiAgICAmLmlzLXJlYWRvbmx5Om5vdCguZXhjbHVkZS1yZWFkb25seS1zdHlsZSkge1xuICAgICAgLnRleHQtZWxsaXBzaXM6OmFmdGVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1jZWxsLWNvbG9yLWJhY2tncm91bmQtcmVhZG9ubHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgICYuaXMtaW5saW5lIHtcbiAgICAgICYuZm9ybWF0dGVyLXRyZWUge1xuICAgICAgICAuaWRzLWRhdGEtZ3JpZC10cmVlLWNvbnRhaW5lciB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmlkcy1kYXRhLWdyaWQtdHJlZS1maWVsZC1jb250YWluZXIge1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC50ZXh0LWVsbGlwc2lzIHtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogZW5kO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLnRleHQtZWxsaXBzaXM6OmFmdGVyIHtcbiAgICAgICAgICBtYXJnaW4taW5saW5lLWVuZDogLThweDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZHMtaWNvbi5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgICAgIG1hcmdpbi1pbmxpbmUtZW5kOiAxNXB4O1xuXG4gICAgICAgICZbaWNvbj0nZHJvcGRvd24nXSB7XG4gICAgICAgICAgbWFyZ2luLWlubGluZS1lbmQ6IDEycHg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLmlzLWxvb2t1cCxcbiAgICAmLmlzLWRhdGVwaWNrZXIsXG4gICAgJi5pcy10aW1lcGlja2VyIHtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcblxuICAgICAgLnRleHQtZWxsaXBzaXMge1xuICAgICAgICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLmlzLWRhdGVwaWNrZXIsXG4gICAgJi5pcy10aW1lcGlja2VyIHtcbiAgICAgIGlkcy10cmlnZ2VyLWZpZWxkIHtcbiAgICAgICAgbWFyZ2luLWlubGluZS1zdGFydDogLTFweDtcbiAgICAgICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiAxcHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5pcy1sb29rdXAge1xuICAgICAgaWRzLWxvb2t1cCB7XG4gICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIGlkcy1sb29rdXA6OnBhcnQoY29udGFpbmVyKSxcbiAgICAgIGlkcy1sb29rdXA6OnBhcnQoZmllbGQtY29udGFpbmVyKSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1jb2xvci10cmFuc3BhcmVudCk7XG4gICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICAgIG1hcmdpbi1pbmxpbmUtZW5kOiAxMHB4O1xuICAgICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG5cbiAgICAgICYuc2hvdy1jZWxsLWljb24tYWx3YXlzIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG5cbiAgICAgICAgJjpob3ZlciB7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWRzLXRyaWdnZXItYnV0dG9uOjpwYXJ0KGJ1dHRvbikge1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgfVxuXG4gICAgLy8gaXMtYm9yZGVybGVzczpob3ZlclxuICAgICY6bm90KC5pcy1pbmxpbmUpOm5vdCguaXMtaW52YWxpZCk6bm90KC5pcy1yZWFkb25seSk6Zm9jdXMsXG4gICAgJjpub3QoLmlzLWlubGluZSk6bm90KC5pcy1pbnZhbGlkKTpub3QoLmlzLXJlYWRvbmx5KTpob3ZlciB7XG4gICAgICAuZWRpdG9yLWNlbGwtaWNvbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIGlkcy1hbGVydCB7XG4gICAgICAgIG1hcmdpbi1pbmxpbmU6IGNhbGMoMTAwJSAtIDQ4cHgpO1xuICAgICAgfVxuICAgIH1cblxuICAgICYuaXMtZWRpdGFibGUuaXMtaW52YWxpZCB7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgICAgIGlkcy1hbGVydCB7XG4gICAgICAgIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2UteHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuaXMtZWRpdGluZyBpZHMtY2hlY2tib3gge1xuICAgIC0taWRzLWNoZWNrYm94LW1hcmdpbi1pbmxpbmUtZW5kOiAwO1xuICAgIC0taWRzLWNoZWNrYm94LXNoYWRvdy1mb2N1czogMCAwIDAgMnB4IHRyYW5zcGFyZW50LCAwIDAgMCAzcHggdHJhbnNwYXJlbnQ7XG4gICAgLS1pZHMtY2hlY2tib3gtY29sb3ItYm9yZGVyLWZvY3VzOiB2YXIoLS1pZHMtY2hlY2tib3gtYm9yZGVyKTtcblxuICAgICZbY2hlY2tlZF0ge1xuICAgICAgLS1pZHMtY2hlY2tib3gtY29sb3ItYm9yZGVyLWZvY3VzOiB2YXIoLS1pZHMtY2hlY2tib3gtY29sb3ItYmFja2dyb3VuZC1zZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogNnB4O1xuICAgIHRvcDogM3B4O1xuICB9XG5cbiAgLy8gRWRpdGluZyB3aXRoIHBvcHVwc1xuICAmLmlzLWVkaXRpbmcuaXMtbG9va3VwLFxuICAmLmlzLWVkaXRpbmcuaXMtZGF0ZXBpY2tlcixcbiAgJi5pcy1lZGl0aW5nLmlzLXRpbWVwaWNrZXIsXG4gICYuaXMtZWRpdGluZy5pcy1wYXNzd29yZCB7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIH1cblxuICAmLmlzLWVkaXRpbmcuaXMtaW5saW5lIGlkcy1pbnB1dCB7XG4gICAgei1pbmRleDogOTk7XG4gIH1cblxuICAvLyBEcm9wZG93biBFZGl0YWJsZSBDZWxsXG4gICYuaXMtZWRpdGFibGUuaXMtZHJvcGRvd24ge1xuICAgIC5kcm9wZG93bi1jZWxsLXZhbHVlIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgICYuaXMtZWRpdGluZzpub3QoLmlzLWlubGluZSkge1xuICAgICAgYm9yZGVyLWlubGluZS1zdGFydC13aWR0aDogMDtcbiAgICB9XG4gIH1cblxuICAvLyBEcm9wZG93biBFZGl0aW5nIElubGluZVxuICAmLmlzLWVkaXRpbmcuaXMtZHJvcGRvd24uaXMtaW5saW5lIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuXG4gICAgaWRzLWRyb3Bkb3duIHtcbiAgICAgIHBhZGRpbmc6IDAgdmFyKC0taWRzLXNwYWNlLTJ4cyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGV4dCBFZGl0YWJsZSBDZWxsXG4gICYuZm9ybWF0dGVyLXRleHQge1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gIH1cblxuICAmLmZvcm1hdHRlci1yb3ctcmVvcmRlciB7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5cbiAgLy8gRWRpdGluZyBVcHBlcmNhc2VcbiAgJi5pcy1lZGl0aW5nLmlzLXVwcGVyY2FzZSB7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcblxuICAgIGlkcy1saXN0LWJveC1vcHRpb24sXG4gICAgaWRzLWRyb3Bkb3duOjpwYXJ0KHRyaWdnZXJmaWVsZC1pbnB1dCksXG4gICAgaWRzLWlucHV0OjpwYXJ0KGlucHV0KSB7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZyb3plbiBDZWxsc1xuICAmLmZyb3plbiB7XG4gICAgcG9zaXRpb246IHN0aWNreTtcbiAgICB6LWluZGV4OiAxOyAvLyB6LWluZGV4IGhpZ2hlciB0aGFuIDIgd2lsbCBicmVhayBpZHMtbG9hZGluZy1pbmRpY2F0b3IncyBvdmVybGF5XG4gIH1cblxuICAvLyBDaGFuZ2UgYm9yZGVycyBmb3Igc2Nyb2xsaW5nXG4gICYuZnJvemVuLWxhc3Qge1xuICAgIGJvcmRlci1pbmxpbmUtZW5kOiAxcHggc29saWQgdmFyKC0taWRzLWRhdGEtZ3JpZC1jZWxsLWNvbG9yLWJvcmRlcik7XG5cbiAgICArIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgICAgYm9yZGVyLWlubGluZS1zdGFydC13aWR0aDogdmFyKC0taWRzLWJvcmRlci13aWR0aC1ub25lKTtcbiAgICB9XG4gIH1cblxuICAmLmZyb3plbi1sZWZ0IHtcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgIGxlZnQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcblxuICAgIC8vIER5bmFtaWNhbGx5IGFkZGVkIHdpZHRoc1xuICAgIEBmb3IgJGkgZnJvbSAyIHRocm91Z2ggMTAge1xuICAgICAgJjpudGgtb2YtdHlwZSgjeyRpfSkge1xuICAgICAgICBsZWZ0OiB2YXIoLS1pZHMtZGF0YS1ncmlkLWZyb3plbi1jb2x1bW4tbGVmdC13aWR0aC0jeyRpfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5mcm96ZW4tcmlnaHQge1xuICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgcmlnaHQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgfVxuXG4gICYuaXMtZGlydHk6OmJlZm9yZSB7XG4gICAgQGluY2x1ZGUgaWRzLWRhdGEtZ3JpZC1jZWxsLWRpcnR5LXRyYWNrZXItaWNvbjtcbiAgfVxuXG4gICYuaXMtZGlydHkuaXMtaW5saW5lIHtcbiAgICAmLmZvcm1hdHRlci10cmVlIHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIGNvbnRlbnQ6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIC5pZHMtZGF0YS1ncmlkLXRyZWUtZmllbGQtY29udGFpbmVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgQGluY2x1ZGUgaWRzLWRhdGEtZ3JpZC1jZWxsLWRpcnR5LXRyYWNrZXItaWNvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICYuaXMtZHJvcGRvd246OmJlZm9yZSB7XG4gICAgICBtYXJnaW4taW5saW5lOiA2cHg7XG4gICAgICBpbnNldC1ibG9jay1zdGFydDogNnB4O1xuICAgIH1cblxuICAgIGlkcy1pbnB1dCB7XG4gICAgICAmOjpwYXJ0KGRpcnR5LXRyYWNrZXItaWNvbikge1xuICAgICAgICAtLWlkcy1pY29uLWhlaWdodC1kZWZhdWx0OiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgIC0taWRzLWljb24td2lkdGgtZGVmYXVsdDogMTJweCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuaXMtZGlydHkuaXMtZHJvcGRvd24uaXMtZWRpdGluZzpub3QoLmlzLWlubGluZSk6OmJlZm9yZSB7XG4gICAgaW5zZXQtYmxvY2stc3RhcnQ6IDNweDtcbiAgICBtYXJnaW4taW5saW5lOiAzcHg7XG4gIH1cblxuICAmLmlzLWludmFsaWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jb2xvci1iYWNrZ3JvdW5kLWVycm9yKTtcbiAgfVxuXG4gICYuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWNvbG9yLWJhY2tncm91bmQtc2VsZWN0ZWQpO1xuICB9XG5cbiAgaWRzLWFsZXJ0IHtcbiAgICBtYXJnaW4tdG9wOiAzcHg7XG4gIH1cblxuICBpZHMtdGFnIHtcbiAgICAtLWlkcy10YWctbWFyZ2luLWlubGluZS1lbmQ6IDA7XG4gIH1cblxuICBpZHMtcHJvZ3Jlc3MtYmFyIHtcbiAgICBtYXJnaW46IHZhcigtLWlkcy1wcm9ncmVzcy1iYXItZ3JpZC1jZWxsLW1hcmdpbik7XG4gIH1cblxuICAmLmlzLWVkaXRpbmcge1xuICAgICRpY29uLXN0eWxlczogKFxuICAgICAgJ3RpbWVwaWNrZXInOiAnY2xvY2snLFxuICAgICAgJ2RhdGVwaWNrZXInOiAnY2FsZW5kYXInXG4gICAgKTtcblxuICAgICRmaWVsZC1oZWlnaHRzOiAoXG4gICAgICAneHMnOiAoLTVweCwgMXB4KSxcbiAgICAgICdzbSc6ICh2YXIoLS1pZHMtc3BhY2UtM3hzKSwgMXB4KVxuICAgICk7XG5cbiAgICBAZWFjaCAkY2xhc3MsICRpY29uIGluICRpY29uLXN0eWxlcyB7XG4gICAgICAmLmlzLSN7JGNsYXNzfSB7XG4gICAgICAgIEBlYWNoICRoZWlnaHQsICR2YWx1ZXMgaW4gJGZpZWxkLWhlaWdodHMge1xuICAgICAgICAgIC5pZHMtdHJpZ2dlci1maWVsZC1zbG90LXRyaWdnZXItZW5kW2ljb249JyN7JGljb259J11bZmllbGQtaGVpZ2h0PScjeyRoZWlnaHR9J10ge1xuICAgICAgICAgICAgbWFyZ2luLWlubGluZS1lbmQ6IGxpc3QubnRoKCR2YWx1ZXMsIDEpO1xuICAgICAgICAgICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiBsaXN0Lm50aCgkdmFsdWVzLCAyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSb3cgaGVpZ2h0OiAneHhzJ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5bZGF0YS1yb3ctaGVpZ2h0PSd4eHMnXSB7XG4gIC5mb3JtYXR0ZXItcHJvZ3Jlc3Mge1xuICAgIGlkcy1wcm9ncmVzcy1iYXIge1xuICAgICAgbWFyZ2luOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmcteHhzKTtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsLmlzLWRpcnR5OjpiZWZvcmUge1xuICAgIGJvcmRlci13aWR0aDogNHB4O1xuICAgIGluc2V0LWJsb2NrLXN0YXJ0OiAxcHg7XG4gICAgaW5zZXQtaW5saW5lLXN0YXJ0OiAtMXB4O1xuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1kaXJ0eS5pcy1pbmxpbmU6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWlubGluZTogM3B4O1xuICAgIHRvcDogM3B4O1xuICB9XG5cbiAgaWRzLWJ1dHRvbiB7XG4gICAgLS1pZHMtYnV0dG9uLWljb24tcGFkZGluZzogdmFyKC0taWRzLXNwYWNlLTN4cyk7XG4gIH1cblxuICBpZHMtYmFkZ2Uge1xuICAgIC0taWRzLWJhZGdlLWZvbnQtbGluZS1oZWlnaHQ6IGNhbGModmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctaGVpZ2h0LXh4cykgLSA4cHgpO1xuICB9XG5cbiAgaWRzLXRhZyB7XG4gICAgLS1pZHMtdGFnLWhlaWdodDogY2FsYyh2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1oZWlnaHQteHhzKSAtIDZweCk7XG4gIH1cblxuICBpZHMtaW5wdXQsXG4gIGlkcy10cmlnZ2VyLWZpZWxkIHtcbiAgICAtLWlkcy1zcGFjZS0zeHM6IDA7XG4gICAgLS1pZHMtaW5wdXQtZm9udC1zaXplLXNtOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWZvbnQtc2l6ZS1zbSk7XG4gIH1cblxuICBpZHMtaW5wdXQge1xuICAgICY6OnBhcnQoZGlydHktdHJhY2tlci1pY29uKSB7XG4gICAgICAtLWlkcy1pY29uLWhlaWdodC1kZWZhdWx0OiAxMHB4ICFpbXBvcnRhbnQ7XG4gICAgICAtLWlkcy1pY29uLXdpZHRoLWRlZmF1bHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAmOjpwYXJ0KGlucHV0KSB7XG4gICAgICBoZWlnaHQ6IGNhbGModmFyKC0taWRzLWlucHV0LWhlaWdodC0xMCkpO1xuICAgIH1cbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGluZyB7XG4gICAgaWRzLWlucHV0OjpwYXJ0KGlucHV0KSB7XG4gICAgICBoZWlnaHQ6IGNhbGModmFyKC0taWRzLWlucHV0LWhlaWdodC0xMCkgLSA0cHgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkanVzdCBub24gaW5saW5lIGVkaXRvclxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsLmlzLWVkaXRhYmxlIC5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICBtYXJnaW4taW5saW5lLWVuZDogdmFyKC0taWRzLXNwYWNlLTN4cyk7XG4gIH1cblxuICAvLyBBZGp1c3QgZHJvcGRvd24gZWRpdG9yXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGFibGUuaXMtaW5saW5lIGlkcy1pY29uLmVkaXRvci1jZWxsLWljb24ge1xuICAgIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2UtMnhzKTtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGFibGUuaXMtaW5saW5lIHtcbiAgICAtLWlkcy1idXR0b24tdGVydGlhcnktY29sb3ItYmFja2dyb3VuZC1ob3ZlcjogdmFyKC0taWRzLWNvbG9yLXRyYW5zcGFyZW50KTtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGluZy5pcy1kcm9wZG93bi5pcy1pbmxpbmUgaWRzLWRyb3Bkb3duIHtcbiAgICBwYWRkaW5nOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSkgdmFyKC0taWRzLXNwYWNlLTR4cyk7XG5cbiAgICAtLWlkcy1pbnB1dC1mb250LXNpemUtc206IHZhcigtLWlkcy1kYXRhLWdyaWQtZm9udC1zaXplLXNtKTtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgIC5pZHMtZGF0YS1ncmlkLWNoZWNrYm94LWNvbnRhaW5lcjpub3QoLmlzLXNlbGVjdGlvbi1jaGVja2JveCkge1xuICAgICAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy14eHMpO1xuICAgIH1cblxuICAgICYuaXMtZWRpdGFibGUuaXMtZWRpdGFibGUuaXMtaW52YWxpZCBpZHMtYWxlcnQge1xuICAgICAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS00eHMpO1xuICAgIH1cblxuICAgIGlkcy1oeXBlcmxpbmsge1xuICAgICAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJvdyBoZWlnaHQ6ICd4cydcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5bZGF0YS1yb3ctaGVpZ2h0PSd4cyddIHtcbiAgLmZvcm1hdHRlci1wcm9ncmVzcyB7XG4gICAgaWRzLXByb2dyZXNzLWJhciB7XG4gICAgICBtYXJnaW46IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy14cyk7XG4gICAgfVxuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1kaXJ0eTo6YmVmb3JlIHtcbiAgICBib3JkZXItd2lkdGg6IDRweDtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZGlydHkuaXMtaW5saW5lOjpiZWZvcmUge1xuICAgIG1hcmdpbi1pbmxpbmU6IDNweDtcbiAgICB0b3A6IDNweDtcbiAgfVxuXG4gIGlkcy1idXR0b24ge1xuICAgIC0taWRzLWJ1dHRvbi1pY29uLXBhZGRpbmc6IDNweDtcbiAgfVxuXG4gIGlkcy1iYWRnZSB7XG4gICAgLS1pZHMtYmFkZ2UtZm9udC1saW5lLWhlaWdodDogY2FsYyh2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1oZWlnaHQteHMpIC0gMTJweCk7XG4gIH1cblxuICBpZHMtdGFnIHtcbiAgICAtLWlkcy10YWctaGVpZ2h0OiBjYWxjKHZhcigtLWlkcy1kYXRhLWdyaWQtcm93LWhlaWdodC14eHMpIC0gNHB4KTtcbiAgfVxuXG4gIGlkcy1pbnB1dCB7XG4gICAgLS1pZHMtaW5wdXQtZm9udC1zaXplLXNtOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWZvbnQtc2l6ZS1zbSk7XG5cbiAgICAmOjpwYXJ0KGRpcnR5LXRyYWNrZXItaWNvbikge1xuICAgICAgLS1pZHMtaWNvbi1oZWlnaHQtZGVmYXVsdDogMTJweCAhaW1wb3J0YW50O1xuICAgICAgLS1pZHMtaWNvbi13aWR0aC1kZWZhdWx0OiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRqdXN0IG5vbiBpbmxpbmUgZWRpdG9yXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGFibGUgLmVkaXRvci1jZWxsLWljb24ge1xuICAgIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgfVxuXG4gIC8vIEFkanVzdCBkcm9wZG93biBlZGl0b3JcbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1lZGl0YWJsZS5pcy1pbmxpbmUgaWRzLWljb24uZWRpdG9yLWNlbGwtaWNvbiB7XG4gICAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS0yeHMpO1xuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1lZGl0YWJsZS5pcy1pbmxpbmUge1xuICAgIC0taWRzLWJ1dHRvbi10ZXJ0aWFyeS1jb2xvci1iYWNrZ3JvdW5kLWhvdmVyOiB2YXIoLS1pZHMtY29sb3ItdHJhbnNwYXJlbnQpO1xuICAgIC0taWRzLWlucHV0LWZvbnQtc2l6ZS1zbTogdmFyKC0taWRzLWRhdGEtZ3JpZC1mb250LXNpemUtc20pO1xuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1lZGl0aW5nLmlzLWRyb3Bkb3duLmlzLWlubGluZSBpZHMtZHJvcGRvd24ge1xuICAgIHBhZGRpbmc6IHZhcigtLWlkcy1zcGFjZS1ub25lKSB2YXIoLS1pZHMtc3BhY2UtM3hzKTtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgIC5pZHMtZGF0YS1ncmlkLWNoZWNrYm94LWNvbnRhaW5lcjpub3QoLmlzLXNlbGVjdGlvbi1jaGVja2JveCkge1xuICAgICAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy14cyk7XG4gICAgfVxuXG4gICAgaWRzLWh5cGVybGluayB7XG4gICAgICBwYWRkaW5nLWlubGluZTogdmFyKC0taWRzLXNwYWNlLTJ4cyk7XG4gICAgfVxuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUm93IGhlaWdodDogJ3NtJ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbltkYXRhLXJvdy1oZWlnaHQ9J3NtJ10ge1xuICAuZm9ybWF0dGVyLXByb2dyZXNzIHtcbiAgICBpZHMtcHJvZ3Jlc3MtYmFyIHtcbiAgICAgIG1hcmdpbjogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLXNtKTtcbiAgICB9XG4gIH1cblxuICBpZHMtYnV0dG9uIHtcbiAgICAtLWlkcy1idXR0b24taWNvbi1wYWRkaW5nOiB2YXIoLS1pZHMtc3BhY2UtMnhzKTtcbiAgfVxuXG4gIC8vIEFkanVzdCBub24gaW5saW5lIGVkaXRvclxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsLmlzLWVkaXRhYmxlIC5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICBtYXJnaW4taW5saW5lLWVuZDogNnB4O1xuICB9XG5cbiAgLy8gQWRqdXN0IGRyb3Bkb3duIGVkaXRvclxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsLmlzLWVkaXRhYmxlLmlzLWlubGluZSBpZHMtaWNvbi5lZGl0b3ItY2VsbC1pY29uIHtcbiAgICBtYXJnaW4taW5saW5lLWVuZDogNXB4O1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogMDtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGFibGUuaXMtaW5saW5lIHtcbiAgICAtLWlkcy1idXR0b24tdGVydGlhcnktY29sb3ItYmFja2dyb3VuZC1ob3ZlcjogdmFyKC0taWRzLWNvbG9yLXRyYW5zcGFyZW50KTtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgIC5pZHMtZGF0YS1ncmlkLWNoZWNrYm94LWNvbnRhaW5lcjpub3QoLmlzLXNlbGVjdGlvbi1jaGVja2JveCkge1xuICAgICAgcGFkZGluZy1pbmxpbmU6IHZhcigtLWlkcy1kYXRhLWdyaWQtcGFkZGluZy1zbSk7XG4gICAgfVxuXG4gICAgaWRzLWh5cGVybGluayB7XG4gICAgICBwYWRkaW5nLWlubGluZTogdmFyKC0taWRzLXNwYWNlLXhzKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSb3cgaGVpZ2h0OiAnbWQnXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuW2RhdGEtcm93LWhlaWdodD0nbWQnXSB7XG4gIC5mb3JtYXR0ZXItcHJvZ3Jlc3Mge1xuICAgIGlkcy1wcm9ncmVzcy1iYXIge1xuICAgICAgbWFyZ2luOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctbWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkanVzdCBkcm9wZG93biBlZGl0b3JcbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1lZGl0YWJsZSAuZWRpdG9yLWNlbGwtaWNvbiB7XG4gICAgbWFyZ2luLWlubGluZS1lbmQ6IDdweDtcbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGFibGUuaXMtaW5saW5lIGlkcy1pY29uLmVkaXRvci1jZWxsLWljb24ge1xuICAgIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctc20pO1xuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5pcy1lZGl0YWJsZS5pcy1pbmxpbmUge1xuICAgIC0taWRzLWJ1dHRvbi10ZXJ0aWFyeS1jb2xvci1iYWNrZ3JvdW5kLWhvdmVyOiB2YXIoLS1pZHMtY29sb3ItdHJhbnNwYXJlbnQpO1xuXG4gICAgOjpzbG90dGVkKGlkcy10cmlnZ2VyLWJ1dHRvbikge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdG9wOiAxMDBweDtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveC1jb250YWluZXI6bm90KC5pcy1zZWxlY3Rpb24tY2hlY2tib3gpIHtcbiAgICAgIHBhZGRpbmctaW5saW5lOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXBhZGRpbmctbWQpO1xuICAgIH1cbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJvdyBoZWlnaHQ6ICdsZydcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5bZGF0YS1yb3ctaGVpZ2h0PSdsZyddIHtcbiAgLmlkcy1kYXRhLWdyaWQtY2VsbCB7XG4gICAgLmlkcy1kYXRhLWdyaWQtY2hlY2tib3gtY29udGFpbmVyOm5vdCguaXMtc2VsZWN0aW9uLWNoZWNrYm94KSB7XG4gICAgICBwYWRkaW5nLWlubGluZTogdmFyKC0taWRzLWRhdGEtZ3JpZC1wYWRkaW5nLWxnKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gTGlzdCBTdHlsZSBGZWF0dXJlXG4uaWRzLWRhdGEtZ3JpZC5pcy1saXN0LXN0eWxlIHtcbiAgLy8gQ2hhbmdlIENlbGwgQm9yZGVycy9CR1xuICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICBib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoOiB2YXIoLS1pZHMtYm9yZGVyLXdpZHRoLW5vbmUpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pZHMtZGF0YS1ncmlkLWxpc3QtY2VsbC1jb2xvci1ib3JkZXIpO1xuXG4gICAgJi5pcy1yZWFkb25seTpub3QoLmV4Y2x1ZGUtcmVhZG9ubHktc3R5bGUpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jb2xvci1iYWNrZ3JvdW5kLXJlYWRvbmx5KVxuICAgIH1cblxuICAgICYuaXMtZGlzYWJsZWQge1xuICAgICAgY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jb2xvci10ZXh0LWRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1ib2R5IC5pZHMtZGF0YS1ncmlkLXJvdzpmaXJzdC1jaGlsZCAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICBib3JkZXItdG9wOiAwO1xuICB9XG59XG5cbi8vIFN0YW5kYWxvbmUgQ3NzXG50ZC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLXNwYWNlLXNtKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2Utc20pO1xufVxuXG4vLyBIYW5kbGUgUlRMXG46aG9zdChbZGlyPSdydGwnXSkge1xuICAuaWRzLWRhdGEtZ3JpZC5pcy1saXN0LXN0eWxlIHtcbiAgICAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgIGJvcmRlci1pbmxpbmUtZW5kLXdpZHRoOiB2YXIoLS1pZHMtYm9yZGVyLXdpZHRoLW5vbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5lZ2F0ZSBCb3JkZXJzXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwge1xuICAgICYuZnJvemVuLWxlZnQge1xuICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgIHJpZ2h0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG5cbiAgICAgIC8vIER5bmFtaWNhbGx5IGFkZGVkIHdpZHRoc1xuICAgICAgQGZvciAkaSBmcm9tIDIgdGhyb3VnaCAxMCB7XG4gICAgICAgICY6bnRoLW9mLXR5cGUoI3skaX0pIHtcbiAgICAgICAgICByaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1mcm96ZW4tY29sdW1uLWxlZnQtd2lkdGgtI3skaX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIGJvcmRlci1pbmxpbmUtZW5kLXdpZHRoOiB2YXIoLS1pZHMtYm9yZGVyLXdpZHRoLW5vbmUpO1xuICAgIH1cblxuICAgICYuaXMtZGlydHkge1xuICAgICAgLmlkcy1kYXRhLWdyaWQtdHJlZS1maWVsZC1jb250YWluZXI6OmJlZm9yZSxcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWlucHV0LWRpcnR5LWluZGljYXRvci1jb2xvci1iYWNrZ3JvdW5kLWRpcnR5KSAgdmFyKC0taWRzLWlucHV0LWRpcnR5LWluZGljYXRvci1jb2xvci1iYWNrZ3JvdW5kLWRpcnR5KSB0cmFuc3BhcmVudCAgdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5mb3JtYXR0ZXItdGV4dG1hc2sge1xuICAgICAgLmlzLXRleHRtYXNrIHtcbiAgICAgICAgdW5pY29kZS1iaWRpOiBwbGFpbnRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEZpeCBzbG90dGVkIHRyaWdnZXIgYnV0dG9uIG1hcmdpbnMgd2hlbiBuZXN0ZWQgd2l0aGluIGNlbGxzXG4uaWRzLXRyaWdnZXItZmllbGQtc2xvdC10cmlnZ2VyLWVuZCB7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG59XG4iLCJAdXNlICcuLi8uLi90aGVtZXMvbWl4aW5zL2lkcy1jb3JlLW1peGlucycgYXMgKjtcblxuLy8gSW5jbHVkZXMgSGlkZGVuIENsYXNzZXMgYW5kIE1peGlucyBmb3IgaGlkaW5nIGVsZW1lbnRzIGF0IGJyZWFrcG9pbnRzXG4uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5oaWRlLXh4bC1kb3duIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJGJyZWFrcG9pbnQteHhsKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG5AbWl4aW4gaGlkZS14eGwtZG93biB7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRicmVha3BvaW50LXh4bCkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLmhpZGUteHhsLXVwIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDogJGJyZWFrcG9pbnQteHhsKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG5AbWl4aW4gaGlkZS14eGwtdXAge1xuICBAbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAkYnJlYWtwb2ludC14eGwpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5oaWRlLXhsLWRvd24ge1xuICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkYnJlYWtwb2ludC14bCkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuQG1peGluIGhpZGUteGwtZG93biB7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRicmVha3BvaW50LXhsKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uaGlkZS14bC11cCB7XG4gIEBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6ICRicmVha3BvaW50LXhsKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG5AbWl4aW4gaGlkZS14bC11cCB7XG4gIEBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6ICRicmVha3BvaW50LXhsKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uaGlkZS1sZy1kb3duIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJGJyZWFrcG9pbnQtbGcpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbkBtaXhpbiBoaWRlLWxnLWRvd24ge1xuICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkYnJlYWtwb2ludC1sZykge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLmhpZGUtbGctdXAge1xuICBAbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAkYnJlYWtwb2ludC1sZykge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuQG1peGluIGhpZGUtbGctdXAge1xuICBAbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAkYnJlYWtwb2ludC1sZykge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLmhpZGUtbWQtZG93biB7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRicmVha3BvaW50LW1kKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG5AbWl4aW4gaGlkZS1tZC1kb3duIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJGJyZWFrcG9pbnQtbWQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5oaWRlLW1kLXVwIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDogJGJyZWFrcG9pbnQtbWQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbkBtaXhpbiBoaWRlLW1kLXVwIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDogJGJyZWFrcG9pbnQtbWQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5oaWRlLXNtLWRvd24ge1xuICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkYnJlYWtwb2ludC1zbSkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuQG1peGluIGhpZGUtc20tZG93biB7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRicmVha3BvaW50LXNtKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uaGlkZS1zbS11cCB7XG4gIEBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6ICRicmVha3BvaW50LXNtKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG5AbWl4aW4gaGlkZS1zbS11cCB7XG4gIEBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6ICRicmVha3BvaW50LXNtKSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uaGlkZS14cy1kb3duIHtcbiAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJGJyZWFrcG9pbnQteHMpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbkBtaXhpbiBoaWRlLXhzLWRvd24ge1xuICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkYnJlYWtwb2ludC14cykge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLmhpZGUteHMtdXAge1xuICBAbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAkYnJlYWtwb2ludC14cykge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuQG1peGluIGhpZGUteHMtdXAge1xuICBAbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAkYnJlYWtwb2ludC14cykge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuQG1peGluIGJyZWFrcG9pbnQteHMtZG93biB7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRicmVha3BvaW50LXhzKSB7XG4gICAgQGNvbnRlbnQ7XG4gIH1cbn1cbiIsIkB1c2UgJy4uLy4uL3RoZW1lcy9taXhpbnMvaWRzLWhpZGUtbWl4aW4uc2NzcycgYXMgaGlkZTtcblxuOmhvc3QoLmhpZGUtc20tZG93bikge1xuICBAaW5jbHVkZSBoaWRlLmhpZGUtc20tZG93bigpO1xufVxuXG4uaWRzLXBvcHVwLW1lbnUge1xuICAmOm5vdChbaGlkZGVuXSkge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHotaW5kZXg6IHZhcigtLWlkcy16LWluZGV4LTE2MCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ2hlY2tib3ggTWl4aW5zLlxuICovXG5AdXNlICdzYXNzOmxpc3QnO1xuQHVzZSAnLi4vLi4vdGhlbWVzL21peGlucy9pZHMtY29yZS1taXhpbnMnIGFzIG1peGlucztcblxuLy8gVW5jaGVja2VkXG5AbWl4aW4gY2hlY2tib3gtdW5jaGVja2VkKCkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvcmRlcjogdmFyKC0taWRzLWNoZWNrYm94LWJvcmRlcik7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWlkcy1jaGVja2JveC1ib3JkZXItcmFkaXVzKTtcbiAgaGVpZ2h0OiAxNHB4O1xuICB3aWR0aDogMTRweDtcbiAgbGVmdDogMDtcbiAgdG9wOiAzcHg7XG59XG5cbkBtaXhpbiBjaGVja2JveC11bmNoZWNrZWQtZXJyb3Ige1xuICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1jaGVja2JveC1jb2xvci1ib3JkZXItZXJyb3IpO1xufVxuXG4vLyBDaGVja2VkXG5AbWl4aW4gY2hlY2tib3gtY2hlY2tlZCgpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWNoZWNrYm94LWNvbG9yLWJhY2tncm91bmQtc2VsZWN0ZWQpO1xuICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1jaGVja2JveC1jb2xvci1ib3JkZXItc2VsZWN0ZWQpO1xufVxuXG5AbWl4aW4gY2hlY2tib3gtY2hlY2tlZC1hZnRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJvcmRlcjogdmFyKC0taWRzLWZvbnQtc2l6ZS0yeHMpIHNvbGlkIHZhcigtLWlkcy1jaGVja2JveC1jb2xvci1ib3JkZXItc2VsZWN0ZWQtYWZ0ZXIpO1xuICBib3JkZXItd2lkdGg6IHZhcigtLWlkcy1jaGVja2JveC1ib3JkZXItd2lkdGgtc2VsZWN0ZWQtYWZ0ZXIpO1xuICBhbmltYXRpb246IGNoZWNrIDAuMTVzO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gIGNvbnRlbnQ6ICcnO1xuICBoZWlnaHQ6IDEwcHg7XG4gIGxlZnQ6IDRweDtcbiAgdG9wOiAwO1xuICB3aWR0aDogNHB4O1xufVxuXG4vLyBJbmRldGVybWluYXRlXG5AbWl4aW4gY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSgpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWNoZWNrYm94LWNvbG9yLWJhY2tncm91bmQtaW5kZXRlcm1pbmF0ZSk7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWNoZWNrYm94LWNvbG9yLWJvcmRlci1pbmRldGVybWluYXRlKTtcbn1cblxuQG1peGluIGNoZWNrYm94LWluZGV0ZXJtaW5hdGUtYWZ0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGFuaW1hdGlvbjogY2hlY2tpbmRldGVybWluYXRlIDAuMTVzO1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taWRzLWNoZWNrYm94LWNvbG9yLWJvcmRlci1pbmRldGVybWluYXRlLWFmdGVyKTtcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS1pZHMtY2hlY2tib3gtYm9yZGVyLXdpZHRoLWluZGV0ZXJtaW5hdGUpO1xuICBjb250ZW50OiAnJztcbiAgaGVpZ2h0OiA2cHg7XG4gIGxlZnQ6IDJweDtcbiAgdG9wOiAwO1xuICB0cmFuc2Zvcm06IG5vbmU7XG4gIHdpZHRoOiAxMHB4O1xufVxuXG4vLyBEaXNhYmxlZFxuQG1peGluIGNoZWNrYm94LWRpc2FibGVkLXVuY2hlY2tlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1jaGVja2JveC1jb2xvci1iYWNrZ3JvdW5kLWRpc2FibGVkKTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtY2hlY2tib3gtY29sb3ItYm9yZGVyLWRpc2FibGVkKTtcbiAgY3Vyc29yOiB2YXIoLS1pZHMtY3Vyc29yLWRlZmF1bHQpO1xufVxuXG5AbWl4aW4gY2hlY2tib3gtZGlzYWJsZWQtdW5jaGVja2VkLWVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtY2hlY2tib3gtY29sb3ItYm9yZGVyLWZvY3VzLWVycm9yKTtcbn1cblxuQG1peGluIGNoZWNrYm94LWRpc2FibGVkLWNoZWNrZWQoKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1jaGVja2JveC1jb2xvci1iYWNrZ3JvdW5kLXNlbGVjdGVkLWRpc2FibGVkKTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtY2hlY2tib3gtY29sb3ItYm9yZGVyLXNlbGVjdGVkLWRpc2FibGVkKTtcbn1cblxuQG1peGluIGNoZWNrYm94LWRpc2FibGVkLXRleHQge1xuICBjdXJzb3I6IHZhcigtLWlkcy1jdXJzb3ItZGVmYXVsdCk7XG4gIGNvbG9yOiB2YXIoLS1pZHMtY2hlY2tib3gtY29sb3ItdGV4dC1kaXNhYmxlZCk7XG59XG5cbi8vIEZvY3VzXG5AbWl4aW4gY2hlY2tib3gtZm9jdXMge1xuICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1jaGVja2JveC1jb2xvci1ib3JkZXItZm9jdXMpO1xuICBib3gtc2hhZG93OiB2YXIoLS1pZHMtY2hlY2tib3gtc2hhZG93LWZvY3VzKTtcbn1cblxuQG1peGluIGNoZWNrYm94LWZvY3VzLWVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtY2hlY2tib3gtY29sb3ItYm9yZGVyLWZvY3VzLWVycm9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0taWRzLWNoZWNrYm94LXNoYWRvdy1mb2N1cy1lcnJvcik7XG59XG5cbi8vIENvbG9yZWRcbiRjb2xvci1uYW1lczogJ2dyZWVuJyAncHVycGxlJyAnYmx1ZScgJ29yYW5nZScgJ3JlZCc7XG4kY29sb3ItdmFyczogLS1pZHMtY29sb3ItZ3JlZW4tNzAgLS1pZHMtY29sb3ItcHVycGxlLTcwIC0taWRzLWNvbG9yLWJsdWUtNzAgLS1pZHMtY29sb3Itb3JhbmdlLTcwIC0taWRzLWNvbG9yLXJlZC03MDtcblxuQG1peGluIGNoZWNrYm94LWNvbG9yZWQoKSB7XG4gIEBlYWNoICRuYW1lIGluICRjb2xvci1uYW1lcyB7XG4gICAgJGk6IGxpc3QuaW5kZXgoJGNvbG9yLW5hbWVzLCAkbmFtZSk7XG4gICAgJGNvbG9yOiB2YXIoI3tsaXN0Lm50aCgkY29sb3ItdmFycywgJGkpfSk7XG5cbiAgICAmW2NvbG9yPScjeyRuYW1lfSddIGlucHV0W3R5cGU9J2NoZWNrYm94J10ge1xuICAgICAgfiAuY2hlY2ttYXJrIHtcbiAgICAgICAgQGluY2x1ZGUgY2hlY2tib3gtY29sb3JlZC1ib3goJGNvbG9yKTtcbiAgICAgIH1cblxuICAgICAgJjpkaXNhYmxlZCB+IC5jaGVja21hcmsge1xuICAgICAgICBAaW5jbHVkZSBjaGVja2JveC1kaXNhYmxlZC11bmNoZWNrZWQoKTtcbiAgICAgIH1cblxuICAgICAgJjpkaXNhYmxlZDpjaGVja2VkIH4gLmNoZWNrbWFyayB7XG4gICAgICAgIEBpbmNsdWRlIGNoZWNrYm94LWRpc2FibGVkLWNoZWNrZWQoKTtcbiAgICAgIH1cblxuICAgICAgJjpmb2N1cyB+IC5jaGVja21hcmsge1xuICAgICAgICBAaW5jbHVkZSBjaGVja2JveC1jb2xvcmVkLWJveC1mb2N1cygkY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gY2hlY2tib3gtY29sb3JlZC1ib3goJGNvbG9yKSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICRjb2xvcjtcbiAgYm9yZGVyLWNvbG9yOiAkY29sb3I7XG59XG5cbkBtaXhpbiBjaGVja2JveC1jb2xvcmVkLWJveC1mb2N1cygkY29sb3IpIHtcbiAgYm9yZGVyLWNvbG9yOiAkY29sb3I7XG59XG5cbi8vIEFuaW1hdGlvbnNcbkBrZXlmcmFtZXMgY2hlY2sge1xuICAwJSB7XG4gICAgaGVpZ2h0OiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiA4cHg7XG4gICAgd2lkdGg6IDA7XG4gIH1cblxuICA1MCUge1xuICAgIGhlaWdodDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogOHB4O1xuICAgIHdpZHRoOiA0cHg7XG4gIH1cblxuICAxMDAlIHtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgbGVmdDogNHB4O1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogNHB4O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2hlY2tpbmRldGVybWluYXRlIHtcbiAgMCUge1xuICAgIHdpZHRoOiAwO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgd2lkdGg6IDEwcHg7XG4gIH1cbn1cbiIsIi8qKlxuICogUmFkaW8gTWl4aW5zLlxuICovXG5AdXNlICdzYXNzOmxpc3QnO1xuQHVzZSAnLi4vLi4vdGhlbWVzL21peGlucy9pZHMtY29yZS1taXhpbnMnIGFzIG1peGlucztcblxuLy8gVW5jaGVja2VkXG5AbWl4aW4gcmFkaW8tdW5jaGVja2VkIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pZHMtcmFkaW8tY29sb3ItYm9yZGVyLWRlZmF1bHQpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1pZHMtcmFkaW8tYm9yZGVyLXJhZGl1cyk7XG4gIGhlaWdodDogMTRweDtcbiAgbGVmdDogMDtcbiAgdG9wOiAzcHg7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1pZHMtbW90aW9uLWR1cmF0aW9uKSB2YXIoLS1pZHMtbW90aW9uLWVhc2UpO1xuICB3aWR0aDogMTRweDtcbn1cblxuQG1peGluIHJhZGlvLXVuY2hlY2tlZC1hZnRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLXJhZGlvLWNvbG9yLWJhY2tncm91bmQpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pZHMtcmFkaW8tY29sb3ItYmFja2dyb3VuZCk7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWlkcy1yYWRpby1ib3JkZXItcmFkaXVzKTtcbiAgY29udGVudDogJyc7XG4gIGhlaWdodDogMDtcbiAgbGVmdDogNnB4O1xuICB0b3A6IDZweDtcbiAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWlkcy1tb3Rpb24tZHVyYXRpb24pIHZhcigtLWlkcy1tb3Rpb24tZWFzZSk7XG4gIHdpZHRoOiAwO1xufVxuXG5AbWl4aW4gcmFkaW8tdW5jaGVja2VkLWVycm9yLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLWNvbG9yLWVycm9yLWRlZmF1bHQpO1xufVxuXG5AbWl4aW4gcmFkaW8tdW5jaGVja2VkLWVycm9yLWxhYmVsLXRleHQge1xuICBjb2xvcjogdmFyKC0taWRzLWNvbG9yLWVycm9yLWRlZmF1bHQpO1xufVxuXG4vLyBDaGVja2VkXG5AbWl4aW4gcmFkaW8tY2hlY2tlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlkcy1yYWRpby1jb2xvci1iYWNrZ3JvdW5kLXNlbGVjdGVkKTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtcmFkaW8tY29sb3ItYm9yZGVyLXNlbGVjdGVkKTtcbn1cblxuQG1peGluIHJhZGlvLWNoZWNrZWQtYWZ0ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtcmFkaW8taW5uZXItY29sb3ItYmFja2dyb3VuZC1zZWxlY3RlZCk7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0taWRzLXJhZGlvLWlubmVyLWNvbG9yLWJhY2tncm91bmQtc2VsZWN0ZWQpO1xuICBib3JkZXItd2lkdGg6IDJweDtcbiAgaGVpZ2h0OiA0cHg7XG4gIGxlZnQ6IDNweDtcbiAgdG9wOiAzcHg7XG4gIHdpZHRoOiA0cHg7XG59XG5cbi8vIERpc2FibGVkXG5AbWl4aW4gcmFkaW8tZGlzYWJsZWQtdW5jaGVja2VkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtcmFkaW8tY29sb3ItYm9yZGVyLWRpc2FibGVkKTtcbiAgY3Vyc29yOiB2YXIoLS1pZHMtY3Vyc29yLWRlZmF1bHQpO1xuICBib3gtc2hhZG93OiBub25lO1xuICBvcGFjaXR5OiB2YXIoLS1pZHMtcmFkaW8tZGlzYWJsZWQtb3BhY2l0eSk7XG59XG5cbkBtaXhpbiByYWRpby1kaXNhYmxlZC11bmNoZWNrZWQtZXJyb3ItY2lyY2xlIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pZHMtcmFkaW8tY29sb3ItYm9yZGVyLWRpc2FibGVkKTtcbn1cblxuQG1peGluIHJhZGlvLWRpc2FibGVkLXVuY2hlY2tlZC1lcnJvci1sYWJlbC10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWlkcy1yYWRpby1jb2xvci1ib3JkZXItZGlzYWJsZWQpO1xufVxuXG5AbWl4aW4gcmFkaW8tZGlzYWJsZWQtY2hlY2tlZCgpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLXJhZGlvLWNvbG9yLWJhY2tncm91bmQtc2VsZWN0ZWQtZGlzYWJsZWQpO1xuICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1yYWRpby1jb2xvci1ib3JkZXItc2VsZWN0ZWQtZGlzYWJsZWQpO1xuICBvcGFjaXR5OiB2YXIoLS1pZHMtcmFkaW8tZGlzYWJsZWQtb3BhY2l0eSk7XG59XG5cbkBtaXhpbiByYWRpby1kaXNhYmxlZC10ZXh0IHtcbiAgY3Vyc29yOiB2YXIoLS1pZHMtY3Vyc29yLWRlZmF1bHQpO1xuICBjb2xvcjogdmFyKC0taWRzLXJhZGlvLWNvbG9yLXRleHQtZGlzYWJsZWQpO1xuICBvcGFjaXR5OiB2YXIoLS1pZHMtcmFkaW8tZGlzYWJsZWQtb3BhY2l0eSk7XG59XG5cbi8vIEZvY3VzXG5AbWl4aW4gcmFkaW8tZm9jdXMge1xuICBib3gtc2hhZG93OiB2YXIoLS1pZHMtcmFkaW8tc2hhZG93KTtcbn1cblxuQG1peGluIHJhZGlvLWZvY3VzLW5vdC1oaWRlLWZvY3VzIHtcbiAgYm94LXNoYWRvdzogdmFyKC0taWRzLXJhZGlvLXNoYWRvdy1mb2N1cyk7XG59XG4iLCJAdXNlICdzYXNzOm1hcCc7XG5AdXNlICcuLi8uLi90aGVtZXMvbWl4aW5zL2lkcy1jb3JlLW1peGlucycgYXMgbWl4aW5zO1xuQHVzZSAnLi9pZHMtZGF0YS1ncmlkLWNvbW1vbicgYXMgKjtcbkB1c2UgJy4vaWRzLWRhdGEtZ3JpZC1maWx0ZXJzJyBhcyAqO1xuQHVzZSAnLi9pZHMtZGF0YS1ncmlkLWhlYWRlcicgYXMgKjtcbkB1c2UgJy4vaWRzLWRhdGEtZ3JpZC1yb3cnIGFzICo7XG5AdXNlICcuL2lkcy1kYXRhLWdyaWQtY2VsbCcgYXMgKjtcbkB1c2UgJy4uLy4uL2NvbXBvbmVudHMvaWRzLXBvcHVwLW1lbnUvaWRzLXBvcHVwLW1lbnUnIGFzICo7XG5AdXNlICcuLi8uLi90aGVtZXMvbWl4aW5zL2lkcy1jaGVja2JveC1taXhpbicgYXMgKjtcbkB1c2UgJy4uLy4uL3RoZW1lcy9taXhpbnMvaWRzLXJhZGlvLW1peGluJyBhcyAqO1xuXG46aG9zdCB7XG4gIC0taWRzLWRhdGEtZ3JpZC1jb2x1bW4td2lkdGhzOiByZXBlYXQoMSwgbWlubWF4KDExMHB4LCAxZnIpKTtcblxuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5pZHMtZGF0YS1ncmlkIHtcbiAgLy8gT3V0c2lkZSBib3JkZXIgYW5kIEJhY2tncm91bmQgYW5kIHNpemluZ1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWNvbG9yLWJhY2tncm91bmQpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pZHMtZGF0YS1ncmlkLWNlbGwtY29sb3ItYm9yZGVyKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0taWRzLWJvcmRlci1yYWRpdXMtMnhzKTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuICBvdXRsaW5lOiBub25lO1xuXG4gIC8vIE5lZWRlZCBzbyBzdGlja3kgaGVhZGVyIHdvcmtzIGluIHNhZmFyaVxuICBkaXNwbGF5OiBpbmxpbmUtZ3JpZDtcbiAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDtcblxuICAvLyBGb250IEluZm9cbiAgQGluY2x1ZGUgbWl4aW5zLmFudGlhbGlhc2VkKCk7XG5cbiAgZm9udC1mYW1pbHk6IHZhcigtLWlkcy1mb250LWZhbWlseS1kZWZhdWx0KSwgdmFyKC0taWRzLWZvbnQtZmFtaWx5LXN5c3RlbS1zYW5zKTtcbiAgZm9udC1zaXplOiB2YXIoLS1pZHMtZm9udC1zaXplLXNtKTtcblxuICAvLyBTZWxlY3Rpb24gQ2hlY2tib3hcbiAgLmlkcy1kYXRhLWdyaWQtY2hlY2tib3gtY29udGFpbmVyIHtcbiAgICBjdXJzb3I6IHZhcigtLWlkcy1jdXJzb3ItcG9pbnRlcik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC8vIENoZWNrYm94IGFsaWdubWVudHNcbiAgLmlkcy1kYXRhLWdyaWQtY2VsbC5hbGlnbi1sZWZ0IHtcbiAgICAuaWRzLWRhdGEtZ3JpZC10cmVlLWNvbnRhaW5lcixcbiAgICAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveC1jb250YWluZXIge1xuICAgICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsLmFsaWduLWNlbnRlciB7XG4gICAgLmlkcy1kYXRhLWdyaWQtY2hlY2tib3gtY29udGFpbmVyIHtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwuYWxpZ24tcmlnaHQge1xuICAgIC5pZHMtZGF0YS1ncmlkLWNoZWNrYm94LWNvbnRhaW5lciB7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDtcbiAgICB9XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1jaGVja2JveCB7XG4gICAgQGluY2x1ZGUgY2hlY2tib3gtdW5jaGVja2VkKCk7XG5cbiAgICAmLmVkaXRhYmxlIHtcbiAgICAgIGN1cnNvcjogdmFyKC0taWRzLWN1cnNvci1wb2ludGVyKTtcbiAgICB9XG5cbiAgICBib3JkZXItY29sb3I6IHZhcigtLWlkcy1kYXRhLWdyaWQtY2VsbC1jaGVja2JveC1jb2xvci1ib3JkZXIpO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG5cbiAgICAmLmRpc2FibGVkIHtcbiAgICAgIEBpbmNsdWRlIGNoZWNrYm94LWRpc2FibGVkLXVuY2hlY2tlZCgpO1xuXG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgfVxuXG4gICAgJi5jaGVja2VkIHtcbiAgICAgIEBpbmNsdWRlIGNoZWNrYm94LWNoZWNrZWQoKTtcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBAaW5jbHVkZSBjaGVja2JveC1jaGVja2VkLWFmdGVyKCk7XG5cbiAgICAgICAgYW5pbWF0aW9uOiBub25lO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgQGluY2x1ZGUgY2hlY2tib3gtZGlzYWJsZWQtY2hlY2tlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgICYuaW5kZXRlcm1pbmF0ZSB7XG4gICAgICBAaW5jbHVkZSBjaGVja2JveC1pbmRldGVybWluYXRlKCk7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgQGluY2x1ZGUgY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1hZnRlcigpO1xuXG4gICAgICAgIGFuaW1hdGlvbjogbm9uZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTZWxlY3Rpb24gUmFkaW9cbiAgLmlkcy1kYXRhLWdyaWQtcmFkaW8tY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLmlkcy1kYXRhLWdyaWQtcmFkaW8ge1xuICAgIEBpbmNsdWRlIHJhZGlvLXVuY2hlY2tlZCgpO1xuXG4gICAgY3Vyc29yOiB2YXIoLS1pZHMtY3Vyc29yLXBvaW50ZXIpO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBAaW5jbHVkZSByYWRpby11bmNoZWNrZWQtYWZ0ZXIoKTtcbiAgICB9XG5cbiAgICAmLmRpc2FibGVkIHtcbiAgICAgIEBpbmNsdWRlIHJhZGlvLWRpc2FibGVkLXVuY2hlY2tlZCgpO1xuICAgIH1cblxuICAgICYuY2hlY2tlZCB7XG4gICAgICBAaW5jbHVkZSByYWRpby1jaGVja2VkKCk7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgQGluY2x1ZGUgcmFkaW8tY2hlY2tlZC1hZnRlcigpO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgQGluY2x1ZGUgcmFkaW8tZGlzYWJsZWQtY2hlY2tlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyZWUgR3JpZFxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsIC5pZHMtZGF0YS1ncmlkLXRyZWUtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIGlkcy1idXR0b24gKyAuaWRzLWRhdGEtZ3JpZC10cmVlLWZpZWxkLWNvbnRhaW5lciAudGV4dC1lbGxpcHNpcyB7XG4gICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgfVxuXG4gICAgaWRzLWJ1dHRvbiB7XG4gICAgICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0taWRzLXNwYWNlLTJ4cyk7XG4gICAgICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICB9XG5cbiAgICBpZHMtYnV0dG9uLmV4cGFuZC1idXR0b24ge1xuICAgICAgLS1pZHMtYnV0dG9uLXRlcnRpYXJ5LWNvbG9yLWJhY2tncm91bmQtaG92ZXI6IHZhcigtLWlkcy1jb2xvci10cmFuc3BhcmVudCk7XG4gICAgICAtLWlkcy1idXR0b24tdGVydGlhcnktY29sb3ItYm9yZGVyLWhvdmVyOiB2YXIoLS1pZHMtY29sb3ItdHJhbnNwYXJlbnQpO1xuICAgICAgLS1pZHMtYnV0dG9uLXRlcnRpYXJ5LWNvbG9yLWJhY2tncm91bmQtcHJlc3NlZDogdmFyKC0taWRzLWNvbG9yLXRyYW5zcGFyZW50KTtcbiAgICAgIC0taWRzLWJ1dHRvbi10ZXJ0aWFyeS1jb2xvci1ib3JkZXItcHJlc3NlZDogdmFyKC0taWRzLWNvbG9yLXRyYW5zcGFyZW50KTtcbiAgICB9XG5cbiAgICAudGV4dC1lbGxpcHNpcyB7XG4gICAgICBpZHMtaHlwZXJsaW5rIHtcbiAgICAgICAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5pZHMtZGF0YS1ncmlkLWNlbGwgLmlkcy1kYXRhLWdyaWQtdHJlZS1maWVsZC1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGlubGluZS1ncmlkO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1hcHMgdXNlZCBmb3IgYWx0ZXJpbmcgYWxpZ25tZW50cyBvZiBlZGl0YWJsZSBncmlkIGNlbGxzIGluIGRpZmZlcmVudCBzY2VuYXJpb3MuXG4gIC8vIFRoZXNlIHJ1bGVzIGFyZSBiYXNlZCBvbiByb3ctaGVpZ2h0LCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBgLmlkcy1kYXRhLWdyaWRgIGVsZW1lbnQgbGV2ZWwuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgJHJvdy1oZWlnaHQtaW5saW5lLXRyZWUtZ3JpZC1idXR0b24td2lkdGhzOiAoXG4gICAgJ3h4cyc6IDMwLFxuICAgICd4cyc6IDMyLFxuICAgICdzbSc6IDM0LFxuICAgICdtZCc6IDQwLFxuICAgICdsZyc6IDQwXG4gICk7XG5cbiAgJHJvdy1oZWlnaHQtcGFkZGluZy1vZmZzZXRzOiAoXG4gICAgJ3h4cyc6IDEyLFxuICAgICd4cyc6IDEwLFxuICAgICdzbSc6IDgsXG4gICAgJ21kJzogMyxcbiAgICAnbGcnOiAzXG4gICk7XG5cbiAgJHJvdy1oZWlnaHQtZGlydHktaW5kaWNhdG9yLW9mZnNldHM6IChcbiAgICAneHhzJzogMSxcbiAgICAneHMnOiAxLFxuICAgICdzbSc6IDEsXG4gICAgJ21kJzogMixcbiAgICAnbGcnOiAyXG4gICk7XG5cbiAgJHJvdy1oZWlnaHQtaW5saW5lLWRpcnR5LWluZGljYXRvci1vZmZzZXRzOiAoXG4gICAgJ3h4cyc6IDMsXG4gICAgJ3hzJzogNCxcbiAgICAnc20nOiA1LFxuICAgICdtZCc6IDYsXG4gICAgJ2xnJzogNlxuICApO1xuXG4gICRyb3ctaGVpZ2h0LWluZGVudHM6IChcbiAgICAneHhzJzogMTIsXG4gICAgJ3hzJzogMTMsXG4gICAgJ3NtJzogMTUsXG4gICAgJ21kJzogMTcsXG4gICAgJ2xnJzogMTdcbiAgKTtcblxuICAkcm93LWhlaWdodC1vdXRsaW5lLXBhZGRpbmc6IChcbiAgICAneHhzJzogMSxcbiAgICAneHMnOiAyLFxuICAgICdzbSc6IDMsXG4gICAgJ21kJzogNCxcbiAgICAnbGcnOiA0XG4gICk7XG5cbiAgJHJvdy1oZWlnaHQtb3V0bGluZS1vZmZzZXRzOiAoXG4gICAgJ3h4cyc6IDEsXG4gICAgJ3hzJzogMixcbiAgICAnc20nOiA1LFxuICAgICdtZCc6IDgsXG4gICAgJ2xnJzogMTJcbiAgKTtcblxuICBAZWFjaCAkcm93SGVpZ2h0LCAkb2Zmc2V0IGluICRyb3ctaGVpZ2h0LXBhZGRpbmctb2Zmc2V0cyB7XG4gICAgLy8gVGhlc2UgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggUm93IEhlaWdodFxuICAgICRidXR0b24td2lkdGg6IG1hcC5nZXQoJHJvdy1oZWlnaHQtaW5saW5lLXRyZWUtZ3JpZC1idXR0b24td2lkdGhzLCAkcm93SGVpZ2h0KTtcbiAgICAkaW5kZW50OiBtYXAuZ2V0KCRyb3ctaGVpZ2h0LWluZGVudHMsICRyb3dIZWlnaHQpO1xuICAgICRkaXJ0eS1pbmRpY2F0b3Itb2Zmc2V0OiBtYXAuZ2V0KCRyb3ctaGVpZ2h0LWRpcnR5LWluZGljYXRvci1vZmZzZXRzLCAkcm93SGVpZ2h0KTtcbiAgICAkaW5saW5lLWRpcnR5LWluZGljYXRvci1vZmZzZXQ6IG1hcC5nZXQoJHJvdy1oZWlnaHQtaW5saW5lLWRpcnR5LWluZGljYXRvci1vZmZzZXRzLCAkcm93SGVpZ2h0KTtcbiAgICAkb3V0bGluZS1vZmZzZXQ6IG1hcC5nZXQoJHJvdy1oZWlnaHQtb3V0bGluZS1vZmZzZXRzLCAkcm93SGVpZ2h0KTtcbiAgICAkb3V0bGluZS1wYWRkaW5nOiBtYXAuZ2V0KCRyb3ctaGVpZ2h0LW91dGxpbmUtcGFkZGluZywgJHJvd0hlaWdodCk7XG5cbiAgICAmW2RhdGEtcm93LWhlaWdodD0nI3skcm93SGVpZ2h0fSddIHtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gVG9wLWxldmVsIGdyaWQgYWxpZ25tZW50cyB0aGF0IGRlcGVuZCBzb2xlbHkgb24gcm93IGhlaWdodFxuICAgICAgLmlkcy1kYXRhLWdyaWQtY2VsbCB7XG4gICAgICAgICYuaXMtZGlydHkge1xuICAgICAgICAgICY6bm90KC5pcy1pbmxpbmUpIHtcbiAgICAgICAgICAgICYuZm9ybWF0dGVyLXRleHQge1xuICAgICAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgICAgIGluc2V0LWJsb2NrLXN0YXJ0OiAjeyRkaXJ0eS1pbmRpY2F0b3Itb2Zmc2V0fXB4O1xuICAgICAgICAgICAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6ICN7JGRpcnR5LWluZGljYXRvci1vZmZzZXR9cHg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLmlzLWlubGluZSB7XG4gICAgICAgICAgICAmLmZvcm1hdHRlci10ZXh0IHtcbiAgICAgICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICBpbnNldC1ibG9jay1zdGFydDogI3skaW5saW5lLWRpcnR5LWluZGljYXRvci1vZmZzZXR9cHg7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWlubGluZS1zdGFydDogI3skaW5saW5lLWRpcnR5LWluZGljYXRvci1vZmZzZXR9cHg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgXCJpbmxpbmUtZWRpdFwiIHN0eWxlJ3Mgb3V0bGluZVxuICAgICAgICAmLmlzLWVkaXRhYmxlLmlzLWlubGluZSB7XG4gICAgICAgICAgJjpub3QoLmZvcm1hdHRlci10cmVlKSB7XG4gICAgICAgICAgICBAaW5jbHVkZSBpZHMtZGF0YS1ncmlkLWlubGluZS1lZGl0YWJsZS1vdXRsaW5lKCRvdXRsaW5lLXBhZGRpbmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICYuZm9ybWF0dGVyLXRyZWUge1xuICAgICAgICAgICAgLnRleHQtZWxsaXBzaXMge1xuICAgICAgICAgICAgICBAaW5jbHVkZSBpZHMtZGF0YS1ncmlkLWlubGluZS1lZGl0YWJsZS1vdXRsaW5lKCRvdXRsaW5lLXBhZGRpbmcpO1xuXG4gICAgICAgICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAjeyRvdXRsaW5lLW9mZnNldCArIDR9cHgpO1xuXG4gICAgICAgICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICAgICAgICBtYXJnaW4taW5saW5lLWVuZDogLSN7JG91dGxpbmUtb2Zmc2V0fXB4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBzdGFydCBwYWRkaW5nIGZyb20gdHJlZS1ncmlkLWNvbnRhaW5lZCBgLnRleHQtZWxsaXBzaXNgIGVsZW1lbnRzXG4gICAgICAuaWRzLWRhdGEtZ3JpZC10cmVlLWZpZWxkLWNvbnRhaW5lciAudGV4dC1lbGxpcHNpcyB7XG4gICAgICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgICB9XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRXhwYW5kYWJsZSBncmlkL3RyZWUgZ3JpZCBuZXN0ZWQgYWxpZ25tZW50IHJ1bGVzXG4gICAgICBAZm9yICRpIGZyb20gMSB0aHJvdWdoIDgge1xuICAgICAgICBbYXJpYS1sZXZlbD0nI3skaX0nXSAuaWRzLWRhdGEtZ3JpZC1jZWxsIHtcbiAgICAgICAgICBAaWYgJGkgPT0gMSB7XG4gICAgICAgICAgICAuaWRzLWRhdGEtZ3JpZC10cmVlLWZpZWxkLWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6ICN7JGJ1dHRvbi13aWR0aH1weDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWRzLWJ1dHRvbiB7XG4gICAgICAgICAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWlkcy1zcGFjZS1ub25lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWRzLWJ1dHRvbiArIC5pZHMtZGF0YS1ncmlkLXRyZWUtZmllbGQtY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgLmlkcy1kYXRhLWdyaWQtdHJlZS1maWVsZC1jb250YWluZXIge1xuICAgICAgICAgICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiAjeyRidXR0b24td2lkdGggKyAoJGluZGVudCAqICgkaSAtIDEpKSArICgkb2Zmc2V0KX1weDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWRzLWJ1dHRvbiB7XG4gICAgICAgICAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6ICN7KCRpbmRlbnQgKiAoJGkgLSAxKSkgKyAkb2Zmc2V0fXB4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZHMtYnV0dG9uICsgLmlkcy1kYXRhLWdyaWQtdHJlZS1maWVsZC1jb250YWluZXIge1xuICAgICAgICAgICAgICBtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgLy8gRGlydHktdHJhY2tlciBydWxlcyBkZXBlbmRlbnQgb24gYGFyaWEtbGV2ZWxgIG5lc3RpbmdcbiAgICAgICAgICAmLmlzLWRpcnR5IHtcbiAgICAgICAgICAgICYuaXMtaW5saW5lIHtcbiAgICAgICAgICAgICAgLmlkcy1kYXRhLWdyaWQtdHJlZS1maWVsZC1jb250YWluZXI6OmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgaW5zZXQtYmxvY2stc3RhcnQ6ICN7JGlubGluZS1kaXJ0eS1pbmRpY2F0b3Itb2Zmc2V0fXB4O1xuICAgICAgICAgICAgICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6ICN7JGlubGluZS1kaXJ0eS1pbmRpY2F0b3Itb2Zmc2V0fXB4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRml4IGZvciB4eHMgcm93IGhlaWdodCB0cmVlIGZvcm1hdHRlciBjZWxscyB3aXRoIGV4cGFuZCBpY29uc1xuICAmW2RhdGEtcm93LWhlaWdodD0neHhzJ10ge1xuICAgIC5pZHMtZGF0YS1ncmlkLWNlbGwuaXMtZWRpdGFibGUuaXMtaW5saW5lLmZvcm1hdHRlci10cmVlIHtcbiAgICAgIC50ZXh0LWVsbGlwc2lzOjphZnRlciB7XG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAzcHgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExpc3QgU3R5bGUgRmVhdHVyZVxuICAmLmlzLWxpc3Qtc3R5bGUge1xuICAgIGJvcmRlci13aWR0aDogdmFyKC0taWRzLWJvcmRlci13aWR0aC1ub25lKTtcbiAgfVxuXG4gIC8vIFVzZWQgZm9yIHJvdyBzdGFydFxuICAmLndhaXRpbmctbG9hZCB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgICAuaWRzLWRhdGEtZ3JpZC1ib2R5IHtcbiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gIH1cbn1cblxuLy8gVXNlZCBmb3IgRnJvemVuIENvbHVtbnNcbi5pZHMtZGF0YS1ncmlkLWJvZHkge1xuICBtaW4td2lkdGg6IGZpdC1jb250ZW50O1xufVxuXG4vLyBTdGFuZGFsb25lIENzcyBCb3JkZXJzXG50YWJsZS5pZHMtZGF0YS1ncmlkIHtcbiAgZGlzcGxheTogdGFibGU7XG4gIG91dGxpbmU6IDFweCBzb2xpZCB2YXIoLS1pZHMtZGF0YS1ncmlkLWNlbGwtY29sb3ItYm9yZGVyKTtcbiAgb3V0bGluZS1vZmZzZXQ6IC0xcHg7XG59XG5cbi8vIEVtcHR5IE1lc3NhZ2Vcbi5pZHMtZGF0YS1ncmlkLXdyYXBwZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmlkcy1kYXRhLWdyaWQtdG9vbGJhciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDZweCB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDtcbiAgfVxufVxuXG5pZHMtZW1wdHktbWVzc2FnZTpub3QoW2hpZGRlbl0pLFxuOjpzbG90dGVkKGlkcy1lbXB0eS1tZXNzYWdlOm5vdChbaGlkZGVuXSkpIHtcbiAgZGlzcGxheTogZmxleDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBtYXJnaW4tdG9wOiB2YXIoLS1pZHMtc3BhY2Utc20pO1xufVxuXG4vLyBBZGp1c3QgZm9yIGZpbHRlciByb3dcbmlkcy1lbXB0eS1tZXNzYWdlLmhhcy1maWx0ZXItcm93Om5vdChbaGlkZGVuXSkge1xuICAmLmZpbHRlci1yb3ctc2l6ZS14eHMge1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogMjRweDtcbiAgfVxuXG4gICYuZmlsdGVyLXJvdy1zaXplLXhzIHtcbiAgICBtYXJnaW4tYmxvY2stc3RhcnQ6IDM0cHg7XG4gIH1cblxuICAmLmZpbHRlci1yb3ctc2l6ZS1zbSB7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiAzNHB4O1xuICB9XG5cbiAgJi5maWx0ZXItcm93LXNpemUtbWQge1xuICAgIG1hcmdpbi1ibG9jay1zdGFydDogMzRweDtcbiAgfVxuXG4gICYuZmlsdGVyLXJvdy1zaXplLWxnIHtcbiAgICBtYXJnaW4tYmxvY2stc3RhcnQ6IDI2cHg7XG4gIH1cblxuICAmLmhhcy1wYWdlciB7XG4gICAgbWFyZ2luLWJsb2NrLXN0YXJ0OiAxNHB4O1xuICB9XG59XG5cbjo6c2xvdHRlZChpZHMtZW1wdHktbWVzc2FnZS5oYXMtZmlsdGVyLXJvdzpub3QoW2hpZGRlbl0pKSB7XG4gIG1hcmdpbi1ibG9jay1zdGFydDogMTRweDtcbn1cblxuLmhhcy1lbXB0eS1tZXNzYWdlIC5pZHMtZGF0YS1ncmlkIHtcbiAgbWluLWhlaWdodDogdmFyKC0taWRzLWRhdGEtZ3JpZC1oZWlnaHQtbWluKTtcbn1cblxuLy8gTG9hZGluZyBJbmRpY2F0b3Jcbmlkcy1sb2FkaW5nLWluZGljYXRvciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHRvcDogdmFyKC0taWRzLXNwYWNlLW5vbmUpO1xuXG4gICZbc3RvcHBlZF0ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuOmhvc3QoOm5vdChbZGlzYWJsZS1yb3ctaGlnaGxpZ2h0XSkpIGlkcy1kYXRhLWdyaWQtcm93OmhvdmVyOm5vdChbcGFydCo9J3Jvdy0nXSk6bm90KC5zZWxlY3RlZCkge1xuICBpZHMtZGF0YS1ncmlkLWNlbGwsXG4gIGlkcy1kYXRhLWdyaWQtY2VsbC5pcy1yZWFkb25seTpub3QoLmV4Y2x1ZGUtcmVhZG9ubHktc3R5bGUpIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLXJvdy1jb2xvci1iYWNrZ3JvdW5kLWhvdmVyKTtcbiAgfVxuXG4gIGlkcy1kYXRhLWdyaWQtY2VsbC5pcy1pbnZhbGlkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pZHMtZGF0YS1ncmlkLWNlbGwtY29sb3ItYmFja2dyb3VuZC1lcnJvci1ob3Zlcik7XG4gIH1cblxuICAuaWRzLWRhdGEtZ3JpZC1jZWxsLmZyb3plbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taWRzLWRhdGEtZ3JpZC1yb3ctY29sb3ItYmFja2dyb3VuZC1ob3Zlcik7XG4gIH1cbn1cblxuI2RhdGFncmlkLW1vZGFsIHtcbiAgLS1pZHMtbW9kYWwtY29udGVudC1wYWRkaW5nOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gIC0taWRzLW1vZGFsLWhlYWRlci1wYWRkaW5nOiB2YXIoLS1pZHMtc3BhY2Utc20pIHZhcigtLWlkcy1zcGFjZS1zbSkgdmFyKC0taWRzLXNwYWNlLXhzKSB2YXIoLS1pZHMtc3BhY2Utc20pO1xuICAtLWlkcy1wb3B1cC1maXQtaGVpZ2h0OiA0MDBweDtcblxuICBpZHMtc3dhcHBhYmxlLWl0ZW0ge1xuICAgIC0taWRzLXN3YXBwYWJsZS1pdGVtLWNvbG9yLWJhY2tncm91bmQtc2VsZWN0ZWQ6IHZhcigtLWlkcy1jb2xvci1hY2NlbnQtYmx1ZS13ZWFrZXN0KTtcbiAgICAtLWlkcy1zd2FwcGFibGUtaXRlbS1jb2xvci10ZXh0LXNlbGVjdGVkOiB2YXIoLS1pZHMtY29sb3ItZm9yZWdyb3VuZC1kZWZhdWx0LWRlZmF1bHQpO1xuXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBoZWlnaHQ6IHZhcigtLWlkcy1kYXRhLWdyaWQtbW9kYWwtcm93LWhlaWdodCk7XG4gIH1cblxuICAjZGF0YWdyaWQtbW9kYWwtdGl0bGUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IGNhbGModmFyKC0taWRzLXNwYWNlLTA0KSAqIC0xKTtcbiAgfVxuXG4gIGlkcy1zZWFyY2gtZmllbGQge1xuICAgIC0taWRzLWlucHV0LWNvbG9yLWJhY2tncm91bmQtZGVmYXVsdDogdmFyKC0taWRzLWNvbG9yLWFjY2VudC1uZXV0cmFsLXdlYWtlc3QpO1xuICAgIC0taWRzLXNlYXJjaC1maWVsZC1jb2xvci1iYWNrZ3JvdW5kLWRlZmF1bHQ6IHZhcigtLWlkcy1jb2xvci1hY2NlbnQtbmV1dHJhbC13ZWFrZXN0KTtcbiAgICAtLWlkcy1pbnB1dC1jb2xvci1ib3JkZXItZGVmYXVsdDogdmFyKC0taWRzLWNvbG9yLWFjY2VudC1uZXV0cmFsLXdlYWspO1xuICAgIC0taWRzLWlucHV0LWNvbG9yLWJvcmRlci1ob3ZlcjogdmFyKC0taWRzLWNvbG9yLWFjY2VudC1uZXV0cmFsLXdlYWspO1xuICAgIC0taWRzLWlucHV0LWNvbG9yLWJvcmRlci1mb2N1czogdmFyKC0taWRzLWNvbG9yLWFjY2VudC1uZXV0cmFsLXdlYWspO1xuICAgIC0taWRzLWlucHV0LWNvbG9yLWJvcmRlci1zaGFkb3c6IG5vbmU7XG4gICAgLS1pZHMtc2VhcmNoLWZpZWxkLWJvcmRlci1yYWRpdXM6IHZhcigtLWlkcy1ib3JkZXItcmFkaXVzLW5vbmUpO1xuICAgIC0taWRzLXNlYXJjaC1maWVsZC1ib3JkZXItd2lkdGg6IHZhcigtLWlkcy1ib3JkZXItd2lkdGgtc20pIHZhcigtLWlkcy1ib3JkZXItd2lkdGgtbm9uZSk7XG5cbiAgICBtYXJnaW4tYm90dG9tOiAtOHB4O1xuICAgIG1hcmdpbi10b3A6IGNhbGModmFyKC0taWRzLXNwYWNlLTA4KSAqIC0xKTtcbiAgICBtaW4td2lkdGg6IDMzMHB4O1xuICAgIHBvc2l0aW9uOiBzdGlja3k7XG4gICAgdG9wOiB2YXIoLS1pZHMtc3BhY2Utbm9uZSk7XG4gICAgei1pbmRleDogMTtcbiAgfVxuXG4gIGlkcy10ZXh0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIGlkcy1zd2l0Y2gge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IHZhcigtLWlkcy1zcGFjZS0zeHMpO1xuICB9XG5cbiAgaWRzLXN3YXBwYWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuZGF0YWdyaWQtbW9kYWwtY29sdW1uLWxpc3Qge1xuICAgIC0taWRzLW1vZGFsLWNvbHVtbi1saXN0LWhlaWdodDogY2FsYygxMDAlIC0gMTRweCk7XG5cbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBtYXgtaGVpZ2h0OiB2YXIoLS1pZHMtbW9kYWwtY29sdW1uLWxpc3QtaGVpZ2h0KTtcbiAgfVxuXG59XG5cbi5zZWxlY3Rpb24tYm9yZGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgYm9yZGVyOiAxLjVweCBzb2xpZCB2YXIoLS1pZHMtYnV0dG9uLXByaW1hcnktY29sb3ItYmFja2dyb3VuZC1kZWZhdWx0KTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIHotaW5kZXg6IDI7XG4gIHRyYW5zaXRpb246IGFsbCAwLjA1cyBlYXNlO1xufVxuIiwiLy8gQnJlYWtwb2ludHMgLSB0aGlzIGNhbnQgYmUgdG9rZW5zXG4kYnJlYWtwb2ludC14eGw6IDE0NDBweDtcbiRicmVha3BvaW50LXhsOiAxMjgwcHg7XG4kYnJlYWtwb2ludC1sZzogMTAyNHB4O1xuJGJyZWFrcG9pbnQtbWQ6IDg0MHB4O1xuJGJyZWFrcG9pbnQtc206IDYwMHB4O1xuJGJyZWFrcG9pbnQteHM6IDMyMHB4O1xuXG4vLyBTZXRzIFRleHQgQW50aWFsaWFzaW5nXG5AbWl4aW4gYW50aWFsaWFzZWQge1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcbn1cblxuLy8gdmVuZG9yIHByZWZpeGVkIHRyYW5zaXRpb25zIGZvciByZWd1bGFyIGF0dHJpYnV0ZXMgKG5vbi12ZW5kb3IgcHJlZml4ZWQpXG5AbWl4aW4gdHJhbnNpdGlvbigkdHJhbnNpdGlvbnMtbGlzdC4uLikge1xuICBAZWFjaCAkcHJlZml4IGluICRwcmVmaXhlcyB7XG4gICAgI3skcHJlZml4fXRyYW5zaXRpb246ICR0cmFuc2l0aW9ucy1saXN0O1xuICB9XG59XG5cbi8vIG1ha2UgdGhlIHRleHQgaW52aXNpYmxlIHZpc3VhbGx5IGJ1dCByZWFkYWJsZSBieSBzY3JlZW4gcmVhZGVyc1xuQG1peGluIGF1ZGlibGUoKSB7XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIGhlaWdodDogMDtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIG1pbi1oZWlnaHQ6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmc6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbn1cbiIsIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gR2VuZXJhdGVzIGEgcHNldWRvLWVsZW1lbnQgaW4gdGhlIGZvcm0gb2YgYW4gXCJvdXRsaW5lXCJcbi8vIGluIGEgY2VsbCB0aGF0IHJlcHJlc2VudHMgdGhlIFwiaW5saW5lLCBlZGl0YWJsZVwiIHN0YXRlLlxuQG1peGluIGlkcy1kYXRhLWdyaWQtaW5saW5lLWVkaXRhYmxlLW91dGxpbmUoJG1hcmdpbikge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgJjo6YWZ0ZXIge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlkcy1pbnB1dC1jb2xvci1ib3JkZXItZGVmYXVsdCk7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0taWRzLWJvcmRlci1yYWRpdXMtMnhzKTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIG1hcmdpbjogI3skbWFyZ2lufXB4O1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gI3skbWFyZ2luICogMn1weCk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAjeyRtYXJnaW4gKiAyfXB4KTtcbiAgfVxufVxuIl19 */`;\n", "// Utils\nimport { customElement, scss } from '../../core/ids-decorators';\nimport { attributes } from '../../core/ids-attributes';\nimport { isValidBooleanValue, stringToBool } from '../../utils/ids-string-utils/ids-string-utils';\nimport { exportToCSV, exportToXLSX } from '../../utils/ids-excel-exporter/ids-excel-exporter';\nimport { eventPath, findInPath } from '../../utils/ids-event-path-utils/ids-event-path-utils';\n\n// Dependencies\nimport IdsDataSource, { GroupableOptions } from '../../core/ids-data-source';\nimport IdsDataGridFormatters from './ids-data-grid-formatters';\nimport { editors } from './ids-data-grid-editors';\nimport IdsDataGridFilters, { IdsDataGridFilterConditions } from './ids-data-grid-filters';\nimport { containerArguments, containerTypes } from './ids-data-grid-container-arguments';\nimport { IdsDataGridContextmenuArgs, setContextmenu, getContextmenuElem } from './ids-data-grid-contextmenu';\nimport { IdsDataGridColumn, IdsDataGridColumnGroup } from './ids-data-grid-column';\nimport IdsGlobal from '../ids-global/ids-global';\n\nimport IdsPopupMenu from '../ids-popup-menu/ids-popup-menu';\nimport {\n IdsDataGridEmptyMessageElements,\n setEmptyMessage,\n resetEmptyMessageElements,\n hideEmptyMessage,\n IdsDataGridToggleEmptyMessage,\n emptyMessageTemplate\n} from './ids-data-grid-empty-message';\n\n// Styles\nimport styles from './ids-data-grid.scss';\n\n// Sub Components\nimport IdsDataGridHeader from './ids-data-grid-header';\nimport IdsDataGridRow from './ids-data-grid-row';\nimport '../ids-virtual-scroll/ids-virtual-scroll';\nimport '../ids-layout-flex/ids-layout-flex';\n\n// Mixins\nimport IdsElement from '../../core/ids-element';\nimport IdsEventsMixin from '../../mixins/ids-events-mixin/ids-events-mixin';\nimport IdsKeyboardMixin from '../../mixins/ids-keyboard-mixin/ids-keyboard-mixin';\nimport IdsLocaleMixin from '../../mixins/ids-locale-mixin/ids-locale-mixin';\nimport IdsPagerMixin from '../../mixins/ids-pager-mixin/ids-pager-mixin';\nimport IdsDataGridSaveSettingsMixin from './ids-data-grid-save-settings-mixin';\nimport IdsDataGridTooltipMixin from './ids-data-grid-tooltip-mixin';\nimport IdsDataGridCell from './ids-data-grid-cell';\nimport { ExcelColumn } from '../../utils/ids-excel-exporter/ids-worksheet-templates';\nimport IdsLoadingIndicator from '../ids-loading-indicator/ids-loading-indicator';\n\n// Types\nimport type IdsHyperlink from '../ids-hyperlink/ids-hyperlink';\nimport type IdsButton from '../ids-button/ids-button';\nimport IdsModal from '../ids-modal/ids-modal';\nimport '../ids-switch/ids-switch';\nimport '../ids-swappable/ids-swappable';\nimport IdsSearchField from '../ids-search-field/ids-search-field';\nimport type IdsSwitch from '../ids-switch/ids-switch';\nimport IdsSwappableItem from '../ids-swappable/ids-swappable-item';\nimport IdsDataGridSearchMixin from './ids-data-grid-search-mixin';\nimport IdsDataGridToolbarMixin from './ids-data-grid-toolbar-mixin';\nimport type { IdsDataGridActivationReason } from './ids-data-grid-cell';\nimport { requestAnimationTimeout } from '../../utils/ids-timer-utils/ids-timer-utils';\n\nexport type ActiveCellCache = {\n rowIndex: number;\n columnIndex: number;\n currentValue?: string;\n hasLeaveViewport?: boolean;\n shouldReinstateCell?: boolean;\n};\n\nconst Base = IdsPagerMixin(\n IdsDataGridToolbarMixin(\n IdsDataGridSearchMixin(\n IdsDataGridSaveSettingsMixin(\n IdsDataGridTooltipMixin(\n IdsKeyboardMixin(\n IdsLocaleMixin(\n IdsEventsMixin(\n IdsElement\n )\n )\n )\n )\n )\n )\n )\n);\n\n/**\n * IDS Data Grid Component\n * @type {IdsDataGrid}\n * @inherits IdsElement\n * @mixes IdsPagerMixin\n * @mixes IdsDataGridTooltipMixin\n * @mixes IdsKeyboardMixin\n * @mixes IdsLocaleMixin\n * @mixes IdsEventsMixin\n * @part table - the table main element\n * @part body - the table body element\n * @part header - the header element\n * @part header-cell - the header cells\n * @part row - the row elements\n * @part cell - the cell elements\n */\n@customElement('ids-data-grid')\n@scss(styles)\nexport default class IdsDataGrid extends Base {\n readonly TOO_MANY_COLUMNS = 30; // 30 is arbitrary number that we can recondsider\n\n readonly cacheHash = Math.random().toString(32).substring(2, 7);\n\n readonly cacheSelected = 's';\n\n readonly cacheDeselected = 'd';\n\n readonly cacheExpanded = 'e';\n\n readonly cacheCollapsed = 'c';\n\n readonly cacheCellClass = 'C';\n\n readonly cacheCellPart = 'P';\n\n initialized = false;\n\n isResizing = false;\n\n isSelecting = false;\n\n activeCell: Record<string, any> = {};\n\n lastActiveCell: null | Record<string, any> = {};\n\n autoFitSet = false;\n\n currentColumns?: IdsDataGridColumn[];\n\n sortColumn?: { id: string, ascending: boolean };\n\n emptyMessageElements?: IdsDataGridEmptyMessageElements;\n\n openMenu: null | IdsPopupMenu = null;\n\n serverSideSelections: Array<{ index: number, data: Record<string, unknown> }> = [];\n\n isRowDisabled?: (rowIndex: number, rowData: Record<string, any>) => boolean;\n\n #activeCellCache: ActiveCellCache | null = null;\n\n #editedCellsCache: Map<string, { rowIndex: number, columnIndex: number,\n currentValue: string, originalValue?: string }> = new Map();\n\n #startSelectionCell?: HTMLElement | null;\n\n #endSelectionCell?: HTMLElement | null;\n\n #currentScroll = {\n top: NaN,\n left: NaN\n };\n\n /**\n * Types for contextmenu.\n */\n contextmenuTypes = { ...containerTypes };\n\n selectWithFilterDropdown = false;\n\n dirtyRows?: Set<string | number>;\n\n constructor() {\n super();\n\n this.initialized = false;\n this.state = {\n menuData: null\n };\n }\n\n /** #@see IdsDataGrid.header */\n #header?: IdsDataGridHeader;\n\n /* Returns the header element */\n get header(): IdsDataGridHeader | undefined {\n if (!this.#header) {\n this.#header = this.container?.querySelector<IdsDataGridHeader>('ids-data-grid-header:not(.column-groups)') ?? undefined;\n }\n return this.#header;\n }\n\n /* Returns the body element */\n get body() {\n return this.container?.querySelector<HTMLElement>('.ids-data-grid-body');\n }\n\n /* Returns the outside wrapper element */\n get wrapper() {\n return this.container?.parentNode as HTMLElement | undefined | null;\n }\n\n /* Returns the cell with active tabindex */\n get cellFocused(): IdsDataGridCell | null {\n return this.shadowRoot?.querySelector<IdsDataGridCell>('[tabindex=\"0\"]') ?? null;\n }\n\n /* Returns all the editable cell elements in an array */\n get cellsEditable(): IdsDataGridCell[] {\n // NOTE: Array.from() seems slower than dotdotdot array-destructuring.\n return [\n ...this.container!.querySelectorAll<IdsDataGridCell>('ids-data-grid-cell.is-editable:not(.is-readonly,.is-disabled)')\n ];\n }\n\n /* Returns all the row elements in an array */\n get rows(): IdsDataGridRow[] {\n // NOTE: Array.from() seems slower than dotdotdot array-destructuring.\n return [\n ...this.container!.querySelectorAll<IdsDataGridRow>('.ids-data-grid-body ids-data-grid-row')\n ];\n }\n\n /* Returns all the selected row elements in an array */\n get rowsSelected(): IdsDataGridRow[] {\n // NOTE: Array.from() seems slower than dotdotdot array-destructuring.\n return [\n ...this.container!.querySelectorAll<IdsDataGridRow>('.ids-data-grid-body ids-data-grid-row.selected')\n ];\n }\n\n /* Returns all the hidden row elements in an array */\n get rowsHidden(): IdsDataGridRow[] {\n // NOTE: Array.from() seems slower than dotdotdot array-destructuring.\n return [\n ...this.container!.querySelectorAll<IdsDataGridRow>('.ids-data-grid-body ids-data-grid-row[hidden]')\n ];\n }\n\n /* Returns all the visible row elements in an array */\n get rowsVisible(): IdsDataGridRow[] {\n // NOTE: Array.from() seems slower than dotdotdot array-destructuring.\n return [\n ...this.container!.querySelectorAll<IdsDataGridRow>('.ids-data-grid-body ids-data-grid-row:not([hidden])')\n ];\n }\n\n /**\n * Rows used for virtual scrolling to operate on\n * @returns {Array<Record<string, any>>} virtual rows\n */\n get virtualRows(): Array<Record<string, any>> {\n return this.data.filter((row) => !row.rowHidden);\n }\n\n connectedCallback() {\n if (this.initialized) this.restoreAllSettings?.();\n\n super.connectedCallback();\n this.#attachEventHandlers();\n this.#attachKeyboardListeners();\n this.#attachScrollEvents();\n\n if (this.initialized) {\n // restore scroll position after virtual scroll handlers are set\n this.#restoreScrollPosition(this.#currentScroll.top, this.#currentScroll.left);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.offEvent('scroll.data-grid', this.container);\n this.offEvent('scroll.data-grid.virtual-scroll', this.container);\n this.offEvent('scrollend.data-grid.virtual-scroll', this.container);\n this.openMenu = null;\n this.serverSideSelections = [];\n\n this.#editedCellsCache.clear();\n }\n\n /** Reference to datasource API */\n datasource: IdsDataSource = new IdsDataSource();\n\n /** Filters instance attached to component */\n readonly filters = new IdsDataGridFilters(this);\n\n /** API for list of formatters */\n readonly formatters: IdsDataGridFormatters = new IdsDataGridFormatters();\n\n /** API for list of editors */\n readonly editors = editors;\n\n /**\n * Return the attributes we handle as getters/setters\n * @returns {Array} The attributes in an array\n */\n static get attributes() {\n return [\n ...super.attributes,\n attributes.ADD_NEW_AT_END,\n attributes.ALLOW_ONE_EXPANDED_ROW,\n attributes.ALTERNATE_ROW_SHADING,\n attributes.AUTO_FIT,\n attributes.CELL_COPY_PASTE,\n attributes.DISABLE_HEADER_CHECKBOX,\n attributes.DISABLE_CLIENT_FILTER,\n attributes.DISABLE_ROW_HIGHLIGHT,\n attributes.EMPTY_MESSAGE_DESCRIPTION,\n attributes.EMPTY_MESSAGE_ICON,\n attributes.EMPTY_MESSAGE_LABEL,\n attributes.EDITABLE,\n attributes.EDIT_NEXT_ON_ENTER_PRESS,\n attributes.EXPANDABLE_ROW,\n attributes.EXPANDABLE_ROW_TEMPLATE,\n attributes.FILTER_ROW_DISABLED,\n attributes.FILTER_WHEN_TYPING,\n attributes.FILTERABLE,\n attributes.GROUP_SELECTS_CHILDREN,\n attributes.HEADER_MENU_ID,\n attributes.HYPERLINK_BEHAVIOR,\n attributes.ID_COLUMN,\n attributes.LABEL,\n attributes.LIST_STYLE,\n attributes.PART,\n attributes.MENU_ID,\n attributes.MIN_HEIGHT,\n attributes.ROW_HEIGHT,\n attributes.ROW_NAVIGATION,\n attributes.ROW_SELECTION,\n attributes.ROW_START,\n attributes.SCROLL_MAX_ROWS,\n attributes.SHOW_HEADER_EXPANDER,\n attributes.STRIP_COL_ID,\n attributes.SUPPRESS_CACHING,\n attributes.SUPPRESS_EMPTY_MESSAGE,\n attributes.SUPPRESS_ROW_CLICK_SELECTION,\n attributes.SUPPRESS_ROW_DEACTIVATION,\n attributes.SUPPRESS_ROW_DESELECTION,\n attributes.SUPPRESS_SELECT_ALL_EVENTS,\n attributes.TREE_GRID,\n attributes.VIRTUAL_SCROLL,\n attributes.UNIQUE_ID,\n attributes.USE_FORMATTERS_FOR_SIZING\n ];\n }\n\n /**\n * @returns {Array<string>} Drawer vetoable events\n */\n vetoableEventTypes = [\n 'beforemenushow',\n 'beforetooltipshow',\n ];\n\n /**\n * Inner template contents\n * @returns {string} The template\n * @private\n */\n template() {\n let cssClasses = `${this.alternateRowShading ? ' alt-row-shading' : ''}`;\n cssClasses += `${this.listStyle ? ' is-list-style' : ''}`;\n cssClasses += ' waiting-load';\n\n const emptyMesageTemplate = emptyMessageTemplate.apply(this);\n\n const innerTemplate = (!this.data?.length || !this.columns?.length)\n || (this?.data?.length === 0 && this?.columns?.length === 0)\n ? ''\n : `${IdsDataGridHeader.template(this)}${this.bodyTemplate()}`;\n const html = `<div class=\"ids-data-grid-wrapper\">\n <span class=\"ids-data-grid-sort-arrows\"></span>\n <div class=\"ids-data-grid${cssClasses}\" role=\"table\" part=\"table\" aria-label=\"${this.label}\" data-row-height=\"${this.rowHeight}\">\n ${innerTemplate}\n </div>\n ${emptyMesageTemplate}\n <slot name=\"menu-container\"></slot>\n <slot name=\"contextmenu\"></slot>\n <slot name=\"header-contextmenu\"></slot>\n <slot name=\"tooltip\">\n <ids-tooltip id=\"tooltip\" exportparts=\"tooltip-popup, tooltip-arrow\"></ids-tooltip>\n </slot>\n <slot name=\"loading-container\">\n <ids-loading-indicator stopped></ids-loading-indicator>\n </slot>\n <slot name=\"modal-container\">\n </slot>\n </div>`;\n\n return html;\n }\n\n /**\n * Collapse all expandable or tree rows.\n * @param {boolean} triggerAllRowsEvent If true, will trigger the event once for all rows\n * @param {boolean} triggerRowEvent If true, will trigger row event for each row\n * @returns {void}\n */\n collapseAll(triggerAllRowsEvent = true, triggerRowEvent = false) {\n this.header?.closeExpanderIcons();\n\n const rows: any[] = [];\n this.rows\n .forEach((row: IdsDataGridRow) => {\n const rowIndex = row.rowIndex;\n rows.push({ row: rowIndex, data: this.data[rowIndex] });\n if (row.isExpanded() && triggerRowEvent) {\n this.triggerEvent(`rowcollapsed`, this, {\n bubbles: true,\n detail: {\n elem: this,\n row: rowIndex,\n data: this.data[rowIndex],\n }\n });\n }\n row.doCollapse();\n });\n\n this.data.forEach((rowData, rowIndex) => {\n this.updateDataset(rowIndex, { rowExpanded: false, rowHidden: !!rowData.parentElement });\n });\n\n if (triggerAllRowsEvent) {\n this.triggerEvent(`rowcollapsed`, this, {\n bubbles: true,\n detail: { elem: this, rows, allRows: true }\n });\n }\n }\n\n /**\n * Expand all expandable or tree rows.\n * @returns {void}\n */\n expandAll() {\n this.data.forEach((rowData, rowIndex) => {\n this.updateDataset(rowIndex, { rowExpanded: true, rowHidden: false });\n });\n\n this.header?.openExpanderIcons();\n\n const rows: any[] = [];\n this.rows\n .forEach((row: IdsDataGridRow) => {\n const rowIndex = row.rowIndex;\n rows.push({ row: rowIndex, data: this.data[rowIndex] });\n row.doExpand();\n });\n\n this.triggerEvent(`rowexpanded`, this, {\n bubbles: true,\n detail: { elem: this, rows, allRows: true }\n });\n }\n\n /**\n * Toggle the empty message.\n * @param {boolean | number} hide If true, will hide empty message.\n * @returns {void}\n */\n toggleEmptyMessage(hide?: boolean | number): void {\n IdsDataGridToggleEmptyMessage.apply(this, [hide]);\n }\n\n /**\n * Apply the Filter with the currently selected conditions, or the ones passed in.\n * Empty conditions will rerun the current set of conditions. Passing empth array will clear the filter.\n * @param {Array} conditions An array of objects with the filter conditions.\n * @returns {void}\n */\n applyFilter(conditions?: Array<IdsDataGridFilterConditions>) {\n this.filters?.applyFilter(conditions);\n }\n\n /**\n * Clears the current filter by applying an empty array of filter conditions.\n * @returns {void}\n */\n clearFilter() {\n this?.applyFilter([]);\n }\n\n /**\n * Gets the current filter conditions applied to the data grid.\n * @returns {Array<IdsDataGridFilterConditions>} The current filter conditions.\n */\n get filterConditions(): Array<IdsDataGridFilterConditions> {\n return this.filters?.filterConditions() ?? [];\n }\n\n /**\n * Sync and then redraw the body section\n * @returns {void}\n */\n redrawBody() {\n this.#redrawBodyTemplate();\n this.pager?.sync?.apply(this);\n\n if (this.virtualScroll) {\n this.#detachScrollEvents();\n this.body?.style.setProperty('transform', `translateY(0px)`);\n this.#handleVirtualScroll(this.virtualScrollSettings.ROW_HEIGHT);\n requestAnimationFrame(() => this.#attachScrollEvents());\n }\n\n this.updateSelectedCells();\n }\n\n /**\n * Redraw the body area\n * @private\n * @returns {void}\n */\n #redrawBodyTemplate() {\n if ((this.columns.length === 0 && this.data.length === 0) || !this.initialized) {\n return;\n }\n\n if (this.body) this.body.innerHTML = this.bodyInnerTemplate();\n this.#resetLastSelectedRow();\n this.#resetInitiallySelectedRow();\n this.header?.setHeaderCheckbox();\n\n // If the grid is empty, set the empty message\n if (this.body?.innerHTML === '') {\n setEmptyMessage.apply(this);\n } else if (!this.emptyMessageElements?.em?.hasAttribute(attributes.HIDDEN)) {\n hideEmptyMessage.apply(this);\n }\n }\n\n /**\n * Redraw the list by reapplying the template\n * @private\n */\n redraw() {\n if (this.columns.length === 0) {\n return;\n }\n\n this.#removeAttachedMenus();\n\n const header = IdsDataGridHeader.template(this);\n const body = this.bodyTemplate();\n if (this.container) this.container.innerHTML = header + body;\n this.#setColumnWidths();\n\n this.#applyAutoFit();\n this.header?.setHeaderCheckbox();\n this.#attachEventHandlers();\n this.#attachKeyboardListeners();\n this.#attachScrollEvents();\n this.setupTooltip();\n setContextmenu.apply(this);\n\n // Set initial padding-bottom for virtual scroll\n if (this.virtualScroll) {\n const settings = this.virtualScrollSettings;\n const totalRows = this.treeGrid ? this.virtualRows.length : this.data.length;\n this.#positionVirtualScrollWindow(0, totalRows, settings);\n }\n\n // Attach post filters setting\n this.filters.attachFilterSettings();\n\n // Set Counts/Totals\n this.#updateRowCount();\n\n this.updateSelectedCells();\n\n // Show/hide empty message\n this.toggleEmptyMessage();\n\n // Do some things after redraw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.afterRedraw();\n\n if (this.virtualScroll && this.rows?.[0]?.rowIndex > 0) this.scrollRowIntoView(this.rows?.[0]?.rowIndex);\n }\n\n /** Do some things after redraw */\n async afterRedraw() {\n const rowStart = this.rowStart || 0;\n\n // Handle ready state\n const handleReady = () => {\n this.header?.setIsHeaderExpanderCollapsed?.();\n this.container?.classList.remove('waiting-load');\n this.triggerEvent('afterrendered', this, { bubbles: true, detail: { elem: this } });\n };\n\n if (!rowStart) {\n requestAnimationFrame(() => {\n // Set Focus\n this.setActiveCell(0, 0, true, 'redraw');\n handleReady();\n });\n } else {\n await IdsGlobal.onThemeLoaded().promise;\n this.scrollRowIntoView(rowStart);\n handleReady();\n }\n }\n\n /**\n * Contextmenu stuff use for info and events\n * @private\n */\n contextmenuInfo: {\n menu?: IdsPopupMenu,\n target?: HTMLElement,\n callbackArgs?: IdsDataGridContextmenuArgs\n } = {};\n\n /**\n * Track contextmenu data dynamicly changed by the user.\n * @private\n */\n isDynamicContextmenu = false;\n\n /**\n * Body template markup\n * @private\n * @returns {string} The template\n */\n bodyTemplate() {\n return `<div class=\"ids-data-grid-body\" part=\"contents\" role=\"rowgroup\">${this.bodyInnerTemplate()}</div>`;\n }\n\n /**\n * Simple way to clear cache until a better cache-busting strategy is in implemented\n * @param {number|undefined} rowIndex - (optional) row-index to target specific rowCache to clear\n * @returns {void}\n */\n resetCache(rowIndex?: number): void {\n if (rowIndex === 0 || (rowIndex && rowIndex >= 1)) {\n delete IdsDataGridRow.rowCache[rowIndex];\n // return; // TODO: returning currently breaks cell-editor tests... must fix\n }\n\n IdsDataGridRow.rowCache = {};\n IdsDataGridCell.cellCache = {};\n\n this.#customScrollEventCache = {};\n this.#header = undefined;\n }\n\n /**\n * Body inner template markup\n * @private\n * @returns {string} The template\n */\n bodyInnerTemplate() {\n this.resetCache();\n\n let innerHTML = '';\n let data = this.data;\n const virtualScrollSettings = this.virtualScrollSettings;\n\n if (this.treeGrid && this.virtualScroll) {\n const visibleRows = this.virtualRows.slice(0, virtualScrollSettings.MAX_ROWS_IN_DOM);\n\n for (let i = 0; i < visibleRows.length; i++) {\n const dataIndex = visibleRows[i].vsRefId;\n innerHTML += IdsDataGridRow.template(data[dataIndex], dataIndex, dataIndex + 1, this);\n }\n\n return innerHTML;\n }\n\n if (this.virtualScroll && !this.treeGrid) {\n data = data.slice(0, virtualScrollSettings.MAX_ROWS_IN_DOM);\n }\n\n for (let index = 0; index < data.length; index++) {\n innerHTML += IdsDataGridRow.template(data[index], index, index + 1, this);\n }\n\n return innerHTML;\n }\n\n /**\n * Check if row is selected.\n * @param {number} index The row index\n * @returns {boolean} True, if row is selected\n */\n rowIsSelected(index: number): boolean {\n if (this.pagination === 'server-side') {\n const record = this.data[index];\n const storedIndex = this.serverSideSelections.findIndex((item) => item.data[this.idColumn] === record[this.idColumn]);\n return storedIndex > -1;\n }\n\n return !!this.data[index].rowSelected;\n }\n\n /**\n * Keep flag for last selected row\n * @private\n */\n #lastSelectedRow: number | null = null;\n\n /**\n * Keep flag for initially selected row\n * @private\n */\n #initiallySelectedRow: number | null = null;\n\n /**\n * Keep reference to last shifted row\n * @private\n */\n #lastShiftedRow: number | null = null;\n\n /**\n * Reset flag for last selected row\n * @private\n * @returns {void}\n */\n #resetLastSelectedRow(): void {\n this.#lastSelectedRow = null;\n }\n\n /**\n * Reset flag for last selected row\n * @private\n * @returns {void}\n */\n #resetInitiallySelectedRow(): void {\n this.#initiallySelectedRow = null;\n }\n\n /**\n * Reset reference to last shifted row\n * @private\n */\n #resetLastShiftedRow(): void {\n this.#lastShiftedRow = null;\n }\n\n setRowState(rowIdx: number, stateName: string): void {\n const row = this.rowByIndex(rowIdx);\n\n if (row) row.setAttribute(attributes.PART, stateName);\n }\n\n /**\n * Handles shift+click selection behavior to select rows between initial anchor and current row\n * @private\n * @param {number} index The row index being shift+clicked\n * @returns {void}\n */\n #toggleShiftSelectionInBetween(index: number): void {\n if (this.#lastSelectedRow === null) return;\n if (this.#initiallySelectedRow === null) {\n this.selectRow(index);\n return;\n }\n\n const start = Math.min(index, this.#lastSelectedRow);\n const end = Math.max(index, this.#lastSelectedRow);\n const toSelectStart = Math.min(index, this.#initiallySelectedRow);\n const toSelectEnd = Math.max(index, this.#initiallySelectedRow);\n for (let i = start; i <= end; i++) {\n if (toSelectStart > i || i > toSelectEnd) this.deSelectRow(i);\n else this.selectRow(i);\n }\n\n // Update lastSelectedRow to current index for next shift-selection\n this.#lastSelectedRow = index;\n\n this.#getSelection()?.removeAllRanges?.();\n this.header?.setHeaderCheckbox();\n\n this.triggerEvent('selectionchanged', this, {\n detail: { elem: this, selectedRows: this.selectedRows }\n });\n }\n\n /**\n * Get current selection\n * @private\n * @returns {Selection|null} The selection\n */\n #getSelection(): Selection | null {\n if (!(this.shadowRoot as any)?.getSelection) {\n return document.getSelection();\n }\n return (this.shadowRoot as any)?.getSelection();\n }\n\n /**\n * Handle all triggering and handling of events\n * @private\n */\n #attachEventHandlers() {\n // Add a cell click handler\n const body = this.body;\n\n if (this.cellSelection) {\n this.#attachDragSelection(body);\n } else {\n this.offEvent('mousedown.body', body);\n this.onEvent('mousedown.body', body, (e: any) => {\n const cell: IdsDataGridCell = (e.target as any).closest('ids-data-grid-cell');\n const expandableRow = (e.target as any).closest('.ids-data-grid-expandable-row');\n const isDraggableElement = (e.target as HTMLElement)?.draggable || (e.target as HTMLElement)?.closest('[draggable=\"true\"]');\n\n if (cell !== this.activeCell.node && cell?.formatter?.name !== 'rowReorder' && !expandableRow && !isDraggableElement) {\n e.preventDefault();\n }\n });\n }\n\n this.offEvent('click.body', body);\n this.onEvent('click.body', body, (e: any) => {\n let cell: IdsDataGridCell = (e.target as any).closest('ids-data-grid-cell');\n if (!cell && this.rowNavigation) {\n const row = e.target.closest('ids-data-grid-row');\n if (row) {\n const rect = row.getBoundingClientRect();\n const x = e.clientX - rect.left;\n\n let accumulatedWidth = 0;\n for (let i = 0; i < row.children.length; i++) {\n const cellElem = row.children[i];\n const cellWidth = cellElem.getBoundingClientRect().width;\n accumulatedWidth += cellWidth;\n\n if (x <= accumulatedWidth) {\n cell = cellElem;\n break;\n }\n }\n\n if (!cell && row.children.length > 0) {\n cell = row.children[0];\n }\n }\n }\n\n if (!cell) return;\n\n if (cell?.isEditing) {\n if (cell?.tabIndex >= 0) {\n return;\n }\n cell?.endCellEdit();\n }\n\n if (this.cellSelection) {\n this.deSelectAllRows();\n }\n\n const cellNum = Number(cell.getAttribute('aria-colindex')) - 1;\n const row = <IdsDataGridRow>cell.parentNode;\n if (row.disabled) return;\n\n const rowNum = row.rowIndex;\n\n if (!e.shiftKey) this.#resetLastShiftedRow();\n\n const isHyperlink = e.target?.nodeName === 'IDS-HYPERLINK' || e.target?.nodeName === 'A';\n const isButton = e.target?.nodeName === 'IDS-BUTTON';\n const isExpandButton = isButton && e.target?.classList.contains('expand-button');\n const isClickable = isButton || isHyperlink;\n const column: IdsDataGridColumn = this.visibleColumns[cellNum];\n\n if (column.formatter?.name && e?.target?.classList?.contains('text-mask')) {\n const formatterFn = new IdsDataGridFormatters();\n const dataIndex = row.getAttribute('data-index');\n\n if (dataIndex === null) {\n return;\n }\n\n const cellData = this.data[+dataIndex][column.id];\n formatterFn.textmaskAction(cellData, cell, column);\n this.tooltip.detachAllEvents();\n e.preventDefault();\n return;\n }\n\n // Focus cell\n this.setActiveCell(cellNum, rowNum, isHyperlink, 'click');\n\n // Handle click callbacks\n if (isClickable && column.click !== undefined && !e.target?.getAttribute('disabled')) {\n column.click(this.data[rowNum], this.visibleColumns[cellNum], e);\n }\n\n // hide menus on body click\n this.hideOpenMenus();\n\n // Handle popup menus\n if (isClickable && column?.menuId !== undefined && !e.target?.getAttribute('disabled')) {\n const menuEl = document.querySelector<IdsPopupMenu>(`#${column.menuId}`);\n if (!menuEl) return;\n menuEl.target = null;\n menuEl.hide();\n menuEl.triggerType = 'immediate-closed';\n menuEl.target = e.target;\n menuEl.align = 'bottom, left';\n menuEl.arrow = 'bottom';\n menuEl.triggerType = 'immediate';\n menuEl.offEvent('selected', menuEl);\n menuEl.onEvent('selected', menuEl, (evt: CustomEvent) => {\n column?.selected?.(this.data[rowNum], this.visibleColumns[cellNum], evt);\n });\n }\n\n // Fires for each row that is clicked\n this.triggerEvent('rowclick', this, {\n detail: {\n elem: this, row, data: this.data[rowNum]\n }\n });\n\n // Handle row selection\n const handleSingleSelection = () => {\n const isLink = e.target?.nodeName === 'IDS-HYPERLINK' || e.target?.nodeName === 'A';\n const behavior = isHyperlink ? column?.hyperlinkBehavior : null;\n\n // Early return for hyperlink behaviors that prevent action\n if (behavior === 'none') return;\n if (isLink) {\n switch (behavior) {\n case 'default':\n this.selectRow(rowNum, true);\n break;\n case 'no-deselect':\n this.selectRow(rowNum, true);\n break;\n case 'no-select':\n this.deSelectRow(rowNum);\n break;\n default:\n this.selectRow(rowNum, true);\n break;\n }\n } else {\n row.toggleSelection();\n }\n };\n\n // Handle multiple or mixed selection\n const handleMultipleOrMixedSelection = () => {\n if (['multiple', 'mixed'].includes(String(this.rowSelection))) {\n const isLink = e?.target?.nodeName === 'IDS-HYPERLINK' || e?.target?.nodeName === 'A';\n const behavior = isLink ? column?.hyperlinkBehavior : null;\n\n // Early return for hyperlink behaviors that prevent action\n if (behavior === 'none') return;\n\n if (e.shiftKey && this.#lastSelectedRow !== null) {\n if (behavior === 'no-select') {\n this.deSelectRow(rowNum);\n } else if (behavior === 'no-deselect') {\n // For no-deselect, we still want the multi-select behavior\n this.#toggleShiftSelectionInBetween(rowNum);\n // Ensure the clicked row stays selected\n this.selectRow(rowNum);\n } else {\n this.#toggleShiftSelectionInBetween(rowNum);\n }\n } else if (isLink) {\n this.#resetInitiallySelectedRow();\n switch (behavior) {\n case 'default':\n row.toggleSelection();\n break;\n case 'no-deselect':\n this.selectRow(rowNum);\n break;\n case 'no-select':\n this.deSelectRow(rowNum);\n break;\n default:\n row.toggleSelection();\n break;\n }\n } else {\n this.#resetInitiallySelectedRow();\n row.toggleSelection();\n }\n this.#lastSelectedRow = rowNum;\n\n if (this.#initiallySelectedRow === null) {\n this.#initiallySelectedRow = rowNum;\n } else if (!row.selected && this.#initiallySelectedRow === rowNum) {\n this.#resetInitiallySelectedRow();\n }\n } else if (this.rowSelection === 'single') {\n handleSingleSelection();\n }\n };\n\n // Handle Expand/Collapse Clicking\n if (isClickable && isExpandButton && !this.groupable) {\n if (this.allowOneExpandedRow) {\n const isExpanded = row.isExpanded();\n const isCollapsed = !isExpanded;\n if (isCollapsed) {\n this.collapseAll(false, true);\n }\n row.toggleExpandCollapse();\n } else {\n row.toggleExpandCollapse();\n }\n return;\n }\n\n if (isClickable && isExpandButton && this.groupable && row.classList.contains('is-group-row')) {\n row.toggleGroupChildRows();\n }\n // Handle mixed selection\n if (this.rowSelection === 'mixed') {\n if (cell.children[0]?.classList.contains('ids-data-grid-checkbox-container')) {\n handleMultipleOrMixedSelection();\n } else {\n row.toggleRowActivation();\n }\n return;\n }\n\n // Handle selection if not disabled\n if (this.rowSelection !== false && this.rowSelection !== 'mixed') {\n if ((!this.suppressRowClickSelection) || (\n this.suppressRowClickSelection\n && (cell.children[0]?.classList.contains('is-selection-checkbox') || cell.children[0]?.classList.contains('is-selection-radio'))\n )) handleMultipleOrMixedSelection();\n }\n\n // Handle Editing\n if (this.editable && column.editor) {\n cell.startCellEdit(e);\n this.updateSelectionBorder(true);\n }\n });\n\n // Add double click to the container\n this.offEvent('dblclick.container', this.container);\n this.onEvent('dblclick.container', this.container, (e: MouseEvent) => {\n // do not fire for disabled cells\n if ((e.target as HTMLElement).classList?.contains('ids-data-grid-checkbox-container')\n && (e.target as HTMLElement).getAttribute('disabled') === 'true') {\n e.stopPropagation();\n return;\n }\n\n e.stopPropagation();\n this.triggerEvent('dblclick', this, {\n bubbles: true,\n detail: {\n ...containerArguments.apply(this, [e]),\n originalEvent: e\n }\n });\n });\n\n if (this.cellCopyPaste) this.#attachCopyPasteCellHandlers();\n\n this.filters?.attachFilterEventHandlers();\n this.attachSaveSettingsEventHandlers?.();\n }\n\n /**\n * Handle the drag and select behavior\n * @private\n * @param {HTMLElement | null} body Datagrid body\n */\n #attachDragSelection(body?: HTMLElement | null) {\n let isDragging = false;\n let deselectAllRows = true;\n let startCell: { row: number; col: number, cell?: HTMLElement } | null = null;\n let prevBounds: { minRow: number; maxRow: number; minCol: number; maxCol: number } | null = null;\n let selectionBorder: HTMLElement | null = null;\n\n // Prevent focus on mousedown\n this.offEvent('mousedown.body', body);\n this.onEvent('mousedown.body', body, (e: any) => {\n const cell: IdsDataGridCell = (e.target as any).closest('ids-data-grid-cell');\n const expandableRow = (e.target as any).closest('.ids-data-grid-expandable-row');\n\n if (cell !== this.activeCell.node && !expandableRow) {\n e.preventDefault();\n }\n\n if (!cell || cell.classList.contains('formatter-selectionCheckbox') || isDragging) return;\n\n if (selectionBorder) selectionBorder.style.display = 'none';\n\n isDragging = true;\n\n startCell = {\n row: parseInt(cell.parentElement?.getAttribute('row-index') || '0'),\n col: parseInt(cell.getAttribute('aria-colindex') || '1') - 1,\n cell\n };\n });\n\n this.offEvent('mousemove.body', body);\n this.onEvent('mousemove.body', body, (e: any) => {\n const cell: IdsDataGridCell = (e.target as any).closest('ids-data-grid-cell');\n\n if (!isDragging || !startCell || !cell) return;\n\n if (startCell && startCell.cell !== this.activeCell.node) {\n this.setActiveCell(startCell.col, startCell.row, false, 'mouse');\n }\n\n if (deselectAllRows) {\n this.deSelectAllRows();\n deselectAllRows = false;\n }\n\n const currentRow = parseInt(cell.parentElement?.getAttribute('row-index') || '0');\n const currentCol = parseInt(cell.getAttribute('aria-colindex') || '0') - 1;\n\n const bounds = {\n minRow: Math.min(startCell.row, currentRow),\n maxRow: Math.max(startCell.row, currentRow),\n minCol: Math.min(startCell.col, currentCol),\n maxCol: Math.max(startCell.col, currentCol)\n };\n\n const isSelected = (row: number, col: number): boolean => {\n const c = this.cellByIndex(row, col);\n return c?.classList.contains('selected') || c?.parentElement?.classList.contains('selected') || false;\n };\n\n if (prevBounds) {\n for (let row = prevBounds.minRow; row <= prevBounds.maxRow; row++) {\n for (let col = prevBounds.minCol; col <= prevBounds.maxCol; col++) {\n const isOutside = row < bounds.minRow || row > bounds.maxRow || col < bounds.minCol || col > bounds.maxCol;\n\n if (isOutside) this.selectCell(row, col, false);\n }\n }\n }\n\n for (let row = bounds.minRow; row <= bounds.maxRow; row++) {\n for (let col = bounds.minCol; col <= bounds.maxCol; col++) {\n if (!isSelected(row, col)) this.selectCell(row, col, true);\n }\n }\n\n if (!selectionBorder) {\n selectionBorder = this.#createSelectionBorder();\n this.container?.appendChild(selectionBorder);\n } else {\n selectionBorder.style.display = 'block';\n }\n\n this.#updateSelectionBorder(startCell.cell || cell, cell);\n\n prevBounds = bounds;\n });\n\n this.onEvent('mouseup.body', body, () => {\n isDragging = false;\n deselectAllRows = true;\n prevBounds = null;\n startCell = null;\n });\n\n this.onEvent('mouseleave', this.container, () => {\n isDragging = false;\n deselectAllRows = true;\n prevBounds = null;\n startCell = null;\n });\n }\n\n /**\n * Create the selection border when drag and selecting cells\n * @private\n * @returns {HTMLElement} The initial selection border element\n */\n #createSelectionBorder(): HTMLElement {\n const border = document.createElement('div');\n border.classList.add('selection-border');\n return border;\n }\n\n /**\n * Update the size and position of the selection border as the mouse moves\n * @private\n * @param {HTMLElement} startCell Cell where selection started\n * @param {HTMLElement} endCell Current cell where the mouse is on\n */\n #updateSelectionBorder(startCell: HTMLElement, endCell: HTMLElement) {\n const border = this.container?.querySelector<HTMLElement>('.selection-border');\n if (!border) return;\n\n const startRect = startCell.getBoundingClientRect();\n const endRect = endCell.getBoundingClientRect();\n const containerRect = this.container?.getBoundingClientRect();\n\n if (!containerRect) return;\n\n // Calculate positions relative to container\n const left = Math.min(startRect.left, endRect.left) - containerRect.left;\n const top = Math.min(startRect.top, endRect.top) - containerRect.top;\n const right = Math.max(startRect.right, endRect.right) - containerRect.left;\n const bottom = Math.max(startRect.bottom, endRect.bottom) - containerRect.top;\n\n // Update border position\n border.style.left = `${left}px`;\n border.style.top = `${top}px`;\n border.style.width = `${right - left - 2}px`;\n border.style.height = `${bottom - top - 2}px`;\n\n // Note the start and end cells\n this.#startSelectionCell = startCell;\n this.#endSelectionCell = endCell;\n }\n\n /**\n * Update the selection border.\n * @param {boolean} clearSelection True if selected cells should be cleared. Will clear only if there is a selection border\n */\n updateSelectionBorder(clearSelection: boolean = false) {\n const border = this.container?.querySelector<HTMLElement>('.selection-border');\n if (!(this.#startSelectionCell && this.#endSelectionCell)) {\n if (border) border.style.display = 'none';\n return;\n }\n\n if (clearSelection) {\n if (border) border.style.display = 'none';\n\n this.deSelectAllRows();\n } else {\n this.#updateSelectionBorder(this.#startSelectionCell, this.#endSelectionCell);\n }\n }\n\n /**\n * Handle Locale (and language) change\n */\n onLocaleChange = () => {\n this.redraw();\n };\n\n /**\n * Move a column to a new position. Use `columnIndex` to get the column by id.\n * @param {number} fromIndex The column index to movex\n * @param {number} toIndex The new column index\n * @param {boolean} includeInvisibleColumns use the invisible columns in the move\n */\n moveColumn(fromIndex: number, toIndex: number, includeInvisibleColumns = false) {\n if (fromIndex === -1 || toIndex === -1) return;\n\n let correctFromIndex = -1;\n let correctToIndex = -1;\n\n if (includeInvisibleColumns) {\n correctFromIndex = this.columnIdxById(this.columns[fromIndex].id);\n correctToIndex = this.columnIdxById(this.columns[toIndex].id);\n } else {\n correctFromIndex = this.columnIdxById(this.visibleColumns[fromIndex].id);\n correctToIndex = this.columnIdxById(this.visibleColumns[toIndex].id);\n }\n\n const element = this.columns[correctFromIndex];\n this.columns.splice(correctFromIndex, 1);\n this.columns.splice(correctToIndex, 0, element);\n\n // Map column id to new column index\n const colIdToCellIndex = this.columns.reduce((obj, curr, idx) => {\n obj[curr.id] = idx;\n return obj;\n }, {} as Record<string, number>);\n\n // Move the dirty cell data\n this.dirtyCells.forEach((dirtyCell: Record<string, any>) => {\n const dirtyCellId = dirtyCell.columnId;\n const row: any = this.data[dirtyCell?.row];\n const cellIndex = row.dirtyCells.findIndex((item: any) => item.columnId === dirtyCellId);\n const newCellIndex = colIdToCellIndex[dirtyCellId];\n row.dirtyCells[cellIndex].cell = newCellIndex;\n });\n\n // Move the validation data\n this.invalidCells.forEach((invalidRow: Record<string, any>) => {\n if (invalidRow.cell === fromIndex) {\n const row: any = this.data[invalidRow?.row];\n const cellIndex = row.invalidCells.findIndex((item: any) => item.cell === fromIndex);\n row.invalidCells[cellIndex].cell = toIndex;\n }\n });\n\n // Move the selection data\n this.data.forEach((row) => {\n if (row.colSelected) {\n const prev = row.colSelected[correctFromIndex];\n row.colSelected.splice(correctFromIndex, 1);\n row.colSelected.splice(correctToIndex, 0, prev);\n }\n });\n\n resetEmptyMessageElements.apply(this);\n this.redraw();\n this.triggerEvent('columnmoved', this, { detail: { elem: this, fromIndex: correctFromIndex, toIndex: correctToIndex } });\n if (this.sortColumn) this.header?.setSortState(this.sortColumn.id, this.sortColumn.ascending);\n this.saveSettings?.();\n\n if (this.#startSelectionCell || this.#endSelectionCell) {\n this.deSelectAllRows();\n }\n }\n\n #attachCopyPasteCellHandlers() {\n const body = this.body;\n\n this.offEvent('copy.body', body);\n this.onEvent('copy.body', body, (e: ClipboardEvent) => {\n this.#handleCopy(e);\n });\n\n this.offEvent('copy', this);\n this.onEvent('copy', this, (e: ClipboardEvent) => {\n this.#handleCopy(e);\n });\n\n this.offEvent('paste.body', body);\n this.onEvent('paste.body', body, (e: ClipboardEvent) => {\n this.#handlePaste(e);\n });\n\n this.offEvent('paste', this);\n this.onEvent('paste', this, (e: ClipboardEvent) => {\n this.#handlePaste(e);\n });\n }\n\n /**\n * Establish Internal Keyboard shortcuts\n * @private\n * @returns {object} This API object for chaining\n */\n #attachKeyboardListeners() {\n // Handle arrow navigation\n this.listen(['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End'], this, (e: KeyboardEvent) => {\n if (['ArrowDown', 'ArrowUp'].includes(e.key) && document.activeElement?.nodeName === 'IDS-DATA-GRID'\n && this.#activeCellCache && this.#activeCellCache?.hasLeaveViewport) {\n this.#scrollRowIntoView(Math.max(this.#activeCellCache.rowIndex - 3, 0));\n e.preventDefault();\n e.stopPropagation();\n\n let newIndex = 1;\n if (e.key === 'ArrowUp') newIndex = -1;\n this.#activeCellCache.rowIndex = Math.max(this.#activeCellCache.rowIndex + newIndex, 0);\n\n requestAnimationTimeout(() => {\n this.#restoreActiveCellAfterScroll();\n });\n return;\n }\n\n const inFilter = findInPath(eventPath(e), '.ids-data-grid-header-cell-filter-wrapper');\n const key = e.key;\n\n if (!e.shiftKey) this.#resetLastShiftedRow();\n if (inFilter) return;\n if (this.openMenu) return;\n\n // Get active cell or default to first cell if null\n let activeCell = this.activeCell.node;\n if (!activeCell) {\n const firstRow = this.rowByIndex(0);\n activeCell = firstRow?.cellByIndex(0) ?? null;\n activeCell.activate(false, 'keyboard');\n }\n if (activeCell?.isEditing) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const previousActiveRow = Number(activeCell?.rowIndex || 0);\n\n if (key === 'ArrowUp') activeCell = activeCell?.cellAbove ?? null;\n else if (key === 'ArrowDown') activeCell = activeCell?.cellBelow ?? null;\n else if (key === 'ArrowLeft' && !e.metaKey) activeCell = activeCell?.cellLeft ?? null;\n else if (key === 'ArrowRight' && !e.metaKey) activeCell = activeCell?.cellRight ?? null;\n else if (key === 'PageUp') {\n // Get the first cell in the current column\n const firstRow = this.rowByIndex(0);\n const columnIndex = activeCell?.columnIndex ?? 0;\n activeCell = firstRow?.cellByIndex(columnIndex) ?? null;\n } else if (key === 'PageDown') {\n // Get the last cell in the current column\n const lastRowIndex = this.data.length - 1;\n const lastRow = this.rowByIndex(lastRowIndex);\n const columnIndex = activeCell?.columnIndex ?? 0;\n activeCell = lastRow?.cellByIndex(columnIndex) ?? null;\n } else if (key === 'Home' || (key === 'ArrowLeft' && e.metaKey)) {\n // Get the first cell in the current row\n const currentRow = this.rowByIndex(activeCell?.rowIndex ?? 0);\n activeCell = currentRow?.cellByIndex(0) ?? null;\n } else if (key === 'End' || (key === 'ArrowRight' && e.metaKey)) {\n // Get the last cell in the current row\n const currentRow = this.rowByIndex(activeCell?.rowIndex ?? 0);\n const lastColumnIndex = this.columns.length - 1;\n activeCell = currentRow?.cellByIndex(lastColumnIndex) ?? null;\n }\n\n // Prevent false movement detection when navigation hits boundary\n const activeRowIndex = activeCell?.rowIndex ?? previousActiveRow;\n activeCell?.focus?.();\n\n if (activeCell && activeCell.columnIndex >= 0) {\n this.setActiveCell(activeCell.columnIndex, activeRowIndex, false, 'keyboard');\n }\n\n // Handle row selection\n const movingVertical = key === 'ArrowDown' || key === 'ArrowUp';\n if ((this.rowSelection === 'mixed' || this.rowSelection === 'multiple') && movingVertical && e.shiftKey) {\n // For mixed mode with rowNavigation, allow shift-selection even without existing selection\n const allowShiftSelection = this.rowSelection === 'mixed' && this.rowNavigation\n ? true\n : this.selectedRows.length > 0;\n\n // Only process shift-selection if we actually moved to a different row AND conditions are met\n if (activeRowIndex !== previousActiveRow && allowShiftSelection) {\n this.#lastShiftedRow ??= previousActiveRow;\n const shiftSelectFrom = Math.min(activeRowIndex, this.#lastShiftedRow);\n const shiftSelectTo = Math.max(activeRowIndex, this.#lastShiftedRow);\n\n if (Number.isNaN(shiftSelectFrom) || Number.isNaN(shiftSelectTo)) return;\n\n // Don't deselect the previous row if it's at the boundary and we didn't actually move\n const isAtLastRow = previousActiveRow === this.data.length - 1;\n const isAtFirstRow = previousActiveRow === 0;\n const tryingToGoDown = key === 'ArrowDown' && isAtLastRow;\n const tryingToGoUp = key === 'ArrowUp' && isAtFirstRow;\n\n if (!tryingToGoDown && !tryingToGoUp\n && (previousActiveRow < shiftSelectFrom || previousActiveRow > shiftSelectTo)) {\n this.deSelectRow(previousActiveRow);\n }\n\n for (let i = shiftSelectFrom; i <= shiftSelectTo; i++) {\n this.selectRow(i);\n }\n }\n }\n\n if (this.rowSelection === 'mixed' && this.rowNavigation) {\n (activeCell?.parentElement as IdsDataGridRow).toggleRowActivation();\n }\n });\n\n // Handle Selection and Expand\n this.listen([' ', 'Space'], this, (e: Event) => {\n const inFilter = findInPath(eventPath(e), '.ids-data-grid-header-cell-filter-wrapper');\n if (inFilter) return;\n\n let activeCell = this.activeCell.node;\n if (!activeCell) {\n const firstRow = this.rowByIndex(0);\n activeCell = firstRow?.cellByIndex(0) ?? null;\n activeCell?.activate(false, 'keyboard');\n }\n\n if (!activeCell) return;\n if (this.openMenu) return;\n if (activeCell.isEditing) return;\n if (!activeCell.canClose()) return;\n\n const row = this.rowByIndex(activeCell.row)!;\n if (!row || row.disabled) return;\n\n const button = activeCell.querySelector('ids-button') as any;\n if (button) {\n button.click();\n e.preventDefault();\n return;\n }\n\n const child = activeCell.children[0];\n const isCheckbox = child?.classList.contains('ids-data-grid-checkbox-container')\n && !child?.classList.contains('is-selection-checkbox');\n if (isCheckbox) {\n activeCell.click();\n e.preventDefault();\n return;\n }\n row.toggleSelection();\n e.preventDefault();\n });\n\n // Follow links with keyboard and start editing\n this.listen(['Enter'], this, (e: KeyboardEvent) => {\n const cellNode = (this.activeCell.node as IdsDataGridCell);\n const target = (e.target as any);\n\n // Hyperlink\n if (cellNode?.classList.contains('formatter-hyperlink')) {\n if (\n !this.selectWithFilterDropdown\n && target.activeCell\n && Object.keys(target.activeCell).length !== 0\n ) {\n cellNode.querySelector<IdsHyperlink>('ids-hyperlink')?.container?.click();\n }\n return;\n }\n\n // Button\n if (cellNode?.classList.contains('formatter-button')) {\n cellNode.querySelector<IdsButton>('ids-button')?.button?.click();\n return;\n }\n\n // Editable Cell\n if (!cellNode?.isEditing) {\n cellNode?.startCellEdit();\n return;\n }\n\n const nextCell = e.shiftKey ? cellNode?.cellAbove : cellNode?.cellBelow;\n\n if (this.editNextOnEnterPress) {\n nextCell?.activate(false, 'keyboard');\n nextCell?.startCellEdit();\n }\n if (!nextCell?.isEditing) nextCell?.focus?.(); // focus non-editable cells\n });\n\n // Commit Edit\n this.listen(['F2'], this, () => {\n const cellNode = this.activeCell.node;\n if (this.activeCellEditor) {\n cellNode.endCellEdit();\n cellNode.focus();\n }\n });\n\n // Cancel Edit\n this.listen(['Escape'], this, () => {\n if (this.openMenu) return;\n const cellNode = this.activeCell.node;\n if (this.activeCellEditor) {\n if (!this.activeCellCanClose()) return;\n cellNode.cancelCellEdit();\n cellNode.focus();\n }\n });\n\n // Edit Next\n this.listen(['Tab'], this, (e: KeyboardEvent) => {\n if (!this.isEditable) {\n return;\n }\n\n const nextCell = e.shiftKey\n ? this.activeCell?.node?.cellLeftEditable\n : this.activeCell?.node?.cellRightEditable;\n\n // If there's no next editable cell, let tab behave normally\n if (!nextCell) {\n return;\n }\n\n // Only prevent default if we found a next cell to edit\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n // First activate and focus the next cell\n nextCell.activate(false, 'keyboard');\n\n // Then handle the editing state\n if (this.editNextOnEnterPress) {\n // Wrap in setTimeout to ensure current cell edit completion\n setTimeout(() => {\n nextCell.startCellEdit?.();\n }, 0);\n } else if (!nextCell.isEditing) {\n nextCell.focus?.();\n }\n });\n\n // Select all\n this.listen(['a', 'A'], this, (e: KeyboardEvent) => {\n // Handle Ctrl+A or Command+A (Mac)\n if ((e.ctrlKey || e.metaKey) && (e.key === 'a' || e.key === 'A')) {\n // Check if any element has focus that should handle its own select-all\n const activeElement = document.activeElement;\n const shadowActiveElement = this.shadowRoot?.activeElement;\n\n // If we're in a text input or textarea, let the default behavior handle it\n const isTextInput = activeElement instanceof HTMLInputElement && activeElement.type === 'text';\n const isTextArea = activeElement instanceof HTMLTextAreaElement;\n const isContentEditable = activeElement?.hasAttribute('contenteditable');\n\n // Check if we're in a filter input within the shadow DOM\n const isInFilter = shadowActiveElement?.closest('.ids-data-grid-header-cell-filter-wrapper') !== null;\n\n if (this.activeCell?.node?.isEditing || this.activeCell?.isEditing || isTextInput || isTextArea\n || isContentEditable || isInFilter) {\n // Let the default behavior handle text selection\n return;\n }\n\n // Otherwise prevent default and handle grid-level selection\n e.preventDefault();\n e.stopPropagation();\n this.toggleSelectAllRows();\n }\n });\n\n this.offEvent('keydown.body', this.header);\n this.onEvent('keydown.body', this.header, () => {\n this.activeCell = {};\n });\n\n // Enter Edit by typing\n this.offEvent('keydown.body', this);\n this.onEvent('keydown.body', this, (e: KeyboardEvent) => {\n const isCtrlDown = e.ctrlKey || e.metaKey;\n const isKeyCopyPaste = e.key === 'v' || e.key === 'c';\n\n if (isCtrlDown && isKeyCopyPaste) return;\n\n const isPrintableKey = e.key.length === 1;\n if (!this.activeCellEditor && isPrintableKey && e.key !== ' ') {\n // Start Edit Mode\n const activeCell = this.activeCell?.node;\n if (activeCell?.tabIndex === 0) {\n activeCell?.startCellEdit?.();\n }\n\n // Depending on autoselect property replace the cell value if autoselect is true\n const inputElem = (this.activeCellEditor as any)?.editor?.input as any;\n const columnSettings = activeCell?.column?.editor?.editorSettings;\n if (inputElem && columnSettings?.autoselect) {\n requestAnimationFrame(() => {\n e.preventDefault();\n e.stopPropagation();\n inputElem.value = e.key;\n });\n }\n }\n });\n return this;\n }\n\n /**\n * Set the column widths by generating the lengths in the css grid\n * and setting the css variable.\n * @private\n */\n #setColumnWidths() {\n let colWidths = '';\n this.visibleColumns.forEach((column: IdsDataGridColumn) => {\n // Special Columns\n if ((column.id === 'selectionCheckbox' || column.id === 'selectionRadio') && !column.width) {\n column.width = 45;\n }\n // Percent Columns\n if (column.width && typeof column.width === 'string' && column.width.indexOf('%') > -1) {\n colWidths += `minmax(${column.width}, 1fr) `;\n }\n // Other (fr)\n if (column.width && typeof column.width === 'string' && column.width.indexOf('%') === -1 && column.width !== 'max-content' && column.width.indexOf('ch') === -1) {\n colWidths += `${column.width} `;\n }\n // Character Width (ch)\n if (column.width && typeof column.width === 'string' && column.width.indexOf('%') === -1 && column.width.indexOf('ch') > -1 && column.width !== 'max-content') {\n colWidths += `minmax(${(Number(column.width.replace('ch', '')) + (this.rowHeightPadding / 2) + 3)}ch, 1fr) `; // Add a few to account for padding\n }\n // Fixed pixel\n if (column.width && typeof column.width === 'number') {\n colWidths += `${column.width}px `;\n }\n // Max content\n if (column.width && typeof column.width === 'string' && column.width === 'max-content') {\n const maxContentWidth: any = this.#calcMaxContentWidth();\n colWidths += !maxContentWidth ? `minmax(110px, 1fr) ` : `minmax(${maxContentWidth[column.id]}px, 1fr) `;\n }\n // Default 110px or stretch to fit\n if (!column.width) {\n colWidths += `minmax(110px, 1fr) `;\n }\n });\n\n this.container?.style.setProperty('--ids-data-grid-column-widths', colWidths);\n this.#setColumnGroupsWidth();\n this.#setFrozenColumnWidth();\n }\n\n /**\n * Correct the position after render to prevent movement of columns when scrolling horizontally\n * Happens when some of the frozen columns don't have a width in the preset during build and render\n * @private\n * @returns {void}\n */\n #setFrozenColumnWidth(): void {\n let debounceFrozenCols: any = null;\n clearTimeout(debounceFrozenCols);\n debounceFrozenCols = setTimeout(() => {\n const frozenCols = this.shadowRoot?.querySelectorAll('.ids-data-grid-header-cell.frozen-left');\n if (!frozenCols) return;\n let widthIncrement = 0;\n for (let index = 0; index < frozenCols.length; index++) {\n if (index > 0) {\n const targetColWidth = frozenCols[index - 1].getBoundingClientRect().width;\n widthIncrement += targetColWidth;\n this.container?.style.setProperty(`--ids-data-grid-frozen-column-left-width-${index + 1}`, `${widthIncrement}px`);\n }\n }\n });\n }\n\n /* Calculate an array with maxContentWidth for each column */\n #calcMaxContentWidth() {\n if (Object.keys(this.maxContentColumnWidths).length > 0) return this.maxContentColumnWidths;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return [];\n\n const measureTextWidth = (text: string, font: string) => {\n context.font = font;\n return context.measureText(text).width;\n };\n\n // Get only visible rows if virtual scroll is enabled\n const rowsToProcess = this.virtualScroll\n ? this.virtualRows.slice(0, this.virtualScrollSettings.MAX_ROWS_IN_DOM)\n : this.data;\n\n this.visibleColumns.forEach((column: IdsDataGridColumn, i: number) => {\n if (column.width === 'max-content') {\n let maxWidth = measureTextWidth((column.name || '').toString(), '600 16px arial');\n\n // Only process rows if there is data\n if (this.data.length > 0) {\n rowsToProcess.forEach((row) => {\n let cellText = '';\n\n // Use formatters for sizing if enabled\n if (column.useValueForSizing !== false && column.formatter) {\n // Get formatted value using the column's formatter\n const formatterResult = typeof column.formatter === 'function'\n && !column.formatter.hasOwnProperty('bind')\n ? column.formatter.call(this.formatters, row, column, i, this)\n : column.formatter(row, column, i, this);\n\n // Extract text from formatter result (might be HTML)\n if (typeof formatterResult === 'string') {\n // Remove HTML tags if the formatter returns HTML\n cellText = formatterResult.replace(/<[^>]*>/g, '');\n } else {\n // Fallback to original value if formatter doesn't return a string\n cellText = row[column.field || ''] ? row[column.field || ''].toString() : '';\n }\n } else {\n // Use original value without formatter\n cellText = row[column.field || ''] ? row[column.field || ''].toString() : '';\n\n // Check if this is a dropdown formatter and has editor settings\n if (column?.formatter?.name === 'dropdown' && column?.editor?.editorSettings?.options) {\n // Find the matching option in the dropdown options\n const option = (column.editor.editorSettings.options as Array<{ value: any; label: string }>).find(\n (opt) => opt.value.toString() === cellText\n );\n // Use the label if found, otherwise use the original value\n cellText = option?.label || cellText;\n }\n }\n\n const cellWidth = measureTextWidth(cellText, `400 16px arial`);\n if (cellWidth > maxWidth) {\n maxWidth = cellWidth;\n }\n });\n }\n\n let extraPadding = 10;\n if (column?.formatter?.name === 'badge' || column?.formatter?.name === 'tag') {\n extraPadding = this.rowHeightPadding;\n }\n\n // Add minimum width of 100px if column has a filter\n if (column?.filterType && !(Array.isArray(column.filterConditions) && column.filterConditions.length === 0)) {\n maxWidth = Math.max(maxWidth, 100);\n }\n this.maxContentColumnWidths[column.id] = maxWidth + (this.rowHeightPadding * 2) + extraPadding;\n }\n });\n\n return this.maxContentColumnWidths;\n }\n\n maxContentColumnWidths: Record<string, number> = {};\n\n /**\n * Utility function to get padding for each rowHeight,\n * note that there is a little extra padding than the css would be for better look.\n * @returns {string} The corresponding padding value\n */\n get rowHeightPadding(): number {\n const rowHeight = this.rowHeight;\n switch (rowHeight) {\n case 'xxs':\n return 8;\n case 'xs':\n return 9;\n case 'sm':\n return 10;\n case 'md':\n return 12;\n default:\n return 16;\n }\n }\n\n /**\n * Set one column's width (used for resizing)\n * @param {string} columnId The column id\n * @param {number} width The column id (or field) to sort\n */\n setColumnWidth(columnId: string, width: number) {\n const idx = this.columnIdxById(columnId);\n const column = this.columnDataById(columnId);\n // Constrain to a min and max width\n const minWidth = (column as any).minWidth || 12;\n const maxWidth = (column as any).maxWidth || Number.MAX_SAFE_INTEGER;\n\n if (this.columns[idx] && width >= minWidth && width <= maxWidth) {\n this.columns[idx].width = width;\n this.#setColumnWidths();\n this.#setColumnGroupsWidth();\n }\n this.triggerEvent('columnresized', this, { detail: { index: idx, column, columns: this.columns } });\n this.saveSettings?.();\n }\n\n /**\n * Set a column to visible or hidden\n * @param {string} columnId The column id\n * @param {boolean} visible True to show or false to hide\n */\n setColumnVisible(columnId: string, visible: boolean) {\n if (visible) {\n this.showColumn(columnId);\n } else {\n this.hideColumn(columnId);\n }\n }\n\n /**\n * Hide a column from view\n * @param {string} columnId The column id\n */\n hideColumn(columnId: string) {\n const column = this.columnDataById(columnId);\n if (!column) return;\n\n column.hidden = true;\n\n const headerCell = this.container?.querySelector(`[column-id=\"${columnId}\"]`);\n if (headerCell) {\n (headerCell as HTMLElement).style.display = 'none';\n }\n\n const columnIndex = this.columnIdxById(columnId);\n const cells = this.container?.querySelectorAll(`[aria-colindex=\"${columnIndex + 1}\"]`);\n cells?.forEach((cell: Element) => {\n (cell as HTMLElement).style.display = 'none';\n });\n\n this.#setColumnWidths();\n }\n\n /**\n * Show a previously hidden column\n * @param {string} columnId The column id\n */\n showColumn(columnId: string) {\n const column = this.columnDataById(columnId);\n if (!column) return;\n\n column.hidden = false;\n\n const headerCell = this.container?.querySelector(`[column-id=\"${columnId}\"]`);\n if (headerCell) {\n (headerCell as HTMLElement).style.display = '';\n }\n\n const columnIndex = this.columnIdxById(columnId);\n const cells = this.container?.querySelectorAll(`[aria-colindex=\"${columnIndex + 1}\"]`);\n cells?.forEach((cell: Element) => {\n (cell as HTMLElement).style.display = '';\n });\n\n this.#setColumnWidths();\n this.#reapplyDirtyStates();\n }\n\n /**\n * Reapply dirty states to cells after column visibility changes.\n * This ensures that dirty cell states are maintained in the correct positions\n * when columns are shown/hidden.\n * @private\n */\n #reapplyDirtyStates() {\n // Loop through each row in the grid\n this.data.forEach((rowData: any, rowIndex: number) => {\n const row = this.rowByIndex(rowIndex);\n if (!row || !rowData.dirtyCells) return;\n\n // Loop through each dirty cell in the row\n rowData.dirtyCells.forEach((dirtyCell: any) => {\n // Get the column data for this dirty cell\n const column = this.columns[dirtyCell.cell];\n if (!column) return;\n\n // Find the new visible index for this column\n const visibleIndex = this.visibleColumns.findIndex((col: any) => col.id === column.id);\n\n // Only proceed if the column is visible\n if (visibleIndex !== -1) {\n dirtyCell.cell = visibleIndex;\n }\n });\n });\n }\n\n /**\n * Set a column's readonly state\n * @param {string} columnId The column id\n * @param {boolean} value True to make readonly, false to make editable\n */\n setColumnReadonly(columnId: string, value: boolean) {\n const columnIndex = this.visibleColumnIdxById(columnId);\n const column = this.columnDataById(columnId);\n if (!column) return;\n\n column.readonly = value;\n\n if (columnIndex === -1) return;\n\n this.visibleColumns[columnIndex].readonly = value;\n const cells = this.container?.querySelectorAll(`[aria-colindex=\"${columnIndex + 1}\"]`);\n\n cells?.forEach((cell: Element) => {\n if (value) {\n cell.classList.add('is-readonly');\n } else {\n cell.classList.remove('is-readonly');\n }\n });\n }\n\n /**\n * Set a column's disabled state\n * @param {string} columnId The column id\n * @param {boolean} value True to make readonly, false to make editable\n */\n setColumnDisabled(columnId: string, value: boolean) {\n const columnIndex = this.visibleColumnIdxById(columnId);\n const column = this.columnDataById(columnId);\n if (!column) return;\n\n column.disabled = value;\n\n if (columnIndex === -1) return;\n\n this.visibleColumns[columnIndex].disabled = value;\n const cells = this.container?.querySelectorAll(`[aria-colindex=\"${columnIndex + 1}\"]`);\n\n cells?.forEach((cell: Element) => {\n if (value) {\n cell.classList.add('is-disabled');\n } else {\n cell.classList.remove('is-disabled');\n }\n });\n }\n\n /**\n * Set the column groups widths based on the provided colspans.\n * With some error handling.\n * @private\n */\n #setColumnGroupsWidth() {\n if (this.columnGroups) {\n let counter = 1;\n\n const groupElems = this.container?.querySelector('.ids-data-grid-column-groups')?.childNodes;\n this.columnGroups.forEach((group: IdsDataGridColumnGroup, index: number) => {\n let colspan = group.colspan;\n // decrease if hidden\n for (let i = 1; i <= colspan; i++) {\n if (this.columns[counter]?.hidden) {\n colspan -= 1;\n }\n counter++;\n }\n (groupElems?.item(index) as HTMLElement)?.style.setProperty('grid-column-start', `span ${colspan}`);\n });\n }\n }\n\n /**\n * Set the sort column and sort direction\n * @param {string} id The column id (or field) to sort\n * @param {boolean} ascending Sort ascending (lowest first) or descending (lowest last)\n */\n setSortColumn(id : string, ascending = true) {\n const column = this.columnDataById(id);\n const sortField = column?.field !== column?.id ? column?.field : column?.id;\n this.sortColumn = { id, ascending };\n\n this.datasource.sort(sortField || '', ascending);\n this.redrawBody();\n this.header?.setSortState(id, ascending);\n this.triggerEvent('sorted', this, { detail: { elem: this, sortColumn: this.sortColumn } });\n this.saveSettings?.();\n }\n\n /**\n * Set the sort column and sort direction on the UI only\n * @param {string} id The column id (or field) to set\n * @param {boolean} ascending Sort ascending (lowest first) or descending (lowest last)\n * @param {boolean} triggerEvent Trigger sorted event, set to true to trigger\n */\n setSortState(id: string, ascending = true, triggerEvent = false) {\n this.header?.setSortState(id, ascending);\n\n if (triggerEvent) {\n const sortColumn = this.sortColumn || { id, ascending };\n this.triggerEvent('sorted', this, { detail: { elem: this, sortColumn } });\n }\n }\n\n /**\n * Get column group data by given column group id\n * @param {string} columnGroupId The column group id\n * @returns {object} The column group data\n */\n columnGroupDataById(columnGroupId: string) {\n return this.columnGroups?.filter(\n (columnGroup: IdsDataGridColumnGroup) => columnGroup.id === columnGroupId\n )[0];\n }\n\n /**\n * Get column group index by given column group id\n * @param {string} columnGroupId The column group id\n * @returns {number} The column group index\n */\n columnGroupIdxById(columnGroupId: string): number {\n return this.columnGroups?.findIndex(\n (columnGroup: IdsDataGridColumn) => columnGroup.id === columnGroupId\n );\n }\n\n /**\n * Get column data by given column id\n * @param {string} columnId The column id\n * @returns {object} The column data\n */\n columnDataById(columnId: string) {\n return this.columns?.filter((column: IdsDataGridColumn) => column.id === columnId)[0];\n }\n\n /**\n * Get column index by given column id\n * @param {string} columnId The column id\n * @returns {number} The column index\n */\n columnIdxById(columnId: string): number {\n return this.columns?.findIndex((column: IdsDataGridColumn) => column.id === columnId);\n }\n\n /**\n * Get column index by given column id but only for visible columns\n * @param {string} columnId The column id\n * @returns {number} The column index\n */\n visibleColumnIdxById(columnId: string): number {\n return this.visibleColumns?.findIndex((column: IdsDataGridColumn) => column.id === columnId);\n }\n\n /**\n * Get the visible column data (via hidden attributes)\n * @returns {Array<IdsDataGridColumn>} The visible column data\n */\n get visibleColumns(): Array<IdsDataGridColumn> {\n return this.columns?.filter((column: IdsDataGridColumn) => !column.hidden);\n }\n\n /**\n * Get the columns frozen on the right\n * @returns {Array<IdsDataGridColumn>} The frozen column data\n */\n get rightFrozenColumns(): Array<IdsDataGridColumn> {\n return this.columns?.filter((column: IdsDataGridColumn) => !column.hidden && column.frozen === 'right');\n }\n\n /**\n * Get the columns frozen on the left\n * @returns {Array<IdsDataGridColumn>} The frozen column data\n */\n get leftFrozenColumns(): Array<IdsDataGridColumn> {\n return this.columns?.filter((column: IdsDataGridColumn) => !column.hidden && column.frozen === 'left');\n }\n\n /**\n * Return true if any columns are frozen\n * @returns {Array<IdsDataGridColumn>} The frozen column data\n */\n get hasFrozenColumns(): boolean {\n return this.leftFrozenColumns.length > 0 || this.rightFrozenColumns.length > 0;\n }\n\n /**\n * Get column data by given column header element\n * @param {HTMLElement} elem The column header element\n * @returns {IdsDataGridColumn} The column data\n */\n columnDataByHeaderElem(elem: HTMLElement) {\n const columnId = elem?.getAttribute('column-id');\n return this.columnDataById(columnId || '');\n }\n\n /**\n * Set to show header expander icon for expandable and tree rows\n * @param {boolean|string} value The value\n */\n set showHeaderExpander(value) {\n if (stringToBool(value)) this.setAttribute(attributes.SHOW_HEADER_EXPANDER, '');\n else this.removeAttribute(attributes.SHOW_HEADER_EXPANDER);\n }\n\n get showHeaderExpander() {\n return this.hasAttribute(attributes.SHOW_HEADER_EXPANDER);\n }\n\n /**\n * Set a style on every alternate row for better readability.\n * @param {boolean|string} value true to use alternate row shading\n */\n set alternateRowShading(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.ALTERNATE_ROW_SHADING, 'true');\n this.shadowRoot?.querySelector('.ids-data-grid')?.classList.add('alt-row-shading');\n return;\n }\n\n this.shadowRoot?.querySelector('.ids-data-grid')?.classList.remove('alt-row-shading');\n this.setAttribute(attributes.ALTERNATE_ROW_SHADING, 'false');\n }\n\n get alternateRowShading() {\n return stringToBool(this.getAttribute(attributes.ALTERNATE_ROW_SHADING)) || false;\n }\n\n /**\n * Strip the special characters in column ID\n * @param {boolean|string} value true to strip\n */\n set stripColumnId(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.STRIP_COL_ID, 'true');\n return;\n }\n\n this.setAttribute(attributes.STRIP_COL_ID, 'false');\n }\n\n get stripColumnId() {\n return stringToBool(this.getAttribute(attributes.STRIP_COL_ID)) || false;\n }\n\n /**\n * Setting for toggling row highlighting\n * @param {boolean|string|null} val If true, disables row highlighting\n */\n set disableRowHighlight(val: boolean | string | null) {\n const disabled = stringToBool(val);\n this.toggleAttribute(attributes.DISABLE_ROW_HIGHLIGHT, disabled);\n }\n\n get disableRowHighlight(): boolean {\n return stringToBool(this.getAttribute(attributes.DISABLE_ROW_HIGHLIGHT));\n }\n\n /**\n * Setting for toggling sorting\n * @param {boolean|string|null} val If true, disables sort\n */\n set disableClientSort(val: boolean | string | null) {\n const disabled = stringToBool(val);\n this.toggleAttribute(attributes.DISABLE_CLIENT_SORT, disabled);\n }\n\n get disableClientSort(): boolean {\n return stringToBool(this.getAttribute(attributes.DISABLE_CLIENT_SORT));\n }\n\n /**\n * Setting for suppressing select all events to improve performance\n * @param {boolean | string} val If true, suppresses select all events\n */\n set suppressSelectAllEvents(val: boolean | string) {\n const suppressed = stringToBool(val);\n this.toggleAttribute(attributes.SUPPRESS_SELECT_ALL_EVENTS, suppressed);\n }\n\n /**\n * Get the suppress select all events state\n * @returns {boolean} true if select all events are suppressed\n */\n get suppressSelectAllEvents(): boolean {\n return stringToBool(this.getAttribute(attributes.SUPPRESS_SELECT_ALL_EVENTS));\n }\n\n /**\n * Setting for disabling header checkbox\n * @param {boolean|string|null} val If true, disables header checkbox\n */\n set disableHeaderCheckbox(val: boolean | string | null) {\n // Skip setting when set to non-boolean value\n if (!isValidBooleanValue(val)) {\n return;\n }\n\n const disabled = stringToBool(val);\n this.toggleAttribute(attributes.DISABLE_HEADER_CHECKBOX, disabled);\n\n this.header?.disableHeaderCheckbox(disabled);\n }\n\n get disableHeaderCheckbox(): boolean {\n return stringToBool(this.getAttribute(attributes.DISABLE_HEADER_CHECKBOX)) || false;\n }\n\n /**\n * Setting to enable the copy-paste handling that's based on\n * cell selection. Default is false.\n * @param {boolean|string|null} val If true, enables copy-paste handling\n */\n set cellCopyPaste(val: boolean | string | null) {\n this.toggleAttribute(attributes.CELL_COPY_PASTE, stringToBool(val));\n }\n\n get cellCopyPaste(): boolean {\n return stringToBool(this.getAttribute(attributes.CELL_COPY_PASTE));\n }\n\n /**\n * Setting for hiding header checkbox\n * @param {boolean|string|null} val If true, disables header checkbox\n */\n set hideHeaderCheckbox(val: boolean | string | null) {\n // Skip setting when set to non-boolean value\n if (!isValidBooleanValue(val)) {\n return;\n }\n\n const hidden = stringToBool(val);\n this.toggleAttribute(attributes.HIDE_HEADER_CHECKBOX, hidden);\n\n this.header?.hideHeaderCheckbox(hidden);\n }\n\n get hideHeaderCheckbox(): boolean {\n return stringToBool(this.getAttribute(attributes.HIDE_HEADER_CHECKBOX)) || false;\n }\n\n /**\n * Set the columns of the data grid\n * @param {Array} value The array to use\n */\n set columns(value: IdsDataGridColumn[] | undefined | null) {\n // Validate first if the column construction is properly aligned with the row selection\n if (value !== null && value !== undefined) {\n if (this.rowSelection === 'single') {\n if (value?.findIndex((obj: any) => obj.id === 'selectionRadio') < 0 && value?.findIndex((obj: any) => obj.id === 'selectionCheckbox') >= 0) {\n const selectionIndex = value?.findIndex((obj: any) => obj.id === 'selectionCheckbox');\n value[selectionIndex].id = 'selectionRadio';\n value[selectionIndex].formatter = this.formatters.selectionRadio;\n }\n } else if (this.rowSelection === 'mixed' || this.rowSelection === 'multiple') {\n if (value?.findIndex((obj: any) => obj.id === 'selectionCheckbox') < 0 && value?.findIndex((obj: any) => obj.id === 'selectionRadio') >= 0) {\n const selectionIndex = value?.findIndex((obj: any) => obj.id === 'selectionRadio');\n value[selectionIndex].id = 'selectionCheckbox';\n value[selectionIndex].formatter = this.formatters.selectionCheckbox;\n }\n }\n\n // Edit fields as needed, currently for stripping special characters in id\n if (this.stripColumnId) {\n value.forEach((column: IdsDataGridColumn) => {\n column.id = column.id.replace(/[^a-zA-Z0-9:_-]/g, '');\n });\n }\n }\n\n this.resetCache();\n this.currentColumns = value || [{ id: '', name: '' }];\n this.redraw();\n }\n\n get columns(): IdsDataGridColumn[] {\n return this.currentColumns || ([{ id: '', name: '', field: '' }]);\n }\n\n /**\n * Set the columns groups of the data grid\n * @param {Array} value The array to use\n */\n set columnGroups(value) {\n this.state.columnsGroups = value;\n this.redraw();\n }\n\n get columnGroups() { return this.state?.columnsGroups || null; }\n\n /**\n * Use this to add more data to the datagrid's existing dataset.\n * This will automatically render additional rows in the datagrid.\n * @param {Array} value The array to use\n */\n appendData(value: Array<Record<string, any>>) {\n if (!value?.length) return;\n\n if (this.virtualScroll) {\n if (this.activeCellEditor) {\n const rowIndex = this.activeCell.row;\n const cell = this.activeCell.cell;\n this.updateActiveCellCache(rowIndex, cell, this.#activeCellCache?.currentValue || '');\n }\n\n if (this.#activeCellCache) {\n this.#activeCellCache.shouldReinstateCell = true;\n }\n\n // NOTE: using originalData skips pagination-logic; it's ok in context of infinite-scroll\n this.datasource.data = [...this.datasource.currentData, ...value];\n this.header?.resetSortStates();\n this.resetCache();\n\n if (this.treeGrid) {\n this.#recycleAllTreeRows(Math.floor(this.container!.scrollTop / this.virtualScrollSettings.ROW_HEIGHT));\n } else {\n this.#appendMissingRows();\n }\n } else {\n this.data = this.data.concat(value);\n }\n }\n\n /* Append missing rows for virtual-scrolling */\n #appendMissingRows() {\n if (!this.virtualScroll) return;\n\n const data = this.data;\n const rows = this.rows;\n if (!data.length || !rows.length) return;\n\n const { MAX_ROWS_IN_DOM, ROW_HEIGHT } = this.virtualScrollSettings;\n\n const rowsNeeded = Math.min(data.length, MAX_ROWS_IN_DOM) - rows.length;\n const missingRows: any[] = [];\n\n const lastRow: any = rows[rows.length - 1];\n const lastRowIndex = lastRow?.rowIndex || 0;\n\n while (missingRows.length < rowsNeeded) {\n const rowIndex = lastRowIndex + missingRows.length + 1;\n const rowData = data[rowIndex];\n if (rowData) {\n const clonedRow = IdsDataGridRow.template(data[rowIndex], rowIndex, rowIndex + 1, this);\n missingRows.push(clonedRow);\n }\n }\n\n if (missingRows.length && this.body) {\n this.body.innerHTML += missingRows.join('');\n }\n\n // trigger recycling if missingRows is 0 because MAX_ROWS_IN_DOMS has\n // been reached but there are still new row data to be rendered\n if (missingRows.length === 0 && data.length - 1 > lastRowIndex) {\n this.#handleVirtualScroll(ROW_HEIGHT);\n }\n }\n\n /**\n * Set the data of the data grid\n * @param {Array} value The array to use\n */\n set data(value: Array<Record<string, any>>) {\n let filterConditions: Array<IdsDataGridFilterConditions> = [];\n if (value) {\n hideEmptyMessage.apply(this);\n if (!this.datasource) this.datasource = new IdsDataSource();\n this.datasource.flatten = this.treeGrid;\n this.datasource.groupable = this.groupable;\n this.datasource.data = value;\n if (this.pager && this.pagination !== 'server-side') this.pager.total = value.length;\n if ((this.initialized && this.columns.length && this.pagination !== 'server-side')) {\n if (this.keepFilterConditions) filterConditions = this.filterConditions;\n this.redrawBody();\n this.maxContentColumnWidths = {};\n this.#setColumnWidths();\n this.#updateRowCount();\n this.syncPagerAfterDatasetChange();\n if (this.keepFilterConditions && filterConditions.length > 0) {\n requestAnimationFrame(() => {\n this.filters.filterIsProcessing = false;\n this.filters.setFilterConditions(filterConditions);\n this.applyFilter();\n });\n }\n this.toggleEmptyMessage();\n return;\n }\n\n this.initialized = true;\n if (this.pagination === 'server-side') this.syncServerSelections();\n this.maxContentColumnWidths = {};\n\n if (this.keepFilterConditions) filterConditions = this.filterConditions;\n this.redraw();\n this.restoreAllSettings?.();\n if (this.keepFilterConditions && filterConditions.length > 0) {\n requestAnimationFrame(() => {\n this.filters.filterIsProcessing = false;\n this.filters.setFilterConditions(filterConditions);\n this.applyFilter();\n });\n }\n } else {\n this.datasource.data = [];\n }\n }\n\n get data(): Array<Record<string, any>> { return this?.datasource?.data || []; }\n\n /**\n * Set empty message description\n * @param {string} value The value\n */\n set emptyMessageDescription(value: string | null) {\n if (typeof value === 'string' && value !== '') {\n this.setAttribute(attributes.EMPTY_MESSAGE_DESCRIPTION, value);\n } else {\n this.removeAttribute(attributes.EMPTY_MESSAGE_DESCRIPTION);\n }\n setEmptyMessage.apply(this);\n }\n\n get emptyMessageDescription(): string | null {\n return this.getAttribute(attributes.EMPTY_MESSAGE_DESCRIPTION);\n }\n\n /**\n * Set empty message icon\n * @param {string} value The value\n */\n set emptyMessageIcon(value: string | null) {\n if (typeof value === 'string' && value !== '') {\n this.setAttribute(attributes.EMPTY_MESSAGE_ICON, value);\n } else {\n this.removeAttribute(attributes.EMPTY_MESSAGE_ICON);\n }\n setEmptyMessage.apply(this);\n }\n\n get emptyMessageIcon(): string | null {\n return this.getAttribute(attributes.EMPTY_MESSAGE_ICON);\n }\n\n /**\n * Set empty message label\n * @param {string} value The value\n */\n set emptyMessageLabel(value: string | null) {\n if (typeof value === 'string' && value !== '') {\n this.setAttribute(attributes.EMPTY_MESSAGE_LABEL, value);\n } else {\n this.removeAttribute(attributes.EMPTY_MESSAGE_LABEL);\n }\n setEmptyMessage.apply(this);\n }\n\n get emptyMessageLabel(): string | null {\n return this.getAttribute(attributes.EMPTY_MESSAGE_LABEL);\n }\n\n /**\n * Set header menu id\n * @param {string} value The header menu id\n */\n set headerMenuId(value) {\n if (value) {\n this.setAttribute(attributes.HEADER_MENU_ID, value);\n return;\n }\n this.removeAttribute(attributes.HEADER_MENU_ID);\n }\n\n get headerMenuId() { return this.getAttribute(attributes.HEADER_MENU_ID); }\n\n /**\n * Set the header menu data\n * @param {Array} value The array to use\n */\n set headerMenuData(value) {\n if (this?.header?.state) {\n this.header.state.headerMenuData = value;\n }\n if (!this.isDynamicContextmenu) {\n const headerMenu: any = getContextmenuElem.apply(this, [true]);\n if (headerMenu) headerMenu.data = value;\n setContextmenu.apply(this);\n }\n this.isDynamicContextmenu = false;\n }\n\n get headerMenuData() { return this?.header?.state?.headerMenuData; }\n\n /**\n * Set menu id\n * @param {string} value The menu id\n */\n set menuId(value) {\n if (value) {\n this.setAttribute(attributes.MENU_ID, value);\n return;\n }\n this.removeAttribute(attributes.MENU_ID);\n }\n\n get menuId() { return this.getAttribute(attributes.MENU_ID); }\n\n /**\n * Set the menu data\n * @param {Array} value The array to use\n */\n set menuData(value) {\n this.state.menuData = value;\n if (!this.isDynamicContextmenu) {\n const menu: any = getContextmenuElem.apply(this);\n if (menu) menu.data = value;\n setContextmenu.apply(this);\n }\n this.isDynamicContextmenu = false;\n }\n\n get menuData() { return this?.state?.menuData; }\n\n /**\n * Set the list view to use virtual scrolling for a large amount of rows\n * @param {boolean|string} value true to use virtual scrolling\n */\n set virtualScroll(value: boolean | string) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.VIRTUAL_SCROLL, 'true');\n } else {\n this.removeAttribute(attributes.VIRTUAL_SCROLL);\n }\n this.redraw();\n }\n\n get virtualScroll(): boolean { return stringToBool(this.getAttribute(attributes.VIRTUAL_SCROLL)); }\n\n /**\n * Some future configurable virtual scroll settings\n * @returns {object} the current settings\n */\n get virtualScrollSettings() {\n const ENABLED = !!this.virtualScroll;\n const ROW_HEIGHT = this.rowPixelHeight || 50;\n const MAX_ROWS_IN_DOM = this.#virtualScrollMaxRowsInDom;\n const BUFFER_ROWS = Math.ceil(MAX_ROWS_IN_DOM * 0.25);\n\n return {\n ENABLED,\n ROW_HEIGHT,\n MAX_ROWS_IN_DOM,\n BUFFER_ROWS\n };\n }\n\n #virtualScrollMaxRowsInDom = 100;\n\n /**\n * Setting for max virtual scroll rows in DOM\n * @param {number} virtualRows number of rows\n */\n set scrollMaxRows(virtualRows: number) {\n const prevMaxRows = this.#virtualScrollMaxRowsInDom;\n const newMaxRows = Number(virtualRows);\n this.#virtualScrollMaxRowsInDom = !Number.isNaN(newMaxRows) ? newMaxRows : prevMaxRows;\n\n // if max rows changed, refresh virtual scroll rows\n if (!this.virtualScroll || prevMaxRows === newMaxRows) return;\n\n const rowIndex = Math.floor(this.container!.scrollTop / this.virtualScrollSettings.ROW_HEIGHT);\n if (this.treeGrid) {\n this.#recycleAllTreeRows(rowIndex);\n } else {\n // Note: Non-tree grids need testing for dynamic max rows\n this.#recycleAllRows(rowIndex);\n }\n }\n\n get scrollMaxRows(): number {\n return this.#virtualScrollMaxRowsInDom;\n }\n\n /* Attach Events for global scrolling */\n #attachScrollEvents() {\n const virtualScrollSettings = this.virtualScrollSettings;\n\n this.offEvent('scroll.data-grid', this.container);\n this.onEvent('scroll.data-grid', this.container, () => {\n const scrollTop = this.container!.scrollTop;\n this.#currentScroll.top = scrollTop;\n this.#currentScroll.left = this.container!.scrollLeft;\n const virtualRowHeight = virtualScrollSettings.ROW_HEIGHT;\n const rowIndex = Math.floor(scrollTop / virtualRowHeight);\n const rows = this.rows;\n\n const reachedTheTop = rowIndex <= 0;\n const reachedTheBottom = this.container!.offsetHeight + this.container!.scrollTop >= this.container!.scrollHeight;\n\n if (reachedTheTop) {\n const firstRow: any = rows[0];\n this.#triggerCustomScrollEvent(firstRow?.rowIndex ?? 0, 'start');\n }\n if (reachedTheBottom) {\n const lastRowIndex = this.datasource.originalData.length - 1;\n this.#triggerCustomScrollEvent(lastRowIndex, 'end');\n }\n if (!reachedTheTop && !reachedTheBottom) {\n this.#triggerCustomScrollEvent(0);\n }\n }, { capture: true, passive: true }); // @see https://javascript.info/bubbling-and-capturing#capturing\n\n this.#attachVirtualScrollEvent();\n }\n\n /* Attach Events for virtual scrolling */\n #attachVirtualScrollEvent() {\n if (!this.virtualScroll) return;\n\n const virtualScrollSettings = this.virtualScrollSettings;\n const virtualRowHeight = virtualScrollSettings.ROW_HEIGHT;\n\n let debounceScroll: any = null;\n this.offEvent('scroll.data-grid.virtual-scroll', this.container);\n this.onEvent('scroll.data-grid.virtual-scroll', this.container, (evt) => {\n evt.stopImmediatePropagation();\n\n this.#handleVirtualScroll(virtualRowHeight);\n\n if (!this.treeGrid) {\n clearTimeout(debounceScroll);\n debounceScroll = setTimeout(() => {\n this.#calculateColumnsOnscreen();\n }, 3);\n }\n this.#restoreActiveCellAfterScroll();\n this.#restoreEditedCellsAfterScroll();\n }, { capture: true, passive: true });// @see https://javascript.info/bubbling-and-capturing#capturing\n\n let debounceScrollend: any = null;\n this.offEvent('scrollend.data-grid.virtual-scroll', this.container);\n this.onEvent('scrollend.data-grid.virtual-scroll', this.container, (evt) => {\n evt.stopImmediatePropagation();\n\n if (!this.treeGrid) {\n clearTimeout(debounceScrollend);\n debounceScrollend = setTimeout(() => {\n this.#handleVirtualScroll(virtualRowHeight);\n }, 500);\n }\n\n if (document.activeElement?.nodeName === 'BODY' && this.#activeCellCache?.hasLeaveViewport) {\n this.container?.focus({ preventScroll: true });\n }\n }, { capture: true, passive: true });// @see https://javascript.info/bubbling-and-capturing#capturing\n\n this.offEvent('rowexpanded.data-grid.virtual-scroll', this);\n this.onEvent('rowexpanded.data-grid.virtual-scroll', this, (evt: CustomEvent) => {\n this.#handleTreeRowExpandCollapse(true, evt.detail);\n });\n\n this.offEvent('rowcollapsed.data-grid.virtual-scroll', this);\n this.onEvent('rowcollapsed.data-grid.virtual-scroll', this, (evt: CustomEvent) => {\n this.#handleTreeRowExpandCollapse(false, evt.detail);\n });\n }\n\n /**\n * Adds \"column-onscreen\" attribute to any column-header that is in browser window viewport\n * @returns {void}\n * @see IdsDataGridCell.isOnScreen()\n */\n #calculateColumnsOnscreen(): void {\n const headerColumns = this.header?.columns;\n if (!headerColumns || headerColumns.length < this.TOO_MANY_COLUMNS) return;\n\n const columnSettings = this.columns;\n const oldHeaderColumnsOnscreen = this.header?.columnsOnscreen;\n\n headerColumns?.forEach((column: HTMLElement) => {\n const columnIndex = (Number(column.getAttribute('aria-colindex') ?? 1) - 1);\n const columnDimensions = column.getBoundingClientRect();\n const columnLeftEdge = columnDimensions.x;\n const columnRightEdge = columnLeftEdge + columnDimensions.width;\n const windowWidth = window.innerWidth + 300;\n\n const isHidden = columnSettings[columnIndex]?.hidden;\n const isOffScreenLeft = columnRightEdge < 0;\n const isOffScreenRight = columnLeftEdge > windowWidth;\n const isOffScreen = isOffScreenLeft || isOffScreenRight;\n const isOnScreen = !isOffScreen && !isHidden;\n\n column.toggleAttribute('column-onscreen', isOnScreen);\n column.toggleAttribute('column-offscreen', isOffScreen);\n column.toggleAttribute('column-offscreen-left', isOffScreenLeft);\n column.toggleAttribute('column-offscreen-right', isOffScreenRight);\n });\n\n const newHeaderColumnsOnscreen = this.header?.columnsOnscreen;\n const columnsStale = oldHeaderColumnsOnscreen[0] !== newHeaderColumnsOnscreen[0];\n this.toggleAttribute('columns-stale', columnsStale);\n\n if (columnsStale) {\n this.rows.forEach((row: IdsDataGridRow) => {\n row.renderRow(row.rowIndex);\n });\n }\n }\n\n #detachScrollEvents() {\n this.offEvent('scroll.data-grid');\n this.offEvent('scroll.data-grid.virtual-scroll');\n this.offEvent('scrollend.data-grid.virtual-scroll');\n }\n\n /**\n * Updates tree node and its children's rowHidden states for virtual scrolling\n * @param {Record<string, any>} treeNode tre node\n * @param {boolean} show show/hidden flag\n */\n #syncTreeHiddenStates(treeNode: Record<string, any>, show: boolean) {\n const hasChildren = treeNode.childrenVRefIds?.length > 0;\n const isExpanded = treeNode.rowExpanded;\n\n this.updateDataset(treeNode.vsRefId, { rowHidden: !show });\n treeNode.rowHidden = !show;\n\n if (hasChildren) {\n treeNode.childrenVRefIds.forEach((childIndex: number) => {\n this.#syncTreeHiddenStates(this.data[childIndex], isExpanded && !treeNode.rowHidden);\n });\n }\n }\n\n #handleTreeRowExpandCollapse(expanded: boolean, payload: Record<string, any>) {\n const rowIndex = payload.row;\n const allRows = payload.allRows;\n const rowHeight = this.virtualScrollSettings.ROW_HEIGHT;\n const scrollIndex = Math.floor(this.container!.scrollTop / rowHeight);\n\n // collapseAll/expandAll invoked and already updated show/hide states\n if (allRows) {\n this.#recycleAllTreeRows(scrollIndex);\n return;\n }\n\n // update parent expanded state\n this.updateDataset(rowIndex, { rowExpanded: expanded, rowHidden: false });\n\n // sync show/hide states of subtree\n this.#syncTreeHiddenStates(this.data[rowIndex], true);\n\n // refresh virtual rows to reflect new show/hidden states\n this.#recycleAllTreeRows(scrollIndex);\n }\n\n /**\n * Recycle all dom tree rows for virtual scroll window\n * @param {number} scrollIndex scroll position row index\n * @param {Record<number, boolean>} forceRender rows to force render\n */\n #recycleAllTreeRows(scrollIndex: number, forceRender: Record<number, boolean> = {}) {\n this.#saveEditedCellsBeforeScroll();\n const rows = this.rows;\n const data = this.data;\n const virtualRows = this.virtualRows;\n const maxVirtualRowIndex = virtualRows.length - 1;\n const scrollSettings = this.virtualScrollSettings;\n const maxRowsInDom = Math.min(scrollSettings.MAX_ROWS_IN_DOM, virtualRows.length);\n\n // safe scroll index\n scrollIndex = Math.max(scrollIndex, 0);\n scrollIndex = Math.min(scrollIndex, maxVirtualRowIndex);\n\n // first virtual row index to render\n let firstVRow = scrollIndex - scrollSettings.BUFFER_ROWS;\n firstVRow = Math.min(firstVRow, maxVirtualRowIndex - maxRowsInDom + 1);\n firstVRow = Math.max(firstVRow, 0);\n\n // recycle all dom rows for virtual scroll window\n let i: number;\n let vRow = firstVRow; // Initialize vRow here\n for (i = 0; i < rows.length; i++) {\n const row = rows[i];\n const dataRowIndex = virtualRows[vRow]?.vsRefId;\n\n if (dataRowIndex >= 0) {\n row.rowIndex = dataRowIndex;\n }\n\n if (forceRender[dataRowIndex]) {\n row.renderRow(dataRowIndex);\n }\n\n vRow++; // Increment vRow here\n }\n\n // clean up dom rows after recycling\n if (maxRowsInDom - rows.length !== 0) {\n // too many rows\n const excessRows = rows.length - maxRowsInDom;\n if (excessRows > 0) {\n rows.slice(-1 * excessRows).forEach((row) => row.remove());\n }\n\n // need more rows\n const neededRows = maxRowsInDom - rows.length;\n if (neededRows > 0) {\n this.body!.innerHTML += Array.from({ length: neededRows }, () => {\n const dataRowIndex = virtualRows[vRow]?.vsRefId;\n const result = IdsDataGridRow.template(data[dataRowIndex], dataRowIndex, dataRowIndex + 1, this);\n vRow++;\n return result;\n }).join('');\n }\n }\n\n // position virtual scroll window\n this.#positionVirtualScrollWindow(firstVRow, this.virtualRows.length, scrollSettings);\n\n this.#restoreEditedCellsAfterScroll();\n }\n\n #handleVirtualScroll(rowHeight: number) {\n if (!this.virtualScroll) return;\n\n const rowIndex = Math.floor(this.container!.scrollTop / rowHeight);\n\n if (this.treeGrid) {\n this.#scrollTreeRowIntoView(rowIndex);\n } else {\n this.#scrollRowIntoView(rowIndex, false);\n }\n }\n\n #customScrollEventCache: { [key: string]: number } = {};\n\n /* Trigger API scroll event */\n #triggerCustomScrollEvent(rowIndex: number, eventType?: 'start' | 'end') {\n if (!eventType) {\n this.#customScrollEventCache = {}; // reset event-cache\n } else if (rowIndex !== this.#customScrollEventCache[eventType]) {\n this.#customScrollEventCache[eventType] = rowIndex;\n\n this.triggerEvent(`scroll${eventType}`, this, {\n bubbles: true,\n composed: true,\n detail: { elem: this, value: rowIndex }\n });\n }\n }\n\n #positionVirtualScrollWindow(firstRowIndex: number, totalRows: number, scrollSettings?: Record<string, any>) {\n const { ROW_HEIGHT, MAX_ROWS_IN_DOM } = scrollSettings || this.virtualScrollSettings;\n const offsetTop = firstRowIndex * ROW_HEIGHT;\n const maxHeight = totalRows * ROW_HEIGHT;\n const paddingBottom = maxHeight - (MAX_ROWS_IN_DOM * ROW_HEIGHT) - offsetTop;\n\n this.body?.style.setProperty('transform', `translateY(${offsetTop}px)`);\n this.body?.style.setProperty('padding-bottom', `${Math.max(paddingBottom, 0)}px`);\n }\n\n #restoreScrollPosition(scrollTop: number, scrollLeft: number) {\n if (!Number.isNaN(scrollTop) && !Number.isNaN(scrollLeft) && this.container) {\n this.container.scrollTop = scrollTop;\n this.container.scrollLeft = scrollLeft;\n }\n }\n\n /**\n * Internal handling of scrolling to row\n * @param {number} rowIndex row index\n */\n #scrollTo(rowIndex: number): void {\n this.rowByIndex(rowIndex)?.firstElementChild?.scrollIntoView?.();\n const headerHeight = this.header?.clientHeight ?? 0;\n const scrollHeight = this.container!.scrollHeight;\n const containerHeight = this.container!.clientHeight;\n const scrollTop = this.container!.scrollTop;\n const isScrollBottom = (scrollTop + containerHeight) >= scrollHeight;\n\n // offset for sticky header height\n if (!isScrollBottom) this.container!.scrollTop -= headerHeight;\n }\n\n /**\n * Internal handling of scrolling to tree row\n * @param {number} rowIndex row index\n */\n #scrollToTreeRow(rowIndex: number) {\n if (!this.container || !this.data.length) return;\n\n const { ROW_HEIGHT } = this.virtualScrollSettings;\n const isRowHidden = this.data[rowIndex]?.rowHidden;\n const forceRender: Record<number, boolean> = {};\n\n // if row is hidden, first expand all parent rows\n if (isRowHidden) {\n const targetRow = this.data[rowIndex];\n let parentRow = this.#findParentRow(this.data, targetRow.parentElement ?? '');\n\n // find parent row\n while (parentRow) {\n forceRender[parentRow.vsRefId] = true;\n this.updateDataset(parentRow.vsRefId, { rowExpanded: true, rowHidden: false });\n parentRow = this.#findParentRow(this.data, parentRow.parentElement ?? '');\n }\n\n const rootRow = this.#findRootRow(targetRow);\n if (rootRow) {\n this.#syncTreeHiddenStates(rootRow, true);\n }\n }\n\n const virtualRowIndex = this.virtualRows.indexOf(this.data[rowIndex]);\n this.#recycleAllTreeRows(virtualRowIndex, forceRender);\n this.container.scrollTop = virtualRowIndex * ROW_HEIGHT;\n }\n\n /**\n * Scroll a given row into view\n * @param {number} rowIndex which row to scroll into view.\n */\n scrollRowIntoView(rowIndex: number) {\n if (this.treeGrid && this.virtualScroll) {\n this.#scrollToTreeRow(rowIndex);\n return;\n }\n\n this.#scrollRowIntoView(rowIndex);\n }\n\n /**\n * Scroll a given row into view\n * @param {number} rowIndex which row to scroll into view.\n * @param {boolean} doScroll set to \"true\" to have the browser perform the scroll action\n */\n #scrollRowIntoView(rowIndex: number, doScroll = true) {\n const data = this.data;\n const rows = this.rows;\n if (!data.length || !rows.length) return;\n\n const virtualScrollSettings = this.virtualScrollSettings;\n const maxRowIndex = data.length - 1;\n rowIndex = Math.max(rowIndex, 0);\n rowIndex = Math.min(rowIndex, maxRowIndex);\n\n if (!this.virtualScroll) {\n this.#scrollTo(rowIndex);\n return;\n }\n\n const container = this.container!;\n const body = this.body!;\n\n const firstRow: any = rows[0];\n const lastRow: any = rows[rows.length - 1];\n const firstRowIndex = firstRow.rowIndex;\n const lastRowIndex = lastRow.rowIndex;\n\n const isAboveFirstRow = rowIndex < firstRowIndex;\n const isBelowLastRow = rowIndex > lastRowIndex;\n const isInRange = !isAboveFirstRow && !isBelowLastRow;\n const reachedTheBottom = lastRowIndex >= maxRowIndex;\n let bufferRowIndex = rowIndex - virtualScrollSettings.BUFFER_ROWS;\n bufferRowIndex = Math.max(bufferRowIndex, 0);\n bufferRowIndex = Math.min(bufferRowIndex, maxRowIndex);\n\n if (isInRange && doScroll) {\n this.offEvent('scroll.data-grid.virtual-scroll', this.container);\n this.#scrollTo(rowIndex);\n this.#attachVirtualScrollEvent();\n return;\n }\n\n // Only save/restore when we need to recycle rows\n const needsRecycling = !isInRange || (isInRange && (bufferRowIndex !== firstRowIndex));\n if (needsRecycling) {\n this.#saveEditedCellsBeforeScroll();\n }\n\n if (isInRange) {\n // if rowIndex is in range of the currently visible rows:\n // then we should only move rows up or down according to how big the buffer should be.\n const moveRowsDown = bufferRowIndex - firstRowIndex;\n const moveRowsUp = Math.abs(moveRowsDown);\n\n if (moveRowsDown > 0) {\n if (!reachedTheBottom) {\n this.#recycleTopRowsDown(moveRowsDown);\n }\n } else if (moveRowsUp < virtualScrollSettings.MAX_ROWS_IN_DOM) {\n this.#recycleBottomRowsUp(moveRowsUp);\n } else {\n if (needsRecycling) {\n this.#restoreEditedCellsAfterScroll();\n }\n return; // exit early because nothing to do.\n }\n } else if (isAboveFirstRow) {\n // if rowIndex should appear above the currently visible rows,\n // then we must figure out how many rows we must move up from the bottom to render the rowIndex row\n this.#recycleAllRows(bufferRowIndex);\n } else if (isBelowLastRow) {\n // if rowIndex should appear below the currently visible rows,\n // then we recycle all rows, since none of the visible rows are needed\n this.#recycleAllRows(bufferRowIndex);\n }\n\n // NOTE: repaint of padding is more performant than margin\n const virtualRowHeight = virtualScrollSettings.ROW_HEIGHT;\n const firstRowInDom = this.rows[0].rowIndex;\n const bodyTranslateY = firstRowInDom * virtualRowHeight;\n\n if (!reachedTheBottom) {\n body.style.setProperty('transform', `translateY(${bodyTranslateY}px)`);\n }\n\n this.#setVirtualScrollPaddingBottom(virtualScrollSettings, this.data.length, bodyTranslateY);\n\n if (doScroll) {\n container!.scrollTop = rowIndex * virtualRowHeight;\n }\n\n if (needsRecycling) {\n this.#restoreEditedCellsAfterScroll();\n }\n }\n\n #setVirtualScrollPaddingBottom(settings: any, totalRows: number, offsetTop: number) {\n const maxHeight = totalRows * settings.ROW_HEIGHT;\n const paddingBottom = maxHeight - (settings.MAX_ROWS_IN_DOM * settings.ROW_HEIGHT) - offsetTop;\n this.body?.style.setProperty('padding-bottom', `${Math.max(paddingBottom, 0)}px`);\n }\n\n #scrollTreeRowIntoView(cursorIndex: number) {\n const domRows = this.rows;\n let virtualRows = this.virtualRows;\n\n if (!virtualRows.length || !domRows.length) {\n this.#positionVirtualScrollWindow(0, 0);\n return;\n }\n\n // clean up row index\n const maxRowIndex = virtualRows.length - 1;\n cursorIndex = Math.max(cursorIndex, 0);\n cursorIndex = Math.min(cursorIndex, maxRowIndex);\n\n // set up scroll variables\n const scrollSettings = this.virtualScrollSettings;\n let firstVisibleRow = domRows[0];\n let firstVisibleRowIndex = virtualRows.indexOf(firstVisibleRow.rowData);\n const lastVisibleRow = domRows[domRows.length - 1];\n const lastVisibleRowIndex = virtualRows.indexOf(lastVisibleRow.rowData);\n const reachedTheBottom = lastVisibleRowIndex >= maxRowIndex;\n\n // virtual window parameters\n let upperLimitIndex = cursorIndex - scrollSettings.BUFFER_ROWS;\n upperLimitIndex = Math.max(upperLimitIndex, 0);\n upperLimitIndex = Math.min(upperLimitIndex, maxRowIndex);\n\n const firstDomRow = domRows[0];\n const firstDomRowVirtualIndex = virtualRows.indexOf(firstDomRow.rowData);\n const lastDomRow = domRows[domRows.length - 1];\n const lastDomRowVirtualIndex = virtualRows.indexOf(lastDomRow.rowData);\n\n const moveRowsDown = upperLimitIndex - firstDomRowVirtualIndex;\n const moveRowsUp = moveRowsDown < 0 ? Math.abs(moveRowsDown) : NaN;\n const isInRange = cursorIndex >= firstDomRowVirtualIndex && cursorIndex <= lastDomRowVirtualIndex;\n\n // Only save/restore when we need to recycle rows\n const needsRecycling = !isInRange\n || (isInRange && (moveRowsDown > 0 || (moveRowsUp && moveRowsUp < scrollSettings.MAX_ROWS_IN_DOM)));\n\n const data = {\n maxRowIndex,\n firstVisibleRowIndex,\n lastVisibleRowIndex,\n dataVisibleRows: virtualRows\n };\n\n if (isInRange) {\n if (moveRowsDown > 0 && !reachedTheBottom) {\n this.#saveEditedCellsBeforeScroll();\n const staleRows = this.rows.slice(0, moveRowsDown);\n this.#recycleTreeRowsDown(data, staleRows);\n } else if (moveRowsUp && moveRowsUp < scrollSettings.MAX_ROWS_IN_DOM) {\n this.#saveEditedCellsBeforeScroll();\n const staleRows = this.rows.slice((-1 * moveRowsUp));\n this.#recycleTreeRowsUp(data, staleRows);\n }\n } else {\n this.#saveEditedCellsBeforeScroll();\n this.#recycleAllTreeRows(cursorIndex);\n }\n\n // position virtual scroll window\n virtualRows = this.virtualRows; // re query after recycling changes\n firstVisibleRow = this.rowsVisible[0];\n firstVisibleRowIndex = virtualRows.indexOf(firstVisibleRow.rowData);\n this.#positionVirtualScrollWindow(firstVisibleRowIndex, virtualRows.length, scrollSettings);\n\n if (needsRecycling) {\n this.#restoreEditedCellsAfterScroll();\n }\n }\n\n #recycleTreeRowsDown(obj: Record<string, any>, staleRows: IdsDataGridRow[]) {\n const { maxRowIndex, lastVisibleRowIndex, dataVisibleRows } = obj;\n const rowsToMove: IdsDataGridRow[] = [];\n\n staleRows.forEach((row, idx) => {\n const nextIndex = lastVisibleRowIndex + (idx) + 1;\n const visibleRowData = dataVisibleRows[nextIndex];\n if (nextIndex > maxRowIndex) return;\n const dataRowIndex = visibleRowData.vsRefId;\n row.rowIndex = dataRowIndex;\n rowsToMove.push(row);\n });\n\n if (rowsToMove.length) {\n this.body?.append(...rowsToMove);\n }\n }\n\n #recycleTreeRowsUp(obj: Record<string, any>, staleRows: IdsDataGridRow[]) {\n const { firstVisibleRowIndex, dataVisibleRows } = obj;\n const rowsToMove: IdsDataGridRow[] = [];\n\n staleRows.forEach((row, idx) => {\n const prevIndex = firstVisibleRowIndex - (idx + 1);\n const visibleRowData = dataVisibleRows[prevIndex];\n const dataRowIndex = visibleRowData.vsRefId;\n row.rowIndex = dataRowIndex;\n rowsToMove.push(row);\n });\n\n if (rowsToMove.length) {\n this.body?.prepend(...rowsToMove.reverse());\n }\n }\n\n /* Recycle the rows during scrolling */\n #recycleAllRows(topRowIndex: number) {\n const data = this.data;\n const rows = this.rows;\n if (!data.length || !rows.length) return;\n\n const veryLastIndex = data.length - 1;\n topRowIndex = Math.min(topRowIndex, veryLastIndex);\n topRowIndex = Math.max(topRowIndex, 0);\n\n const { MAX_ROWS_IN_DOM } = this.virtualScrollSettings;\n\n // Using Array.every as an alternaive to using a for-loop with a break\n this.rows.every((row: any, idx) => {\n const nextRowIndex = topRowIndex + idx;\n if (nextRowIndex > veryLastIndex) {\n const moveTheRestToTop = MAX_ROWS_IN_DOM - idx;\n this.#recycleBottomRowsUp(moveTheRestToTop);\n return false;\n }\n row.rowIndex = nextRowIndex;\n return true;\n });\n }\n\n /* Recycle the rows during scrolling from the top */\n #recycleTopRowsDown(rowCount: number) {\n const rows = this.rows;\n if (!rowCount || !rows.length) return;\n const data = this.data;\n\n const bottomRow = rows[rows.length - 1];\n const bottomRowIndex = bottomRow.rowIndex;\n const staleRows = rows.slice(0, rowCount);\n const rowsToMove: IdsDataGridRow[] = [];\n\n // NOTE: Using Array.every as an alternaive to using a for-loop with a break\n staleRows.every((row: IdsDataGridRow, idx) => {\n const nextIndex = bottomRowIndex + (idx + 1);\n if (nextIndex >= data.length) return false;\n row.rowIndex = nextIndex;\n return rowsToMove.push(row);\n });\n\n if (!rowsToMove.length) return;\n\n // NOTE: no need to shift rows in the DOM if all the rows need to be recycled\n if (rowsToMove.length >= this.virtualScrollSettings.MAX_ROWS_IN_DOM) return;\n\n // NOTE: body.append is faster than body.innerHTML\n // NOTE: body.append is faster than multiple calls to appendChild()\n this.body?.append(...rowsToMove);\n }\n\n /* Recycle the rows during scrolling from the bottom */\n #recycleBottomRowsUp(rowCount: number) {\n const rows = this.rows;\n if (!rowCount || !rows.length) return;\n\n const topRow = rows[0];\n const topRowIndex = topRow.rowIndex;\n const staleRows = rows.slice((-1 * rowCount));\n const rowsToMove: IdsDataGridRow[] = [];\n\n // NOTE: Using Array.every as an alternaive to using a for-loop with a break\n staleRows.every((row: any, idx) => {\n const prevIndex = topRowIndex - (idx + 1);\n if (prevIndex < 0) return false;\n row.rowIndex = prevIndex;\n return rowsToMove.push(row);\n });\n\n if (!rowsToMove.length) return;\n\n // NOTE: no need to shift rows in the DOM if all the rows need to be recycled\n if (rowsToMove.length >= this.virtualScrollSettings.MAX_ROWS_IN_DOM) return;\n\n // NOTE: body.prepend() seems to be faster than body.innerHTML\n this.body?.prepend(...rowsToMove.reverse());\n }\n\n /**\n * Set the aria-label element in the DOM. This should be translated.\n * @param {string} value The aria label\n */\n set label(value: string) {\n if (value) {\n this.setAttribute(attributes.LABEL, value);\n this.shadowRoot?.querySelector('.ids-data-grid')?.setAttribute('aria-label', value);\n return;\n }\n\n this.removeAttribute(attributes.LABEL);\n this.shadowRoot?.querySelector('.ids-data-grid')?.setAttribute('aria-label', 'Data Grid');\n }\n\n get label(): string { return this.getAttribute(attributes.LABEL) || 'Data Grid'; }\n\n /**\n * Set the row height between extra-small, small, medium and large (default)\n * @param {string} value The row height\n */\n set rowHeight(value) {\n if (value) {\n const isNew = this.initialized && this.getAttribute(attributes.ROW_HEIGHT) !== value;\n this.setAttribute(attributes.ROW_HEIGHT, value);\n this.shadowRoot?.querySelector('.ids-data-grid')?.setAttribute('data-row-height', value);\n if (isNew) {\n this.maxContentColumnWidths = {};\n this.#setColumnWidths();\n }\n } else {\n this.removeAttribute(attributes.ROW_HEIGHT);\n this.shadowRoot?.querySelector('.ids-data-grid')?.setAttribute('data-row-height', 'lg');\n }\n this.saveSettings?.();\n }\n\n get rowHeight() { return this.getAttribute(attributes.ROW_HEIGHT) || 'lg'; }\n\n /**\n * Set the min height of the grid (for the empty message or loading indicator)\n * @param {string} value The min height\n */\n set minHeight(value) {\n if (value) {\n this.setAttribute(attributes.MIN_HEIGHT, value.toString());\n this.style.setProperty('--ids-data-grid-height-min', value);\n } else {\n this.removeAttribute(attributes.MIN_HEIGHT);\n this.style.removeProperty('--ids-data-grid-height-min');\n }\n this.saveSettings?.();\n }\n\n get minHeight() { return this.getAttribute(attributes.MIN_HEIGHT) || '350px'; }\n\n /**\n * Set the row index. If set, the datagrid's data set will initially load here.\n * @param {number} rowIndex The row-index at which to start showing data.\n */\n set rowStart(rowIndex: number) {\n this.setAttribute(attributes.ROW_START, String(rowIndex || 0));\n }\n\n /**\n * Get the start-row index\n * @returns {number} The start-row index\n */\n get rowStart(): number { return Number(this.getAttribute(attributes.ROW_START)) || 0; }\n\n /**\n * Sets keyboard navigation to rows\n * @param {boolean} value toggle row navigation\n */\n set rowNavigation(value: string | boolean | null) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.ROW_NAVIGATION, '');\n this.container?.classList.add('row-navigation');\n } else {\n this.removeAttribute(attributes.ROW_NAVIGATION);\n this.container?.classList.remove('row-navigation');\n }\n }\n\n get rowNavigation(): boolean {\n return this.hasAttribute(attributes.ROW_NAVIGATION);\n }\n\n /**\n * Set the style of the grid to list style for simple readonly lists\n * @param {boolean} value list styling to use\n */\n set listStyle(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.LIST_STYLE, String(value));\n this.shadowRoot?.querySelector('.ids-data-grid')?.classList.add('is-list-style');\n } else {\n this.removeAttribute(attributes.LIST_STYLE);\n this.shadowRoot?.querySelector('.ids-data-grid')?.classList.remove('is-list-style');\n }\n }\n\n get listStyle() { return stringToBool(this.getAttribute(attributes.LIST_STYLE)) || false; }\n\n /**\n * Set the row selection mode between false, 'single', 'multiple' and 'mixed'\n * @param {string|boolean} value selection mode to use\n */\n set rowSelection(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.ROW_SELECTION, String(value));\n } else {\n this.removeAttribute(attributes.ROW_SELECTION);\n }\n }\n\n get rowSelection() { return this.getAttribute(attributes.ROW_SELECTION) || false; }\n\n /**\n * Set the cell selection mode. Default is false.\n * @param {boolean} value True if drag selection will be used\n */\n set cellSelection(value: boolean) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.CELL_SELECTION, String(value));\n } else {\n this.removeAttribute(attributes.CELL_SELECTION);\n }\n }\n\n get cellSelection() { return stringToBool(this.getAttribute(attributes.CELL_SELECTION)); }\n\n /**\n * Set the column selection, true to add column header selection\n * @param {boolean} value selection mode to use\n */\n set colSelection(value: boolean) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.COL_SELECTION, String(value));\n } else {\n this.removeAttribute(attributes.COL_SELECTION);\n }\n }\n\n get colSelection(): boolean { return stringToBool(this.getAttribute(attributes.COL_SELECTION)); }\n\n /**\n * Set suppress empty message\n * @param {string|boolean} value The value\n */\n set suppressEmptyMessage(value: string | boolean) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.SUPPRESS_EMPTY_MESSAGE, '');\n } else {\n this.removeAttribute(attributes.SUPPRESS_EMPTY_MESSAGE);\n }\n setEmptyMessage.apply(this);\n }\n\n get suppressEmptyMessage(): boolean {\n return this.hasAttribute(attributes.SUPPRESS_EMPTY_MESSAGE);\n }\n\n /*\n * Get the loading indicator element\n * @param {IdsLoadingIndicator} the loading element\n */\n get loadingIndicator(): IdsLoadingIndicator {\n return this.shadowRoot?.querySelector('slot[name=\"loading-container\"]')?.children[0] as IdsLoadingIndicator;\n }\n\n /*\n * Set to true to prevent rows from being selectedd when clicking the row,only the checkbox will select.\n * @param {string|boolean} value true or false\n */\n set suppressRowClickSelection(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.SUPPRESS_ROW_CLICK_SELECTION, value.toString());\n } else {\n this.removeAttribute(attributes.SUPPRESS_ROW_CLICK_SELECTION);\n }\n }\n\n get suppressRowClickSelection() { return this.getAttribute(attributes.SUPPRESS_ROW_CLICK_SELECTION) || false; }\n\n /**\n * Set to true to prevent rows from being deselected if click or space bar the row.\n * i.e. once a row is selected, it remains selected until another row is selected in its place.\n * @param {string|boolean} value true or false\n */\n set suppressRowDeselection(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.SUPPRESS_ROW_DESELECTION, String(value));\n } else {\n this.removeAttribute(attributes.SUPPRESS_ROW_DESELECTION);\n }\n }\n\n get suppressRowDeselection() { return this.getAttribute(attributes.SUPPRESS_ROW_DESELECTION) || false; }\n\n /**\n * Set to true to prevent rows from being deactivated if clicked.\n * i.e. once a row is activated, it remains activated until another row is activated in its place.\n * @param {string|boolean} value true or false\n */\n set suppressRowDeactivation(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.SUPPRESS_ROW_DEACTIVATION, String(value));\n } else {\n this.removeAttribute(attributes.SUPPRESS_ROW_DEACTIVATION);\n }\n }\n\n get suppressRowDeactivation() { return this.getAttribute(attributes.SUPPRESS_ROW_DEACTIVATION) || false; }\n\n /**\n * Get the selected rows\n * @returns {Array<object>} An array of all currently selected rows\n */\n get selectedRows(): Array<{ index: number, data: Record<string, unknown> }> {\n return this.data.flatMap((row: Record<string, unknown>, index: number) => {\n if (row.rowSelected) return { index: Number(index), data: row };\n return [];\n });\n }\n\n /**\n * Map and boundary data on selected cells\n * @returns { object };\n */\n get selectedMap(): { bounds: { minRow: number, maxRow: number, minCol: number, maxCol: number }, map: Array<Array<any>> } {\n const bounds = {\n minRow: this.data.length,\n maxRow: -1,\n minCol: this.columns.length,\n maxCol: -1\n };\n const map: Array<any> = [];\n\n const getColIndex = (i: number) => (this.rowSelection ? i + 1 : i);\n const updateBounds = (row: number, col: number) => {\n if (row < bounds.minRow) bounds.minRow = row;\n if (row > bounds.maxRow) bounds.maxRow = row;\n if (col < bounds.minCol) bounds.minCol = col;\n if (col > bounds.maxCol) bounds.maxCol = col;\n };\n const blankArr = Array(this.visibleColumns.length).fill(false);\n const columns = this.rowSelection ? this.visibleColumns.slice(1, this.visibleColumns.length) : this.visibleColumns;\n\n let count = 0;\n\n this.data.forEach((row: any, rowIndex: number) => {\n if (row.rowSelected) {\n updateBounds(rowIndex, 0);\n updateBounds(rowIndex, columns.length - 1);\n\n map.push(columns.map((column: IdsDataGridColumn, colIndex: number) => ({\n row: rowIndex,\n col: colIndex,\n value: row[column.field || column.id],\n target: this.cellByIndex(rowIndex, getColIndex(colIndex)),\n })));\n\n count += columns.length;\n } else if (row.colSelected) {\n const mapRow: Array<any> = [];\n\n row.colSelected.forEach((isSelected: boolean, colIndex: number) => {\n if (isSelected) {\n const column = this.visibleColumns[getColIndex(colIndex)];\n\n mapRow.push({\n row: rowIndex,\n col: colIndex,\n value: row[column.field || column.id],\n target: this.cellByIndex(rowIndex, getColIndex(colIndex)),\n });\n count++;\n updateBounds(rowIndex, colIndex);\n } else {\n mapRow.push(false);\n }\n });\n\n map.push(mapRow);\n } else {\n map.push(blankArr);\n }\n });\n\n if (count === 0 && this.activeCell && this.activeCell.node) {\n bounds.minRow = this.activeCell.row;\n bounds.maxRow = this.activeCell.row;\n bounds.minCol = this.activeCell.cell;\n bounds.maxCol = this.activeCell.cell;\n\n const column = this.visibleColumns[getColIndex(this.activeCell.cell)];\n const value = this.data[this.activeCell.row] ? this.data[this.activeCell.row][column?.field || column?.id] : null;\n\n map[this.activeCell.row][this.activeCell.cell] = {\n value,\n row: this.activeCell.row,\n col: this.activeCell.cell,\n target: this.activeCell.node\n };\n }\n\n return { bounds, map };\n }\n\n /**\n * Get the selected rows across all pages, if a paged dataset is present\n * @returns {Array<object>} An array of all currently selected rows\n */\n get selectedRowsAcrossPages(): Array<{ index: number, data: Record<string, unknown> }> {\n if (!this.pager) return this.selectedRows;\n if (this.pagination === 'server-side') return this.serverSideSelections;\n\n const rows = this.treeGrid ? this.virtualRows : this.datasource.currentData;\n return rows.flatMap((row: Record<string, unknown>, index: number) => {\n if (row.rowSelected) return { index: Number(index), data: row };\n return [];\n });\n }\n\n /**\n * Get the activated row\n * @returns {any} The index of the selected row\n */\n get activatedRow(): any {\n return this.data.flatMap((row: Record<string, unknown>, index: number) => {\n if (row.rowActivated) return { index: Number(index), data: row };\n return [];\n })[0] || { };\n }\n\n /**\n * Update the dataset\n * @param {number} row the parent row that was clicked\n * @param {Record<string, unknown>} data the data to apply to the row\n * @param {boolean} isClear do not keep current data\n */\n updateDataset(row: number, data: Record<string, unknown>, isClear?: boolean) {\n const idCol = this.idColumn || 'id';\n // Ensure the incoming record contains a proper ID\n if (!data[idCol] && this.data[row] && data[idCol] !== '') {\n data[idCol] = this.data[row][idCol];\n }\n\n // Same page update\n if (row < this.data.length) {\n // Update the current data\n if (isClear) this.data[row] = data;\n else this.data[row] = { ...this.data[row], ...data };\n }\n\n // Update the tree element in the original data\n if (this.treeGrid) {\n if (this.data[row].ariaLevel === 1) {\n this.datasource.update([data], !!isClear);\n return;\n }\n\n // Update the child element\n const parentRow = this.#findParentRow(this.datasource.originalData, this.data[row].parentElement ?? '');\n if (parentRow) {\n const updatedChildData = {\n ...parentRow.children[this.data[row][this.idColumn]],\n ...data\n };\n this.datasource.update([updatedChildData], !!isClear);\n }\n return;\n }\n\n // Non tree - update original data\n if (!data.id) data.id = row;\n this.datasource.update([data], !!isClear);\n }\n\n /**\n * Update the dataset and refresh and add a dirty tracker if set on the column.\n * @param {number} row the parent row that was clicked\n * @param {Record<string, unknown>} data the data to apply to the row\n * @param {boolean} isClear do not keep current data\n */\n updateDatasetAndRefresh(row: number, data: Record<string, unknown>, isClear?: boolean) {\n const existingRow = this.data[row];\n this.#saveCellOriginalValue(existingRow, row, data);\n this.updateDataset(row, data, isClear);\n this.#updateCellDirtyState(existingRow, row, data);\n IdsDataGridCell.cellCache = { };\n this.rowByIndex(row)?.refreshRow();\n this.updateSelectedCells();\n }\n\n /**\n * Save the cell's originalValue if it hasn't been set yet\n * @param {Record<string, unknown>} existingRow The current row data before update\n * @param {number} row row The row index\n * @param {Record<string, unknown>} data data The new data being applied to the row\n */\n #saveCellOriginalValue(existingRow: Record<string, any>, row: number, data: Record<string, unknown>) {\n if (!(existingRow && data)) return;\n\n Object.keys(data).forEach((field: any) => {\n if (existingRow[field] !== data[field]) {\n const columnIndex = this.columns.findIndex((col: any) => col.field === field);\n if (columnIndex !== -1) {\n const cell = this.rowByIndex(row)?.querySelector(\n `ids-data-grid-cell[aria-colindex=\"${columnIndex + 1}\"]`\n ) as IdsDataGridCell;\n\n if (cell && cell.originalValue === undefined) {\n cell.originalValue = existingRow[field];\n }\n }\n }\n });\n }\n\n /**\n * Update the cell's dirty state after data has been refreshed\n * @param {Record<string, unknown>} existingRow existingRow The current row data before update\n * @param {number} row The row index\n * @param {Record<string, unknown>} data The new data being applied to the row\n */\n #updateCellDirtyState(existingRow: Record<string, any>, row: number, data: Record<string, unknown>) {\n if (!(existingRow && data)) return;\n\n Object.keys(data).forEach((field: any) => {\n if (existingRow[field] !== data[field]) {\n // Get the full column index from all columns\n const fullColumnIndex = this.columnIdxById(field);\n const columnData = this.columns[fullColumnIndex];\n\n if (columnData && fullColumnIndex !== -1 && (columnData.editor?.editorSettings?.dirtyTracker)) {\n // Find the visible index of this column\n const visibleIndex = this.visibleColumns.findIndex((col: any) => col.id === columnData.id);\n\n // Only proceed if the column is visible\n if (visibleIndex !== -1) {\n const rowIndex = this.rowByIndex(row);\n if (rowIndex) {\n // Use the visible index + 1 for aria-colindex\n const cell = rowIndex.querySelector(\n `ids-data-grid-cell[aria-colindex=\"${visibleIndex + 1}\"]`\n ) as IdsDataGridCell;\n\n if (cell) {\n cell.trackValueChange(data[field], true);\n }\n }\n }\n }\n }\n });\n }\n\n /**\n * Find the parent id based on the cached props\n * @param {Array<Record<string, any>>} data the parent row that was clicked\n * @param {string} parentIds the string \"1 2\" of indexes\n * @returns {Record<string, unknown>} The child record\n */\n #findParentRow(data: Array<Record<string, any>>, parentIds: string): any {\n let childRow: any;\n parentIds.split(' ').forEach((r: string, index: number) => {\n if (index === 0) {\n // eslint-disable-next-line arrow-body-style\n childRow = data.find((row: Record<string, any>) => {\n if (!row) return false;\n // eslint-disable-next-line eqeqeq\n return row[this.idColumn] == r;\n });\n } else {\n // eslint-disable-next-line arrow-body-style\n childRow = childRow?.children.find((cRow: Record<string, any>) => {\n if (!cRow) return false;\n // eslint-disable-next-line eqeqeq\n return cRow[this.idColumn] == r;\n });\n }\n });\n return childRow;\n }\n\n #findRootRow(row: Record<string, any>) {\n if (!row.parentElement) return row;\n\n const rootId = row.parentElement.split(' ')[0];\n // eslint-disable-next-line eqeqeq\n const rootRow = this.data.find((item) => item[this.idColumn] == rootId);\n\n return rootRow;\n }\n\n /**\n * Updates row count attribute on container\n */\n #updateRowCount() {\n this.container?.setAttribute('aria-rowcount', this.rowCount.toString());\n }\n\n /**\n * Updates the selected status of the cells\n */\n updateSelectedCells() {\n const colSelectedCount = Array(this.visibleColumns.length).fill(0);\n\n this.data.forEach((row, rowIndex) => {\n if (row.colSelected) {\n row.colSelected.forEach((selected: boolean, colIndex: number) => {\n this.selectCell(rowIndex, colIndex, selected);\n colSelectedCount[colIndex] += selected ? 1 : 0;\n });\n }\n });\n\n colSelectedCount.forEach((selected: number, index: number) => {\n this.header?.setColumnCheckbox(index, selected >= this.rowCount);\n });\n }\n\n /**\n * Get the row HTMLElement\n * @param {number} rowIndex the zero based index\n * @returns {HTMLElement} Row HTMLElement\n */\n rowByIndex(rowIndex: number): IdsDataGridRow | undefined | null {\n const maxRowIndex = this.data.length - 1;\n rowIndex = Math.max(rowIndex, 0);\n rowIndex = Math.min(rowIndex, maxRowIndex);\n return this.shadowRoot?.querySelector<IdsDataGridRow>(`.ids-data-grid-body ids-data-grid-row[row-index=\"${rowIndex}\"]`);\n }\n\n activeCellEditor?: IdsDataGridCell;\n\n /**\n * Commit editing on any active editor\n */\n commitCellEdit() {\n this.activeCellEditor?.endCellEdit();\n }\n\n /**\n * Cancel editing on any active editor\n */\n cancelCellEdit() {\n this.activeCellEditor?.cancelCellEdit();\n }\n\n /**\n * Add a row to the data grid by appending individual row element\n * @param {Record<string, unknown>} data the data to add to the row\n * @param {number} index insert position for new row\n */\n addRow(data: Record<string, unknown>, index?: number) {\n if (data) hideEmptyMessage.apply(this);\n\n // Update data\n const insertIdx = index ?? this.data.length;\n this.data.splice(insertIdx, 0, data);\n\n // Append new row element to DOM\n const body = this.container?.querySelector('.ids-data-grid-body');\n const rowElement = IdsDataGridRow.template(data, insertIdx, insertIdx + 1, this);\n body?.insertAdjacentHTML('beforeend', rowElement);\n\n // Update grid state\n this.#updateRowCount();\n this.syncPagerAfterDatasetChange();\n }\n\n /**\n * Add multiple rows to the data grid by calling addRow for each\n * @param {Array<Record<string, unknown>>} data Array of row data objects to add\n * @param {number} index Optional insert position for new rows (defaults to end)\n */\n addRows(data: Array<Record<string, unknown>> = [], index?: number) {\n data.forEach((rowData, i) => {\n const insertIdx = (index ?? this.datasource.originalData.length) + i;\n this.addRow(rowData, insertIdx);\n });\n }\n\n /**\n * Remove a row by index for the data\n * @param {number} index the row index to remove\n * @param {Array<Record<string, unknown>>} data to be deleted\n */\n removeRow(index: number, data?: Record<string, unknown>) {\n // Update data\n if (data === undefined || !data[this.idColumn]) {\n data = this.data[index];\n data[this.idColumn] = this.data[index][this.idColumn] || this.uniqueId;\n }\n\n this.datasource.delete([data]);\n this.datasource.refreshPreviousState();\n\n // Update grid state\n this.redrawBody();\n this.#updateRowCount();\n this.syncPagerAfterDatasetChange();\n\n this.triggerEvent('rowremoved', this, {\n detail: {\n elem: this, data\n }\n });\n }\n\n /**\n * Clear all values in a row a row by index\n * @param {number} index the row index to clear\n * @param {Array<Record<string, unknown>>} data to be cleared\n */\n clearRow(index: number, data?: Record<string, unknown>) {\n if (data === undefined) {\n data = {};\n }\n\n if (this.data[index]) {\n data.colSelected = this.data[index].colSelected;\n }\n\n this.updateDataset(index, data, true);\n this.datasource.refreshPreviousState();\n\n this.redrawBody();\n }\n\n /**\n * Corrects pager-related attributes after a change to the dataset\n */\n private syncPagerAfterDatasetChange() {\n if (this.pager) {\n this.pageTotal = this.datasource.total;\n if (this.pageNumber !== this.datasource.pageNumber) this.pageNumber = this.datasource.pageNumber;\n }\n }\n\n get isEditable() {\n return this.columns?.some((column) => !!column?.editor);\n }\n\n /**\n * Edit the first editable cell\n */\n editFirstCell() {\n if (this.isEditable) this.activeCell?.node?.parentElement?.querySelector('.is-editable:not(.formatter-selectionCheckbox)')?.startCellEdit();\n }\n\n /**\n * Set a row to selected\n * @param {number} index the zero based index\n * @param {boolean} triggerEvent fire an event with the selected row\n * @param {boolean} setActive also set the active cell to enable keyboard navigation\n */\n selectRow(index: number, triggerEvent = true, setActive = false) {\n const row = this.rowByIndex(index);\n\n // If virtual scroll and row not in DOM, just save state in data\n if (this.virtualScroll && !row && this.data[index]) {\n if (this.rowSelection === 'single') this.deSelectAllRows();\n this.updateDataset(index, { rowSelected: true });\n\n // Set internal state for shift-key selection to work properly\n this.#lastSelectedRow = index;\n if (this.#initiallySelectedRow === null) {\n this.#initiallySelectedRow = index;\n }\n\n return;\n }\n\n if (!row || row.selected) return;\n\n let canSelect = true;\n const response = (veto: any) => {\n canSelect = !!veto;\n };\n\n if (triggerEvent) {\n this.triggerEvent('beforerowselected', this, {\n detail: {\n elem: this, row, data: this.data[index], response\n }\n });\n }\n\n if (!canSelect) {\n return;\n }\n\n if (this.rowSelection === 'multiple' || this.rowSelection === 'mixed') {\n const checkbox = row?.querySelector('.is-selection-checkbox .ids-data-grid-checkbox');\n checkbox?.classList.add('checked');\n checkbox?.setAttribute('aria-checked', 'true');\n }\n\n if (this.rowSelection === 'single') {\n this.deSelectAllRows();\n const radio = row?.querySelector('.ids-data-grid-radio') || row?.querySelector('.is-selection-checkbox .ids-data-grid-checkbox');\n radio?.classList.add('checked');\n radio?.setAttribute('aria-checked', 'true');\n }\n\n this.updateDataset(index, { rowSelected: true });\n this.selectServerSide(index);\n row.selected = true;\n\n if ((this.rowSelection === 'single' || this.rowSelection === 'multiple') && row) {\n row.updateCells(index);\n }\n\n if (triggerEvent) {\n this.triggerEvent('rowselected', this, {\n detail: {\n elem: this, row, data: this.data[index]\n }\n });\n }\n\n if (this.groupSelectsChildren) row?.toggleChildRowSelection(true);\n this.header?.setHeaderCheckbox();\n\n // Set internal state for shift-key selection to work properly\n this.#lastSelectedRow = index;\n if (this.#initiallySelectedRow === null) {\n this.#initiallySelectedRow = index;\n }\n\n // Optionally set active cell to enable keyboard navigation\n if (setActive) {\n this.setActiveCell(0, index, false, 'method');\n }\n }\n\n /**\n * Select all cells in that column\n * @param {number} colIndex Column index\n */\n selectColumn(colIndex: number) {\n this.columns[colIndex].isSelected = true;\n for (let rowIndex = 0; rowIndex < this.rowCount; rowIndex++) {\n this.selectCell(rowIndex, colIndex, true);\n }\n }\n\n /**\n * Set the cell to selected or unselected\n * @param {number} rowIndex Row index of the target cell\n * @param {number} colIndex Column index of the target cell\n * @param {boolean} isSelected True to select, false to deselect\n */\n selectCell(rowIndex: number, colIndex: number, isSelected: boolean) {\n const cell = this.cellByIndex(rowIndex, colIndex);\n\n let colSelected = this.data[rowIndex].colSelected;\n if (!colSelected) {\n colSelected = Array(this.columns.length).fill(false);\n }\n\n if (isSelected) {\n cell?.classList.add('selected');\n } else {\n cell?.classList.remove('selected');\n }\n\n colSelected[colIndex] = isSelected;\n this.updateDataset(rowIndex, { colSelected });\n }\n\n /**\n * Stores a record in server-side selections\n * @param {number} index the row number to select\n * @returns {void}\n */\n selectServerSide(index: number) {\n if (this.pagination !== 'server-side') return;\n\n const record = this.data[index];\n // eslint-disable-next-line arrow-body-style\n const storedIndex = this.serverSideSelections.findIndex((item) => {\n return item.data[this.idColumn] === record[this.idColumn];\n });\n\n if (storedIndex === -1) {\n this.serverSideSelections.push({\n index,\n data: record\n });\n }\n }\n\n /**\n * When using server-side paging, syncs records coming from IdsDataSource\n * that should be \"selected\" according to previously-selected rows.\n * @returns {void}\n */\n syncServerSelections() {\n this.data.forEach((record, i) => {\n // eslint-disable-next-line arrow-body-style\n const serverSelected = this.serverSideSelections.findIndex((item) => {\n return item.data[this.idColumn] === record[this.idColumn];\n });\n if (serverSelected > -1) {\n this.data[i].rowSelected = true;\n }\n });\n }\n\n /**\n * Set a row to be deselected\n * @param {number} index the zero based index\n * @param {boolean} triggerEvent fire an event with the deselected row\n */\n deSelectRow(index: number, triggerEvent = true) {\n const row = this.rowByIndex(index);\n\n // If virtual scroll and row not in DOM, just save state in data\n if (this.virtualScroll && !row && this.data[index]) {\n this.updateDataset(index, { rowSelected: false });\n return;\n }\n\n if (!row) return;\n\n let canDeselect = true;\n const response = (veto: any) => {\n canDeselect = !!veto;\n };\n\n if (triggerEvent) {\n this.triggerEvent('beforerowdeselected', this, {\n detail: {\n elem: this, row, data: this.data[index], response\n }\n });\n }\n\n if (!canDeselect) {\n return;\n }\n\n if (this.rowSelection === 'mixed') {\n row.classList.remove('mixed');\n }\n row.classList.remove('selected');\n row.removeAttribute('aria-selected');\n\n if (this.rowSelection === 'multiple' || this.rowSelection === 'mixed') {\n const checkbox = row.querySelector('.is-selection-checkbox .ids-data-grid-checkbox');\n checkbox?.classList.remove('checked');\n checkbox?.setAttribute('aria-checked', 'false');\n }\n\n if (this.rowSelection === 'single') {\n const radio = row.querySelector('.ids-data-grid-radio') || row.querySelector('.is-selection-checkbox .ids-data-grid-checkbox');\n radio?.classList.remove('checked');\n radio?.setAttribute('aria-checked', 'false');\n }\n\n this.updateDataset(index, { rowSelected: false });\n this.deselectServerSide(index);\n\n if (triggerEvent) {\n this.triggerEvent('rowdeselected', this, {\n detail: {\n elem: this, row, data: this.data[index]\n }\n });\n }\n\n row.updateCells(index);\n if (this.groupSelectsChildren) row.toggleChildRowSelection(false);\n this.header?.setHeaderCheckbox();\n }\n\n /**\n * Deselect all the cell in the column\n * @param {number} colIndex Column index\n */\n deSelectColumn(colIndex: number) {\n this.columns[colIndex].isSelected = false;\n for (let rowIndex = 0; rowIndex < this.rowCount; rowIndex++) {\n this.selectCell(rowIndex, colIndex, false);\n }\n\n this.header?.setColumnCheckbox(colIndex, false);\n }\n\n /**\n * Removes a record from server-side selections\n * @param {number} index the row number to select\n * @returns {void}\n */\n deselectServerSide(index: number) {\n if (this.pagination !== 'server-side') return;\n\n const record = this.data[index];\n // eslint-disable-next-line arrow-body-style\n const storedIndex = this.serverSideSelections.findIndex((item) => {\n return item.data[this.idColumn] === record[this.idColumn];\n });\n if (storedIndex > -1) {\n this.serverSideSelections.splice(storedIndex, 1);\n }\n }\n\n /**\n * Set a row to activated\n * @param {number} index the zero based index\n */\n activateRow(index: number) {\n let row: any = index;\n if (typeof index === 'number') {\n row = this.rowByIndex(index);\n }\n\n if (!row || this.rowSelection !== 'mixed') {\n return;\n }\n\n (row as any).classList.add('activated');\n this.updateDataset(Number(row?.getAttribute('data-index')), { rowActivated: true });\n row?.updateCells(index);\n\n this.triggerEvent('rowactivated', this, {\n detail: {\n elem: this, row, data: this.data[index], index\n }\n });\n }\n\n /**\n * Set a row to be deactivated\n * @param {number} index the zero based index\n */\n deactivateRow(index: any) {\n if (typeof index === 'undefined' || index === null) {\n return;\n }\n let row = index;\n\n if (typeof index === 'number') {\n row = this.rowByIndex(index);\n }\n\n if (!row || this.rowSelection !== 'mixed') {\n return;\n }\n row.classList.remove('activated');\n this.updateDataset(Number(row?.getAttribute('data-index')), { rowActivated: undefined });\n row.updateCells(index);\n\n this.triggerEvent('rowdeactivated', this, {\n detail: {\n elem: this, row, data: this.data[index], index\n }\n });\n }\n\n /**\n * Set a all rows to be selected\n */\n selectAllRows() {\n this.data?.forEach((row: any, index: number) => {\n if (!row.disabled) {\n this.selectRow(index, !this.suppressSelectAllEvents);\n row.rowSelected = true;\n }\n });\n\n this.triggerEvent('selectionchanged', this, {\n detail: {\n elem: this,\n selectedRows: this.selectedRows\n }\n });\n this.header?.setHeaderCheckbox();\n }\n\n /**\n * Set a all rows to be deselected\n */\n deSelectAllRows() {\n this.data?.forEach((row: any, index: number) => {\n if (row.rowSelected) {\n this.deSelectRow(index, !this.suppressSelectAllEvents);\n row.rowSelected = false;\n }\n });\n\n if (this.colSelection || this.cellSelection) {\n this.columns.forEach((_col: IdsDataGridColumn, colIndex: number) => {\n this.deSelectColumn(colIndex);\n });\n }\n\n this.triggerEvent('selectionchanged', this, {\n detail: {\n elem: this,\n selectedRows: this.selectedRows\n }\n });\n this.header?.setHeaderCheckbox();\n this.#startSelectionCell = null;\n this.#endSelectionCell = null;\n }\n\n /**\n * Toggle the selection of all rows\n */\n toggleSelectAllRows() {\n // Check if all rows are currently selected\n const allRowsSelected = this.data?.every((row: any) => row.rowSelected);\n\n if (allRowsSelected) {\n // If any rows are selected, deselect all\n this.deSelectAllRows();\n } else {\n this.selectAllRows();\n }\n }\n\n /**\n * Set/Get the total number of records\n * @returns {number} The no of rows (flattened trees)\n */\n get rowCount() {\n return this.data.length;\n }\n\n /**\n * Get the row height in pixels\n * @private\n * @returns {number} The pixel height\n */\n get rowPixelHeight(): number {\n const rowHeights: any = {\n xxs: 25,\n xs: 30,\n sm: 35,\n md: 40,\n lg: 50\n };\n\n return rowHeights[this.rowHeight] + 1;\n }\n\n /**\n * Set the card to auto fit to its parent size\n * @param {boolean|string|null} value The auto fit\n */\n set autoFit(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.AUTO_FIT, String(value));\n return;\n }\n this.removeAttribute(attributes.AUTO_FIT);\n }\n\n get autoFit(): boolean {\n return stringToBool(this.getAttribute(attributes.AUTO_FIT));\n }\n\n /**\n * Set the container height\n * @private\n */\n #applyAutoFit() {\n if (this.autoFitSet) {\n return;\n }\n if (this.autoFit === true) {\n const height = this.pagination === 'none' ? '100%' : `calc(100% - 44px)`;\n this.container?.style.setProperty('height', height);\n this.wrapper?.style.setProperty('height', '100%');\n this.autoFitSet = true;\n }\n }\n\n /**\n * Suppress row row and cell caching\n * @param {boolean|string|null} value false to not cache\n */\n set suppressCaching(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.SUPPRESS_CACHING, String(value));\n return;\n }\n this.removeAttribute(attributes.SUPPRESS_CACHING);\n }\n\n get suppressCaching(): boolean {\n return stringToBool(this.getAttribute(attributes.SUPPRESS_CACHING)) || false;\n }\n\n /**\n * Set the active cell for focus\n * @param {number} cellNumber The cell to focus (zero based)\n * @param {number} rowIndex The row to focus (zero based)\n * @param {boolean} noFocus If true, do not focus the cell\n * @param {string} reason Explains why the cell is being set active\n * @returns {object} the current active cell\n */\n setActiveCell(cellNumber: number, rowIndex: number, noFocus?: boolean, reason?: IdsDataGridActivationReason) {\n if (rowIndex < 0 || cellNumber < 0 || rowIndex > this.data.length - 1\n || cellNumber > this.visibleColumns.length - 1 || Number.isNaN(rowIndex) || Number.isNaN(rowIndex)) {\n return this.activeCell;\n }\n\n if (!this.activeCell) this.activeCell = {};\n this.activeCell.cell = Number(cellNumber);\n this.activeCell.row = Number(rowIndex);\n\n // Cache the active cell state\n const currentCell = this.cellByIndex(rowIndex, cellNumber);\n this.updateActiveCellCache(rowIndex, cellNumber, currentCell?.value);\n\n let rowNode = this.rowByIndex(rowIndex);\n if (!rowNode && this.virtualScroll) {\n this.#scrollRowIntoView(rowIndex);\n rowNode = this.rowByIndex(rowIndex);\n }\n\n const queriedCells = rowNode?.querySelectorAll<HTMLElement>('ids-data-grid-cell');\n if (queriedCells && queriedCells.length > 0) {\n const cellNode = queriedCells[cellNumber] as IdsDataGridCell;\n cellNode.activate(Boolean(noFocus), reason);\n }\n return this.activeCell;\n }\n\n /**\n * Sets disable client filter\n * @param {boolean|string} value IThe value\n */\n set disableClientFilter(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.DISABLE_CLIENT_FILTER, '');\n } else {\n this.removeAttribute(attributes.DISABLE_CLIENT_FILTER);\n }\n }\n\n get disableClientFilter() {\n const value = this.getAttribute(attributes.DISABLE_CLIENT_FILTER);\n return value !== null ? stringToBool(value) : this.filters.DEFAULTS.disableClientFilter;\n }\n\n /**\n * Sets the data grid to be filterable\n * @param {boolean|string} value If true will set filterable\n */\n set filterable(value) {\n if (typeof value !== 'undefined' && value !== null) {\n this.setAttribute(attributes.FILTERABLE, String(value));\n } else {\n this.removeAttribute(attributes.FILTERABLE);\n }\n this.header?.setFilterRow();\n }\n\n get filterable() {\n const value = this.getAttribute(attributes.FILTERABLE);\n return value !== null ? stringToBool(value) : this.filters.DEFAULTS.filterable;\n }\n\n /**\n * Keep filter conditions when calling `data` to reload data\n * @param {boolean|string} value If true will reapply the filter\n */\n set keepFilterConditions(value: boolean | string) {\n const keep = stringToBool(value);\n if (keep) {\n this.setAttribute(attributes.KEEP_FILTER_CONDITIONS, String(keep));\n } else {\n this.removeAttribute(attributes.KEEP_FILTER_CONDITIONS);\n }\n }\n\n get keepFilterConditions() {\n return this.getAttribute(attributes.KEEP_FILTER_CONDITIONS) || false;\n }\n\n /**\n * Sets disabled to be filter row\n * @param {boolean|string} value The value\n */\n set filterRowDisabled(value) {\n const isApply = this.filterRowDisabled !== stringToBool(value);\n if (typeof value !== 'undefined' && value !== null) {\n this.setAttribute(attributes.FILTER_ROW_DISABLED, String(value));\n } else {\n this.removeAttribute(attributes.FILTER_ROW_DISABLED);\n }\n if (isApply) this.filters?.setFilterRowDisabled();\n }\n\n get filterRowDisabled() {\n const value = this.getAttribute(attributes.FILTER_ROW_DISABLED);\n return value !== null ? stringToBool(value) : this.filters.DEFAULTS.filterRowDisabled;\n }\n\n /**\n * Sets the data grid to filter when typing\n * @param {boolean|string} value The value\n */\n set filterWhenTyping(value) {\n const isApply = this.filterWhenTyping !== stringToBool(value);\n if (typeof value !== 'undefined' && value !== null) {\n this.setAttribute(attributes.FILTER_WHEN_TYPING, String(value));\n } else {\n this.removeAttribute(attributes.FILTER_WHEN_TYPING);\n }\n if (isApply) this.filters?.setFilterWhenTyping();\n }\n\n get filterWhenTyping() {\n const value = this.getAttribute(attributes.FILTER_WHEN_TYPING);\n return value !== null ? stringToBool(value) : this.filters.DEFAULTS.filterWhenTyping;\n }\n\n /**\n * Sets the grid to render as a tree grid (does require a tree formatter column)\n * @param {boolean|string} value The value\n */\n set treeGrid(value) {\n if (stringToBool(value)) {\n this.setAttribute(attributes.TREE_GRID, value.toString());\n } else {\n this.removeAttribute(attributes.TREE_GRID);\n }\n }\n\n get treeGrid() {\n return this.hasAttribute(attributes.TREE_GRID);\n }\n\n /**\n * Sets the grid to group rows (only one field is supported)\n * @param {GroupableOptions} value The group by options\n */\n set groupable(value: GroupableOptions) {\n if (value) {\n this.state.groupable = value;\n } else {\n delete this.state.groupable;\n }\n }\n\n get groupable(): GroupableOptions {\n return this.state.groupable;\n }\n\n /**\n * If true then the children will be selected when a group is selected\n * @param {boolean|string} value The value\n */\n set groupSelectsChildren(value) {\n value = stringToBool(value);\n if (value) {\n this.setAttribute(attributes.GROUP_SELECTS_CHILDREN, value.toString());\n } else {\n this.removeAttribute(attributes.GROUP_SELECTS_CHILDREN);\n }\n }\n\n get groupSelectsChildren() {\n return stringToBool(this.getAttribute(attributes.GROUP_SELECTS_CHILDREN)) || false;\n }\n\n /**\n * Used to set which column is the unique id column in the data set.\n * This is needed for some operations.\n * @param {string} value The value\n */\n set idColumn(value) {\n if (value) {\n this.setAttribute(attributes.ID_COLUMN, value.toString());\n this.datasource.primaryKey = value;\n } else {\n this.removeAttribute(attributes.ID_COLUMN);\n this.datasource.primaryKey = this.idColumn;\n }\n }\n\n get idColumn() {\n return this.getAttribute(attributes.ID_COLUMN) || 'id';\n }\n\n /**\n * If true an expandable row is present in the grid. Also requires a expandable-row-template and\n * an expander formatter.\n * @param {string} value The value\n */\n set expandableRow(value) {\n if (value) {\n this.setAttribute(attributes.EXPANDABLE_ROW, value.toString());\n } else {\n this.removeAttribute(attributes.EXPANDABLE_ROW);\n }\n }\n\n get expandableRow() {\n return this.getAttribute(attributes.EXPANDABLE_ROW) || false;\n }\n\n /**\n * This setting will allow only one expandable-row to be opened/expanded at a time.\n * @param {string} value The value\n */\n set allowOneExpandedRow(value) {\n this.toggleAttribute(attributes.ALLOW_ONE_EXPANDED_ROW, stringToBool(value));\n }\n\n get allowOneExpandedRow() {\n return this.hasAttribute(attributes.ALLOW_ONE_EXPANDED_ROW);\n }\n\n /**\n * An id that points to the template to use for expandable rows. Also requires the expandable-row setting\n * and an expander formatter.\n * @param {string} value The value\n */\n set expandableRowTemplate(value) {\n if (value) {\n this.setAttribute(attributes.EXPANDABLE_ROW_TEMPLATE, value.toString());\n } else {\n this.removeAttribute(attributes.EXPANDABLE_ROW_TEMPLATE);\n }\n }\n\n get expandableRowTemplate() {\n return this.getAttribute(attributes.EXPANDABLE_ROW_TEMPLATE) || '';\n }\n\n /**\n * Set uniqueId to save to local storage.\n * @param {number|string|null} value A uniqueId use to save to local storage.\n */\n set uniqueId(value: number | string | null) {\n const val = /number|string/g.test(typeof value) ? `${value}` : null;\n if (typeof val === 'string' && val !== '') {\n this.setAttribute(attributes.UNIQUE_ID, val);\n } else {\n this.removeAttribute(attributes.UNIQUE_ID);\n }\n }\n\n get uniqueId(): string | null { return this.getAttribute(attributes.UNIQUE_ID); }\n\n /**\n * Set to true if one or more editors is present to activate editing\n * @param {boolean} value true indicates some cells may be editable\n */\n set editable(value: boolean) {\n value = stringToBool(value);\n if (value) {\n this.setAttribute(attributes.EDITABLE, value.toString());\n } else {\n this.removeAttribute(attributes.EDITABLE);\n }\n }\n\n get editable(): boolean {\n return stringToBool(this.getAttribute(attributes.EDITABLE));\n }\n\n /**\n * Set to false to avoid moving up and down rows when editing and hitting enter\n * @param {boolean} value false indicates the grid will not switch rows on edit\n */\n set editNextOnEnterPress(value: boolean) {\n value = stringToBool(value);\n if (value) {\n this.setAttribute(attributes.EDIT_NEXT_ON_ENTER_PRESS, value.toString());\n } else {\n this.removeAttribute(attributes.EDIT_NEXT_ON_ENTER_PRESS);\n }\n }\n\n get editNextOnEnterPress(): boolean {\n return stringToBool(this.getAttribute(attributes.EDIT_NEXT_ON_ENTER_PRESS));\n }\n\n /**\n * Set to true to automatically append rows when keyboard navigating\n * the data grid in editable mode\n * @param {boolean} val boolean flag\n */\n set addNewAtEnd(val: string | boolean) {\n if (stringToBool(val)) {\n this.setAttribute(attributes.ADD_NEW_AT_END, 'true');\n } else {\n this.removeAttribute(attributes.ADD_NEW_AT_END);\n }\n }\n\n get addNewAtEnd(): boolean {\n return stringToBool(this.getAttribute(attributes.ADD_NEW_AT_END));\n }\n\n /**\n * Get all the currently invalid cells\n * @returns {Array<{ row: number, cell: number, columnId: string | null, validationMessages: any }>} cell invalid info\n */\n get invalidCells(): Array<{ row: number, cell: number, columnId: string | null, validationMessages: any }> {\n const invalidCells: Array<{ row: number, cell: number, columnId: string | null, validationMessages: any }> = [];\n for (let index = 0; index < this.data.length; index++) {\n if (this.data[index]?.invalidCells) {\n this.data[index].invalidCells?.forEach((invalidCellInRow: any) => {\n invalidCellInRow.row = index;\n });\n invalidCells.push(...this.data[index].invalidCells);\n }\n }\n return invalidCells;\n }\n\n /**\n * Get all the currently dirty cells\n * @returns {Array<{ row: number, cell: number, columnId: string | null, originalValue: any }>} info about the dirty cells\n */\n get dirtyCells(): Array<{ row: number, cell: number, columnId: string | null, originalValue: any }> {\n const dirtyCells: Array<{ row: number, cell: number, columnId: string | null, originalValue: any }> = [];\n for (let index = 0; index < this.data.length; index++) {\n if (this.data[index]?.dirtyCells) {\n this.data[index].dirtyCells?.forEach((dirtyCellInRow: any) => {\n dirtyCellInRow.row = index;\n });\n dirtyCells.push(...this.data[index].dirtyCells);\n }\n }\n return dirtyCells;\n }\n\n /**\n * Reset any currently dirty cells\n */\n resetDirtyCells() {\n this.data.forEach((row, idx) => {\n this.resetDirtyRow(idx);\n });\n }\n\n /**\n * Reset any currently dirty cells for a specific row\n * @param {number} rowIndex The row index to reset the dirty state\n */\n resetDirtyRow(rowIndex: number) {\n const row = this.rowByIndex(rowIndex);\n const rowData = this.data[rowIndex];\n\n row?.querySelectorAll('ids-data-grid-cell.is-dirty').forEach((cell) => {\n cell.classList.remove('is-dirty');\n });\n\n // Reset the dirty cell state in the data as well\n if (rowData?.dirtyCells) {\n delete rowData.dirtyCells;\n }\n }\n\n /**\n * Toggles text mask visibility for all cells in a specified column.\n * @param {number} colIndex - The column index (1-based) to toggle\n * @param {boolean | undefined} mask - Optional mask state; if undefined, toggles current state\n * @returns {void}\n */\n toggleTextMaskColumn(colIndex: number, mask: boolean | undefined = undefined) {\n const formatterFn = new IdsDataGridFormatters();\n for (let i = 0; i < this.rows.length; i++) {\n const row = this.rows[i];\n const cellElement = row?.querySelector<IdsDataGridCell>(`[aria-colindex=\"${colIndex}\"]`);\n const columnData = this.columns.at(colIndex - 1);\n const dataIndex = row.getAttribute('data-index');\n\n if (dataIndex === null || !cellElement || !columnData || !columnData?.formatter) {\n return;\n }\n\n const cellData = this.data[+dataIndex][columnData.id];\n\n formatterFn.textmaskAction(cellData, cellElement, columnData, mask);\n this.tooltip.detachAllEvents();\n }\n }\n\n /**\n * Export data grid to excel\n * @param {string} format csv or xlsx\n * @param {string} filename filename\n * @param {boolean} keepGridFormatting keep grid formatting, or pass raw datasource data\n */\n exportToExcel(format: 'csv' | 'xlsx', filename: string, keepGridFormatting = true) {\n const xlColumns: Record<string, ExcelColumn> = {};\n const gridColCache: Record<string, IdsDataGridColumn> = {};\n format = format === 'csv' || format === 'xlsx' ? format : 'xlsx';\n keepGridFormatting = format === 'csv' ? true : keepGridFormatting;\n\n // create excel col config from grid column config\n this.columns.forEach((gridCol) => {\n if (gridCol.id && gridCol.field && gridCol.name && gridCol?.exportable !== false) {\n gridColCache[gridCol.id] = gridCol;\n\n xlColumns[gridCol.id] = {\n id: gridCol.id,\n field: gridCol.field,\n name: Array.isArray(gridCol.name) ? `${gridCol.name[0]} ${gridCol.name[0].emphasis === 'subtle' ? '(' : ''}${gridCol.name[0]}${gridCol.name[0].emphasis === 'subtle' ? ')' : ''}` : gridCol.name,\n type: keepGridFormatting ? 'string' : this.determineColType(gridCol)\n };\n }\n });\n\n // Get excel data from grid data source\n const elem = document.createElement('span');\n const xlData: Array<Record<string, any>> = !keepGridFormatting\n ? this.datasource.data\n : this.datasource.data.map((rowData, rowIndex) => {\n const xlDataRow: Record<string, any> = {};\n\n Object.keys(xlColumns).forEach((id) => {\n const gridCol = gridColCache[id];\n const formatter = gridCol?.formatter;\n const isNumber = formatter === this.formatters.decimal || formatter === this.formatters.integer;\n const isCheckbox = formatter === this.formatters.checkbox;\n const rawValue = rowData[xlColumns[id].field];\n let excelValue = rawValue;\n\n // Apply custom export formatter if provided\n if (gridCol.exportFormatter) excelValue = gridCol.exportFormatter(rawValue, rowData);\n else if (isCheckbox && typeof rawValue === 'boolean') excelValue = rawValue ? 'True' : 'False';\n // use grid formatted strings for non number truthy values\n else if (rawValue !== undefined && rawValue !== null && !isNumber && formatter) {\n const formattedValue = formatter.call(this.formatters, rowData, gridCol!, rowIndex, this);\n elem.innerHTML = formattedValue;\n excelValue = elem.textContent?.trim();\n }\n\n xlDataRow[id] = excelValue;\n });\n\n return xlDataRow;\n });\n\n const exporter = format === 'csv' ? exportToCSV : exportToXLSX;\n exporter(xlData, {\n filename: filename || 'data-grid',\n columns: Object.values(xlColumns)\n });\n }\n\n /**\n * Get excel data type from data grid column formattter\n * @param {IdsDataGridColumn} gridCol grid column config\n * @returns {string} matching excel type\n */\n private determineColType(gridCol: IdsDataGridColumn): string {\n let type = 'string';\n\n if (gridCol.formatter === this.formatters.integer || gridCol.formatter === this.formatters.decimal) {\n type = 'number';\n }\n\n if (gridCol.formatter === this.formatters.date) {\n type = 'date';\n }\n\n if (gridCol.formatter === this.formatters.time) {\n type = 'time';\n }\n\n return type;\n }\n\n /**\n * Find a specific IdsDataGridCell element using row-index and column-index.\n * @param {number} rowIndex the zero-based row index\n * @param {number} columnIndex the zero-based column index\n * @returns {IdsDataGridCell} html element for cell\n */\n cellByIndex(rowIndex: number, columnIndex: number): IdsDataGridCell | null {\n return this.rowByIndex(rowIndex)?.cellByIndex?.(columnIndex) ?? null;\n }\n\n /**\n * Removes filter row menus that have been moved from filter row headers into the data grid wrapper\n * @private\n */\n #removeAttachedMenus() {\n const attachedMenus = this.wrapper?.querySelectorAll<IdsPopupMenu>('ids-popup-menu');\n if (attachedMenus?.length) {\n [...attachedMenus].forEach((el: IdsPopupMenu) => el.remove());\n }\n }\n\n /**\n * Checks on the active cell editor to see if its current state allows it to be closed.\n * @returns {boolean} true if the cell editor is able to \"close\"\n */\n private activeCellCanClose(): boolean {\n if (this.activeCellEditor?.isEditing) return false;\n if (this.activeCellEditor?.editor?.popup?.visible) return false;\n if (this.activeCellEditor?.column?.editor?.inline) return false;\n\n return true;\n }\n\n /**\n * Hide any open context menus\n * @private\n */\n hideOpenMenus() {\n const openMenus = document.querySelector<IdsPopupMenu>('ids-popup-menu:not([hidden])');\n if (openMenus) {\n openMenus.hide();\n }\n }\n\n /**\n * Inherited from `ids-pager-mixin`.\n * Fires when the pager requires a data reload\n */\n onPagingReload() {\n if (this.pagination !== 'server-side') {\n this.redrawBody();\n }\n }\n\n modalTemplate = `<ids-modal id=\"datagrid-modal\" scrollable>\n <ids-text slot=\"title\" font-size=\"24\" type=\"h2\" id=\"datagrid-modal-title\">${this.localeAPI.translate('PersonalizeColumns')}</ids-text>\n <ids-modal-button slot=\"buttons\" id=\"datagrid-modal-close-btn\" appearance=\"primary\">\n <span>${this.localeAPI.translate('Close')}</span>\n </ids-modal-button>\n <ids-search-field clearable label=\"${this.localeAPI.translate('SearchColumnName')}\" label-state=\"collapsed\" size=\"full\"></ids-search-field>\n <ids-swappable></ids-swappable>\n </ids-modal>`;\n\n /**\n * Show a modal with selection options for the columns and grouped rows\n */\n async showPersonalizationDialog() {\n // Append and translate modal\n const modalSlot = this.shadowRoot!.querySelector('slot[name=\"modal-container\"]')!;\n modalSlot.innerHTML = this.modalTemplate;\n const modal = modalSlot.querySelector('#datagrid-modal') as IdsModal;\n const closeButton = modalSlot.querySelector('#datagrid-modal-close-btn')!;\n closeButton.querySelector('span')!.textContent = this.localeAPI.translate('Close');\n modal.querySelector('[slot=\"title\"]')!.textContent = this.localeAPI.translate('PersonalizeColumns');\n\n const searchfield = modal.querySelector<IdsSearchField>('ids-search-field')!;\n searchfield!.placeholder = this.localeAPI.translate('SearchColumnName');\n searchfield!.label = this.localeAPI.translate('SearchColumnName');\n\n // Populate Columns\n let swappables = '';\n this.columns.forEach((column) => {\n const item = `<ids-swappable-item ${!column?.reorderable ? ' disable-drag' : ''} column-id=\"${column?.id}\" ${column?.hideable === false ? ` disabled=\"true\"` : ''}>\n <ids-text font-size=\"16\" type=\"p\">${column?.name}</ids-text>\n <ids-switch${!column?.hidden ? ` checked=\"true\"` : ''}${column?.hideable === false ? ` disabled=\"true\"` : ''} name=\"${column?.id}\"></ids-switch>\n </ids-swappable-item>`;\n swappables += item;\n });\n\n const swappable = modal.querySelector('ids-swappable');\n swappable!.innerHTML = swappables;\n\n // Event Handlers for the dialog\n modal.onEvent('click', closeButton, async () => {\n await modal.hide();\n modal.remove();\n });\n modal.onEvent('change', modal, async (e: CustomEvent) => {\n if (e.detail?.elem?.tagName === 'IDS-SEARCH-FIELD') return;\n this.setColumnVisible(e?.detail?.elem.getAttribute('name'), (e?.target as IdsSwitch).checked);\n });\n modal.onEvent('swapped', swappable, async (e: CustomEvent) => {\n this.moveColumn(e.detail?.fromIndex, e.detail?.toIndex, true);\n });\n\n searchfield.offEvent('keyup', searchfield);\n searchfield.onEvent('keyup', searchfield, async (e: CustomEvent) => {\n if (!e.detail) this.#filterColumnList(modal, searchfield.value);\n });\n searchfield.onEvent('cleared', searchfield, async () => {\n this.#filterColumnList(modal, '');\n });\n await modal.show();\n }\n\n /**\n * Filter the column list\n * @param {HTMLElement} modal the modal to filter\n * @param {string} value the value to filter by\n */\n #filterColumnList(modal: HTMLElement, value: string) {\n modal.querySelector('ids-swappable')?.querySelectorAll<IdsSwappableItem>('ids-swappable-item').forEach((item: IdsSwappableItem) => {\n const textElem = item.querySelector('ids-text');\n if (textElem?.textContent?.toLowerCase().includes(value.toLowerCase())) {\n item.hidden = false;\n textElem.innerHTML = textElem.textContent!.replace(value, `<b>${value}</b>`);\n } else {\n item.hidden = true;\n }\n });\n }\n\n /**\n * Handle the copy event\n * @private\n * @param {ClipboardEvent} e Clipboard event when copy is triggered\n */\n #handleCopy(e: ClipboardEvent) {\n const selectedMap = this.selectedMap;\n const bounds = selectedMap.bounds;\n\n if (bounds.maxRow === -1) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const copyRows: Array<string> = [];\n\n for (let rowIndex = bounds.minRow; rowIndex <= bounds.maxRow; rowIndex++) {\n const rowData = [];\n\n for (let colIndex = bounds.minCol; colIndex <= bounds.maxCol; colIndex++) {\n const cell = selectedMap.map[rowIndex][colIndex];\n let copyValue = '';\n\n if (cell) {\n if (new Date(cell.target.textContent.trim()) instanceof Date) {\n copyValue = cell.target.textContent.trim();\n } else {\n copyValue = cell.target?.value ? cell.target.value : cell.value;\n }\n }\n\n rowData.push(copyValue);\n }\n\n copyRows.push(rowData.join('\\t'));\n }\n\n e.clipboardData?.setData('text/plain', copyRows.join('\\n'));\n }\n\n /**\n * Handle the paste event\n * @private\n * @param {ClipboardEvent} e Clipboard event when paste is triggered\n */\n #handlePaste(e: ClipboardEvent) {\n const selectedMap = this.selectedMap;\n\n if (selectedMap.bounds.maxRow === -1) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const pasteData = e.clipboardData?.getData('text/plain') || '';\n const pasteRows = pasteData.split(/\\r\\n|\\n|\\r/).map((row) => row.split('\\t'));\n\n const columns = this.rowSelection ? this.visibleColumns.slice(1, this.visibleColumns.length) : this.visibleColumns;\n const bounds = selectedMap.bounds;\n\n const activeCell = this.activeCell.node;\n\n if (this.activeCellEditor && this.activeCellCanClose()) {\n activeCell.cancelCellEdit();\n activeCell.focus();\n }\n\n if (bounds.maxRow === -1) {\n bounds.minRow = parseInt(activeCell.parentElement?.getAttribute('row-index') || '0');\n bounds.minCol = parseInt(activeCell.getAttribute('aria-colindex') || '0') - 1;\n bounds.minCol = this.rowSelection ? bounds.minCol - 1 : bounds.minCol;\n }\n\n let pRow = 0;\n let pCol;\n let shouldUpdate;\n\n for (let rowIndex = bounds.minRow; rowIndex <= this.data.length && pRow < pasteRows.length; rowIndex++) {\n pCol = 0;\n shouldUpdate = false;\n\n const updateData = { ...this.data[rowIndex] };\n\n for (let colIndex = bounds.minCol; colIndex <= this.columns.length && pCol < pasteRows[pRow].length; colIndex++) {\n const column = columns[colIndex];\n\n if (!column) continue;\n\n const cell = this.cellByIndex(rowIndex, this.rowSelection ? colIndex + 1 : colIndex);\n const cellEditable = !(cell?.classList.contains('is-readonly') || cell?.classList.contains('is-disabled')) && column.editor;\n\n if (cellEditable && pasteRows[pRow][pCol].length > 0) {\n let pasteValue: string = pasteRows[pRow][pCol];\n\n // Format the pasted value here\n if (column.editor && column.editor.editorSettings) {\n const settings = column.editor.editorSettings;\n\n if (settings.maxlength) {\n pasteValue = pasteValue.substring(0, settings.maxlength as number);\n }\n }\n\n shouldUpdate = true;\n updateData[column.field || column.id] = pasteValue;\n }\n\n pCol++;\n }\n\n if (shouldUpdate) {\n this.updateDatasetAndRefresh(rowIndex, updateData);\n }\n pRow++;\n }\n }\n\n /**\n * Forces closure of any open filter-related popup elements within the data grid\n */\n closePopupFilters() {\n const datagridChildrens = this.shadowRoot?.querySelector('.ids-data-grid-wrapper')?.children;\n if (!datagridChildrens) {\n return;\n }\n\n // list of popup menu tag names to be close\n const filterNodeNames = ['ids-date-picker-popup', 'ids-popup-menu', 'ids-time-picker-popup', 'ids-dropdown-list'];\n\n for (const child of datagridChildrens) {\n if (filterNodeNames.includes(child.nodeName?.toLowerCase())) {\n const popup = (child as any).popup;\n if (popup && popup.visible) (child as any).popup.hide();\n }\n }\n }\n\n /**\n * Set the text of a column header\n * @param {string} columnId The column to update\n * @param {string} text The new header text to set\n */\n setColumnHeaderText(columnId: string, text: string) {\n const column = this.columnDataById(columnId);\n if (!column || !text) return;\n\n const headerCell = this.shadowRoot?.querySelector(`[column-id=\"${columnId}\"]`);\n const textElement = headerCell?.querySelector('.ids-data-grid-header-text');\n if (textElement) {\n textElement.textContent = text;\n column.name = text;\n }\n }\n\n /**\n * Save all currently edited cell values before DOM recycling\n * @private\n */\n #saveEditedCellsBeforeScroll() {\n this.#editedCellsCache.clear();\n\n const editedCells: Array<IdsDataGridCell> = [];\n\n if (this.activeCell?.node?.isEditing) {\n editedCells.push(this.activeCell?.node);\n const activeCell = this.activeCell.node;\n const currentValue = activeCell.editor?.input?.value || '';\n this.updateActiveCellCache(this.activeCell.row, this.activeCell.cell, currentValue);\n this.#activeCellCache!.shouldReinstateCell = true;\n this.commitCellEdit();\n }\n\n for (const dirtyCell of this.dirtyCells) {\n const idsCell = this.cellByIndex(dirtyCell.row, dirtyCell.cell);\n if (idsCell) {\n editedCells.push(idsCell);\n }\n }\n\n editedCells?.forEach((cell: any) => {\n const rowIndex = parseInt(cell.parentElement?.getAttribute('row-index') || '-1');\n const columnIndex = parseInt(cell.getAttribute('aria-colindex') || '0') - 1;\n\n if (rowIndex >= 0 && columnIndex >= 0) {\n let currentValue = cell.value || cell.textContent || '';\n if (cell.isEditing && cell.editor?.input) {\n currentValue = cell.editor.input.value || cell.editor.input.textContent || '';\n }\n\n const cacheKey = `${rowIndex}-${columnIndex}`;\n this.#editedCellsCache.set(cacheKey, {\n rowIndex,\n columnIndex,\n currentValue,\n originalValue: cell.originalValue\n });\n }\n });\n }\n\n /**\n * Restore active cell focus and edit state after scroll ends\n * @private\n */\n #restoreActiveCellAfterScroll() {\n if (!this.#activeCellCache || !this.#activeCellCache?.shouldReinstateCell) {\n return;\n }\n\n const {\n rowIndex, columnIndex, currentValue\n } = this.#activeCellCache;\n\n // Check if the cached row and column exist in data\n if (rowIndex < 0 || rowIndex >= this.data.length || columnIndex < 0 || columnIndex >= this.visibleColumns.length) {\n return;\n }\n\n // Check if the cached row is currently visible on screen\n const rowElement = this.rowByIndex(rowIndex);\n if (!rowElement) {\n return;\n }\n\n // Only visually activate if row is in viewport for virtual scroll\n const scrollTop = this.container?.scrollTop || 0;\n const containerHeight = this.container?.clientHeight || 0;\n const rowHeight = this.virtualScrollSettings.ROW_HEIGHT;\n\n const rowTop = rowIndex * rowHeight;\n const rowBottom = rowTop + rowHeight;\n const viewportTop = scrollTop;\n const viewportBottom = scrollTop + containerHeight;\n\n const isInViewport = rowTop >= viewportTop && rowBottom <= viewportBottom;\n\n if (!isInViewport) {\n this.#activeCellCache.hasLeaveViewport = true;\n return; // Don't visually activate if not in viewport\n }\n\n if (!this.#activeCellCache.hasLeaveViewport) {\n // Exit when the active cell is not leaving the viewport\n return;\n }\n\n // Get the cell element\n const cellElement = this.cellByIndex(rowIndex, columnIndex);\n if (!cellElement) {\n return;\n }\n\n this.setActiveCell(columnIndex, rowIndex, false, 'internal');\n // Restore edit state if the cell was being edited\n if (cellElement.column?.editor) {\n cellElement.startCellEdit();\n if (cellElement.editor?.input) {\n cellElement.editor.input.value = currentValue;\n }\n }\n }\n\n /**\n * Restore edited cell values after DOM recycling\n * @private\n */\n #restoreEditedCellsAfterScroll() {\n if (this.#editedCellsCache.size === 0) {\n return;\n }\n\n const scrollTop = this.container?.scrollTop || 0;\n const containerHeight = this.container?.clientHeight || 0;\n const rowHeight = this.virtualScrollSettings.ROW_HEIGHT;\n const viewportTop = scrollTop;\n const viewportBottom = scrollTop + containerHeight;\n\n this.#editedCellsCache.forEach((cachedCell) => {\n const {\n rowIndex, columnIndex, currentValue, originalValue\n } = cachedCell;\n\n // Check if row is in viewport\n const rowTop = rowIndex * rowHeight;\n const rowBottom = rowTop + rowHeight;\n const isInViewport = rowTop >= viewportTop && rowBottom <= viewportBottom;\n\n if (!isInViewport) {\n return;\n }\n\n const rowElement = this.rowByIndex(rowIndex);\n if (!rowElement) {\n return;\n }\n\n const cellElement = this.cellByIndex(rowIndex, columnIndex);\n if (!cellElement) {\n return;\n }\n\n if (originalValue !== undefined) {\n cellElement.originalValue = originalValue;\n }\n\n // Only restore editing state for the cell that was actively being edited\n if (cellElement.column?.editor && this.#activeCellCache\n && this.#activeCellCache.rowIndex === rowIndex\n && this.#activeCellCache.columnIndex === columnIndex) {\n cellElement.startCellEdit(undefined, false);\n if (cellElement.editor?.input) {\n cellElement.editor.input.value = currentValue;\n }\n }\n });\n\n this.#editedCellsCache.clear();\n }\n\n /**\n * Add or update an edited cell in the cache\n * @param {number} rowIndex - The row index\n * @param {number} columnIndex - The column index\n * @param {string} currentValue - The current edited value\n * @param {string} originalValue - The original value before editing\n */\n cacheEditedCell(rowIndex: number, columnIndex: number, currentValue: string, originalValue?: string) {\n const cacheKey = `${rowIndex}-${columnIndex}`;\n this.#editedCellsCache.set(cacheKey, {\n rowIndex,\n columnIndex,\n currentValue,\n originalValue\n });\n }\n\n /**\n * Remove an edited cell from the cache (when editing is committed or cancelled)\n * @param {number} rowIndex - The row index\n * @param {number} columnIndex - The column index\n */\n removeEditedCellFromCache(rowIndex: number, columnIndex: number) {\n const cacheKey = `${rowIndex}-${columnIndex}`;\n this.#editedCellsCache.delete(cacheKey);\n }\n\n /**\n * Updates the active cell cache with new values\n * @param {number} row - The row index\n * @param {number} cell - The cell index\n * @param {string} cellValue - The current cell value\n */\n updateActiveCellCache(row: number, cell: number, cellValue: string) {\n this.#activeCellCache = {\n rowIndex: row,\n columnIndex: cell,\n currentValue: cellValue,\n hasLeaveViewport: false,\n shouldReinstateCell: true\n };\n }\n\n /**\n * Clears the active cell cache, optionally checking if the cached row is within viewport\n * @param {boolean} withinViewportCheck - If true, only clears cache if the cached row is visible in viewport\n * @returns {void}\n */\n clearActiveCellCache(withinViewportCheck = false) {\n if (withinViewportCheck && this.#activeCellCache) {\n const {\n rowIndex\n } = this.#activeCellCache;\n const rowElement = this.rowByIndex(rowIndex);\n const containerRect = this.container?.getBoundingClientRect();\n const rowRect = rowElement?.getBoundingClientRect();\n\n if (!containerRect || !rowRect) {\n return;\n }\n\n const isRowVisible = rowRect.top >= containerRect.top\n && rowRect.bottom <= containerRect.bottom;\n\n if (!isRowVisible) {\n return;\n }\n }\n\n this.#activeCellCache = null;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAO,wBAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
6
- "names": ["row"]
7
- }