barsa-sap-ui 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/esm2020/barsa-sap-ui.mjs +5 -0
- package/esm2020/lib/apply-conditional-formmatings.directive.mjs +84 -0
- package/esm2020/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +109 -0
- package/esm2020/lib/barsa-base-layout/barsa-base-layout.component.mjs +34 -0
- package/esm2020/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +71 -0
- package/esm2020/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +28 -0
- package/esm2020/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +77 -0
- package/esm2020/lib/barsa-network-offline/barsa-network-offline.component.mjs +45 -0
- package/esm2020/lib/barsa-sap-ui-routing.module.mjs +17 -0
- package/esm2020/lib/barsa-sap-ui.module.mjs +277 -0
- package/esm2020/lib/barsa-search-form/barsa-search-form.component.mjs +29 -0
- package/esm2020/lib/barsa-table-header/barsa-table-header.component.mjs +122 -0
- package/esm2020/lib/barsa-table-row/barsa-table-row.component.mjs +57 -0
- package/esm2020/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +334 -0
- package/esm2020/lib/barsa-tree-item/barsa-tree-item.component.mjs +120 -0
- package/esm2020/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +19 -0
- package/esm2020/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +156 -0
- package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +45 -0
- package/esm2020/lib/captcha-field/captcha-field.component.mjs +28 -0
- package/esm2020/lib/card-item/card-item.component.mjs +60 -0
- package/esm2020/lib/card-view-content/card-view-content.component.mjs +23 -0
- package/esm2020/lib/col-renderer.directive.mjs +50 -0
- package/esm2020/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +56 -0
- package/esm2020/lib/column-matrix-renderer/matrix-value.pipe.mjs +60 -0
- package/esm2020/lib/column-renderer/column-renderer.component.mjs +84 -0
- package/esm2020/lib/constants.mjs +413 -0
- package/esm2020/lib/custom-date-time/custom-date-time.component.mjs +41 -0
- package/esm2020/lib/device-info-field-base.mjs +23 -0
- package/esm2020/lib/dynamic-page-size.pipe.mjs +26 -0
- package/esm2020/lib/empty-page/empty-page.component.mjs +38 -0
- package/esm2020/lib/file-in-dialog/file-in-dialog.component.mjs +44 -0
- package/esm2020/lib/form-dialog/form-dialog.component.mjs +125 -0
- package/esm2020/lib/form-dialog-less/form-dialog-less.component.mjs +38 -0
- package/esm2020/lib/form-page/form-page.component.mjs +51 -0
- package/esm2020/lib/form-page-base.mjs +129 -0
- package/esm2020/lib/form-toolbar-button/form-toolbar-button.component.mjs +44 -0
- package/esm2020/lib/form-wizard/form-wizard.component.mjs +21 -0
- package/esm2020/lib/fullscreen-dialog.directive.mjs +40 -0
- package/esm2020/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +152 -0
- package/esm2020/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +203 -0
- package/esm2020/lib/global-search/global-search.component.mjs +26 -0
- package/esm2020/lib/global-search-module/global-search-module.component.mjs +30 -0
- package/esm2020/lib/global-search-panel/global-search-panel.component.mjs +30 -0
- package/esm2020/lib/header-avatar/header-avatar.component.mjs +19 -0
- package/esm2020/lib/header-facet-form/header-facet-form.component.mjs +22 -0
- package/esm2020/lib/header-facet-key-value/header-facet-key-value.component.mjs +31 -0
- package/esm2020/lib/header-facet-microchart/header-facet-microchart.component.mjs +21 -0
- package/esm2020/lib/header-facet-plain-text/header-facet-plain-text.component.mjs +28 -0
- package/esm2020/lib/header-facet-progress/header-facet-progress.component.mjs +26 -0
- package/esm2020/lib/header-facet-rate/header-facet-rate.component.mjs +26 -0
- package/esm2020/lib/htree-create-new/htree-create-new.component.mjs +49 -0
- package/esm2020/lib/hyperlink/hyperlink.component.mjs +19 -0
- package/esm2020/lib/index.mjs +412 -0
- package/esm2020/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +32 -0
- package/esm2020/lib/layout-actions/layout-actions.component.mjs +65 -0
- package/esm2020/lib/layout-control/layout-control.component.mjs +214 -0
- package/esm2020/lib/layout-wizard/layout-wizard.component.mjs +133 -0
- package/esm2020/lib/list-item/list-item.component.mjs +30 -0
- package/esm2020/lib/ly-empty-space/ly-empty-space.component.mjs +37 -0
- package/esm2020/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +70 -0
- package/esm2020/lib/ly-label/ly-label.component.mjs +31 -0
- package/esm2020/lib/ly-layout-container/ly-layout-container.component.mjs +83 -0
- package/esm2020/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +17 -0
- package/esm2020/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +24 -0
- package/esm2020/lib/ly-layout-panel/ly-layout-panel.component.mjs +64 -0
- package/esm2020/lib/ly-line/ly-line.component.mjs +56 -0
- package/esm2020/lib/ly-simple-label/ly-simple-label.component.mjs +27 -0
- package/esm2020/lib/ly-tab-container/ly-tab-container.component.mjs +43 -0
- package/esm2020/lib/ly-tab-page/ly-tab-page.component.mjs +35 -0
- package/esm2020/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +49 -0
- package/esm2020/lib/manage-filters-report/manage-filters-report.component.mjs +45 -0
- package/esm2020/lib/mask/mask.component.mjs +22 -0
- package/esm2020/lib/message-strip/message-strip.component.mjs +28 -0
- package/esm2020/lib/models/grid-data-provider.mjs +219 -0
- package/esm2020/lib/models/grid-view.mjs +2 -0
- package/esm2020/lib/models/index.mjs +2 -0
- package/esm2020/lib/no-data/no-data.component.mjs +20 -0
- package/esm2020/lib/page-with-form-handler-base.mjs +42 -0
- package/esm2020/lib/page-with-header/page-with-header.component.mjs +76 -0
- package/esm2020/lib/progress-indicator/progress-indicator.component.mjs +18 -0
- package/esm2020/lib/report-navigator/report-navigator.component.mjs +62 -0
- package/esm2020/lib/report-new-top-form/report-new-top-form.component.mjs +60 -0
- package/esm2020/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +35 -0
- package/esm2020/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +99 -0
- package/esm2020/lib/report-search-panel-save/report-search-panel-save.component.mjs +90 -0
- package/esm2020/lib/report-tree-base.mjs +405 -0
- package/esm2020/lib/report-view-renderer.directive.mjs +248 -0
- package/esm2020/lib/responsive-toolbar/responsive-toolbar.component.mjs +50 -0
- package/esm2020/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +84 -0
- package/esm2020/lib/rich-text-static/rich-text-static.component.mjs +35 -0
- package/esm2020/lib/sap-font-class.pipe.mjs +29 -0
- package/esm2020/lib/sap-font.pipe.mjs +29 -0
- package/esm2020/lib/sap-ui-report-base.component.mjs +689 -0
- package/esm2020/lib/search-panel/search-panel.component.mjs +40 -0
- package/esm2020/lib/static-text/static-text.component.mjs +15 -0
- package/esm2020/lib/title/title.component.mjs +15 -0
- package/esm2020/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +14 -0
- package/esm2020/lib/ui-button/ui-button.component.mjs +31 -0
- package/esm2020/lib/ui-calendar/ui-calendar.component.mjs +46 -0
- package/esm2020/lib/ui-card-view/ui-card-view.component.mjs +60 -0
- package/esm2020/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +27 -0
- package/esm2020/lib/ui-check-box/ui-check-box.component.mjs +29 -0
- package/esm2020/lib/ui-color-ui/ui-color-ui.component.mjs +50 -0
- package/esm2020/lib/ui-container-with-button/ui-container-with-button.component.mjs +34 -0
- package/esm2020/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +194 -0
- package/esm2020/lib/ui-date-time/ui-date-time.component.mjs +116 -0
- package/esm2020/lib/ui-editable-grid/ui-editable-grid.component.mjs +110 -0
- package/esm2020/lib/ui-exception-form/ui-exception-form.component.mjs +61 -0
- package/esm2020/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +181 -0
- package/esm2020/lib/ui-form-panel/ui-form-panel.component.mjs +43 -0
- package/esm2020/lib/ui-form-panel-toolbar/ui-form-panel-toolbar.component.mjs +26 -0
- package/esm2020/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +32 -0
- package/esm2020/lib/ui-graph/ui-graph.component.mjs +16 -0
- package/esm2020/lib/ui-grid/ui-grid.component.mjs +25 -0
- package/esm2020/lib/ui-grid-columns/ui-grid-columns.component.mjs +44 -0
- package/esm2020/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +67 -0
- package/esm2020/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +76 -0
- package/esm2020/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +59 -0
- package/esm2020/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +156 -0
- package/esm2020/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +11 -0
- package/esm2020/lib/ui-label/ui-label.component.mjs +12 -0
- package/esm2020/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +299 -0
- package/esm2020/lib/ui-list-view/ui-list-view.component.mjs +44 -0
- package/esm2020/lib/ui-matrix-view/ui-matrix-view.component.mjs +125 -0
- package/esm2020/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +19 -0
- package/esm2020/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +13 -0
- package/esm2020/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +46 -0
- package/esm2020/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +335 -0
- package/esm2020/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +18 -0
- package/esm2020/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +83 -0
- package/esm2020/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +24 -0
- package/esm2020/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +21 -0
- package/esm2020/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +216 -0
- package/esm2020/lib/ui-picture-file/ui-picture-file.component.mjs +95 -0
- package/esm2020/lib/ui-pictures-info/ui-pictures-info.component.mjs +215 -0
- package/esm2020/lib/ui-radio-group/ui-radio-group.component.mjs +24 -0
- package/esm2020/lib/ui-read-only-field/ui-read-only-field.component.mjs +29 -0
- package/esm2020/lib/ui-report-container/ui-report-container.component.mjs +46 -0
- package/esm2020/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +24 -0
- package/esm2020/lib/ui-simple-combo/ui-simple-combo.component.mjs +29 -0
- package/esm2020/lib/ui-single-picture/ui-single-picture.component.mjs +36 -0
- package/esm2020/lib/ui-switch-button/ui-switch-button.component.mjs +20 -0
- package/esm2020/lib/ui-table-view/ui-table-view.component.mjs +106 -0
- package/esm2020/lib/ui-text-area/ui-text-area.component.mjs +44 -0
- package/esm2020/lib/ui-text-field/ui-text-field.component.mjs +47 -0
- package/esm2020/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +47 -0
- package/esm2020/lib/ui-time-span/ui-time-span.component.mjs +24 -0
- package/esm2020/lib/ui-tinymce/ui-tinymce.component.mjs +53 -0
- package/esm2020/lib/ui-tree/ui-tree.component.mjs +69 -0
- package/esm2020/lib/ui-tree-view/ui-tree-view.component.mjs +75 -0
- package/esm2020/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +24 -0
- package/esm2020/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +276 -0
- package/esm2020/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +26 -0
- package/esm2020/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +86 -0
- package/esm2020/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +117 -0
- package/esm2020/lib/ul-notify-popup/ul-notify-popup.component.mjs +114 -0
- package/esm2020/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +44 -0
- package/esm2020/lib/ulv-column-settings/ulv-column-settings.component.mjs +53 -0
- package/esm2020/lib/ulv-context-menu/ulv-context-menu.component.mjs +74 -0
- package/esm2020/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +43 -0
- package/esm2020/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +183 -0
- package/esm2020/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +44 -0
- package/esm2020/lib/ulv-paging/ulv-paging.component.mjs +73 -0
- package/esm2020/lib/ulv-selection/ulv-selection.component.mjs +66 -0
- package/esm2020/lib/ulv-settings/ulv-settings.component.mjs +117 -0
- package/esm2020/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +44 -0
- package/esm2020/lib/ulv-toolbar/ulv-toolbar.component.mjs +110 -0
- package/esm2020/lib/upload-file-status.pipe.mjs +28 -0
- package/esm2020/lib/wizard-layout.directive.mjs +102 -0
- package/esm2020/public-api.mjs +170 -0
- package/fesm2015/barsa-sap-ui.mjs +11437 -0
- package/fesm2015/barsa-sap-ui.mjs.map +1 -0
- package/fesm2020/barsa-sap-ui.mjs +11427 -0
- package/fesm2020/barsa-sap-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/apply-conditional-formmatings.directive.d.ts +25 -0
- package/lib/barsa-asp-viewer/barsa-asp-viewer.component.d.ts +26 -0
- package/lib/barsa-base-layout/barsa-base-layout.component.d.ts +18 -0
- package/lib/barsa-date-time-picker/barsa-date-time-picker.component.d.ts +18 -0
- package/lib/barsa-list-file-linear/barsa-list-file-linear.component.d.ts +8 -0
- package/lib/barsa-monaco-editor/barsa-monaco-editor.component.d.ts +18 -0
- package/lib/barsa-network-offline/barsa-network-offline.component.d.ts +13 -0
- package/lib/barsa-sap-ui-routing.module.d.ts +7 -0
- package/lib/barsa-sap-ui.module.d.ts +181 -0
- package/lib/barsa-search-form/barsa-search-form.component.d.ts +8 -0
- package/lib/barsa-table-header/barsa-table-header.component.d.ts +37 -0
- package/lib/barsa-table-row/barsa-table-row.component.d.ts +20 -0
- package/lib/barsa-tinyemce/barsa-tinyemce.component.d.ts +43 -0
- package/lib/barsa-tree-item/barsa-tree-item.component.d.ts +48 -0
- package/lib/barsa-tree-item/node-has-one-depth-level.pipe.d.ts +8 -0
- package/lib/barsa-ulv-main/barsa-ulv-main.component.d.ts +52 -0
- package/lib/breadcrumb/breadcrumb.component.d.ts +17 -0
- package/lib/captcha-field/captcha-field.component.d.ts +10 -0
- package/lib/card-item/card-item.component.d.ts +17 -0
- package/lib/card-view-content/card-view-content.component.d.ts +8 -0
- package/lib/col-renderer.directive.d.ts +12 -0
- package/lib/column-matrix-renderer/column-matrix-renderer.component.d.ts +23 -0
- package/lib/column-matrix-renderer/matrix-value.pipe.d.ts +8 -0
- package/lib/column-renderer/column-renderer.component.d.ts +29 -0
- package/lib/constants.d.ts +6 -0
- package/lib/custom-date-time/custom-date-time.component.d.ts +26 -0
- package/lib/device-info-field-base.d.ts +12 -0
- package/lib/dynamic-page-size.pipe.d.ts +8 -0
- package/lib/empty-page/empty-page.component.d.ts +11 -0
- package/lib/file-in-dialog/file-in-dialog.component.d.ts +16 -0
- package/lib/form-dialog/form-dialog.component.d.ts +40 -0
- package/lib/form-dialog-less/form-dialog-less.component.d.ts +27 -0
- package/lib/form-page/form-page.component.d.ts +17 -0
- package/lib/form-page-base.d.ts +26 -0
- package/lib/form-toolbar-button/form-toolbar-button.component.d.ts +18 -0
- package/lib/form-wizard/form-wizard.component.d.ts +8 -0
- package/lib/fullscreen-dialog.directive.d.ts +14 -0
- package/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.d.ts +58 -0
- package/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.d.ts +18 -0
- package/lib/global-search/global-search.component.d.ts +12 -0
- package/lib/global-search-module/global-search-module.component.d.ts +18 -0
- package/lib/global-search-panel/global-search-panel.component.d.ts +11 -0
- package/lib/header-avatar/header-avatar.component.d.ts +8 -0
- package/lib/header-facet-form/header-facet-form.component.d.ts +9 -0
- package/lib/header-facet-key-value/header-facet-key-value.component.d.ts +11 -0
- package/lib/header-facet-microchart/header-facet-microchart.component.d.ts +8 -0
- package/lib/header-facet-plain-text/header-facet-plain-text.component.d.ts +11 -0
- package/lib/header-facet-progress/header-facet-progress.component.d.ts +11 -0
- package/lib/header-facet-rate/header-facet-rate.component.d.ts +11 -0
- package/lib/htree-create-new/htree-create-new.component.d.ts +13 -0
- package/lib/hyperlink/hyperlink.component.d.ts +7 -0
- package/lib/index.d.ts +85 -0
- package/lib/inline-save-and-cancel/inline-save-and-cancel.component.d.ts +11 -0
- package/lib/layout-actions/layout-actions.component.d.ts +23 -0
- package/lib/layout-control/layout-control.component.d.ts +65 -0
- package/lib/layout-wizard/layout-wizard.component.d.ts +27 -0
- package/lib/list-item/list-item.component.d.ts +13 -0
- package/lib/ly-empty-space/ly-empty-space.component.d.ts +14 -0
- package/lib/ly-horizontal-layout/ly-horizontal-layout.component.d.ts +22 -0
- package/lib/ly-label/ly-label.component.d.ts +15 -0
- package/lib/ly-layout-container/ly-layout-container.component.d.ts +26 -0
- package/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.d.ts +8 -0
- package/lib/ly-layout-field-label/ly-layout-field-label.component.d.ts +13 -0
- package/lib/ly-layout-panel/ly-layout-panel.component.d.ts +25 -0
- package/lib/ly-line/ly-line.component.d.ts +17 -0
- package/lib/ly-simple-label/ly-simple-label.component.d.ts +11 -0
- package/lib/ly-tab-container/ly-tab-container.component.d.ts +16 -0
- package/lib/ly-tab-page/ly-tab-page.component.d.ts +18 -0
- package/lib/ly-vertical-layout/ly-vertical-layout.component.d.ts +18 -0
- package/lib/manage-filters-report/manage-filters-report.component.d.ts +24 -0
- package/lib/mask/mask.component.d.ts +9 -0
- package/lib/message-strip/message-strip.component.d.ts +11 -0
- package/lib/models/grid-data-provider.d.ts +26 -0
- package/lib/models/grid-view.d.ts +64 -0
- package/lib/models/index.d.ts +1 -0
- package/lib/no-data/no-data.component.d.ts +8 -0
- package/lib/page-with-form-handler-base.d.ts +10 -0
- package/lib/page-with-header/page-with-header.component.d.ts +29 -0
- package/lib/progress-indicator/progress-indicator.component.d.ts +8 -0
- package/lib/report-navigator/report-navigator.component.d.ts +21 -0
- package/lib/report-new-top-form/report-new-top-form.component.d.ts +18 -0
- package/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.d.ts +14 -0
- package/lib/report-search-fields-manage/report-search-fields-manage.component.d.ts +20 -0
- package/lib/report-search-panel-save/report-search-panel-save.component.d.ts +27 -0
- package/lib/report-tree-base.d.ts +61 -0
- package/lib/report-view-renderer.directive.d.ts +82 -0
- package/lib/responsive-toolbar/responsive-toolbar.component.d.ts +19 -0
- package/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.d.ts +24 -0
- package/lib/rich-text-static/rich-text-static.component.d.ts +24 -0
- package/lib/sap-font-class.pipe.d.ts +8 -0
- package/lib/sap-font.pipe.d.ts +9 -0
- package/lib/sap-ui-report-base.component.d.ts +133 -0
- package/lib/search-panel/search-panel.component.d.ts +13 -0
- package/lib/static-text/static-text.component.d.ts +7 -0
- package/lib/title/title.component.d.ts +7 -0
- package/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.d.ts +7 -0
- package/lib/ui-button/ui-button.component.d.ts +11 -0
- package/lib/ui-calendar/ui-calendar.component.d.ts +16 -0
- package/lib/ui-card-view/ui-card-view.component.d.ts +16 -0
- package/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.d.ts +9 -0
- package/lib/ui-check-box/ui-check-box.component.d.ts +12 -0
- package/lib/ui-color-ui/ui-color-ui.component.d.ts +16 -0
- package/lib/ui-container-with-button/ui-container-with-button.component.d.ts +11 -0
- package/lib/ui-date-range-ex/ui-date-range-ex.component.d.ts +36 -0
- package/lib/ui-date-time/ui-date-time.component.d.ts +24 -0
- package/lib/ui-editable-grid/ui-editable-grid.component.d.ts +43 -0
- package/lib/ui-exception-form/ui-exception-form.component.d.ts +16 -0
- package/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.d.ts +51 -0
- package/lib/ui-form-panel/ui-form-panel.component.d.ts +24 -0
- package/lib/ui-form-panel-toolbar/ui-form-panel-toolbar.component.d.ts +13 -0
- package/lib/ui-gantt-chart/ui-gantt-chart.component.d.ts +15 -0
- package/lib/ui-graph/ui-graph.component.d.ts +9 -0
- package/lib/ui-grid/ui-grid.component.d.ts +12 -0
- package/lib/ui-grid-columns/ui-grid-columns.component.d.ts +14 -0
- package/lib/ui-grid-filter-item/ui-grid-filter-item.component.d.ts +19 -0
- package/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.d.ts +24 -0
- package/lib/ui-grid-sort-item/ui-grid-sort-item.component.d.ts +25 -0
- package/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.d.ts +28 -0
- package/lib/ui-info-bar-panel/ui-info-bar-panel.component.d.ts +5 -0
- package/lib/ui-label/ui-label.component.d.ts +6 -0
- package/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.d.ts +62 -0
- package/lib/ui-list-view/ui-list-view.component.d.ts +15 -0
- package/lib/ui-matrix-view/ui-matrix-view.component.d.ts +45 -0
- package/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.d.ts +7 -0
- package/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.d.ts +6 -0
- package/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.d.ts +13 -0
- package/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.d.ts +78 -0
- package/lib/ui-monaco-editor/ui-monaco-editor.component.d.ts +7 -0
- package/lib/ui-multi-select-combo/ui-multi-select-combo.component.d.ts +21 -0
- package/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.d.ts +11 -0
- package/lib/ui-num-int-ui/ui-num-int-ui.component.d.ts +10 -0
- package/lib/ui-pdf-viewer/ui-pdf-viewer.component.d.ts +63 -0
- package/lib/ui-picture-file/ui-picture-file.component.d.ts +27 -0
- package/lib/ui-pictures-info/ui-pictures-info.component.d.ts +68 -0
- package/lib/ui-radio-group/ui-radio-group.component.d.ts +9 -0
- package/lib/ui-read-only-field/ui-read-only-field.component.d.ts +11 -0
- package/lib/ui-report-container/ui-report-container.component.d.ts +17 -0
- package/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.d.ts +9 -0
- package/lib/ui-simple-combo/ui-simple-combo.component.d.ts +13 -0
- package/lib/ui-single-picture/ui-single-picture.component.d.ts +13 -0
- package/lib/ui-switch-button/ui-switch-button.component.d.ts +11 -0
- package/lib/ui-table-view/ui-table-view.component.d.ts +29 -0
- package/lib/ui-text-area/ui-text-area.component.d.ts +15 -0
- package/lib/ui-text-field/ui-text-field.component.d.ts +14 -0
- package/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.d.ts +13 -0
- package/lib/ui-time-span/ui-time-span.component.d.ts +10 -0
- package/lib/ui-tinymce/ui-tinymce.component.d.ts +17 -0
- package/lib/ui-tree/ui-tree.component.d.ts +32 -0
- package/lib/ui-tree-view/ui-tree-view.component.d.ts +41 -0
- package/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.d.ts +9 -0
- package/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.d.ts +67 -0
- package/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.d.ts +16 -0
- package/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.d.ts +20 -0
- package/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.d.ts +48 -0
- package/lib/ul-notify-popup/ul-notify-popup.component.d.ts +41 -0
- package/lib/ul-toast-adapter/ul-toast-adapter.component.d.ts +13 -0
- package/lib/ulv-column-settings/ulv-column-settings.component.d.ts +19 -0
- package/lib/ulv-context-menu/ulv-context-menu.component.d.ts +24 -0
- package/lib/ulv-filter-settings/ulv-filter-settings.component.d.ts +19 -0
- package/lib/ulv-form-multi-select/ulv-form-multi-select.component.d.ts +26 -0
- package/lib/ulv-groupby-settings/ulv-groupby-settings.component.d.ts +16 -0
- package/lib/ulv-paging/ulv-paging.component.d.ts +27 -0
- package/lib/ulv-selection/ulv-selection.component.d.ts +43 -0
- package/lib/ulv-settings/ulv-settings.component.d.ts +43 -0
- package/lib/ulv-sort-settings/ulv-sort-settings.component.d.ts +16 -0
- package/lib/ulv-toolbar/ulv-toolbar.component.d.ts +47 -0
- package/lib/upload-file-status.pipe.d.ts +9 -0
- package/lib/wizard-layout.directive.d.ts +39 -0
- package/package.json +31 -0
- package/public-api.d.ts +166 -0
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Inject, Input, Optional, Self, ViewChild, ViewChildren } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
|
|
3
|
+
import { debounceTime, distinctUntilChanged, filter, map, takeUntil, tap, withLatestFrom } from 'rxjs/operators';
|
|
4
|
+
import { TableComponent, ToolbarComponent } from '@fundamental-ngx/core';
|
|
5
|
+
import { SelectionMode } from '@fundamental-ngx/platform';
|
|
6
|
+
import { BarsaApi, GetAllColumnsSorted, getControlSizeMode, getGridSettings, ReportBaseComponent } from 'barsa-novin-ray-core';
|
|
7
|
+
import { LayoutControlComponent } from './layout-control/layout-control.component';
|
|
8
|
+
import { GridMoDataList } from './models';
|
|
9
|
+
import { UlvColumnSettingsComponent } from './ulv-column-settings/ulv-column-settings.component';
|
|
10
|
+
import { UlvSortSettingsComponent } from './ulv-sort-settings/ulv-sort-settings.component';
|
|
11
|
+
import { UlvGroupbySettingsComponent } from './ulv-groupby-settings/ulv-groupby-settings.component';
|
|
12
|
+
import { UlvFilterSettingsComponent } from './ulv-filter-settings/ulv-filter-settings.component';
|
|
13
|
+
import { DOCUMENT } from '@angular/common';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/cdk/overlay";
|
|
16
|
+
import * as i2 from "@fundamental-ngx/core";
|
|
17
|
+
import * as i3 from "barsa-novin-ray-core";
|
|
18
|
+
export class SapUiReportBaseComponent extends ReportBaseComponent {
|
|
19
|
+
constructor(el, _overlay, _contentDensityService, _portalService, _dialogService, _ulvMainService, _layoutService, _renderer, document, _formpanelService) {
|
|
20
|
+
super(_portalService, _ulvMainService);
|
|
21
|
+
this.el = el;
|
|
22
|
+
this._overlay = _overlay;
|
|
23
|
+
this._contentDensityService = _contentDensityService;
|
|
24
|
+
this._portalService = _portalService;
|
|
25
|
+
this._dialogService = _dialogService;
|
|
26
|
+
this._ulvMainService = _ulvMainService;
|
|
27
|
+
this._layoutService = _layoutService;
|
|
28
|
+
this._renderer = _renderer;
|
|
29
|
+
this.document = document;
|
|
30
|
+
this._formpanelService = _formpanelService;
|
|
31
|
+
this.useLayoutItemTextForControl = false;
|
|
32
|
+
this.parentHeight = 0;
|
|
33
|
+
this.dialogConfig = {
|
|
34
|
+
responsivePadding: true,
|
|
35
|
+
verticalPadding: true,
|
|
36
|
+
minWidth: '40rem',
|
|
37
|
+
minHeight: '90vh',
|
|
38
|
+
maxWidth: '100vw',
|
|
39
|
+
maxHeight: '100vh',
|
|
40
|
+
resizable: true
|
|
41
|
+
};
|
|
42
|
+
this.selectedRowsNumber = {};
|
|
43
|
+
this.selectAll = false;
|
|
44
|
+
this.rowClick = true;
|
|
45
|
+
this.cellClick = false;
|
|
46
|
+
this.secondaryColumnsSource = new BehaviorSubject([]);
|
|
47
|
+
this.secondaryColumns$ = this.secondaryColumnsSource.asObservable();
|
|
48
|
+
this.rowActivable = true;
|
|
49
|
+
this.openOverflowCommands = [];
|
|
50
|
+
this.containerWidthSource$ = new Subject();
|
|
51
|
+
this.singleSelection = SelectionMode.SINGLE;
|
|
52
|
+
this.multipleSelection = SelectionMode.MULTIPLE;
|
|
53
|
+
this._deviceNameSource = new BehaviorSubject('desktop');
|
|
54
|
+
/* eslint-disable */
|
|
55
|
+
this.ShowFormPanelControl = (formpanelCtrlr) => { };
|
|
56
|
+
/* eslint-disable */
|
|
57
|
+
this.ForceCloseChild = () => { };
|
|
58
|
+
/* eslint-disable */
|
|
59
|
+
this.RefreshFormPanelControl = (formpanelCtrlr) => { };
|
|
60
|
+
this.containerWidth$ = this.containerWidthSource$
|
|
61
|
+
.asObservable()
|
|
62
|
+
.pipe(debounceTime(200), distinctUntilChanged());
|
|
63
|
+
this.deviceName$ = this._deviceNameSource.asObservable();
|
|
64
|
+
this.mobileOrTablet$ = this.deviceName$.pipe(map((device) => device === 'mobile' || device === 'tablet'));
|
|
65
|
+
this._oldContainer = BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter;
|
|
66
|
+
this.closeScrollStrategy = this._overlay.scrollStrategies.close();
|
|
67
|
+
this.contentDensity$ = this._contentDensityService.contentDensity;
|
|
68
|
+
this.secondaryColumnsCount$ = this.secondaryColumns$.pipe(map((columns) => columns.length));
|
|
69
|
+
this.columnsCount$ = this.visibleColumns$.pipe(map((columns) => columns.length), map((count) => {
|
|
70
|
+
const access = BarsaApi.Common.Util.TryGetValue(this.context, 'Setting.Extra.DefaultCommandsAccess');
|
|
71
|
+
if (access?.View) {
|
|
72
|
+
count++;
|
|
73
|
+
}
|
|
74
|
+
return count;
|
|
75
|
+
}), map((count) => {
|
|
76
|
+
if (this.selectionMode !== 'none') {
|
|
77
|
+
count++;
|
|
78
|
+
}
|
|
79
|
+
return count;
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
get _typeDefId() {
|
|
83
|
+
return this.context.Setting.Extra.Report.TypeDefId;
|
|
84
|
+
}
|
|
85
|
+
get _inlineEditMode() {
|
|
86
|
+
return this._ulvMainService.getValueInlineEdit();
|
|
87
|
+
}
|
|
88
|
+
get _allowInlineEdit() {
|
|
89
|
+
return this._ulvMainService.getAllowInlineEdit();
|
|
90
|
+
}
|
|
91
|
+
get _access() {
|
|
92
|
+
return this.context.Setting?.Extra?.DefaultCommandsAccess;
|
|
93
|
+
}
|
|
94
|
+
set _access(val) {
|
|
95
|
+
if (this.context.Setting.Extra) {
|
|
96
|
+
this.context.Setting.Extra.DefaultCommandsAccess = val;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.context.Setting.Extra = { DefaultCommandsAccess: val };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
ngOnInit() {
|
|
103
|
+
this._setParentHeight();
|
|
104
|
+
this._readViewSetting();
|
|
105
|
+
if (!this._access) {
|
|
106
|
+
this._setDefaultAccess();
|
|
107
|
+
}
|
|
108
|
+
super.ngOnInit();
|
|
109
|
+
this.showOkCancelButtons = this.context.ShowOkCancelButtons;
|
|
110
|
+
this._ulvMainService.layoutInfo$.subscribe((layoutInfo) => {
|
|
111
|
+
if (layoutInfo && layoutInfo.UseLayoutItemTextForControl) {
|
|
112
|
+
this.useLayoutItemTextForControl = true;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const title = this.viewSetting?.Title;
|
|
116
|
+
if (title) {
|
|
117
|
+
this._ulvMainService.setTitle(title);
|
|
118
|
+
}
|
|
119
|
+
this._ulvMainService.reportId$.subscribe((reportId) => (this.reportId = reportId));
|
|
120
|
+
this._layoutService.setRendered(true);
|
|
121
|
+
this.selectionMode = this.context.ViewSetting?.IsCheckList ? this.multipleSelection : this.singleSelection;
|
|
122
|
+
this._openOnClick = this.viewSetting?.OpenOnClick;
|
|
123
|
+
this.customRowHeight = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.ExtraJsonPropReport.GridRowHeight');
|
|
124
|
+
this.rtl$ = this._portalService.rtl$;
|
|
125
|
+
this.navigationArrow$ = this._portalService.rtl$.pipe(map((isRtl) => (isRtl ? 'navigation-left-arrow' : 'navigation-right-arrow')));
|
|
126
|
+
this.allowInlineEdit$ = this._ulvMainService.allowInlineEdit$;
|
|
127
|
+
this.inlineEditMode$ = this._ulvMainService.inlineEditMode$;
|
|
128
|
+
this.onlyInlineEdit$ = this._ulvMainService.onlyInlineEdit$;
|
|
129
|
+
this.hasSelected$ = this.moDataList$.pipe(map((moList) => moList.some((c) => c.$IsChecked)));
|
|
130
|
+
this.moDataList$ = this.moDataList$.pipe(map((items) => this._mapCartableMo(items)));
|
|
131
|
+
const gridDataSource = new GridMoDataList(this.moDataList$, this.gridSetting$, this.visibleColumns$, this.searchTerm$);
|
|
132
|
+
this.gridDataSource = gridDataSource;
|
|
133
|
+
this.columns$ = combineLatest([this.gridSetting$, this.secondaryColumns$]).pipe(map(([, secondaryColumns]) => {
|
|
134
|
+
const secondaries = secondaryColumns.map((c) => c.Name);
|
|
135
|
+
const columns = GetAllColumnsSorted(this.context).filter((c) => !c.Hidden);
|
|
136
|
+
return columns.filter((c) => secondaries.indexOf(c.Name) === -1);
|
|
137
|
+
}), tap((columns) => {
|
|
138
|
+
columns.forEach((c) => {
|
|
139
|
+
c.$CSSClassName = 'column__FieldType' + c.FieldTypeId;
|
|
140
|
+
if (c.FieldTypeId === 38) {
|
|
141
|
+
c.$Width = 'auto';
|
|
142
|
+
}
|
|
143
|
+
if (c.Extra?.IconDisplayTypeEnum === 'Image') {
|
|
144
|
+
c.$Width = '38px';
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
c.$Width = !BarsaApi.LoginFormData.IsUserLoggedIn // if user is anonymous all column width equals to 100%
|
|
148
|
+
? '100%'
|
|
149
|
+
: c.Width > 0
|
|
150
|
+
? c.Width + 'px'
|
|
151
|
+
: '100%';
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}));
|
|
155
|
+
this._ulvMainService.inlineEditMode$
|
|
156
|
+
.pipe(withLatestFrom(this.hasSelected$), filter(([_, __]) => this._access.Add !== false))
|
|
157
|
+
.subscribe(([editMode]) => this._inlineEditModeChanged(editMode));
|
|
158
|
+
this._setContainerWidth();
|
|
159
|
+
}
|
|
160
|
+
ngOnDestroy() {
|
|
161
|
+
super.ngOnDestroy();
|
|
162
|
+
if (this._formpanelService) {
|
|
163
|
+
this._formpanelService.destroy();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
onEditMode() {
|
|
167
|
+
this._setInlineEdit(!this._inlineEditMode);
|
|
168
|
+
}
|
|
169
|
+
onSelectNextInlineRecord(mo) {
|
|
170
|
+
this._selectNextInlineRecord(mo);
|
|
171
|
+
}
|
|
172
|
+
onEditFormPanelSave(mo) {
|
|
173
|
+
this._inlineEditSaveFormPanel(mo);
|
|
174
|
+
}
|
|
175
|
+
onEditFormPanelCancel() {
|
|
176
|
+
this._inilineEditCancel();
|
|
177
|
+
}
|
|
178
|
+
onEditFormPanelValueChange(mo) {
|
|
179
|
+
this._inlineFormPanelValueChange(mo);
|
|
180
|
+
}
|
|
181
|
+
onColumnResized(columns) {
|
|
182
|
+
this._handleColumnsResized(columns);
|
|
183
|
+
}
|
|
184
|
+
onRowClick($event) {
|
|
185
|
+
const { mo } = $event;
|
|
186
|
+
if (mo.group || this._inlineEditMode) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const moIndex = this._getIndex(mo);
|
|
190
|
+
this._rowCheck(mo, moIndex, true);
|
|
191
|
+
this._openMo(mo, moIndex);
|
|
192
|
+
}
|
|
193
|
+
onUlvCommand($event) {
|
|
194
|
+
const { mo } = $event;
|
|
195
|
+
const moIndex = this._getIndex(mo);
|
|
196
|
+
this._ulvCommandClicked(mo, moIndex);
|
|
197
|
+
}
|
|
198
|
+
onRowCheck($event) {
|
|
199
|
+
const { mo } = $event;
|
|
200
|
+
const moIndex = this._getIndex(mo);
|
|
201
|
+
if (this._openOnClick) {
|
|
202
|
+
this.onRowClick($event);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this._rowCheck(mo, moIndex);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
onExpandClick(mo) {
|
|
209
|
+
mo.$Expanded = !mo.$Expanded;
|
|
210
|
+
this._setVisibility(mo.$Expanded, mo);
|
|
211
|
+
this._ulvMainService.reSetMoDataList();
|
|
212
|
+
}
|
|
213
|
+
onAllCheckbox(checked) {
|
|
214
|
+
this._doCheckedAll(checked);
|
|
215
|
+
// if (checked) {
|
|
216
|
+
// this.gridDataSource.resultItems.forEach((mo, index) => {
|
|
217
|
+
// this._select(mo, index);
|
|
218
|
+
// });
|
|
219
|
+
// } else {
|
|
220
|
+
// this.gridDataSource.resultItems.forEach((mo, index) => {
|
|
221
|
+
// this._deselect(mo, index);
|
|
222
|
+
// });
|
|
223
|
+
// }
|
|
224
|
+
}
|
|
225
|
+
onSortAscending(column) {
|
|
226
|
+
this._addSortColumn(column.Name, 'ASC');
|
|
227
|
+
}
|
|
228
|
+
onSortDescending(column) {
|
|
229
|
+
this._addSortColumn(column.Name, 'DESC');
|
|
230
|
+
}
|
|
231
|
+
onFilter(selectedColumn) {
|
|
232
|
+
this._showFilterSetting(selectedColumn);
|
|
233
|
+
}
|
|
234
|
+
onColumnSettings(device) {
|
|
235
|
+
this._openSettings('columns', device);
|
|
236
|
+
}
|
|
237
|
+
onSortSettings(device) {
|
|
238
|
+
this._openSettings('sort', device);
|
|
239
|
+
}
|
|
240
|
+
onGroupbySettings(device) {
|
|
241
|
+
this._openSettings('groupby', device);
|
|
242
|
+
}
|
|
243
|
+
onListCheckboxClick($event) {
|
|
244
|
+
const { mo, index, e } = $event;
|
|
245
|
+
this.onRowCheck({ mo, index, cause: 'singleSelect' });
|
|
246
|
+
e.stopPropagation();
|
|
247
|
+
e.preventDefault();
|
|
248
|
+
}
|
|
249
|
+
onListNavigationClick($event) {
|
|
250
|
+
const { mo, index, e } = $event;
|
|
251
|
+
this.onRowClick({ mo, index });
|
|
252
|
+
e.stopPropagation();
|
|
253
|
+
e.preventDefault();
|
|
254
|
+
}
|
|
255
|
+
onSaveTopForm(mo) {
|
|
256
|
+
const newMoDataList = this.moDataList;
|
|
257
|
+
const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
|
|
258
|
+
if (existsIndex > -1) {
|
|
259
|
+
newMoDataList[existsIndex] = mo;
|
|
260
|
+
}
|
|
261
|
+
newMoDataList.map((c) => {
|
|
262
|
+
c.$NewInlineMo = undefined;
|
|
263
|
+
c.$IsChecked = false;
|
|
264
|
+
});
|
|
265
|
+
this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
266
|
+
this.refreshContextMoDataList(newMoDataList);
|
|
267
|
+
}
|
|
268
|
+
onNewTopFormAdd(mo) {
|
|
269
|
+
this._addInlineMoToModataList(mo);
|
|
270
|
+
}
|
|
271
|
+
// protected _inlineEditModeChanged(editMode): void {
|
|
272
|
+
// if (editMode) {
|
|
273
|
+
// const canAdd: boolean = this._access?.Add !== false;
|
|
274
|
+
// let selectedMo = this._getSelected();
|
|
275
|
+
// let newMo;
|
|
276
|
+
// if (canAdd !== false && !selectedMo) {
|
|
277
|
+
// this._createNewInlineRecord();
|
|
278
|
+
// return;
|
|
279
|
+
// }
|
|
280
|
+
// // if (!selectedMo && !newMo && this.moDataList.length > 0) {
|
|
281
|
+
// // selectedMo = this.moDataList[0];
|
|
282
|
+
// // }
|
|
283
|
+
// // if (selectedMo) {
|
|
284
|
+
// // const idOfSelectedMo = this._indexOfMo(selectedMo);
|
|
285
|
+
// // selectedMo.$IsChecked = false;
|
|
286
|
+
// // this._createNewInlineRecord(selectedMo);
|
|
287
|
+
// // this._rowCheck(selectedMo, idOfSelectedMo);
|
|
288
|
+
// // }
|
|
289
|
+
// } else {
|
|
290
|
+
// BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter = this._oldContainer;
|
|
291
|
+
// this._setNewInlineMo(null);
|
|
292
|
+
// }
|
|
293
|
+
// }
|
|
294
|
+
// protected _createNewInlineRecord(selectedMo?: MetaobjectDataModel) {
|
|
295
|
+
// const mo = this._inlineEditPrepareNewMo();
|
|
296
|
+
// const formMo = BarsaApi.Common.Merger.FastMerge(mo, selectedMo, { extendedFields: ['Id,$Caption'] });
|
|
297
|
+
// this._setNewInlineMo(formMo);
|
|
298
|
+
// this._select(formMo, -1);
|
|
299
|
+
// }
|
|
300
|
+
_setParentHeight() {
|
|
301
|
+
const elDom = this.el.nativeElement;
|
|
302
|
+
let parentDom = elDom.parentElement;
|
|
303
|
+
let parentHeight = parentDom?.clientHeight ?? 0;
|
|
304
|
+
while (parentDom != null && !parentHeight) {
|
|
305
|
+
parentDom = parentDom.parentElement;
|
|
306
|
+
parentHeight = parentDom?.clientHeight ?? 0;
|
|
307
|
+
}
|
|
308
|
+
this.parentHeight = parentHeight;
|
|
309
|
+
}
|
|
310
|
+
_mapCartableMo(items) {
|
|
311
|
+
if (!this.viewSetting) {
|
|
312
|
+
return items;
|
|
313
|
+
}
|
|
314
|
+
const { NameSerializeMo, CartableObjectName } = this.viewSetting;
|
|
315
|
+
if (!NameSerializeMo || !CartableObjectName || !items?.length) {
|
|
316
|
+
return items;
|
|
317
|
+
}
|
|
318
|
+
items.forEach((c) => (c[CartableObjectName] = BarsaApi.Ext.decode('{' + c[NameSerializeMo] + '}')));
|
|
319
|
+
return items;
|
|
320
|
+
}
|
|
321
|
+
_inlineEditModeChanged(editMode) {
|
|
322
|
+
let newMoDataList = this.moDataList;
|
|
323
|
+
let changed = false;
|
|
324
|
+
if (editMode) {
|
|
325
|
+
newMoDataList.push(this._inlineReportCreateNewMo(!this._getSelected()));
|
|
326
|
+
changed = true;
|
|
327
|
+
}
|
|
328
|
+
else if (editMode === false && !newMoDataList.length) {
|
|
329
|
+
newMoDataList = newMoDataList.filter((c) => !c.$NewInlineMo);
|
|
330
|
+
changed = true;
|
|
331
|
+
}
|
|
332
|
+
if (!changed) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
336
|
+
this.refreshContextMoDataList(newMoDataList);
|
|
337
|
+
}
|
|
338
|
+
_inlineReportCreateNewMo(isChecked) {
|
|
339
|
+
return this._ulvMainService.createNewInlineMo(isChecked);
|
|
340
|
+
}
|
|
341
|
+
_inlineFormPanelValueChange(mo) {
|
|
342
|
+
const newMoDataList = this.moDataList;
|
|
343
|
+
const existMoIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
|
|
344
|
+
if (existMoIndex > -1) {
|
|
345
|
+
newMoDataList[existMoIndex] = BarsaApi.Common.MetaObjectWeb.CreateMo(mo);
|
|
346
|
+
this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
347
|
+
this.refreshContextMoDataList(newMoDataList);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
_selectNextInlineRecord(mo) {
|
|
351
|
+
const newMoDataList = this.moDataList;
|
|
352
|
+
if (!mo.$NewInlineMo) {
|
|
353
|
+
// select next record
|
|
354
|
+
const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
|
|
355
|
+
if (existsIndex > -1 && existsIndex + 1 < newMoDataList.length) {
|
|
356
|
+
newMoDataList[existsIndex + 1].$IsChecked = false;
|
|
357
|
+
this._rowCheck(newMoDataList[existsIndex + 1], existsIndex + 1);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
newMoDataList.map((c) => {
|
|
361
|
+
c.$NewInlineMo = undefined;
|
|
362
|
+
c.$IsChecked = false;
|
|
363
|
+
});
|
|
364
|
+
newMoDataList.push(this._inlineReportCreateNewMo(true));
|
|
365
|
+
this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
366
|
+
this.refreshContextMoDataList(newMoDataList);
|
|
367
|
+
}
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
_inlineEditSaveFormPanel(mo) {
|
|
372
|
+
const newMoDataList = this.moDataList;
|
|
373
|
+
if (!mo.$NewInlineMo) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
|
|
377
|
+
if (existsIndex > -1) {
|
|
378
|
+
newMoDataList[existsIndex] = mo;
|
|
379
|
+
}
|
|
380
|
+
newMoDataList.map((c) => {
|
|
381
|
+
c.$NewInlineMo = undefined;
|
|
382
|
+
c.$IsChecked = false;
|
|
383
|
+
});
|
|
384
|
+
// const reportEventMo = {
|
|
385
|
+
// ReportId: this.reportId,
|
|
386
|
+
// ...mo,
|
|
387
|
+
// $IsChecked: false,
|
|
388
|
+
// $NewInlineMo: undefined
|
|
389
|
+
// };
|
|
390
|
+
// const indexOfMo = this._getIndex(mo);
|
|
391
|
+
// // let indexOfNextMo = indexOfMo + 1;
|
|
392
|
+
// // const canAdd: boolean = this._access?.Add !== false;
|
|
393
|
+
// let insertedIndex = indexOfMo;
|
|
394
|
+
// if (indexOfMo === -1) {
|
|
395
|
+
// insertedIndex = newMoDataList.length;
|
|
396
|
+
// }
|
|
397
|
+
// newMoDataList.splice(insertedIndex, indexOfMo === -1 ? 0 : 1, reportEventMo);
|
|
398
|
+
// if (mo.$State === 'New') {
|
|
399
|
+
// }
|
|
400
|
+
newMoDataList.push(this._inlineReportCreateNewMo(false));
|
|
401
|
+
this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
402
|
+
this.refreshContextMoDataList(newMoDataList);
|
|
403
|
+
this._rowCheck(mo, newMoDataList.findIndex((c) => c.Id === mo.Id));
|
|
404
|
+
// this._ulvMainService.createNewInlineMo();
|
|
405
|
+
}
|
|
406
|
+
_setDefaultAccess() {
|
|
407
|
+
this._access = {
|
|
408
|
+
Add: false,
|
|
409
|
+
AddToList: false,
|
|
410
|
+
Delete: false,
|
|
411
|
+
Edit: false,
|
|
412
|
+
Export: false,
|
|
413
|
+
Print: false,
|
|
414
|
+
Refresh: false,
|
|
415
|
+
RemoveFromList: false,
|
|
416
|
+
View: false
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
_expandMo(selectedMo, expand) {
|
|
420
|
+
selectedMo.$Expanded = expand;
|
|
421
|
+
selectedMo.$Children?.forEach((child) => {
|
|
422
|
+
this._expandMo(child, expand);
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
_indexOfId(id) {
|
|
426
|
+
return this.gridDataSource.resultItems.findIndex((c) => c.Id === id);
|
|
427
|
+
}
|
|
428
|
+
_indexOfMo(mo) {
|
|
429
|
+
return this.gridDataSource.resultItems.findIndex((c) => c.Id === mo.Id);
|
|
430
|
+
}
|
|
431
|
+
_indexOfSelected() {
|
|
432
|
+
return this.gridDataSource.resultItems.findIndex((c) => c.$IsChecked);
|
|
433
|
+
}
|
|
434
|
+
_getIndex(mo) {
|
|
435
|
+
return this.moDataList.findIndex((c) => c.Id === mo.Id);
|
|
436
|
+
}
|
|
437
|
+
_inilineEditCancel() {
|
|
438
|
+
this._setInlineEdit(false);
|
|
439
|
+
}
|
|
440
|
+
_setInlineEdit(value) {
|
|
441
|
+
this._ulvMainService.setInlineEdit(value);
|
|
442
|
+
}
|
|
443
|
+
_readViewSetting() {
|
|
444
|
+
this.viewSetting = this.context.Setting.ClassNames.CustomUi?.Parameters;
|
|
445
|
+
}
|
|
446
|
+
// protected _moDataListChanged(moDataList: MetaobjectDataModel[]): void {
|
|
447
|
+
// super._moDataListChanged(moDataList);
|
|
448
|
+
// if (this._inlineEditMode) {
|
|
449
|
+
// const checkedMoIndex = moDataList.findIndex((c) => c.$IsChecked);
|
|
450
|
+
// if (checkedMoIndex > -1) {
|
|
451
|
+
// const checkedMo = moDataList[checkedMoIndex];
|
|
452
|
+
// if (checkedMo.Id !== this.formPanelCtrlr.Mo.Id) {
|
|
453
|
+
// this._inlineEditorDestroyFormPanelCtrlr();
|
|
454
|
+
// this._inlineEditCreateFormPanelCtrlr(checkedMo, checkedMoIndex);
|
|
455
|
+
// }
|
|
456
|
+
// }
|
|
457
|
+
// }
|
|
458
|
+
// }
|
|
459
|
+
_setVisibility(expand, mo //MetaobjectDataModel
|
|
460
|
+
) {
|
|
461
|
+
mo.$Children?.forEach((child) => {
|
|
462
|
+
child.$Visibility = expand;
|
|
463
|
+
if (child.$Children) {
|
|
464
|
+
this._setVisibility(expand, child);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
// protected _setNewInlineMo(mo: MetaobjectDataModel | null): void {
|
|
469
|
+
// this._ulvMainService.setNewInlineMo(mo);
|
|
470
|
+
// }
|
|
471
|
+
// protected _inlineEditPrepareNewMo(): MetaobjectDataModel {
|
|
472
|
+
// const newMo = getNewMoGridEditor(this.formSetting, this._typeDefId);
|
|
473
|
+
// newMo.Id = getUniqueId(3);
|
|
474
|
+
// if (this._isComposite()) {
|
|
475
|
+
// const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
|
|
476
|
+
// newMo[relation.ParentFdName] = relation.ParentMoId;
|
|
477
|
+
// }
|
|
478
|
+
// const newMoDataList = [...this.moDataList, newMo as MetaobjectDataModel];
|
|
479
|
+
// this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
480
|
+
// BarsaApi.Ul.ApplicationCtrlr.fireEvent(
|
|
481
|
+
// BarsaApi.Ul.ApplicationCtrlr.EventEnum.GlobalReportMoAdd,
|
|
482
|
+
// this.context,
|
|
483
|
+
// reportEventMoAdd
|
|
484
|
+
// );
|
|
485
|
+
// this.context.fireEvent('RefreshContextMoDataList', newMoDataList);
|
|
486
|
+
// return newMo as MetaobjectDataModel;
|
|
487
|
+
// }
|
|
488
|
+
_addInlineMoToModataList(newInlineMo) {
|
|
489
|
+
const newMoDataList = [...this.moDataList, { ...newInlineMo, $IsChecked: false }];
|
|
490
|
+
this._ulvMainService.reSetMoDataList(newMoDataList);
|
|
491
|
+
this.refreshContextMoDataList(newMoDataList);
|
|
492
|
+
}
|
|
493
|
+
_rowCheck(mo, index, selected = false) {
|
|
494
|
+
const editMode = this._inlineEditMode && this._allowInlineEdit;
|
|
495
|
+
if (mo.$IsChecked && editMode) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
let selectionMode = this.selectionMode;
|
|
499
|
+
if (editMode) {
|
|
500
|
+
selectionMode = SelectionMode.SINGLE;
|
|
501
|
+
}
|
|
502
|
+
const checked = !mo.$IsChecked || selected;
|
|
503
|
+
this.rowHoverable = false;
|
|
504
|
+
if (selectionMode === 'none') {
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
if (checked) {
|
|
508
|
+
if (selectionMode === 'single' && checked) {
|
|
509
|
+
this._doCheckedAll(false);
|
|
510
|
+
}
|
|
511
|
+
if (editMode) {
|
|
512
|
+
if (index !== -1) {
|
|
513
|
+
// this._setNewInlineMo(null);
|
|
514
|
+
this._select(mo, index);
|
|
515
|
+
}
|
|
516
|
+
// TODO
|
|
517
|
+
// this._setValueInlineMo(mo);
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
this._select(mo, index);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
else
|
|
524
|
+
this._deselect(mo, index);
|
|
525
|
+
}
|
|
526
|
+
// protected _setValueInlineMo(mo: MetaobjectDataModel): void {
|
|
527
|
+
// // this.formPanelCtrlr.SetValue({ ...mo, $TypeDefId: this._typeDefId });
|
|
528
|
+
// }
|
|
529
|
+
_inlineEditorDestroyFormPanelCtrlr() {
|
|
530
|
+
// if (this.formPanelCtrlr) {
|
|
531
|
+
// this._formPanelService.destroy();
|
|
532
|
+
// this.formPanelCtrlr.Destroy();
|
|
533
|
+
// this.formPanelCtrlr = null;
|
|
534
|
+
// }
|
|
535
|
+
}
|
|
536
|
+
_windowResized() {
|
|
537
|
+
this._setContainerWidth();
|
|
538
|
+
this._setParentHeight();
|
|
539
|
+
}
|
|
540
|
+
_setContainerWidth() {
|
|
541
|
+
const el = this.el.nativeElement;
|
|
542
|
+
this.containerWidthSource$.next(el.offsetWidth);
|
|
543
|
+
}
|
|
544
|
+
_deviceSizeChanged(deviceSize) {
|
|
545
|
+
const el = this.el.nativeElement;
|
|
546
|
+
if (this._inlineEditMode) {
|
|
547
|
+
this.secondaryColumnsSource.next([]);
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
if (this.viewSetting?.DisableResponsive) {
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
const gridSize = getControlSizeMode(el, deviceSize);
|
|
554
|
+
let deviceName = 'desktop';
|
|
555
|
+
const visibleColumns = this._visibleColumnsSource.getValue();
|
|
556
|
+
let columnsCount = visibleColumns.length;
|
|
557
|
+
switch (gridSize) {
|
|
558
|
+
case 'l':
|
|
559
|
+
case 'xl':
|
|
560
|
+
deviceName = 'desktop';
|
|
561
|
+
break;
|
|
562
|
+
case 's':
|
|
563
|
+
deviceName = 'mobile';
|
|
564
|
+
columnsCount = 2;
|
|
565
|
+
break;
|
|
566
|
+
case 'm':
|
|
567
|
+
deviceName = 'tablet';
|
|
568
|
+
columnsCount = 4;
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
this._deviceNameSource.next(deviceName);
|
|
572
|
+
const colSettings = this.gridSettingSource.getValue()?.ColSettingList || [];
|
|
573
|
+
let sumColWidth = 0;
|
|
574
|
+
if (colSettings.length > 0 && this.containerWidth > 0) {
|
|
575
|
+
columnsCount = visibleColumns.length;
|
|
576
|
+
colSettings.forEach((col, index) => {
|
|
577
|
+
if (sumColWidth + col.Width > this.containerWidth && columnsCount === visibleColumns.length) {
|
|
578
|
+
columnsCount = index;
|
|
579
|
+
}
|
|
580
|
+
sumColWidth += col.Width;
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
if (visibleColumns.length > 2) {
|
|
584
|
+
this.secondaryColumnsSource.next(visibleColumns.slice(columnsCount, visibleColumns.length));
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
_openSettings(name, device) {
|
|
588
|
+
let component = null;
|
|
589
|
+
switch (name) {
|
|
590
|
+
case 'columns':
|
|
591
|
+
component = UlvColumnSettingsComponent;
|
|
592
|
+
break;
|
|
593
|
+
case 'sort':
|
|
594
|
+
component = UlvSortSettingsComponent;
|
|
595
|
+
break;
|
|
596
|
+
case 'groupby':
|
|
597
|
+
component = UlvGroupbySettingsComponent;
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
const config = {
|
|
601
|
+
...this.dialogConfig,
|
|
602
|
+
data: { context: this.context },
|
|
603
|
+
fullScreen: device === 'mobile',
|
|
604
|
+
minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
|
|
605
|
+
minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight
|
|
606
|
+
};
|
|
607
|
+
if (component !== null) {
|
|
608
|
+
const dialogRef = this._dialogService.open(component, config);
|
|
609
|
+
dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
|
|
610
|
+
if (setting) {
|
|
611
|
+
const isSortChanged = name === 'sort' || name === 'groupby';
|
|
612
|
+
this.updateGridSetting(setting, isSortChanged);
|
|
613
|
+
this.context.moDataList = this.gridDataSource.resultItems;
|
|
614
|
+
this._setVisibleColumns();
|
|
615
|
+
}
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
_showFilterSetting(selectedColumn) {
|
|
620
|
+
const typeDefId = this._typeDefId;
|
|
621
|
+
const controlsInfo$ = this._ulvMainService.loadMetaConditionsControlInfos(typeDefId, this.allColumns.map((c) => c.Name));
|
|
622
|
+
const config = {
|
|
623
|
+
...this.dialogConfig,
|
|
624
|
+
data: {
|
|
625
|
+
controlsInfo$,
|
|
626
|
+
typeDefId,
|
|
627
|
+
selectedColumnName: selectedColumn.Name,
|
|
628
|
+
context: this.context
|
|
629
|
+
}
|
|
630
|
+
};
|
|
631
|
+
const dialogRef = this._dialogService.open(UlvFilterSettingsComponent, config);
|
|
632
|
+
dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
|
|
633
|
+
if (setting) {
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
_addSortColumn(name, sortDirection, isGrouped = false) {
|
|
638
|
+
const sortItem = {
|
|
639
|
+
Name: name,
|
|
640
|
+
SortDirection: sortDirection,
|
|
641
|
+
IsGrouped: isGrouped
|
|
642
|
+
};
|
|
643
|
+
const settings = getGridSettings(this.context);
|
|
644
|
+
const existSortItemIndex = settings.SortSettingList.findIndex((c) => c.Name === name);
|
|
645
|
+
if (existSortItemIndex > -1) {
|
|
646
|
+
settings.SortSettingList[existSortItemIndex] = sortItem;
|
|
647
|
+
}
|
|
648
|
+
else {
|
|
649
|
+
settings.SortSettingList.push(sortItem);
|
|
650
|
+
}
|
|
651
|
+
this.updateGridSetting(settings, true);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
SapUiReportBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: SapUiReportBaseComponent, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i2.ContentDensityService }, { token: i3.PortalService }, { token: i2.DialogService }, { token: i3.UlvMainService }, { token: i3.LayoutService }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i3.FormPanelService, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
655
|
+
SapUiReportBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: SapUiReportBaseComponent, selector: "bsu-sap-ui-report-base", inputs: { ShowFormPanelControl: "ShowFormPanelControl", ForceCloseChild: "ForceCloseChild", RefreshFormPanelControl: "RefreshFormPanelControl" }, viewQueries: [{ propertyName: "tableComponent", first: true, predicate: TableComponent, descendants: true }, { propertyName: "toolbarComponent", first: true, predicate: ToolbarComponent, descendants: true }, { propertyName: "tableRowsRef", predicate: ["tableRows"], descendants: true }, { propertyName: "layoutControlsRef", predicate: LayoutControlComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
656
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: SapUiReportBaseComponent, decorators: [{
|
|
657
|
+
type: Component,
|
|
658
|
+
args: [{
|
|
659
|
+
selector: 'bsu-sap-ui-report-base',
|
|
660
|
+
template: '',
|
|
661
|
+
changeDetection: ChangeDetectionStrategy.OnPush
|
|
662
|
+
}]
|
|
663
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i2.ContentDensityService }, { type: i3.PortalService }, { type: i2.DialogService }, { type: i3.UlvMainService }, { type: i3.LayoutService }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
|
|
664
|
+
type: Inject,
|
|
665
|
+
args: [DOCUMENT]
|
|
666
|
+
}] }, { type: i3.FormPanelService, decorators: [{
|
|
667
|
+
type: Optional
|
|
668
|
+
}, {
|
|
669
|
+
type: Self
|
|
670
|
+
}] }]; }, propDecorators: { tableComponent: [{
|
|
671
|
+
type: ViewChild,
|
|
672
|
+
args: [TableComponent]
|
|
673
|
+
}], toolbarComponent: [{
|
|
674
|
+
type: ViewChild,
|
|
675
|
+
args: [ToolbarComponent]
|
|
676
|
+
}], tableRowsRef: [{
|
|
677
|
+
type: ViewChildren,
|
|
678
|
+
args: ['tableRows']
|
|
679
|
+
}], layoutControlsRef: [{
|
|
680
|
+
type: ViewChildren,
|
|
681
|
+
args: [LayoutControlComponent]
|
|
682
|
+
}], ShowFormPanelControl: [{
|
|
683
|
+
type: Input
|
|
684
|
+
}], ForceCloseChild: [{
|
|
685
|
+
type: Input
|
|
686
|
+
}], RefreshFormPanelControl: [{
|
|
687
|
+
type: Input
|
|
688
|
+
}] } });
|
|
689
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FwLXVpLXJlcG9ydC1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3NhcC11aS1yZXBvcnQtYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBR1IsSUFBSSxFQUNKLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pILE9BQU8sRUFLSCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBbUIsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRSxPQUFPLEVBQ0gsUUFBUSxFQUtSLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZUFBZSxFQUlmLG1CQUFtQixFQUl0QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEcsT0FBTyxFQUFFLDBCQUEwQixFQUFF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QWM7c0JBQXhDLFNBQVM7dUJBQUMsY0FBYztnQkFDSSxnQkFBZ0I7c0JBQTVDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNBLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFFekIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLHNCQUFzQjtnQkFnVTNCLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLHVCQUF1QjtzQkFBL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBJbmplY3QsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgUmVuZGVyZXIyLFxyXG4gICAgU2VsZixcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBPdmVybGF5LCBTY3JvbGxTdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwsIHRhcCwgd2l0aExhdGVzdEZyb20gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgICBDb250ZW50RGVuc2l0eSxcclxuICAgIENvbnRlbnREZW5zaXR5U2VydmljZSxcclxuICAgIERpYWxvZ0NvbmZpZyxcclxuICAgIERpYWxvZ1NlcnZpY2UsXHJcbiAgICBUYWJsZUNvbXBvbmVudCxcclxuICAgIFRvb2xiYXJDb21wb25lbnRcclxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlLCBUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBCYXJzYUFwaSxcclxuICAgIGNvbHVtbnNSZXNpemVkRXZlbnRBcmdzLFxyXG4gICAgRGVmYXVsdENvbW1hbmRzQWNjZXNzLFxyXG4gICAgRGV2aWNlU2l6ZSxcclxuICAgIEZvcm1QYW5lbFNlcnZpY2UsXHJcbiAgICBHZXRBbGxDb2x1bW5zU29ydGVkLFxyXG4gICAgZ2V0Q29udHJvbFNpemVNb2RlLFxyXG4gICAgZ2V0R3JpZFNldHRpbmdzLFxyXG4gICAgTGF5b3V0U2VydmljZSxcclxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBQb3J0YWxTZXJ2aWNlLFxyXG4gICAgUmVwb3J0QmFzZUNvbXBvbmVudCxcclxuICAgIFJlcG9ydFZpZXdDb2x1bW4sXHJcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcclxuICAgIFVsdk1haW5TZXJ2aWNlXHJcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBMYXlvdXRDb250cm9sQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtY29udHJvbC9sYXlvdXQtY29udHJvbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkTW9EYXRhTGlzdCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgVWx2Q29sdW1uU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1jb2x1bW4tc2V0dGluZ3MvdWx2LWNvbHVtbi1zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVbHZTb3J0U2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1zb3J0LXNldHRpbmdzL3Vsdi1zb3J0LXNldHRpbmdzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVsdkdyb3VwYnlTZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4vdWx2LWdyb3VwYnktc2V0dGluZ3MvdWx2LWdyb3VwYnktc2V0dGluZ3MuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWx2RmlsdGVyU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1maWx0ZXItc2V0dGluZ3MvdWx2LWZpbHRlci1zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LXNhcC11aS1yZXBvcnQtYmFzZScsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2FwVWlSZXBvcnRCYXNlQ29tcG9uZW50PFQgZXh0ZW5kcyBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZz5cclxuICAgIGV4dGVuZHMgUmVwb3J0QmFzZUNvbXBvbmVudFxyXG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxyXG57XHJcbiAgICBAVmlld0NoaWxkKFRhYmxlQ29tcG9uZW50KSB0YWJsZUNvbXBvbmVudDogVGFibGVDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKFRvb2xiYXJDb21wb25lbnQpIHRvb2xiYXJDb21wb25lbnQ6IFRvb2xiYXJDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkcmVuKCd0YWJsZVJvd3MnKSB0YWJsZVJvd3NSZWY6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuICAgIEBWaWV3Q2hpbGRyZW4oTGF5b3V0Q29udHJvbENvbXBvbmVudClcclxuICAgIGxheW91dENvbnRyb2xzUmVmOiBRdWVyeUxpc3Q8TGF5b3V0Q29udHJvbENvbXBvbmVudD47XHJcbiAgICB1c2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2wgPSBmYWxzZTtcclxuICAgIGhhc1NlbGVjdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHNob3dPa0NhbmNlbEJ1dHRvbnM6IGFueTtcclxuICAgIHBhcmVudEhlaWdodCA9IDA7XHJcbiAgICBkaWFsb2dDb25maWc6IERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICByZXNwb25zaXZlUGFkZGluZzogdHJ1ZSxcclxuICAgICAgICB2ZXJ0aWNhbFBhZGRpbmc6IHRydWUsXHJcbiAgICAgICAgbWluV2lkdGg6ICc0MHJlbScsXHJcbiAgICAgICAgbWluSGVpZ2h0OiAnOTB2aCcsXHJcbiAgICAgICAgbWF4V2lkdGg6ICcxMDB2dycsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnMTAwdmgnLFxyXG4gICAgICAgIHJlc2l6YWJsZTogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICBzZWxlY3RlZFJvd3NOdW1iZXIgPSB7fTtcclxuICAgIHNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgc2VsZWN0aW9uQWRhcHRlckhhbmRsZXI6IHtcclxuICAgICAgICBzY29wZTogYW55O1xyXG4gICAgICAgIHJvd3NlbGVjdDogYW55O1xyXG4gICAgICAgIHJvd2Rlc2VsZWN0OiBhbnk7XHJcbiAgICAgICAgYmVmb3Jlcm93c2VsZWN0OiBhbnk7XHJcbiAgICB9O1xyXG4gICAgbmF2aWdhdGlvbkFycm93JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xyXG4gICAgY3VzdG9tUm93SGVpZ2h0OiBhbnk7XHJcbiAgICByb3dDbGljayA9IHRydWU7XHJcbiAgICBjZWxsQ2xpY2sgPSBmYWxzZTtcclxuICAgIGRldmljZU5hbWUkOiBPYnNlcnZhYmxlPERldmljZVNpemU+O1xyXG4gICAgbW9iaWxlT3JUYWJsZXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAgIHNlY29uZGFyeUNvbHVtbnNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlcG9ydFZpZXdDb2x1bW5bXT4oW10pO1xyXG4gICAgc2Vjb25kYXJ5Q29sdW1ucyQgPSB0aGlzLnNlY29uZGFyeUNvbHVtbnNTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwb3BpbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBjb250ZW50RGVuc2l0eSQ6IE9ic2VydmFibGU8Q29udGVudERlbnNpdHk+O1xyXG5cclxuICAgIHJvd0FjdGl2YWJsZSA9IHRydWU7XHJcbiAgICBvcGVuT3ZlcmZsb3dDb21tYW5kczogYm9vbGVhbltdID0gW107XHJcbiAgICBjb250YWluZXJXaWR0aFNvdXJjZSQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XHJcbiAgICBjbG9zZVNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneTtcclxuICAgIHJvd0hvdmVyYWJsZTogYm9vbGVhbjtcclxuICAgIHNvdXJjZTogVGFibGVEYXRhU291cmNlPE1ldGFvYmplY3REYXRhTW9kZWw+O1xyXG4gICAgc2VsZWN0aW9uTW9kZTogU2VsZWN0aW9uTW9kZTtcclxuICAgIGNvbHVtbnNDb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuICAgIHNlY29uZGFyeUNvbHVtbnNDb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuICAgIGNvbnRhaW5lcldpZHRoJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gICAgY29sdW1ucyQ6IE9ic2VydmFibGU8UmVwb3J0Vmlld0NvbHVtbltdPjtcclxuICAgIGdyaWREYXRhU291cmNlOiBHcmlkTW9EYXRhTGlzdDtcclxuICAgIHNpbmdsZVNlbGVjdGlvbiA9IFNlbGVjdGlvbk1vZGUuU0lOR0xFO1xyXG4gICAgbXVsdGlwbGVTZWxlY3Rpb24gPSBTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xyXG4gICAgYWxsb3dJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGlubGluZUVkaXRNb2RlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIG9ubHlJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGZvcm1QYW5lbEN0cmxyOiBhbnk7XHJcbiAgICBsYXlvdXQkOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgcmVwb3J0SWQ6IHN0cmluZztcclxuICAgIHZpZXdTZXR0aW5nOiBUO1xyXG5cclxuICAgIHByb3RlY3RlZCBfZGV2aWNlTmFtZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGV2aWNlU2l6ZT4oJ2Rlc2t0b3AnKTtcclxuICAgIHByaXZhdGUgX29sZENvbnRhaW5lcjogYW55O1xyXG4gICAgcHJpdmF0ZSBfb3Blbk9uQ2xpY2s6IGJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9vdmVybGF5OiBPdmVybGF5LFxyXG4gICAgICAgIHByb3RlY3RlZCBfY29udGVudERlbnNpdHlTZXJ2aWNlOiBDb250ZW50RGVuc2l0eVNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX3Vsdk1haW5TZXJ2aWNlOiBVbHZNYWluU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX2xheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByb3RlY3RlZCBkb2N1bWVudCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByb3RlY3RlZCBfZm9ybXBhbmVsU2VydmljZTogRm9ybVBhbmVsU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX3BvcnRhbFNlcnZpY2UsIF91bHZNYWluU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCQgPSB0aGlzLmNvbnRhaW5lcldpZHRoU291cmNlJFxyXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDIwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlTmFtZSQgPSB0aGlzLl9kZXZpY2VOYW1lU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMubW9iaWxlT3JUYWJsZXQkID0gdGhpcy5kZXZpY2VOYW1lJC5waXBlKG1hcCgoZGV2aWNlKSA9PiBkZXZpY2UgPT09ICdtb2JpbGUnIHx8IGRldmljZSA9PT0gJ3RhYmxldCcpKTtcclxuICAgICAgICB0aGlzLl9vbGRDb250YWluZXIgPSBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkN1cnJlbnRTeXN0ZW1BZGFwdGVyO1xyXG4gICAgICAgIHRoaXMuY2xvc2VTY3JvbGxTdHJhdGVneSA9IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuY29udGVudERlbnNpdHkkID0gdGhpcy5fY29udGVudERlbnNpdHlTZXJ2aWNlLmNvbnRlbnREZW5zaXR5O1xyXG4gICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc0NvdW50JCA9IHRoaXMuc2Vjb25kYXJ5Q29sdW1ucyQucGlwZShtYXAoKGNvbHVtbnMpID0+IGNvbHVtbnMubGVuZ3RoKSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ291bnQkID0gdGhpcy52aXNpYmxlQ29sdW1ucyQucGlwZShcclxuICAgICAgICAgICAgbWFwKChjb2x1bW5zKSA9PiBjb2x1bW5zLmxlbmd0aCksXHJcbiAgICAgICAgICAgIG1hcCgoY291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUodGhpcy5jb250ZXh0LCAnU2V0dGluZy5FeHRyYS5EZWZhdWx0Q29tbWFuZHNBY2Nlc3MnKTtcclxuICAgICAgICAgICAgICAgIGlmIChhY2Nlc3M/LlZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbWFwKChjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF90eXBlRGVmSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEuUmVwb3J0LlR5cGVEZWZJZDtcclxuICAgIH1cclxuICAgIGdldCBfaW5saW5lRWRpdE1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmdldFZhbHVlSW5saW5lRWRpdCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9hbGxvd0lubGluZUVkaXQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmdldEFsbG93SW5saW5lRWRpdCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9hY2Nlc3MoKTogRGVmYXVsdENvbW1hbmRzQWNjZXNzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LlNldHRpbmc/LkV4dHJhPy5EZWZhdWx0Q29tbWFuZHNBY2Nlc3M7XHJcbiAgICB9XHJcbiAgICBzZXQgX2FjY2Vzcyh2YWw6IERlZmF1bHRDb21tYW5kc0FjY2Vzcykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuU2V0dGluZy5FeHRyYSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuU2V0dGluZy5FeHRyYS5EZWZhdWx0Q29tbWFuZHNBY2Nlc3MgPSB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEgPSB7IERlZmF1bHRDb21tYW5kc0FjY2VzczogdmFsIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2V0UGFyZW50SGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fcmVhZFZpZXdTZXR0aW5nKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9hY2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFjY2VzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuc2hvd09rQ2FuY2VsQnV0dG9ucyA9IHRoaXMuY29udGV4dC5TaG93T2tDYW5jZWxCdXR0b25zO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxheW91dEluZm8kLnN1YnNjcmliZSgobGF5b3V0SW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SW5mbyAmJiBsYXlvdXRJbmZvLlVzZUxheW91dEl0ZW1UZXh0Rm9yQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLnZpZXdTZXR0aW5nPy5UaXRsZTtcclxuICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2Uuc2V0VGl0bGUodGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZXBvcnRJZCQuc3Vic2NyaWJlKChyZXBvcnRJZCkgPT4gKHRoaXMucmVwb3J0SWQgPSByZXBvcnRJZCkpO1xyXG4gICAgICAgIHRoaXMuX2xheW91dFNlcnZpY2Uuc2V0UmVuZGVyZWQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb250ZXh0LlZpZXdTZXR0aW5nPy5Jc0NoZWNrTGlzdCA/IHRoaXMubXVsdGlwbGVTZWxlY3Rpb24gOiB0aGlzLnNpbmdsZVNlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLl9vcGVuT25DbGljayA9IHRoaXMudmlld1NldHRpbmc/Lk9wZW5PbkNsaWNrO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tUm93SGVpZ2h0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLFxyXG4gICAgICAgICAgICAnRXh0cmEuRXh0cmFKc29uUHJvcFJlcG9ydC5HcmlkUm93SGVpZ2h0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5ydGwkID0gdGhpcy5fcG9ydGFsU2VydmljZS5ydGwkO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkFycm93JCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UucnRsJC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKGlzUnRsKSA9PiAoaXNSdGwgPyAnbmF2aWdhdGlvbi1sZWZ0LWFycm93JyA6ICduYXZpZ2F0aW9uLXJpZ2h0LWFycm93JykpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmFsbG93SW5saW5lRWRpdCQgPSB0aGlzLl91bHZNYWluU2VydmljZS5hbGxvd0lubGluZUVkaXQkO1xyXG4gICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUkID0gdGhpcy5fdWx2TWFpblNlcnZpY2UuaW5saW5lRWRpdE1vZGUkO1xyXG4gICAgICAgIHRoaXMub25seUlubGluZUVkaXQkID0gdGhpcy5fdWx2TWFpblNlcnZpY2Uub25seUlubGluZUVkaXQkO1xyXG4gICAgICAgIHRoaXMuaGFzU2VsZWN0ZWQkID0gdGhpcy5tb0RhdGFMaXN0JC5waXBlKG1hcCgobW9MaXN0KSA9PiBtb0xpc3Quc29tZSgoYykgPT4gYy4kSXNDaGVja2VkKSkpO1xyXG4gICAgICAgIHRoaXMubW9EYXRhTGlzdCQgPSB0aGlzLm1vRGF0YUxpc3QkLnBpcGUobWFwKChpdGVtcykgPT4gdGhpcy5fbWFwQ2FydGFibGVNbyhpdGVtcykpKTtcclxuICAgICAgICBjb25zdCBncmlkRGF0YVNvdXJjZSA9IG5ldyBHcmlkTW9EYXRhTGlzdChcclxuICAgICAgICAgICAgdGhpcy5tb0RhdGFMaXN0JCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZyQsXHJcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMkLFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm0kXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkRGF0YVNvdXJjZSA9IGdyaWREYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmdyaWRTZXR0aW5nJCwgdGhpcy5zZWNvbmRhcnlDb2x1bW5zJF0pLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgoWywgc2Vjb25kYXJ5Q29sdW1uc10pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZGFyaWVzID0gc2Vjb25kYXJ5Q29sdW1ucy5tYXAoKGMpID0+IGMuTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gR2V0QWxsQ29sdW1uc1NvcnRlZCh0aGlzLmNvbnRleHQpLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoYykgPT4gc2Vjb25kYXJpZXMuaW5kZXhPZihjLk5hbWUpID09PSAtMSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0YXAoKGNvbHVtbnMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoYzogUmVwb3J0Vmlld0NvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGMuJENTU0NsYXNzTmFtZSA9ICdjb2x1bW5fX0ZpZWxkVHlwZScgKyBjLkZpZWxkVHlwZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLkZpZWxkVHlwZUlkID09PSAzOCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLiRXaWR0aCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuRXh0cmE/Lkljb25EaXNwbGF5VHlwZUVudW0gPT09ICdJbWFnZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy4kV2lkdGggPSAnMzhweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy4kV2lkdGggPSAhQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc1VzZXJMb2dnZWRJbiAvLyBpZiB1c2VyIGlzIGFub255bW91cyBhbGwgY29sdW1uIHdpZHRoIGVxdWFscyB0byAxMDAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcxMDAlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjLldpZHRoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjLldpZHRoICsgJ3B4J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5pbmxpbmVFZGl0TW9kZSRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmhhc1NlbGVjdGVkJCksXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKFtfLF9fXSkgPT4gdGhpcy5fYWNjZXNzLkFkZCAhPT0gZmFsc2UpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW2VkaXRNb2RlXSkgPT4gdGhpcy5faW5saW5lRWRpdE1vZGVDaGFuZ2VkKGVkaXRNb2RlKSk7XHJcbiAgICAgICAgdGhpcy5fc2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9mb3JtcGFuZWxTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1wYW5lbFNlcnZpY2UuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NldElubGluZUVkaXQoIXRoaXMuX2lubGluZUVkaXRNb2RlKTtcclxuICAgIH1cclxuICAgIG9uU2VsZWN0TmV4dElubGluZVJlY29yZChtbyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdE5leHRJbmxpbmVSZWNvcmQobW8pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdEZvcm1QYW5lbFNhdmUobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbmxpbmVFZGl0U2F2ZUZvcm1QYW5lbChtbyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0Rm9ybVBhbmVsQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2luaWxpbmVFZGl0Q2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgICBvbkVkaXRGb3JtUGFuZWxWYWx1ZUNoYW5nZShtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lubGluZUZvcm1QYW5lbFZhbHVlQ2hhbmdlKG1vKTtcclxuICAgIH1cclxuICAgIG9uQ29sdW1uUmVzaXplZChjb2x1bW5zOiBjb2x1bW5zUmVzaXplZEV2ZW50QXJncyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUNvbHVtbnNSZXNpemVkKGNvbHVtbnMpO1xyXG4gICAgfVxyXG4gICAgb25Sb3dDbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgaWYgKG1vLmdyb3VwIHx8IHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICB0aGlzLl9yb3dDaGVjayhtbywgbW9JbmRleCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fb3Blbk1vKG1vLCBtb0luZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBvblVsdkNvbW1hbmQoJGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyBtbyB9ID0gJGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IG1vSW5kZXggPSB0aGlzLl9nZXRJbmRleChtbyk7XHJcbiAgICAgICAgdGhpcy5fdWx2Q29tbWFuZENsaWNrZWQobW8sIG1vSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgb25Sb3dDaGVjaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICBpZiAodGhpcy5fb3Blbk9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrKCRldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcm93Q2hlY2sobW8sIG1vSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkV4cGFuZENsaWNrKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgbW8uJEV4cGFuZGVkID0gIW1vLiRFeHBhbmRlZDtcclxuICAgICAgICB0aGlzLl9zZXRWaXNpYmlsaXR5KG1vLiRFeHBhbmRlZCwgbW8pO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWxsQ2hlY2tib3goY2hlY2tlZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RvQ2hlY2tlZEFsbChjaGVja2VkKTtcclxuICAgICAgICAvLyBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgIC8vICAgdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5mb3JFYWNoKChtbywgaW5kZXgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5mb3JFYWNoKChtbywgaW5kZXgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fZGVzZWxlY3QobW8sIGluZGV4KTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNvcnRBc2NlbmRpbmcoY29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkU29ydENvbHVtbihjb2x1bW4uTmFtZSwgJ0FTQycpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU29ydERlc2NlbmRpbmcoY29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkU29ydENvbHVtbihjb2x1bW4uTmFtZSwgJ0RFU0MnKTtcclxuICAgIH1cclxuICAgIG9uRmlsdGVyKHNlbGVjdGVkQ29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2hvd0ZpbHRlclNldHRpbmcoc2VsZWN0ZWRDb2x1bW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ29sdW1uU2V0dGluZ3MoZGV2aWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb3BlblNldHRpbmdzKCdjb2x1bW5zJywgZGV2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNvcnRTZXR0aW5ncyhkZXZpY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vcGVuU2V0dGluZ3MoJ3NvcnQnLCBkZXZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uR3JvdXBieVNldHRpbmdzKGRldmljZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29wZW5TZXR0aW5ncygnZ3JvdXBieScsIGRldmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25MaXN0Q2hlY2tib3hDbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vLCBpbmRleCwgZSB9ID0gJGV2ZW50O1xyXG4gICAgICAgIHRoaXMub25Sb3dDaGVjayh7IG1vLCBpbmRleCwgY2F1c2U6ICdzaW5nbGVTZWxlY3QnIH0pO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTGlzdE5hdmlnYXRpb25DbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vLCBpbmRleCwgZSB9ID0gJGV2ZW50O1xyXG4gICAgICAgIHRoaXMub25Sb3dDbGljayh7IG1vLCBpbmRleCB9KTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIG9uU2F2ZVRvcEZvcm0obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xyXG4gICAgICAgIGNvbnN0IGV4aXN0c0luZGV4ID0gbmV3TW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IG1vLklkKTtcclxuICAgICAgICBpZiAoZXhpc3RzSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0W2V4aXN0c0luZGV4XSA9IG1vO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdNb0RhdGFMaXN0Lm1hcCgoYykgPT4ge1xyXG4gICAgICAgICAgICBjLiROZXdJbmxpbmVNbyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2UucmVTZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaENvbnRleHRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgfVxyXG4gICAgb25OZXdUb3BGb3JtQWRkKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkSW5saW5lTW9Ub01vZGF0YUxpc3QobW8pO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIEBJbnB1dCgpIFNob3dGb3JtUGFuZWxDb250cm9sID0gKGZvcm1wYW5lbEN0cmxyKSA9PiB7fTtcclxuICAgIC8qIGVzbGludC1kaXNhYmxlICovXHJcbiAgICBASW5wdXQoKSBGb3JjZUNsb3NlQ2hpbGQgPSAoKSA9PiB7fTtcclxuICAgIC8qIGVzbGludC1kaXNhYmxlICovXHJcbiAgICBASW5wdXQoKSBSZWZyZXNoRm9ybVBhbmVsQ29udHJvbCA9IChmb3JtcGFuZWxDdHJscikgPT4ge307XHJcblxyXG4gICAgLy8gcHJvdGVjdGVkIF9pbmxpbmVFZGl0TW9kZUNoYW5nZWQoZWRpdE1vZGUpOiB2b2lkIHtcclxuICAgIC8vICAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgY2FuQWRkOiBib29sZWFuID0gdGhpcy5fYWNjZXNzPy5BZGQgIT09IGZhbHNlO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IHNlbGVjdGVkTW8gPSB0aGlzLl9nZXRTZWxlY3RlZCgpO1xyXG4gICAgLy8gICAgICAgICBsZXQgbmV3TW87XHJcbiAgICAvLyAgICAgICAgIGlmIChjYW5BZGQgIT09IGZhbHNlICYmICFzZWxlY3RlZE1vKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLl9jcmVhdGVOZXdJbmxpbmVSZWNvcmQoKTtcclxuICAgIC8vICAgICAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAvLyBpZiAoIXNlbGVjdGVkTW8gJiYgIW5ld01vICYmIHRoaXMubW9EYXRhTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICBzZWxlY3RlZE1vID0gdGhpcy5tb0RhdGFMaXN0WzBdO1xyXG4gICAgLy8gICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgICAgIC8vIGlmIChzZWxlY3RlZE1vKSB7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICBjb25zdCBpZE9mU2VsZWN0ZWRNbyA9IHRoaXMuX2luZGV4T2ZNbyhzZWxlY3RlZE1vKTtcclxuICAgIC8vICAgICAgICAgLy8gICAgIHNlbGVjdGVkTW8uJElzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lUmVjb3JkKHNlbGVjdGVkTW8pO1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgdGhpcy5fcm93Q2hlY2soc2VsZWN0ZWRNbywgaWRPZlNlbGVjdGVkTW8pO1xyXG4gICAgLy8gICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5DdXJyZW50U3lzdGVtQWRhcHRlciA9IHRoaXMuX29sZENvbnRhaW5lcjtcclxuICAgIC8vICAgICAgICAgdGhpcy5fc2V0TmV3SW5saW5lTW8obnVsbCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gcHJvdGVjdGVkIF9jcmVhdGVOZXdJbmxpbmVSZWNvcmQoc2VsZWN0ZWRNbz86IE1ldGFvYmplY3REYXRhTW9kZWwpIHtcclxuICAgIC8vICAgICBjb25zdCBtbyA9IHRoaXMuX2lubGluZUVkaXRQcmVwYXJlTmV3TW8oKTtcclxuICAgIC8vICAgICBjb25zdCBmb3JtTW8gPSBCYXJzYUFwaS5Db21tb24uTWVyZ2VyLkZhc3RNZXJnZShtbywgc2VsZWN0ZWRNbywgeyBleHRlbmRlZEZpZWxkczogWydJZCwkQ2FwdGlvbiddIH0pO1xyXG4gICAgLy8gICAgIHRoaXMuX3NldE5ld0lubGluZU1vKGZvcm1Nbyk7XHJcbiAgICAvLyAgICAgdGhpcy5fc2VsZWN0KGZvcm1NbywgLTEpO1xyXG4gICAgLy8gfVxyXG4gICAgcHJvdGVjdGVkIF9zZXRQYXJlbnRIZWlnaHQoKSB7XHJcbiAgICAgICAgY29uc3QgZWxEb20gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHBhcmVudERvbSA9IGVsRG9tLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IHBhcmVudERvbT8uY2xpZW50SGVpZ2h0ID8/IDA7XHJcbiAgICAgICAgd2hpbGUgKHBhcmVudERvbSAhPSBudWxsICYmICFwYXJlbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgcGFyZW50RG9tID0gcGFyZW50RG9tLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHBhcmVudEhlaWdodCA9IHBhcmVudERvbT8uY2xpZW50SGVpZ2h0ID8/IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGFyZW50SGVpZ2h0ID0gcGFyZW50SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9tYXBDYXJ0YWJsZU1vKGl0ZW1zOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pIHtcclxuICAgICAgICBpZiAoIXRoaXMudmlld1NldHRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IE5hbWVTZXJpYWxpemVNbywgQ2FydGFibGVPYmplY3ROYW1lIH0gPSB0aGlzLnZpZXdTZXR0aW5nO1xyXG4gICAgICAgIGlmICghTmFtZVNlcmlhbGl6ZU1vIHx8ICFDYXJ0YWJsZU9iamVjdE5hbWUgfHwgIWl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChjKSA9PiAoY1tDYXJ0YWJsZU9iamVjdE5hbWVdID0gQmFyc2FBcGkuRXh0LmRlY29kZSgneycgKyBjW05hbWVTZXJpYWxpemVNb10gKyAnfScpKSk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmxpbmVFZGl0TW9kZUNoYW5nZWQoZWRpdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlZGl0TW9kZSkge1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0LnB1c2godGhpcy5faW5saW5lUmVwb3J0Q3JlYXRlTmV3TW8oIXRoaXMuX2dldFNlbGVjdGVkKCkpKTtcclxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChlZGl0TW9kZSA9PT0gZmFsc2UgJiYgIW5ld01vRGF0YUxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIG5ld01vRGF0YUxpc3QgPSBuZXdNb0RhdGFMaXN0LmZpbHRlcigoYykgPT4gIWMuJE5ld0lubGluZU1vKTtcclxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY2hhbmdlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbmxpbmVSZXBvcnRDcmVhdGVOZXdNbyhpc0NoZWNrZWQ6IGJvb2xlYW4pOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdWx2TWFpblNlcnZpY2UuY3JlYXRlTmV3SW5saW5lTW8oaXNDaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lubGluZUZvcm1QYW5lbFZhbHVlQ2hhbmdlKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBjb25zdCBleGlzdE1vSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgIGlmIChleGlzdE1vSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0W2V4aXN0TW9JbmRleF0gPSBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYi5DcmVhdGVNbyhtbyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROZXh0SW5saW5lUmVjb3JkKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBpZiAoIW1vLiROZXdJbmxpbmVNbykge1xyXG4gICAgICAgICAgICAvLyBzZWxlY3QgbmV4dCByZWNvcmRcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RzSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgICAgICBpZiAoZXhpc3RzSW5kZXggPiAtMSAmJiBleGlzdHNJbmRleCArIDEgPCBuZXdNb0RhdGFMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleCArIDFdLiRJc0NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvd0NoZWNrKG5ld01vRGF0YUxpc3RbZXhpc3RzSW5kZXggKyAxXSwgZXhpc3RzSW5kZXggKyAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld01vRGF0YUxpc3QubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYy4kTmV3SW5saW5lTW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG5ld01vRGF0YUxpc3QucHVzaCh0aGlzLl9pbmxpbmVSZXBvcnRDcmVhdGVOZXdNbyh0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmxpbmVFZGl0U2F2ZUZvcm1QYW5lbChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XHJcbiAgICAgICAgaWYgKCFtby4kTmV3SW5saW5lTW8pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleGlzdHNJbmRleCA9IG5ld01vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0c0luZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleF0gPSBtbztcclxuICAgICAgICB9XHJcbiAgICAgICAgbmV3TW9EYXRhTGlzdC5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgYy4kTmV3SW5saW5lTW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGMuJElzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb25zdCByZXBvcnRFdmVudE1vID0ge1xyXG4gICAgICAgIC8vICAgICBSZXBvcnRJZDogdGhpcy5yZXBvcnRJZCxcclxuICAgICAgICAvLyAgICAgLi4ubW8sXHJcbiAgICAgICAgLy8gICAgICRJc0NoZWNrZWQ6IGZhbHNlLFxyXG4gICAgICAgIC8vICAgICAkTmV3SW5saW5lTW86IHVuZGVmaW5lZFxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGluZGV4T2ZNbyA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICAvLyAvLyBsZXQgaW5kZXhPZk5leHRNbyA9IGluZGV4T2ZNbyArIDE7XHJcbiAgICAgICAgLy8gLy8gY29uc3QgY2FuQWRkOiBib29sZWFuID0gdGhpcy5fYWNjZXNzPy5BZGQgIT09IGZhbHNlO1xyXG4gICAgICAgIC8vIGxldCBpbnNlcnRlZEluZGV4ID0gaW5kZXhPZk1vO1xyXG4gICAgICAgIC8vIGlmIChpbmRleE9mTW8gPT09IC0xKSB7XHJcbiAgICAgICAgLy8gICAgIGluc2VydGVkSW5kZXggPSBuZXdNb0RhdGFMaXN0Lmxlbmd0aDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gbmV3TW9EYXRhTGlzdC5zcGxpY2UoaW5zZXJ0ZWRJbmRleCwgaW5kZXhPZk1vID09PSAtMSA/IDAgOiAxLCByZXBvcnRFdmVudE1vKTtcclxuICAgICAgICAvLyBpZiAobW8uJFN0YXRlID09PSAnTmV3Jykge1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBuZXdNb0RhdGFMaXN0LnB1c2godGhpcy5faW5saW5lUmVwb3J0Q3JlYXRlTmV3TW8oZmFsc2UpKTtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgdGhpcy5fcm93Q2hlY2soXHJcbiAgICAgICAgICAgIG1vLFxyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5fdWx2TWFpblNlcnZpY2UuY3JlYXRlTmV3SW5saW5lTW8oKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2V0RGVmYXVsdEFjY2VzcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3MgPSB7XHJcbiAgICAgICAgICAgIEFkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIEFkZFRvTGlzdDogZmFsc2UsXHJcbiAgICAgICAgICAgIERlbGV0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIEVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBFeHBvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBQcmludDogZmFsc2UsXHJcbiAgICAgICAgICAgIFJlZnJlc2g6IGZhbHNlLFxyXG4gICAgICAgICAgICBSZW1vdmVGcm9tTGlzdDogZmFsc2UsXHJcbiAgICAgICAgICAgIFZpZXc6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZXhwYW5kTW8oc2VsZWN0ZWRNbzogTWV0YW9iamVjdERhdGFNb2RlbCwgZXhwYW5kKTogdm9pZCB7XHJcbiAgICAgICAgc2VsZWN0ZWRNby4kRXhwYW5kZWQgPSBleHBhbmQ7XHJcbiAgICAgICAgc2VsZWN0ZWRNby4kQ2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuZE1vKGNoaWxkLCBleHBhbmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmRleE9mSWQoaWQpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gaWQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmRleE9mTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmRleE9mU2VsZWN0ZWQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5maW5kSW5kZXgoKGMpID0+IGMuJElzQ2hlY2tlZCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2dldEluZGV4KG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmlsaW5lRWRpdENhbmNlbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZXRJbmxpbmVFZGl0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldElubGluZUVkaXQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5zZXRJbmxpbmVFZGl0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfcmVhZFZpZXdTZXR0aW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlld1NldHRpbmcgPSB0aGlzLmNvbnRleHQuU2V0dGluZy5DbGFzc05hbWVzLkN1c3RvbVVpPy5QYXJhbWV0ZXJzO1xyXG4gICAgfVxyXG4gICAgLy8gcHJvdGVjdGVkIF9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcclxuICAgIC8vICAgICBzdXBlci5fbW9EYXRhTGlzdENoYW5nZWQobW9EYXRhTGlzdCk7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNoZWNrZWRNb0luZGV4ID0gbW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuJElzQ2hlY2tlZCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoY2hlY2tlZE1vSW5kZXggPiAtMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY2hlY2tlZE1vID0gbW9EYXRhTGlzdFtjaGVja2VkTW9JbmRleF07XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY2hlY2tlZE1vLklkICE9PSB0aGlzLmZvcm1QYW5lbEN0cmxyLk1vLklkKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdG9yRGVzdHJveUZvcm1QYW5lbEN0cmxyKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdENyZWF0ZUZvcm1QYW5lbEN0cmxyKGNoZWNrZWRNbywgY2hlY2tlZE1vSW5kZXgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0VmlzaWJpbGl0eShcclxuICAgICAgICBleHBhbmQ6IGJvb2xlYW4sXHJcbiAgICAgICAgbW86IGFueSAvL01ldGFvYmplY3REYXRhTW9kZWxcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIG1vLiRDaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQuJFZpc2liaWxpdHkgPSBleHBhbmQ7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC4kQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHkoZXhwYW5kLCBjaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcm90ZWN0ZWQgX3NldE5ld0lubGluZU1vKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnNldE5ld0lubGluZU1vKG1vKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHByb3RlY3RlZCBfaW5saW5lRWRpdFByZXBhcmVOZXdNbygpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgIC8vIGNvbnN0IG5ld01vID0gZ2V0TmV3TW9HcmlkRWRpdG9yKHRoaXMuZm9ybVNldHRpbmcsIHRoaXMuX3R5cGVEZWZJZCk7XHJcbiAgICAvLyBuZXdNby5JZCA9IGdldFVuaXF1ZUlkKDMpO1xyXG4gICAgLy8gaWYgKHRoaXMuX2lzQ29tcG9zaXRlKCkpIHtcclxuICAgIC8vICAgICBjb25zdCByZWxhdGlvbiA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKHRoaXMuY29udGV4dC5TZXR0aW5nLCAnRXh0cmEuUmVsYXRpb24nKTtcclxuICAgIC8vICAgICBuZXdNb1tyZWxhdGlvbi5QYXJlbnRGZE5hbWVdID0gcmVsYXRpb24uUGFyZW50TW9JZDtcclxuICAgIC8vIH1cclxuICAgIC8vICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gWy4uLnRoaXMubW9EYXRhTGlzdCwgbmV3TW8gYXMgTWV0YW9iamVjdERhdGFNb2RlbF07XHJcbiAgICAvLyAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAvLyBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLmZpcmVFdmVudChcclxuICAgIC8vICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5FdmVudEVudW0uR2xvYmFsUmVwb3J0TW9BZGQsXHJcbiAgICAvLyAgIHRoaXMuY29udGV4dCxcclxuICAgIC8vICAgcmVwb3J0RXZlbnRNb0FkZFxyXG4gICAgLy8gKTtcclxuICAgIC8vICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1JlZnJlc2hDb250ZXh0TW9EYXRhTGlzdCcsIG5ld01vRGF0YUxpc3QpO1xyXG4gICAgLy8gICAgcmV0dXJuIG5ld01vIGFzIE1ldGFvYmplY3REYXRhTW9kZWw7XHJcbiAgICAvLyB9XHJcbiAgICBwcm90ZWN0ZWQgX2FkZElubGluZU1vVG9Nb2RhdGFMaXN0KG5ld0lubGluZU1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IFsuLi50aGlzLm1vRGF0YUxpc3QsIHsgLi4ubmV3SW5saW5lTW8sICRJc0NoZWNrZWQ6IGZhbHNlIH1dO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Jvd0NoZWNrKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBpbmRleDogbnVtYmVyLCBzZWxlY3RlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWRpdE1vZGUgPSB0aGlzLl9pbmxpbmVFZGl0TW9kZSAmJiB0aGlzLl9hbGxvd0lubGluZUVkaXQ7XHJcbiAgICAgICAgaWYgKG1vLiRJc0NoZWNrZWQgJiYgZWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VsZWN0aW9uTW9kZTtcclxuICAgICAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuU0lOR0xFO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjaGVja2VkID0gIW1vLiRJc0NoZWNrZWQgfHwgc2VsZWN0ZWQ7XHJcbiAgICAgICAgdGhpcy5yb3dIb3ZlcmFibGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnICYmIGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvQ2hlY2tlZEFsbChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVkaXRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fc2V0TmV3SW5saW5lTW8obnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXRWYWx1ZUlubGluZU1vKG1vKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdChtbywgaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHRoaXMuX2Rlc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICB9XHJcbiAgICAvLyBwcm90ZWN0ZWQgX3NldFZhbHVlSW5saW5lTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgIC8vICAgICAvLyB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKHsgLi4ubW8sICRUeXBlRGVmSWQ6IHRoaXMuX3R5cGVEZWZJZCB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lubGluZUVkaXRvckRlc3Ryb3lGb3JtUGFuZWxDdHJscigpOiB2b2lkIHtcclxuICAgICAgICAvLyBpZiAodGhpcy5mb3JtUGFuZWxDdHJscikge1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5mb3JtUGFuZWxDdHJsci5EZXN0cm95KCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybVBhbmVsQ3RybHIgPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfd2luZG93UmVzaXplZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZXRDb250YWluZXJXaWR0aCgpO1xyXG4gICAgICAgIHRoaXMuX3NldFBhcmVudEhlaWdodCgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9zZXRDb250YWluZXJXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoU291cmNlJC5uZXh0KGVsLm9mZnNldFdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RldmljZVNpemVDaGFuZ2VkKGRldmljZVNpemUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy5faW5saW5lRWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlLm5leHQoW10pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5EaXNhYmxlUmVzcG9uc2l2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncmlkU2l6ZSA9IGdldENvbnRyb2xTaXplTW9kZShlbCwgZGV2aWNlU2l6ZSk7XHJcbiAgICAgICAgbGV0IGRldmljZU5hbWU6IERldmljZVNpemUgPSAnZGVza3RvcCc7XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLl92aXNpYmxlQ29sdW1uc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBjb2x1bW5zQ291bnQgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGg7XHJcbiAgICAgICAgc3dpdGNoIChncmlkU2l6ZSkge1xyXG4gICAgICAgICAgICBjYXNlICdsJzpcclxuICAgICAgICAgICAgY2FzZSAneGwnOlxyXG4gICAgICAgICAgICAgICAgZGV2aWNlTmFtZSA9ICdkZXNrdG9wJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzJzpcclxuICAgICAgICAgICAgICAgIGRldmljZU5hbWUgPSAnbW9iaWxlJztcclxuICAgICAgICAgICAgICAgIGNvbHVtbnNDb3VudCA9IDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbSc6XHJcbiAgICAgICAgICAgICAgICBkZXZpY2VOYW1lID0gJ3RhYmxldCc7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSA0O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RldmljZU5hbWVTb3VyY2UubmV4dChkZXZpY2VOYW1lKTtcclxuICAgICAgICBjb25zdCBjb2xTZXR0aW5ncyA9IHRoaXMuZ3JpZFNldHRpbmdTb3VyY2UuZ2V0VmFsdWUoKT8uQ29sU2V0dGluZ0xpc3QgfHwgW107XHJcbiAgICAgICAgbGV0IHN1bUNvbFdpZHRoID0gMDtcclxuICAgICAgICBpZiAoY29sU2V0dGluZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRhaW5lcldpZHRoID4gMCkge1xyXG4gICAgICAgICAgICBjb2x1bW5zQ291bnQgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbFNldHRpbmdzLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdW1Db2xXaWR0aCArIGNvbC5XaWR0aCA+IHRoaXMuY29udGFpbmVyV2lkdGggJiYgY29sdW1uc0NvdW50ID09PSB2aXNpYmxlQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSBpbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN1bUNvbFdpZHRoICs9IGNvbC5XaWR0aDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc1NvdXJjZS5uZXh0KHZpc2libGVDb2x1bW5zLnNsaWNlKGNvbHVtbnNDb3VudCwgdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb3BlblNldHRpbmdzKG5hbWUsIGRldmljZTogRGV2aWNlU2l6ZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8YW55PiB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlICdjb2x1bW5zJzpcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFVsdkNvbHVtblNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NvcnQnOlxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gVWx2U29ydFNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwYnknOlxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gVWx2R3JvdXBieVNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmRpYWxvZ0NvbmZpZyxcclxuICAgICAgICAgICAgZGF0YTogeyBjb250ZXh0OiB0aGlzLmNvbnRleHQgfSxcclxuICAgICAgICAgICAgZnVsbFNjcmVlbjogZGV2aWNlID09PSAnbW9iaWxlJyxcclxuICAgICAgICAgICAgbWluV2lkdGg6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnYXV0bycgOiB0aGlzLmRpYWxvZ0NvbmZpZy5taW5XaWR0aCxcclxuICAgICAgICAgICAgbWluSGVpZ2h0OiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJ2F1dG8nIDogdGhpcy5kaWFsb2dDb25maWcubWluSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoY29tcG9uZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbihjb21wb25lbnQsIGNvbmZpZyk7XHJcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU29ydENoYW5nZWQgPSBuYW1lID09PSAnc29ydCcgfHwgbmFtZSA9PT0gJ2dyb3VwYnknO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZFNldHRpbmcoc2V0dGluZywgaXNTb3J0Q2hhbmdlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1vRGF0YUxpc3QgPSB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2libGVDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2hvd0ZpbHRlclNldHRpbmcoc2VsZWN0ZWRDb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0eXBlRGVmSWQgPSB0aGlzLl90eXBlRGVmSWQ7XHJcbiAgICAgICAgY29uc3QgY29udHJvbHNJbmZvJCA9IHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxvYWRNZXRhQ29uZGl0aW9uc0NvbnRyb2xJbmZvcyhcclxuICAgICAgICAgICAgdHlwZURlZklkLFxyXG4gICAgICAgICAgICB0aGlzLmFsbENvbHVtbnMubWFwKChjKSA9PiBjLk5hbWUpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sc0luZm8kLFxyXG4gICAgICAgICAgICAgICAgdHlwZURlZklkLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5OYW1lOiBzZWxlY3RlZENvbHVtbi5OYW1lLFxyXG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3BlbihVbHZGaWx0ZXJTZXR0aW5nc0NvbXBvbmVudCwgY29uZmlnKTtcclxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2FkZFNvcnRDb2x1bW4obmFtZTogYW55LCBzb3J0RGlyZWN0aW9uOiBzdHJpbmcsIGlzR3JvdXBlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc29ydEl0ZW0gPSB7XHJcbiAgICAgICAgICAgIE5hbWU6IG5hbWUsXHJcbiAgICAgICAgICAgIFNvcnREaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXHJcbiAgICAgICAgICAgIElzR3JvdXBlZDogaXNHcm91cGVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldEdyaWRTZXR0aW5ncyh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0U29ydEl0ZW1JbmRleCA9IHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuTmFtZSA9PT0gbmFtZSk7XHJcbiAgICAgICAgaWYgKGV4aXN0U29ydEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdFtleGlzdFNvcnRJdGVtSW5kZXhdID0gc29ydEl0ZW07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0dGluZ3MuU29ydFNldHRpbmdMaXN0LnB1c2goc29ydEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTZXR0aW5nKHNldHRpbmdzLCB0cnVlKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|