@tsi-developpement/tsi-shared-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/consts/app-providers.mjs +11 -0
- package/esm2022/lib/consts/html-template.const.mjs +40 -0
- package/esm2022/lib/consts/index.mjs +8 -0
- package/esm2022/lib/consts/localization-key.mjs +12 -0
- package/esm2022/lib/consts/locals.const.mjs +8 -0
- package/esm2022/lib/consts/queryParamNames.const.mjs +11 -0
- package/esm2022/lib/consts/themes.mjs +5 -0
- package/esm2022/lib/consts/tsi-consts.mjs +45 -0
- package/esm2022/lib/end-points/authorization-endpoints.mjs +35 -0
- package/esm2022/lib/end-points/baseuri.mjs +11 -0
- package/esm2022/lib/end-points/endpoints.mjs +208 -0
- package/esm2022/lib/end-points/import-export-endpoint.mjs +35 -0
- package/esm2022/lib/end-points/index.mjs +7 -0
- package/esm2022/lib/end-points/presentation-settings-endpoints.mjs +13 -0
- package/esm2022/lib/end-points/reporting-endpoints.mjs +55 -0
- package/esm2022/lib/end-points/shared-endpoint.mjs +12 -0
- package/esm2022/lib/end-points/user-identity-endpoints.mjs +61 -0
- package/esm2022/lib/enums/Language.mjs +9 -0
- package/esm2022/lib/enums/auto-complete.mjs +6 -0
- package/esm2022/lib/enums/button-type.enum.mjs +6 -0
- package/esm2022/lib/enums/claim-types.mjs +15 -0
- package/esm2022/lib/enums/code-format.mjs +6 -0
- package/esm2022/lib/enums/component-use-modes-enum.mjs +19 -0
- package/esm2022/lib/enums/css-units.mjs +10 -0
- package/esm2022/lib/enums/decimal-format.mjs +8 -0
- package/esm2022/lib/enums/display-types.mjs +35 -0
- package/esm2022/lib/enums/filter-operator-type.mjs +34 -0
- package/esm2022/lib/enums/form-validation-error.mjs +7 -0
- package/esm2022/lib/enums/grid-selection-mode.mjs +7 -0
- package/esm2022/lib/enums/grid-sort-mode.mjs +7 -0
- package/esm2022/lib/enums/http-method-types.mjs +6 -0
- package/esm2022/lib/enums/index.mjs +25 -0
- package/esm2022/lib/enums/input-types.mjs +20 -0
- package/esm2022/lib/enums/layout-orientation.mjs +6 -0
- package/esm2022/lib/enums/logout-reason-enum.mjs +8 -0
- package/esm2022/lib/enums/modal-size-enum.mjs +10 -0
- package/esm2022/lib/enums/report-type.mjs +9 -0
- package/esm2022/lib/enums/status.mjs +9 -0
- package/esm2022/lib/enums/text-box-type.mjs +7 -0
- package/esm2022/lib/enums/tooltipPosition.enum.mjs +8 -0
- package/esm2022/lib/enums/tsi-component-enum.mjs +40 -0
- package/esm2022/lib/enums/type-import.mjs +6 -0
- package/esm2022/lib/functions/array.functions.mjs +8 -0
- package/esm2022/lib/functions/index.mjs +3 -0
- package/esm2022/lib/functions/modal-open.function.mjs +69 -0
- package/esm2022/lib/guards/admin.guard.mjs +37 -0
- package/esm2022/lib/guards/auth.guard.mjs +30 -0
- package/esm2022/lib/guards/index.mjs +4 -0
- package/esm2022/lib/guards/permission.guard.mjs +32 -0
- package/esm2022/lib/interfaces/configuration/configuration.mjs +2 -0
- package/esm2022/lib/interfaces/generic-form/generic-form.mjs +118 -0
- package/esm2022/lib/interfaces/generic-types/dictionary.mjs +2 -0
- package/esm2022/lib/interfaces/grid/grid-configuration.mjs +2 -0
- package/esm2022/lib/interfaces/index.mjs +12 -0
- package/esm2022/lib/interfaces/modal/dynamic.component.mjs +7 -0
- package/esm2022/lib/interfaces/modal/modal-size.mjs +2 -0
- package/esm2022/lib/interfaces/pagination/pagination-base.mjs +2 -0
- package/esm2022/lib/interfaces/select-list/combo-status-model.mjs +10 -0
- package/esm2022/lib/interfaces/settings/app-settings.mjs +2 -0
- package/esm2022/lib/interfaces/styles/css-size-property.mjs +17 -0
- package/esm2022/lib/interfaces/translation/translation.mjs +2 -0
- package/esm2022/lib/models/Notes/Note.mjs +7 -0
- package/esm2022/lib/models/application/configuration/endpoint-infos.mjs +3 -0
- package/esm2022/lib/models/application/configuration/entity-delete-behavior.mjs +2 -0
- package/esm2022/lib/models/authorization/authorization-token-mapper.mjs +24 -0
- package/esm2022/lib/models/authorization/authorization-token.mjs +2 -0
- package/esm2022/lib/models/common/component-descriminator.mjs +2 -0
- package/esm2022/lib/models/common/entity-properties.mjs +2 -0
- package/esm2022/lib/models/common/entity-validations.mjs +2 -0
- package/esm2022/lib/models/common/event-schema.mjs +2 -0
- package/esm2022/lib/models/common/key-value-pair.mjs +2 -0
- package/esm2022/lib/models/entity-info/entity-info.mjs +29 -0
- package/esm2022/lib/models/filter/filter-by-existing-values.mjs +7 -0
- package/esm2022/lib/models/filter/paged-result-request-base.mjs +13 -0
- package/esm2022/lib/models/filter/search-field.mjs +2 -0
- package/esm2022/lib/models/import-export/import-export.mjs +15 -0
- package/esm2022/lib/models/index.mjs +38 -0
- package/esm2022/lib/models/journalisation-application/journalisation-application.mjs +10 -0
- package/esm2022/lib/models/journalisation-application/status-history.mjs +3 -0
- package/esm2022/lib/models/layout/layout-config.mjs +2 -0
- package/esm2022/lib/models/modal/bs-modal.mjs +6 -0
- package/esm2022/lib/models/presentation-settings/presentation-settings.mjs +8 -0
- package/esm2022/lib/models/progress-bar/progress-bar-create-request.mjs +2 -0
- package/esm2022/lib/models/progress-bar/progress-bar-response.mjs +8 -0
- package/esm2022/lib/models/progress-bar/progress-bar-update-request.mjs +3 -0
- package/esm2022/lib/models/remote-services-utility/subscription-result.mjs +17 -0
- package/esm2022/lib/models/reporting/json-data-connection.mjs +2 -0
- package/esm2022/lib/models/reporting/optional-endpoints.mjs +2 -0
- package/esm2022/lib/models/reporting/report-template-response.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-edit-template.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-print.mjs +2 -0
- package/esm2022/lib/models/reporting/report-to-template.mjs +2 -0
- package/esm2022/lib/models/settings/devise.mjs +3 -0
- package/esm2022/lib/models/settings/fichier.mjs +6 -0
- package/esm2022/lib/models/settings/type-fichier.mjs +3 -0
- package/esm2022/lib/models/tsi-card/tsi-card.mjs +3 -0
- package/esm2022/lib/models/user-identity/login-response.mjs +7 -0
- package/esm2022/lib/models/user-identity/tenant.mjs +3 -0
- package/esm2022/lib/models/user-identity/user-identity.mjs +3 -0
- package/esm2022/lib/models/workflow/workflow.mjs +14 -0
- package/esm2022/lib/package-initializer.mjs +7 -0
- package/esm2022/lib/pipes/cut-label.pipe.mjs +23 -0
- package/esm2022/lib/pipes/index.mjs +8 -0
- package/esm2022/lib/pipes/localize.pipe.mjs +51 -0
- package/esm2022/lib/pipes/modal-label.pipe.mjs +37 -0
- package/esm2022/lib/pipes/shorten.pipe.mjs +20 -0
- package/esm2022/lib/pipes/to-number.pipe.mjs +20 -0
- package/esm2022/lib/pipes/tsi-currency.pipe.mjs +29 -0
- package/esm2022/lib/pipes/tsi-decimal.pipe.mjs +21 -0
- package/esm2022/lib/providers/index.mjs +2 -0
- package/esm2022/lib/providers/shared-ui-tsi.provider.mjs +15 -0
- package/esm2022/lib/routes/admin.routes.mjs +5 -0
- package/esm2022/lib/routes/app.routes.mjs +7 -0
- package/esm2022/lib/routes/identity.routes.mjs +4 -0
- package/esm2022/lib/routes/index.mjs +5 -0
- package/esm2022/lib/routes/manage-reporting.routes.mjs +5 -0
- package/esm2022/lib/services/Component-Finder/tsi-component-finder.service.mjs +22 -0
- package/esm2022/lib/services/Import-Export/modele-import.service.mjs +59 -0
- package/esm2022/lib/services/Note/Note.service.mjs +35 -0
- package/esm2022/lib/services/UserIdentity/identity-platform-authentication.service.mjs +29 -0
- package/esm2022/lib/services/UserIdentity/user-identity.service.mjs +40 -0
- package/esm2022/lib/services/application/api-explorer.service.mjs +24 -0
- package/esm2022/lib/services/application/app.layout.service.mjs +97 -0
- package/esm2022/lib/services/application/parametres-application-parambase.service.mjs +20 -0
- package/esm2022/lib/services/authorization/authorization.service.mjs +124 -0
- package/esm2022/lib/services/authorization/identity-manager.service.mjs +97 -0
- package/esm2022/lib/services/base/crud-base.service.mjs +38 -0
- package/esm2022/lib/services/configuration/entity-configuration.service.mjs +49 -0
- package/esm2022/lib/services/currentUser/currentUser.service.mjs +49 -0
- package/esm2022/lib/services/date-helper.service.mjs +133 -0
- package/esm2022/lib/services/dialog-data.service.mjs +32 -0
- package/esm2022/lib/services/fichier/fichier-upload.service.mjs +44 -0
- package/esm2022/lib/services/fichier/fichier.service.mjs +20 -0
- package/esm2022/lib/services/formula.service.mjs +20 -0
- package/esm2022/lib/services/generator/html-template-generator.service.mjs +196 -0
- package/esm2022/lib/services/index.mjs +41 -0
- package/esm2022/lib/services/journalisation/journalisation-application.service.mjs +23 -0
- package/esm2022/lib/services/journalisation/status-history.service.mjs +23 -0
- package/esm2022/lib/services/layout/layout-helper.service.mjs +72 -0
- package/esm2022/lib/services/modal/tsi-bs-modal.service.mjs +37 -0
- package/esm2022/lib/services/modal/tsi-modal.service.mjs +21 -0
- package/esm2022/lib/services/module-code/module-code.service.mjs +31 -0
- package/esm2022/lib/services/module-main-parameter.service.mjs +31 -0
- package/esm2022/lib/services/notification/error-response-manager.service.mjs +57 -0
- package/esm2022/lib/services/notification/tsi-confirmation.service.mjs +37 -0
- package/esm2022/lib/services/notification/tsi-message.service.mjs +54 -0
- package/esm2022/lib/services/notification/tsi-notification.service.mjs +47 -0
- package/esm2022/lib/services/presentation-setting/presentation-designer-base.service.mjs +26 -0
- package/esm2022/lib/services/presentation-setting/presentation-designer.service.mjs +58 -0
- package/esm2022/lib/services/presentation-setting/presentation-setting.service.mjs +39 -0
- package/esm2022/lib/services/progress-bar/progress-bar-helper.service.mjs +39 -0
- package/esm2022/lib/services/progress-bar/progress-bar.service.mjs +30 -0
- package/esm2022/lib/services/record-info-popup.service.mjs +21 -0
- package/esm2022/lib/services/reporting/dashboard-module.service.mjs +24 -0
- package/esm2022/lib/services/reporting/reporting.service.mjs +111 -0
- package/esm2022/lib/services/settings/app-settings.service.mjs +47 -0
- package/esm2022/lib/services/settings/keyboard-shortcut.service.mjs +30 -0
- package/esm2022/lib/services/status/entityStatus.service.mjs +21 -0
- package/esm2022/lib/services/translation/translation.service.mjs +71 -0
- package/esm2022/lib/services/validation/entity-validations.service.mjs +21 -0
- package/esm2022/lib/services/validation/generic-validation-state.service.mjs +30 -0
- package/esm2022/lib/services/validation/input-registry.service.mjs +25 -0
- package/esm2022/lib/services/workflow/workflow-configuration.service.mjs +80 -0
- package/esm2022/lib/shared.module.mjs +643 -0
- package/esm2022/lib/tsi-base/components/app-base/app-base.component.mjs +101 -0
- package/esm2022/lib/tsi-base/components/tsi-base/tsi-base.component.mjs +25 -0
- package/esm2022/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.mjs +645 -0
- package/esm2022/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.mjs +514 -0
- package/esm2022/lib/tsi-base/index.mjs +6 -0
- package/esm2022/lib/tsi-base/tsi-input-base/tsi-input-base.component.mjs +141 -0
- package/esm2022/lib/tsi-components/alert-import-message/alert-import-message.component.mjs +19 -0
- package/esm2022/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.mjs +40 -0
- package/esm2022/lib/tsi-components/button-components/tsi-button/tsi-button.component.mjs +75 -0
- package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +173 -0
- package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +201 -0
- package/esm2022/lib/tsi-components/index.mjs +80 -0
- package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +643 -0
- package/esm2022/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.mjs +120 -0
- package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +53 -0
- package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +62 -0
- package/esm2022/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.mjs +116 -0
- package/esm2022/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.mjs +51 -0
- package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +195 -0
- package/esm2022/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.mjs +54 -0
- package/esm2022/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.mjs +55 -0
- package/esm2022/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.mjs +43 -0
- package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +56 -0
- package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +649 -0
- package/esm2022/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.mjs +44 -0
- package/esm2022/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.mjs +50 -0
- package/esm2022/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.mjs +65 -0
- package/esm2022/lib/tsi-components/logout-popup/logout-popup.component.mjs +12 -0
- package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +435 -0
- package/esm2022/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.mjs +148 -0
- package/esm2022/lib/tsi-components/manage-reporting/manage-reporting.component.mjs +1075 -0
- package/esm2022/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.mjs +31 -0
- package/esm2022/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.mjs +24 -0
- package/esm2022/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.mjs +19 -0
- package/esm2022/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.mjs +22 -0
- package/esm2022/lib/tsi-components/modal-component/modal.component.mjs +138 -0
- package/esm2022/lib/tsi-components/modal-loader/modal-loader.component.mjs +58 -0
- package/esm2022/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.mjs +32 -0
- package/esm2022/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.mjs +18 -0
- package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +57 -0
- package/esm2022/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.mjs +27 -0
- package/esm2022/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.mjs +25 -0
- package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +139 -0
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +1509 -0
- package/esm2022/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.mjs +144 -0
- package/esm2022/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.mjs +13 -0
- package/esm2022/lib/tsi-components/output-components/tsi-label/tsi-label.component.mjs +24 -0
- package/esm2022/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.mjs +18 -0
- package/esm2022/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.mjs +20 -0
- package/esm2022/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.mjs +30 -0
- package/esm2022/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.mjs +17 -0
- package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +427 -0
- package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +667 -0
- package/esm2022/lib/tsi-components/spinner/spinner.component.mjs +15 -0
- package/esm2022/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.mjs +21 -0
- package/esm2022/lib/tsi-components/tsi-calender/context-menu/context-menu.component.mjs +46 -0
- package/esm2022/lib/tsi-components/tsi-calender/tsi-calender.component.mjs +297 -0
- package/esm2022/lib/tsi-components/tsi-card/tsi-card.component.mjs +64 -0
- package/esm2022/lib/tsi-components/tsi-card-list/tsi-card-list.component.mjs +112 -0
- package/esm2022/lib/tsi-components/tsi-change-password/tsi-change-password.component.mjs +39 -0
- package/esm2022/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.mjs +83 -0
- package/esm2022/lib/tsi-components/tsi-divider/tsi-divider.component.mjs +18 -0
- package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +305 -0
- package/esm2022/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.mjs +15 -0
- package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +883 -0
- package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +149 -0
- package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +231 -0
- package/esm2022/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.mjs +119 -0
- package/esm2022/lib/tsi-components/tsi-modal/tsi-modal.component.mjs +25 -0
- package/esm2022/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.mjs +119 -0
- package/esm2022/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.mjs +54 -0
- package/esm2022/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.mjs +27 -0
- package/esm2022/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.mjs +123 -0
- package/esm2022/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.mjs +41 -0
- package/esm2022/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.mjs +187 -0
- package/esm2022/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.mjs +170 -0
- package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +142 -0
- package/esm2022/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.mjs +37 -0
- package/esm2022/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.mjs +52 -0
- package/esm2022/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.mjs +46 -0
- package/esm2022/lib/tsi-components/tsi-tenants/tsi-tenants.component.mjs +122 -0
- package/esm2022/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.mjs +21 -0
- package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +186 -0
- package/esm2022/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.mjs +54 -0
- package/esm2022/lib/tsi-directives/auto-select.directive.mjs +33 -0
- package/esm2022/lib/tsi-directives/busy.directive.mjs +32 -0
- package/esm2022/lib/tsi-directives/dynamic-component-loader/ad.directive.mjs +16 -0
- package/esm2022/lib/tsi-directives/index.mjs +8 -0
- package/esm2022/lib/tsi-directives/module-main-parameter.directive.mjs +16 -0
- package/esm2022/lib/tsi-directives/presentation-designer-base.directive.mjs +238 -0
- package/esm2022/lib/tsi-directives/presentation-designer.directive.mjs +205 -0
- package/esm2022/lib/tsi-directives/validation.directive.mjs +85 -0
- package/esm2022/lib/tsi-helpers/compoent-reference.helper.mjs +7 -0
- package/esm2022/lib/tsi-helpers/date-helper.mjs +21 -0
- package/esm2022/lib/tsi-helpers/export-excel.helper.mjs +40 -0
- package/esm2022/lib/tsi-helpers/filter-helper.mjs +126 -0
- package/esm2022/lib/tsi-helpers/grid-col-style.helper.mjs +7 -0
- package/esm2022/lib/tsi-helpers/guid.helper.mjs +19 -0
- package/esm2022/lib/tsi-helpers/helpers.mjs +9 -0
- package/esm2022/lib/tsi-helpers/index.mjs +13 -0
- package/esm2022/lib/tsi-helpers/mapping-helper.mjs +10 -0
- package/esm2022/lib/tsi-helpers/object.helper.mjs +6 -0
- package/esm2022/lib/tsi-helpers/primeng-translate-config.mjs +55 -0
- package/esm2022/lib/tsi-helpers/storage-manager.mjs +33 -0
- package/esm2022/lib/tsi-helpers/type-registry.helper.mjs +49 -0
- package/esm2022/lib/types/enum-description.type.mjs +2 -0
- package/esm2022/lib/types/index.mjs +3 -0
- package/esm2022/lib/types/time-only.mjs +42 -0
- package/esm2022/public-api.mjs +21 -0
- package/esm2022/tsi-developpement-tsi-shared-ui.mjs +5 -0
- package/esm2022/tsi-tsi-shared-ui.mjs +5 -0
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +17486 -0
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -0
- package/fesm2022/tsi-tsi-shared-ui.mjs +17486 -0
- package/fesm2022/tsi-tsi-shared-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/consts/app-providers.d.ts +4 -0
- package/lib/consts/html-template.const.d.ts +12 -0
- package/lib/consts/index.d.ts +7 -0
- package/lib/consts/localization-key.d.ts +11 -0
- package/lib/consts/locals.const.d.ts +7 -0
- package/lib/consts/queryParamNames.const.d.ts +10 -0
- package/lib/consts/themes.d.ts +4 -0
- package/lib/consts/tsi-consts.d.ts +40 -0
- package/lib/end-points/authorization-endpoints.d.ts +31 -0
- package/lib/end-points/baseuri.d.ts +10 -0
- package/lib/end-points/endpoints.d.ts +205 -0
- package/lib/end-points/import-export-endpoint.d.ts +33 -0
- package/lib/end-points/index.d.ts +6 -0
- package/lib/end-points/presentation-settings-endpoints.d.ts +11 -0
- package/lib/end-points/reporting-endpoints.d.ts +53 -0
- package/lib/end-points/shared-endpoint.d.ts +9 -0
- package/lib/end-points/user-identity-endpoints.d.ts +59 -0
- package/lib/enums/Language.d.ts +9 -0
- package/lib/enums/auto-complete.d.ts +4 -0
- package/lib/enums/button-type.enum.d.ts +4 -0
- package/lib/enums/claim-types.d.ts +13 -0
- package/lib/enums/code-format.d.ts +4 -0
- package/lib/enums/component-use-modes-enum.d.ts +17 -0
- package/lib/enums/css-units.d.ts +8 -0
- package/lib/enums/decimal-format.d.ts +6 -0
- package/lib/enums/display-types.d.ts +17 -0
- package/lib/enums/filter-operator-type.d.ts +18 -0
- package/lib/enums/form-validation-error.d.ts +11 -0
- package/lib/enums/grid-selection-mode.d.ts +5 -0
- package/lib/enums/grid-sort-mode.d.ts +5 -0
- package/lib/enums/http-method-types.d.ts +4 -0
- package/lib/enums/index.d.ts +24 -0
- package/lib/enums/input-types.d.ts +18 -0
- package/lib/enums/layout-orientation.d.ts +4 -0
- package/lib/enums/logout-reason-enum.d.ts +6 -0
- package/lib/enums/modal-size-enum.d.ts +10 -0
- package/lib/enums/report-type.d.ts +7 -0
- package/lib/enums/status.d.ts +7 -0
- package/lib/enums/text-box-type.d.ts +5 -0
- package/lib/enums/tooltipPosition.enum.d.ts +6 -0
- package/lib/enums/tsi-component-enum.d.ts +37 -0
- package/lib/enums/type-import.d.ts +4 -0
- package/lib/functions/array.functions.d.ts +1 -0
- package/lib/functions/index.d.ts +1 -0
- package/lib/functions/modal-open.function.d.ts +9 -0
- package/lib/guards/admin.guard.d.ts +14 -0
- package/lib/guards/auth.guard.d.ts +12 -0
- package/lib/guards/index.d.ts +3 -0
- package/lib/guards/permission.guard.d.ts +2 -0
- package/lib/interfaces/configuration/configuration.d.ts +10 -0
- package/lib/interfaces/generic-form/generic-form.d.ts +45 -0
- package/lib/interfaces/generic-types/dictionary.d.ts +3 -0
- package/lib/interfaces/grid/grid-configuration.d.ts +116 -0
- package/lib/interfaces/index.d.ts +11 -0
- package/lib/interfaces/modal/dynamic.component.d.ts +18 -0
- package/lib/interfaces/modal/modal-size.d.ts +4 -0
- package/lib/interfaces/pagination/pagination-base.d.ts +46 -0
- package/lib/interfaces/select-list/combo-status-model.d.ts +8 -0
- package/lib/interfaces/settings/app-settings.d.ts +4 -0
- package/lib/interfaces/styles/css-size-property.d.ts +10 -0
- package/lib/interfaces/translation/translation.d.ts +10 -0
- package/lib/models/Notes/Note.d.ts +25 -0
- package/lib/models/application/configuration/endpoint-infos.d.ts +6 -0
- package/lib/models/application/configuration/entity-delete-behavior.d.ts +6 -0
- package/lib/models/authorization/authorization-token-mapper.d.ts +4 -0
- package/lib/models/authorization/authorization-token.d.ts +16 -0
- package/lib/models/common/component-descriminator.d.ts +4 -0
- package/lib/models/common/entity-properties.d.ts +5 -0
- package/lib/models/common/entity-validations.d.ts +7 -0
- package/lib/models/common/event-schema.d.ts +6 -0
- package/lib/models/common/key-value-pair.d.ts +4 -0
- package/lib/models/entity-info/entity-info.d.ts +37 -0
- package/lib/models/filter/filter-by-existing-values.d.ts +6 -0
- package/lib/models/filter/paged-result-request-base.d.ts +16 -0
- package/lib/models/filter/search-field.d.ts +35 -0
- package/lib/models/import-export/import-export.d.ts +28 -0
- package/lib/models/index.d.ts +37 -0
- package/lib/models/journalisation-application/journalisation-application.d.ts +39 -0
- package/lib/models/journalisation-application/status-history.d.ts +12 -0
- package/lib/models/layout/layout-config.d.ts +3 -0
- package/lib/models/modal/bs-modal.d.ts +5 -0
- package/lib/models/presentation-settings/presentation-settings.d.ts +14 -0
- package/lib/models/progress-bar/progress-bar-create-request.d.ts +8 -0
- package/lib/models/progress-bar/progress-bar-response.d.ts +10 -0
- package/lib/models/progress-bar/progress-bar-update-request.d.ts +9 -0
- package/lib/models/remote-services-utility/subscription-result.d.ts +15 -0
- package/lib/models/reporting/json-data-connection.d.ts +6 -0
- package/lib/models/reporting/optional-endpoints.d.ts +8 -0
- package/lib/models/reporting/report-template-response.d.ts +13 -0
- package/lib/models/reporting/report-to-edit-template.d.ts +29 -0
- package/lib/models/reporting/report-to-print.d.ts +18 -0
- package/lib/models/reporting/report-to-template.d.ts +19 -0
- package/lib/models/settings/devise.d.ts +9 -0
- package/lib/models/settings/fichier.d.ts +14 -0
- package/lib/models/settings/type-fichier.d.ts +4 -0
- package/lib/models/tsi-card/tsi-card.d.ts +9 -0
- package/lib/models/user-identity/login-response.d.ts +8 -0
- package/lib/models/user-identity/tenant.d.ts +5 -0
- package/lib/models/user-identity/user-identity.d.ts +5 -0
- package/lib/models/workflow/workflow.d.ts +36 -0
- package/lib/package-initializer.d.ts +1 -0
- package/lib/pipes/cut-label.pipe.d.ts +7 -0
- package/lib/pipes/index.d.ts +7 -0
- package/lib/pipes/localize.pipe.d.ts +11 -0
- package/lib/pipes/modal-label.pipe.d.ts +10 -0
- package/lib/pipes/shorten.pipe.d.ts +7 -0
- package/lib/pipes/to-number.pipe.d.ts +7 -0
- package/lib/pipes/tsi-currency.pipe.d.ts +10 -0
- package/lib/pipes/tsi-decimal.pipe.d.ts +7 -0
- package/lib/providers/index.d.ts +1 -0
- package/lib/providers/shared-ui-tsi.provider.d.ts +8 -0
- package/lib/routes/admin.routes.d.ts +4 -0
- package/lib/routes/app.routes.d.ts +6 -0
- package/lib/routes/identity.routes.d.ts +3 -0
- package/lib/routes/index.d.ts +4 -0
- package/lib/routes/manage-reporting.routes.d.ts +4 -0
- package/lib/services/Component-Finder/tsi-component-finder.service.d.ts +10 -0
- package/lib/services/Import-Export/modele-import.service.d.ts +21 -0
- package/lib/services/Note/Note.service.d.ts +15 -0
- package/lib/services/UserIdentity/identity-platform-authentication.service.d.ts +13 -0
- package/lib/services/UserIdentity/user-identity.service.d.ts +15 -0
- package/lib/services/application/api-explorer.service.d.ts +13 -0
- package/lib/services/application/app.layout.service.d.ts +47 -0
- package/lib/services/application/parametres-application-parambase.service.d.ts +10 -0
- package/lib/services/authorization/authorization.service.d.ts +46 -0
- package/lib/services/authorization/identity-manager.service.d.ts +23 -0
- package/lib/services/base/crud-base.service.d.ts +20 -0
- package/lib/services/configuration/entity-configuration.service.d.ts +22 -0
- package/lib/services/currentUser/currentUser.service.d.ts +26 -0
- package/lib/services/date-helper.service.d.ts +32 -0
- package/lib/services/dialog-data.service.d.ts +12 -0
- package/lib/services/fichier/fichier-upload.service.d.ts +15 -0
- package/lib/services/fichier/fichier.service.d.ts +10 -0
- package/lib/services/formula.service.d.ts +10 -0
- package/lib/services/generator/html-template-generator.service.d.ts +28 -0
- package/lib/services/index.d.ts +40 -0
- package/lib/services/journalisation/journalisation-application.service.d.ts +12 -0
- package/lib/services/journalisation/status-history.service.d.ts +12 -0
- package/lib/services/layout/layout-helper.service.d.ts +25 -0
- package/lib/services/modal/tsi-bs-modal.service.d.ts +16 -0
- package/lib/services/modal/tsi-modal.service.d.ts +9 -0
- package/lib/services/module-code/module-code.service.d.ts +18 -0
- package/lib/services/module-main-parameter.service.d.ts +12 -0
- package/lib/services/notification/error-response-manager.service.d.ts +13 -0
- package/lib/services/notification/tsi-confirmation.service.d.ts +11 -0
- package/lib/services/notification/tsi-message.service.d.ts +13 -0
- package/lib/services/notification/tsi-notification.service.d.ts +18 -0
- package/lib/services/presentation-setting/presentation-designer-base.service.d.ts +14 -0
- package/lib/services/presentation-setting/presentation-designer.service.d.ts +19 -0
- package/lib/services/presentation-setting/presentation-setting.service.d.ts +16 -0
- package/lib/services/progress-bar/progress-bar-helper.service.d.ts +19 -0
- package/lib/services/progress-bar/progress-bar.service.d.ts +16 -0
- package/lib/services/record-info-popup.service.d.ts +10 -0
- package/lib/services/reporting/dashboard-module.service.d.ts +11 -0
- package/lib/services/reporting/reporting.service.d.ts +32 -0
- package/lib/services/settings/app-settings.service.d.ts +13 -0
- package/lib/services/settings/keyboard-shortcut.service.d.ts +9 -0
- package/lib/services/status/entityStatus.service.d.ts +11 -0
- package/lib/services/translation/translation.service.d.ts +20 -0
- package/lib/services/validation/entity-validations.service.d.ts +10 -0
- package/lib/services/validation/generic-validation-state.service.d.ts +15 -0
- package/lib/services/validation/input-registry.service.d.ts +11 -0
- package/lib/services/workflow/workflow-configuration.service.d.ts +28 -0
- package/lib/shared.module.d.ts +141 -0
- package/lib/tsi-base/components/app-base/app-base.component.d.ts +28 -0
- package/lib/tsi-base/components/tsi-base/tsi-base.component.d.ts +11 -0
- package/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.d.ts +118 -0
- package/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.d.ts +85 -0
- package/lib/tsi-base/index.d.ts +5 -0
- package/lib/tsi-base/tsi-input-base/tsi-input-base.component.d.ts +34 -0
- package/lib/tsi-components/alert-import-message/alert-import-message.component.d.ts +10 -0
- package/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.d.ts +16 -0
- package/lib/tsi-components/button-components/tsi-button/tsi-button.component.d.ts +26 -0
- package/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.d.ts +31 -0
- package/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.d.ts +52 -0
- package/lib/tsi-components/index.d.ts +79 -0
- package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +127 -0
- package/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.d.ts +30 -0
- package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +18 -0
- package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +21 -0
- package/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.d.ts +38 -0
- package/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.d.ts +14 -0
- package/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.d.ts +45 -0
- package/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.d.ts +17 -0
- package/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.d.ts +19 -0
- package/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.d.ts +16 -0
- package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +16 -0
- package/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.d.ts +92 -0
- package/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.d.ts +17 -0
- package/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.d.ts +21 -0
- package/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.d.ts +23 -0
- package/lib/tsi-components/logout-popup/logout-popup.component.d.ts +5 -0
- package/lib/tsi-components/manage-import-export/manage-import-export.component.d.ts +64 -0
- package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +151 -0
- package/lib/tsi-components/manage-reporting/manage-reporting.component.d.ts +109 -0
- package/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.d.ts +15 -0
- package/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.d.ts +13 -0
- package/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.d.ts +9 -0
- package/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.d.ts +13 -0
- package/lib/tsi-components/modal-component/modal.component.d.ts +25 -0
- package/lib/tsi-components/modal-loader/modal-loader.component.d.ts +27 -0
- package/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.d.ts +14 -0
- package/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +7 -0
- package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +19 -0
- package/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.d.ts +10 -0
- package/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.d.ts +9 -0
- package/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.d.ts +41 -0
- package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +231 -0
- package/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.d.ts +46 -0
- package/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-label/tsi-label.component.d.ts +8 -0
- package/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.d.ts +9 -0
- package/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.d.ts +6 -0
- package/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.d.ts +10 -0
- package/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.d.ts +7 -0
- package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +97 -0
- package/lib/tsi-components/reporting/reporting.component.d.ts +103 -0
- package/lib/tsi-components/spinner/spinner.component.d.ts +8 -0
- package/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.d.ts +9 -0
- package/lib/tsi-components/tsi-calender/context-menu/context-menu.component.d.ts +25 -0
- package/lib/tsi-components/tsi-calender/tsi-calender.component.d.ts +50 -0
- package/lib/tsi-components/tsi-card/tsi-card.component.d.ts +25 -0
- package/lib/tsi-components/tsi-card-list/tsi-card-list.component.d.ts +35 -0
- package/lib/tsi-components/tsi-change-password/tsi-change-password.component.d.ts +21 -0
- package/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.d.ts +23 -0
- package/lib/tsi-components/tsi-divider/tsi-divider.component.d.ts +6 -0
- package/lib/tsi-components/tsi-form/tsi-form.component.d.ts +91 -0
- package/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.d.ts +8 -0
- package/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.d.ts +156 -0
- package/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.d.ts +28 -0
- package/lib/tsi-components/tsi-kanban/tsi-kanban.component.d.ts +68 -0
- package/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.d.ts +35 -0
- package/lib/tsi-components/tsi-modal/tsi-modal.component.d.ts +10 -0
- package/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.d.ts +38 -0
- package/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.d.ts +19 -0
- package/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.d.ts +13 -0
- package/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.d.ts +21 -0
- package/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.d.ts +12 -0
- package/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.d.ts +41 -0
- package/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.d.ts +38 -0
- package/lib/tsi-components/tsi-search-box/tsi-search-box.component.d.ts +44 -0
- package/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.d.ts +21 -0
- package/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.d.ts +18 -0
- package/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.d.ts +17 -0
- package/lib/tsi-components/tsi-tenants/tsi-tenants.component.d.ts +39 -0
- package/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.d.ts +9 -0
- package/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.d.ts +35 -0
- package/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.d.ts +13 -0
- package/lib/tsi-directives/auto-select.directive.d.ts +9 -0
- package/lib/tsi-directives/busy.directive.d.ts +11 -0
- package/lib/tsi-directives/dynamic-component-loader/ad.directive.d.ts +8 -0
- package/lib/tsi-directives/index.d.ts +7 -0
- package/lib/tsi-directives/module-main-parameter.directive.d.ts +8 -0
- package/lib/tsi-directives/presentation-designer-base.directive.d.ts +41 -0
- package/lib/tsi-directives/presentation-designer.directive.d.ts +37 -0
- package/lib/tsi-directives/validation.directive.d.ts +18 -0
- package/lib/tsi-helpers/compoent-reference.helper.d.ts +5 -0
- package/lib/tsi-helpers/date-helper.d.ts +6 -0
- package/lib/tsi-helpers/export-excel.helper.d.ts +5 -0
- package/lib/tsi-helpers/filter-helper.d.ts +12 -0
- package/lib/tsi-helpers/grid-col-style.helper.d.ts +5 -0
- package/lib/tsi-helpers/guid.helper.d.ts +6 -0
- package/lib/tsi-helpers/helpers.d.ts +4 -0
- package/lib/tsi-helpers/index.d.ts +12 -0
- package/lib/tsi-helpers/mapping-helper.d.ts +5 -0
- package/lib/tsi-helpers/object.helper.d.ts +3 -0
- package/lib/tsi-helpers/primeng-translate-config.d.ts +54 -0
- package/lib/tsi-helpers/storage-manager.d.ts +8 -0
- package/lib/tsi-helpers/type-registry.helper.d.ts +34 -0
- package/lib/types/enum-description.type.d.ts +3 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/time-only.d.ts +17 -0
- package/package.json +24 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,643 @@
|
|
|
1
|
+
import { Component, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { GridSelectionMode, InputTypes, ModalSizeEnum, ButtonType, TooltipPosition } from '../../../enums';
|
|
3
|
+
import { rtlModeKeys } from '../../../consts/locals.const';
|
|
4
|
+
import { EntityValidationsService } from '../../../services/validation/entity-validations.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../pipes/localize.pipe";
|
|
7
|
+
import * as i2 from "@angular/common";
|
|
8
|
+
import * as i3 from "@angular/forms";
|
|
9
|
+
import * as i4 from "primeng/api";
|
|
10
|
+
import * as i5 from "primeng/table";
|
|
11
|
+
import * as i6 from "primeng/tooltip";
|
|
12
|
+
import * as i7 from "primeng/multiselect";
|
|
13
|
+
import * as i8 from "../tsi-search-combo/tsi-search-combo.component";
|
|
14
|
+
import * as i9 from "../tsi-checkbox/tsi-checkbox.component";
|
|
15
|
+
import * as i10 from "../tsi-currency-other-input/tsi-currency-other-input.component";
|
|
16
|
+
import * as i11 from "../tsi-currency-societe-input/tsi-currency-societe-input.component";
|
|
17
|
+
import * as i12 from "../tsi-date-picker/tsi-date-picker.component";
|
|
18
|
+
import * as i13 from "../tsi-decimal-input/tsi-decimal-input.component";
|
|
19
|
+
import * as i14 from "../tsi-integer/tsi-integer.component";
|
|
20
|
+
import * as i15 from "../tsi-rate-input/tsi-rate-input.component";
|
|
21
|
+
import * as i16 from "../tsi-text-box/tsi-text-box.component";
|
|
22
|
+
import * as i17 from "../tsi-formula-box/tsi-formula-box.component";
|
|
23
|
+
import * as i18 from "../tsi-time-picker/tsi-time-picker.component";
|
|
24
|
+
import * as i19 from "../../output-components/tsi-checkbox-display/tsi-checkbox-display.component";
|
|
25
|
+
import * as i20 from "../../output-components/tsi-currency-other-display/tsi-currency-other-display.component";
|
|
26
|
+
import * as i21 from "../../output-components/tsi-currency-societe-display/tsi-currency-societe-display.component";
|
|
27
|
+
import * as i22 from "../../output-components/tsi-date-display/tsi-date-display.component";
|
|
28
|
+
import * as i23 from "../../output-components/tsi-decimal-display/tsi-decimal-display.component";
|
|
29
|
+
import * as i24 from "../../output-components/tsi-integer-display/tsi-integer-display.component";
|
|
30
|
+
import * as i25 from "../../output-components/tsi-rate-display/tsi-rate-display.component";
|
|
31
|
+
import * as i26 from "../../tsi-bubble-info/tsi-bubble-info.component";
|
|
32
|
+
import * as i27 from "../../button-components/tsi-button/tsi-button.component";
|
|
33
|
+
import * as i28 from "../../output-components/tsi-time-display/tsi-time-display.component";
|
|
34
|
+
export class EditableGridComponent {
|
|
35
|
+
get columns() {
|
|
36
|
+
return this._columns;
|
|
37
|
+
}
|
|
38
|
+
set columns(value) {
|
|
39
|
+
value.forEach(el => el.translatedHeader = this._localizePipe.transform(el.header ?? ""));
|
|
40
|
+
this._columns = value;
|
|
41
|
+
if (this.selectedColumns.length == 0) {
|
|
42
|
+
this.selectedColumns = this._columns;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
set gridData(data) {
|
|
46
|
+
this._gridData = data;
|
|
47
|
+
this._initCurrentRowNumberAndOrderByRowNumber();
|
|
48
|
+
}
|
|
49
|
+
get gridData() { return this._gridData; }
|
|
50
|
+
get editableGridBusinessClass() {
|
|
51
|
+
return this._editableGridBusinessClass;
|
|
52
|
+
}
|
|
53
|
+
set editableGridBusinessClass(className) {
|
|
54
|
+
this._editableGridBusinessClass = className;
|
|
55
|
+
this._entityValidationsService.getEntityValidations(this.editableGridBusinessClass).subscribe({
|
|
56
|
+
next: (entityValidations) => {
|
|
57
|
+
entityValidations.forEach(el => {
|
|
58
|
+
let col = this.columns.find(c => c.labelField?.toLocaleLowerCase() === el.columnName.toLocaleLowerCase() ||
|
|
59
|
+
c.field?.toLocaleLowerCase() === el.columnName.toLocaleLowerCase());
|
|
60
|
+
if (col) {
|
|
61
|
+
col.validationStatusCssClass = el.isNullable !== true ? 'border-red-500 border-3' : '';
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
constructor(_localizePipe) {
|
|
68
|
+
this._localizePipe = _localizePipe;
|
|
69
|
+
this._isAutoRowNumber = false;
|
|
70
|
+
this._autoRowNumberField = '';
|
|
71
|
+
this._currentRowNumber = 0;
|
|
72
|
+
this.tooltipPosition = TooltipPosition;
|
|
73
|
+
this.isAr = false;
|
|
74
|
+
this._gridData = [];
|
|
75
|
+
this._equalityCheckOn = false;
|
|
76
|
+
this.multipleGridSelectionMode = GridSelectionMode.Multiple;
|
|
77
|
+
//#endregion
|
|
78
|
+
this.inputTypes = InputTypes;
|
|
79
|
+
this.modalSize = ModalSizeEnum.ExtraLarge;
|
|
80
|
+
this.buttonType = ButtonType;
|
|
81
|
+
this.selectedItems = [];
|
|
82
|
+
this.key = 'uid';
|
|
83
|
+
this.items = [];
|
|
84
|
+
this.showAddButton = true; //TO DO Save Button Option
|
|
85
|
+
this.showDeleteButton = true; //TO DO Save Button Option
|
|
86
|
+
this.showEditButton = true; //TO DO Save Button Option
|
|
87
|
+
this.showRowSummary = false; //TO DO Save Button Option
|
|
88
|
+
this.scrollHeight = '500px';
|
|
89
|
+
this.rowPerPage = [5, 10, 20];
|
|
90
|
+
// @Input() isPaginator: boolean = true;
|
|
91
|
+
this.pageSize = 5;
|
|
92
|
+
/**
|
|
93
|
+
*
|
|
94
|
+
*/
|
|
95
|
+
this.selectedColumns = [];
|
|
96
|
+
this._columns = [];
|
|
97
|
+
this._tempColumns = [];
|
|
98
|
+
this.showSaveButton = true; //TO DO Save Button Option
|
|
99
|
+
this.showActionColumn = true; //TO DO Save Button Option
|
|
100
|
+
this.enableRowDisabling = false;
|
|
101
|
+
this.rowSummaryConfig = [];
|
|
102
|
+
this.showHaveSumary = false;
|
|
103
|
+
this.showRowSumary = false;
|
|
104
|
+
/**selection */
|
|
105
|
+
this.selectKeyOnly = true;
|
|
106
|
+
this.selectionMode = GridSelectionMode.None;
|
|
107
|
+
this.showConsultButton = false;
|
|
108
|
+
this.disabled = false;
|
|
109
|
+
this._editableGridBusinessClass = "";
|
|
110
|
+
/**order */
|
|
111
|
+
this.orderColumn = 'uid';
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region Outputs
|
|
114
|
+
this.itemsSave = new EventEmitter();
|
|
115
|
+
/**
|
|
116
|
+
*
|
|
117
|
+
*/
|
|
118
|
+
this.refreshEventEmitter = new EventEmitter();
|
|
119
|
+
//@Output() actionEventEmitter: EventEmitter<GridActionEmitResult> = new EventEmitter<GridActionEmitResult>();
|
|
120
|
+
this.saveDataEventEmitter = new EventEmitter();
|
|
121
|
+
this.rowChangedEventEmitter = new EventEmitter();
|
|
122
|
+
this.selectedRowEventEmitter = new EventEmitter();
|
|
123
|
+
this.addedRowEventEmitter = new EventEmitter();
|
|
124
|
+
this.focusOutEventEmitter = new EventEmitter();
|
|
125
|
+
this.cellChanged = new EventEmitter();
|
|
126
|
+
this.rowDeletedEventEmitter = new EventEmitter();
|
|
127
|
+
this.selectedItemsChange = new EventEmitter();
|
|
128
|
+
this.onRowSelect = new EventEmitter();
|
|
129
|
+
this.focusOutRow = new EventEmitter();
|
|
130
|
+
this.onConsultClicked = new EventEmitter();
|
|
131
|
+
this._entityValidationsService = inject(EntityValidationsService);
|
|
132
|
+
}
|
|
133
|
+
ngOnInit() {
|
|
134
|
+
this._initSaveEventSubscription();
|
|
135
|
+
this._verifyGridRequirements();
|
|
136
|
+
this._initCurrentRowNumberAndOrderByRowNumber();
|
|
137
|
+
this._initEquatableFields();
|
|
138
|
+
this._initSumAtFusionFields();
|
|
139
|
+
let langue = localStorage.getItem(rtlModeKeys.rtlModeEnabled);
|
|
140
|
+
if (langue && JSON.parse(langue)) {
|
|
141
|
+
this.isAr = true;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.isAr = false;
|
|
145
|
+
}
|
|
146
|
+
if (!this.selectedColumns || this.selectedColumns.length == 0) {
|
|
147
|
+
this.selectedColumns = this.columns;
|
|
148
|
+
}
|
|
149
|
+
this._tempColumns = this.columns;
|
|
150
|
+
}
|
|
151
|
+
findColumnByKey(key) {
|
|
152
|
+
if (this.columns) {
|
|
153
|
+
for (let col of this.columns) {
|
|
154
|
+
if (col.header === key || col.field === key)
|
|
155
|
+
return col;
|
|
156
|
+
else
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
restoreState(configuration) {
|
|
163
|
+
let state = JSON.parse(configuration);
|
|
164
|
+
if (this.dt) {
|
|
165
|
+
if (this.dt) {
|
|
166
|
+
this.dt.columnWidthsState = state.columnWidths;
|
|
167
|
+
this.dt.tableWidthState = state.tableWidth;
|
|
168
|
+
let columnOrder = state.columnOrder;
|
|
169
|
+
if (columnOrder) {
|
|
170
|
+
let reorderedColumns = this.getReorderedColumns(columnOrder);
|
|
171
|
+
this.selectedColumns = reorderedColumns;
|
|
172
|
+
this.columns = reorderedColumns;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
getReorderedColumns(columnOrder) {
|
|
178
|
+
let reorderedColumns = [];
|
|
179
|
+
columnOrder.map((key) => {
|
|
180
|
+
let col = this.findColumnByKey(key);
|
|
181
|
+
if (col) {
|
|
182
|
+
reorderedColumns.push(col);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return reorderedColumns;
|
|
186
|
+
}
|
|
187
|
+
resetSelectedColumns(configuration) {
|
|
188
|
+
let state = JSON.parse(configuration);
|
|
189
|
+
if (this.dt) {
|
|
190
|
+
this.dt.columnWidthsState = state.columnWidths;
|
|
191
|
+
this.dt.tableWidthState = state.tableWidth;
|
|
192
|
+
let columnOrder = state.columnOrder;
|
|
193
|
+
if (columnOrder) {
|
|
194
|
+
let reorderedColumns = this.getReorderedColumns(columnOrder);
|
|
195
|
+
this.selectedColumns = reorderedColumns;
|
|
196
|
+
this.columns = this._tempColumns;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
getState() {
|
|
201
|
+
let state = {};
|
|
202
|
+
if (!this.dt) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (this.dt.resizableColumns) {
|
|
206
|
+
this.dt.saveColumnWidths(state);
|
|
207
|
+
}
|
|
208
|
+
this.dt.saveColumnOrder(state);
|
|
209
|
+
return state;
|
|
210
|
+
}
|
|
211
|
+
isDeleteButtonDisabled(item) {
|
|
212
|
+
if (this.deleteLineButtonDisabled != undefined) {
|
|
213
|
+
return this.deleteLineButtonDisabled(item);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
ngOnDestroy() {
|
|
217
|
+
this.saveEventSubscription?.unsubscribe();
|
|
218
|
+
}
|
|
219
|
+
inputChanged(col) {
|
|
220
|
+
if (col.watchForChanges === true) {
|
|
221
|
+
this.saveDataEventEmitter.emit(this.gridData);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
saveItems() {
|
|
225
|
+
this.itemsSave.emit(this.gridData);
|
|
226
|
+
this.saveDataEventEmitter.emit(this.gridData);
|
|
227
|
+
}
|
|
228
|
+
addRow() {
|
|
229
|
+
if (!this.gridData) {
|
|
230
|
+
this.gridData = [];
|
|
231
|
+
}
|
|
232
|
+
let newRow = this._initRow();
|
|
233
|
+
this.gridData.push(newRow);
|
|
234
|
+
let rowAddedResult = {
|
|
235
|
+
rowNumber: this.gridData.length - 1,
|
|
236
|
+
data: newRow
|
|
237
|
+
};
|
|
238
|
+
if (this.editableTable?.sortField && this.editableTable.sortOrder) {
|
|
239
|
+
this.editableTable?.value.push(newRow);
|
|
240
|
+
}
|
|
241
|
+
this.refreshSort();
|
|
242
|
+
this.addedRowEventEmitter.emit(rowAddedResult);
|
|
243
|
+
}
|
|
244
|
+
refreshSort() {
|
|
245
|
+
if (this.editableTable?.sortField) {
|
|
246
|
+
const sortField = this.editableTable.sortField;
|
|
247
|
+
const sortOrder = this.editableTable.sortOrder;
|
|
248
|
+
this.gridData.sort((a, b) => {
|
|
249
|
+
const valueA = a[sortField];
|
|
250
|
+
const valueB = b[sortField];
|
|
251
|
+
let result = 0;
|
|
252
|
+
if (valueA < valueB)
|
|
253
|
+
result = -1;
|
|
254
|
+
else if (valueA > valueB)
|
|
255
|
+
result = 1;
|
|
256
|
+
return result * sortOrder;
|
|
257
|
+
});
|
|
258
|
+
this.gridData = [...this.gridData];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
addRowOnLastElement(item, col) {
|
|
262
|
+
this._verifyAddRowOnLastElementRequirements();
|
|
263
|
+
let itemPosition = this.gridData.indexOf(item);
|
|
264
|
+
let colPosition = this.columns.indexOf(col);
|
|
265
|
+
if (itemPosition == this.gridData.length - 1 && colPosition == this.columns.length - 1) {
|
|
266
|
+
this.addRow();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
delete(item) {
|
|
270
|
+
if (this.editableTable?.sortField && this.editableTable.sortMode) {
|
|
271
|
+
const index = this.editableTable.value.indexOf(item, 0);
|
|
272
|
+
if (index > -1) {
|
|
273
|
+
this.editableTable.value.splice(index, 1);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const index = this.gridData.indexOf(item, 0);
|
|
277
|
+
if (index > -1) {
|
|
278
|
+
this.gridData.splice(index, 1);
|
|
279
|
+
this._onDeleteRow(item);
|
|
280
|
+
this.rowDeletedEventEmitter.emit(this.gridData);
|
|
281
|
+
}
|
|
282
|
+
this.refreshSort();
|
|
283
|
+
}
|
|
284
|
+
getSummary(col) {
|
|
285
|
+
if (col.haveSummary == true) {
|
|
286
|
+
let sum = 0;
|
|
287
|
+
this.gridData.forEach((row) => {
|
|
288
|
+
sum += row[col.field];
|
|
289
|
+
});
|
|
290
|
+
return sum;
|
|
291
|
+
}
|
|
292
|
+
return 0;
|
|
293
|
+
}
|
|
294
|
+
rowSummary(row) {
|
|
295
|
+
let sum = 0;
|
|
296
|
+
this.columns.forEach(col => {
|
|
297
|
+
if (col.rowSummary == true) {
|
|
298
|
+
sum += row[col.field];
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
return sum;
|
|
302
|
+
}
|
|
303
|
+
onRowSelected(event) {
|
|
304
|
+
this.selectedItem = event.data;
|
|
305
|
+
if (this.selectKeyOnly == true) {
|
|
306
|
+
let selectionKey;
|
|
307
|
+
selectionKey = this.selectedItem[this.key];
|
|
308
|
+
this.onRowSelect.emit(selectionKey);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
this.onRowSelect.emit(this.selectedItems);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
onRowUnselect(event) {
|
|
315
|
+
this.selectedItem = undefined;
|
|
316
|
+
}
|
|
317
|
+
selectionChange(event) {
|
|
318
|
+
let selection = [];
|
|
319
|
+
if (this.selectionMode == GridSelectionMode.Multiple) {
|
|
320
|
+
if (this.selectedItems) {
|
|
321
|
+
if (this.selectKeyOnly) {
|
|
322
|
+
let keys = [];
|
|
323
|
+
this.selectedItems.forEach((v) => { keys.push(v[this.key]); });
|
|
324
|
+
selection = keys;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
selection = this.selectedItems;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
selection = [];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
else if (this.selectionMode == GridSelectionMode.Single) {
|
|
335
|
+
if (this.selectKeyOnly) {
|
|
336
|
+
selection = this.selectedItems ? [this.selectedItems[this.key]] : [];
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
selection = this.selectedItems ? [this.selectedItems] : [];
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (this.selectionMode != GridSelectionMode.None) {
|
|
343
|
+
this.selectedItemsChange.emit(selection);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
handleKeydown(event) {
|
|
347
|
+
if (event.code === 'Space') {
|
|
348
|
+
event.stopPropagation();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
onFocusOutRow(item) {
|
|
352
|
+
this.focusOutRow.emit(item);
|
|
353
|
+
}
|
|
354
|
+
customSort(event) {
|
|
355
|
+
if (event.data != null && event.data != undefined) {
|
|
356
|
+
event.data.sort((data1, data2) => {
|
|
357
|
+
if (event.field != null && event.field != undefined && event.order) {
|
|
358
|
+
let value1 = data1[event.field];
|
|
359
|
+
let value2 = data2[event.field];
|
|
360
|
+
let result = null;
|
|
361
|
+
if (value1 == null && value2 != null)
|
|
362
|
+
result = -1;
|
|
363
|
+
else if (value1 != null && value2 == null)
|
|
364
|
+
result = 1;
|
|
365
|
+
else if (value1 == null && value2 == null)
|
|
366
|
+
result = 0;
|
|
367
|
+
else if (typeof value1 === 'string' && typeof value2 === 'string')
|
|
368
|
+
result = value1.localeCompare(value2);
|
|
369
|
+
else
|
|
370
|
+
result = (value1 < value2) ? -1 : (value1 > value2) ? 1 : 0;
|
|
371
|
+
return (event.order * result);
|
|
372
|
+
}
|
|
373
|
+
return 0;
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
consult(key) {
|
|
378
|
+
this.onConsultClicked.emit(key);
|
|
379
|
+
}
|
|
380
|
+
onCellValueChanged(col, newValue, item) {
|
|
381
|
+
// send events
|
|
382
|
+
if (col.watchForChanges === true) {
|
|
383
|
+
let cellChangedResult = {
|
|
384
|
+
key: item[this.key],
|
|
385
|
+
field: col.field,
|
|
386
|
+
newValue: newValue
|
|
387
|
+
};
|
|
388
|
+
this.cellChanged.emit(cellChangedResult);
|
|
389
|
+
this.saveDataEventEmitter.emit(this.gridData);
|
|
390
|
+
}
|
|
391
|
+
// recalculate currentRowNumber
|
|
392
|
+
if (col.field === this._autoRowNumberField) {
|
|
393
|
+
this._orderByRowNumber();
|
|
394
|
+
}
|
|
395
|
+
// check for duplicated rows
|
|
396
|
+
// if(this._equalityCheckOn && col.isEquatableCriteria){
|
|
397
|
+
// console.log('found equatable : col:', col, 'row : ', item);
|
|
398
|
+
// alert('@onCellValueChanged');
|
|
399
|
+
// this._tryFindEquatable(item);
|
|
400
|
+
// }
|
|
401
|
+
}
|
|
402
|
+
//#region private methods
|
|
403
|
+
_initRow() {
|
|
404
|
+
let newRow = {};
|
|
405
|
+
//console.log('start _initRow', this.configuration);
|
|
406
|
+
if (this.columns) {
|
|
407
|
+
//console.log('_initRow :: configuration : ', this.configuration);
|
|
408
|
+
this.columns.forEach(col => {
|
|
409
|
+
newRow[col.field] = undefined;
|
|
410
|
+
});
|
|
411
|
+
if (this._isAutoRowNumber === true) {
|
|
412
|
+
newRow[this._autoRowNumberField] = this._nextRowNumber();
|
|
413
|
+
//console.log('_initRow :: newRow : ', newRow);
|
|
414
|
+
}
|
|
415
|
+
return newRow;
|
|
416
|
+
}
|
|
417
|
+
return newRow;
|
|
418
|
+
}
|
|
419
|
+
_initSaveEventSubscription() {
|
|
420
|
+
this.saveEventSubscription = this.events?.subscribe(() => this.saveItems());
|
|
421
|
+
}
|
|
422
|
+
_verifyAddRowOnLastElementRequirements() {
|
|
423
|
+
if (this.gridData == null
|
|
424
|
+
|| this.gridData == undefined) {
|
|
425
|
+
throw new Error('gridData can\'t be null');
|
|
426
|
+
}
|
|
427
|
+
if (this.columns == null
|
|
428
|
+
|| this.columns == undefined) {
|
|
429
|
+
throw new Error('grid columns can\'t be null');
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
let rowNumberColumns = this.columns.filter(c => c.isAutoRowNumberColumn === true);
|
|
433
|
+
if (rowNumberColumns.length > 1) {
|
|
434
|
+
throw new Error('grid columns can\'t have more than one RowNumberColumn');
|
|
435
|
+
}
|
|
436
|
+
else if (rowNumberColumns.length == 1) {
|
|
437
|
+
this._isAutoRowNumber = true;
|
|
438
|
+
this._autoRowNumberField = rowNumberColumns[0].field;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
_verifyGridRequirements() {
|
|
443
|
+
if (this.columns == null
|
|
444
|
+
|| this.columns == undefined) {
|
|
445
|
+
throw new Error('grid columns can\'t be null');
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
let rowNumberColumns = this.columns.filter(c => c.isAutoRowNumberColumn === true);
|
|
449
|
+
//console.log('rowNumberColumns : ', rowNumberColumns);
|
|
450
|
+
if (rowNumberColumns.length > 1) {
|
|
451
|
+
throw new Error('grid columns can\'t have more than one RowNumberColumn');
|
|
452
|
+
}
|
|
453
|
+
else if (rowNumberColumns.length == 1) {
|
|
454
|
+
this._isAutoRowNumber = true;
|
|
455
|
+
this._autoRowNumberField = rowNumberColumns[0].field;
|
|
456
|
+
//console.log('_isAutoRowNumber : ', this._isAutoRowNumber);
|
|
457
|
+
//console.log('_autoRowNumberField : ', this._autoRowNumberField);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
_initCurrentRowNumberAndOrderByRowNumber() {
|
|
462
|
+
// console.log('_initCurrentRowNumber :: _isAutoRowNumber : ', this._isAutoRowNumber);
|
|
463
|
+
// console.log('_initCurrentRowNumber :: _autoRowNumberField : ', this._autoRowNumberField);
|
|
464
|
+
// console.log('_initCurrentRowNumber :: gridData : ', this.gridData);
|
|
465
|
+
if (this._isAutoRowNumber === true
|
|
466
|
+
&& this._autoRowNumberField != undefined
|
|
467
|
+
&& this._autoRowNumberField != null
|
|
468
|
+
&& this.gridData.length > 0) {
|
|
469
|
+
//alert('_currentRowNumber');
|
|
470
|
+
// let aux = this.gridData.map(a => a[this._autoRowNumberField]);;
|
|
471
|
+
// aux.sort((a, b) => { return -a + b ;});
|
|
472
|
+
this._orderByRowNumber();
|
|
473
|
+
this._currentRowNumber = this.gridData[this.gridData.length - 1][this._autoRowNumberField];
|
|
474
|
+
//alert(this._currentRowNumber);
|
|
475
|
+
//console.log('_initCurrentRowNumber : ',this._currentRowNumber);
|
|
476
|
+
}
|
|
477
|
+
//console.log('_initCurrentRowNumber : ',this._currentRowNumber);
|
|
478
|
+
}
|
|
479
|
+
_nextRowNumber() {
|
|
480
|
+
this._currentRowNumber = this.gridData.length + 1;
|
|
481
|
+
//console.log('_nextRowNumber : ', this._currentRowNumber);
|
|
482
|
+
return this._currentRowNumber;
|
|
483
|
+
}
|
|
484
|
+
_onDeleteRow(row) {
|
|
485
|
+
if (row[this._autoRowNumberField] === this._currentRowNumber) {
|
|
486
|
+
this._currentRowNumber--;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
_orderByRowNumber() {
|
|
490
|
+
this.gridData.sort((a, b) => { return a[this._autoRowNumberField] - b[this._autoRowNumberField]; });
|
|
491
|
+
}
|
|
492
|
+
_initEquatableFields() {
|
|
493
|
+
let equatableColumns = this.columns.filter(c => c.isEquatableCriteria == true);
|
|
494
|
+
if (equatableColumns) {
|
|
495
|
+
this._equalityCheckOn = true;
|
|
496
|
+
this._equatableFields = equatableColumns.map(c => c.field);
|
|
497
|
+
}
|
|
498
|
+
//console.log('equ fields : ', this._equatableFields);
|
|
499
|
+
}
|
|
500
|
+
_initSumAtFusionFields() {
|
|
501
|
+
let sumAtFusionColumns = this.columns.filter(c => c.isSumAtFusion == true);
|
|
502
|
+
if (sumAtFusionColumns) {
|
|
503
|
+
this._equalityCheckOn = true;
|
|
504
|
+
this._sumAtFusionFields = sumAtFusionColumns.map(c => c.field);
|
|
505
|
+
}
|
|
506
|
+
//console.log('sum fields : ', this._sumAtFusionFields);
|
|
507
|
+
}
|
|
508
|
+
_tryFindEquatable(row) {
|
|
509
|
+
alert('@_tryFindEquatable');
|
|
510
|
+
let foundEqualRow = false;
|
|
511
|
+
for (let i = 0; i < this.gridData.length; i++) {
|
|
512
|
+
console.log('proc row : ', this.gridData[i]);
|
|
513
|
+
let isCurrentRowEqual = true;
|
|
514
|
+
this._equatableFields?.forEach(f => {
|
|
515
|
+
console.log('proc field : ', f);
|
|
516
|
+
if (this.gridData[i][f] != row[f]) {
|
|
517
|
+
alert('current row not equal');
|
|
518
|
+
console.log('not equal ', row, this.gridData[i]);
|
|
519
|
+
isCurrentRowEqual = false;
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
if (isCurrentRowEqual) {
|
|
523
|
+
alert('current row is equal');
|
|
524
|
+
this._fusionRows(this.gridData[i], row);
|
|
525
|
+
foundEqualRow = true;
|
|
526
|
+
break;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
if (foundEqualRow) {
|
|
530
|
+
console.log('deleting : ', row);
|
|
531
|
+
this.delete(row);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
_fusionRows(row1, row2) {
|
|
535
|
+
this._sumAtFusionFields?.forEach(f => {
|
|
536
|
+
row1[f] += row2[f];
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableGridComponent, deps: [{ token: i1.LocalizePipe }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
540
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditableGridComponent, selector: "Tsi-Generic-Editable-Grid", inputs: { selectedItems: "selectedItems", configuration: "configuration", key: "key", items: "items", saveEvent: ["events", "saveEvent"], showAddButton: "showAddButton", showDeleteButton: "showDeleteButton", showEditButton: "showEditButton", showRowSummary: "showRowSummary", scrollHeight: "scrollHeight", rowPerPage: "rowPerPage", pageSize: "pageSize", columns: "columns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", events: "events", showSaveButton: "showSaveButton", showActionColumn: "showActionColumn", enableRowDisabling: "enableRowDisabling", rowSummaryConfig: "rowSummaryConfig", showHaveSumary: "showHaveSumary", showRowSumary: "showRowSumary", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", showConsultButton: "showConsultButton", disabled: "disabled", editableGridBusinessClass: "editableGridBusinessClass", orderColumn: "orderColumn", deleteLineButtonDisabled: "deleteLineButtonDisabled", id: "id" }, outputs: { itemsSave: "itemsSave", refreshEventEmitter: "refreshEventEmitter", saveDataEventEmitter: "saveDataEventEmitter", rowChangedEventEmitter: "rowChangedEventEmitter", selectedRowEventEmitter: "selectedRowEventEmitter", addedRowEventEmitter: "addedRowEventEmitter", focusOutEventEmitter: "focusOutEventEmitter", cellChanged: "cellChanged", rowDeletedEventEmitter: "rowDeletedEventEmitter", selectedItemsChange: "selectedItemsChange", onRowSelect: "onRowSelect", focusOutRow: "focusOutRow", onConsultClicked: "onConsultClicked" }, viewQueries: [{ propertyName: "editableTable", first: true, predicate: ["editableTable"], descendants: true }, { propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\" [paginator]=\"gridData.length > pageSize\"\r\n [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\" (onRowSelect)=\"onRowSelected($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\" [resizableColumns]=\"true\" columnResizeMode=\"expand\"\r\n appendTo=\"body\" styleClass=\"p-datatable-sm\" [value]=\"gridData\" [columns]=\"selectedColumns\" [dataKey]=\"key\"\r\n [scrollHeight]=\"scrollHeight\" styleClass=\"p-datatable-gridlines\" (selectionChange)=\"selectionChange($event)\"\r\n #editableTable [totalRecords]=\"gridData.length\">\r\n <!-- [tableStyle]=\"{'min-width': '50rem','width': 'inherit'}\" -->\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n <td>\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </td>\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [ngStyle]=\"isAr ? {'text-align': 'start'} : {}\">\r\n\r\n <ng-template #ordinaryBloc>\r\n\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (keydown)=\"handleKeydown($event)\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"inputChanged(col)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (keydown)=\"handleKeydown($event)\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i5.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i5.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i5.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i5.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i5.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i5.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i5.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i5.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i8.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "currentRowItem", "datasource", "bind", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick"] }, { kind: "component", type: i9.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i10.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["numOfDecimal", "currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i11.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i12.TsiDatePickerComponent, selector: "Tsi-Date-Picker", inputs: ["required", "showTime", "showButtonBar"], outputs: ["inputFieldChange"] }, { kind: "component", type: i13.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i14.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i15.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i16.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i17.TsiFormulaBoxComponent, selector: "Tsi-Formula-Box", inputs: ["value", "endPoint"], outputs: ["valueChange"] }, { kind: "component", type: i18.TsiTimePickerComponent, selector: "tsi-time-picker", outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i20.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i21.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i22.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i23.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i24.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i25.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i26.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i27.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i28.TsiTimeDisplayComponent, selector: "tsi-time-display", inputs: ["inputData"] }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }] }); }
|
|
541
|
+
}
|
|
542
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableGridComponent, decorators: [{
|
|
543
|
+
type: Component,
|
|
544
|
+
args: [{ selector: 'Tsi-Generic-Editable-Grid', template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\" [paginator]=\"gridData.length > pageSize\"\r\n [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\" (onRowSelect)=\"onRowSelected($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\" [resizableColumns]=\"true\" columnResizeMode=\"expand\"\r\n appendTo=\"body\" styleClass=\"p-datatable-sm\" [value]=\"gridData\" [columns]=\"selectedColumns\" [dataKey]=\"key\"\r\n [scrollHeight]=\"scrollHeight\" styleClass=\"p-datatable-gridlines\" (selectionChange)=\"selectionChange($event)\"\r\n #editableTable [totalRecords]=\"gridData.length\">\r\n <!-- [tableStyle]=\"{'min-width': '50rem','width': 'inherit'}\" -->\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n <td>\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </td>\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [ngStyle]=\"isAr ? {'text-align': 'start'} : {}\">\r\n\r\n <ng-template #ordinaryBloc>\r\n\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (keydown)=\"handleKeydown($event)\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"inputChanged(col)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (keydown)=\"handleKeydown($event)\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}\n"] }]
|
|
545
|
+
}], ctorParameters: () => [{ type: i1.LocalizePipe }], propDecorators: { editableTable: [{
|
|
546
|
+
type: ViewChild,
|
|
547
|
+
args: ["editableTable"]
|
|
548
|
+
}], selectedItems: [{
|
|
549
|
+
type: Input
|
|
550
|
+
}], configuration: [{
|
|
551
|
+
type: Input,
|
|
552
|
+
args: ['configuration']
|
|
553
|
+
}], key: [{
|
|
554
|
+
type: Input,
|
|
555
|
+
args: ['key']
|
|
556
|
+
}], items: [{
|
|
557
|
+
type: Input
|
|
558
|
+
}], saveEvent: [{
|
|
559
|
+
type: Input,
|
|
560
|
+
args: ['events']
|
|
561
|
+
}], showAddButton: [{
|
|
562
|
+
type: Input
|
|
563
|
+
}], showDeleteButton: [{
|
|
564
|
+
type: Input
|
|
565
|
+
}], showEditButton: [{
|
|
566
|
+
type: Input
|
|
567
|
+
}], showRowSummary: [{
|
|
568
|
+
type: Input
|
|
569
|
+
}], scrollHeight: [{
|
|
570
|
+
type: Input
|
|
571
|
+
}], rowPerPage: [{
|
|
572
|
+
type: Input
|
|
573
|
+
}], pageSize: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], columns: [{
|
|
576
|
+
type: Input
|
|
577
|
+
}], gridData: [{
|
|
578
|
+
type: Input
|
|
579
|
+
}], isTableLoading: [{
|
|
580
|
+
type: Input
|
|
581
|
+
}], parent: [{
|
|
582
|
+
type: Input
|
|
583
|
+
}], events: [{
|
|
584
|
+
type: Input
|
|
585
|
+
}], showSaveButton: [{
|
|
586
|
+
type: Input
|
|
587
|
+
}], showActionColumn: [{
|
|
588
|
+
type: Input
|
|
589
|
+
}], enableRowDisabling: [{
|
|
590
|
+
type: Input
|
|
591
|
+
}], rowSummaryConfig: [{
|
|
592
|
+
type: Input
|
|
593
|
+
}], showHaveSumary: [{
|
|
594
|
+
type: Input
|
|
595
|
+
}], showRowSumary: [{
|
|
596
|
+
type: Input
|
|
597
|
+
}], selectKeyOnly: [{
|
|
598
|
+
type: Input
|
|
599
|
+
}], selectionMode: [{
|
|
600
|
+
type: Input
|
|
601
|
+
}], showConsultButton: [{
|
|
602
|
+
type: Input
|
|
603
|
+
}], disabled: [{
|
|
604
|
+
type: Input
|
|
605
|
+
}], editableGridBusinessClass: [{
|
|
606
|
+
type: Input
|
|
607
|
+
}], orderColumn: [{
|
|
608
|
+
type: Input
|
|
609
|
+
}], deleteLineButtonDisabled: [{
|
|
610
|
+
type: Input
|
|
611
|
+
}], itemsSave: [{
|
|
612
|
+
type: Output
|
|
613
|
+
}], refreshEventEmitter: [{
|
|
614
|
+
type: Output
|
|
615
|
+
}], saveDataEventEmitter: [{
|
|
616
|
+
type: Output
|
|
617
|
+
}], rowChangedEventEmitter: [{
|
|
618
|
+
type: Output
|
|
619
|
+
}], selectedRowEventEmitter: [{
|
|
620
|
+
type: Output
|
|
621
|
+
}], addedRowEventEmitter: [{
|
|
622
|
+
type: Output
|
|
623
|
+
}], focusOutEventEmitter: [{
|
|
624
|
+
type: Output
|
|
625
|
+
}], cellChanged: [{
|
|
626
|
+
type: Output
|
|
627
|
+
}], rowDeletedEventEmitter: [{
|
|
628
|
+
type: Output
|
|
629
|
+
}], selectedItemsChange: [{
|
|
630
|
+
type: Output
|
|
631
|
+
}], onRowSelect: [{
|
|
632
|
+
type: Output
|
|
633
|
+
}], focusOutRow: [{
|
|
634
|
+
type: Output
|
|
635
|
+
}], onConsultClicked: [{
|
|
636
|
+
type: Output
|
|
637
|
+
}], dt: [{
|
|
638
|
+
type: ViewChild,
|
|
639
|
+
args: ["dt", { static: false }]
|
|
640
|
+
}], id: [{
|
|
641
|
+
type: Input
|
|
642
|
+
}] } });
|
|
643
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy9lZGl0YWJsZS1ncmlkL2VkaXRhYmxlLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvZWRpdGFibGUtZ3JpZC9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJN0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT25HLE1BQU0sT0FBTyxxQkFBcUI7SUFnRGhDLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBYSxPQUFPLENBQUMsS0FBd0I7UUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekYs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SztnQkFNTyx5QkFBeUI7c0JBQXJDLEtBQUs7Z0JBa0JHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUlHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR29DLEVBQUU7c0JBQTVDLFNBQVM7dUJBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFekIsRUFBRTtzQkFBVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTb3J0RXZlbnQsIFRhYmxlU3RhdGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRhYmxlLCBUYWJsZVJvd1NlbGVjdEV2ZW50LCBUYWJsZVJvd1VuU2VsZWN0RXZlbnQgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEdyaWRTZWxlY3Rpb25Nb2RlLCBJbnB1dFR5cGVzLCBNb2RhbFNpemVFbnVtLCBCdXR0b25UeXBlLCBUb29sdGlwUG9zaXRpb259IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgQ2VsbENoYW5nZWRSZXN1bHQsIEdyaWRDb2x1bW4sIElHcmlkQ29uZmlndXJhdGlvbiwgUm93QWRkZWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgcnRsTW9kZUtleXMgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvbG9jYWxzLmNvbnN0JztcclxuaW1wb3J0IHsgTG9jYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvbG9jYWxpemUucGlwZSc7XHJcbmltcG9ydCB7IEVudGl0eVZhbGlkYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vZW50aXR5LXZhbGlkYXRpb25zLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdUc2ktR2VuZXJpYy1FZGl0YWJsZS1HcmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8jcmVnaW9uIGxvY2FsIHZhcnNcclxuICAvLyNyZWdpb24gcHJpdmF0ZSBsb2NhbCB2YXJzXHJcbiAgcHJpdmF0ZSBzYXZlRXZlbnRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBfaXNBdXRvUm93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfYXV0b1Jvd051bWJlckZpZWxkOiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIF9jdXJyZW50Um93TnVtYmVyOiBudW1iZXIgPSAwO1xyXG4gIHRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbjtcclxuICBpc0FyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZ3JpZERhdGE6IEFycmF5PGFueT4gPSBbXTtcclxuICBwcml2YXRlIF9lcXVhdGFibGVGaWVsZHM6IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfc3VtQXRGdXNpb25GaWVsZHM6IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZXF1YWxpdHlDaGVja09uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIGlucHV0VHlwZXMgPSBJbnB1dFR5cGVzO1xyXG4gIG1vZGFsU2l6ZSA9IE1vZGFsU2l6ZUVudW0uRXh0cmFMYXJnZTtcclxuICBAVmlld0NoaWxkKFwiZWRpdGFibGVUYWJsZVwiKSBlZGl0YWJsZVRhYmxlPzogVGFibGVcclxuXHJcbiAgYnV0dG9uVHlwZSA9IEJ1dHRvblR5cGU7XHJcblxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueSA9IFtdO1xyXG4gIHNlbGVjdGVkSXRlbTogYW55O1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIElucHV0c1xyXG4gIEBJbnB1dCgnY29uZmlndXJhdGlvbicpIGNvbmZpZ3VyYXRpb24/OiBJR3JpZENvbmZpZ3VyYXRpb247XHJcbiAgQElucHV0KCdrZXknKSBrZXk6IHN0cmluZyA9ICd1aWQnO1xyXG4gIEBJbnB1dCgpIGl0ZW1zOiBBcnJheTxhbnk+ID0gW107XHJcbiAgQElucHV0KCdldmVudHMnKSBzYXZlRXZlbnQ/OiBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcbiAgQElucHV0KCkgc2hvd0RlbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93RWRpdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93Um93U3VtbWFyeTogYm9vbGVhbiA9IGZhbHNlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcblxyXG5cclxuICBASW5wdXQoKSBzY3JvbGxIZWlnaHQ6IHN0cmluZyA9ICc1MDBweCc7XHJcbiAgQElucHV0KCkgcm93UGVyUGFnZTogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcclxuICAvLyBASW5wdXQoKSBpc1BhZ2luYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcGFnZVNpemUgOiBudW1iZXIgPSA1XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgc2VsZWN0ZWRDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgIHByaXZhdGUgX3RlbXBDb2x1bW5zIDogQXJyYXk8R3JpZENvbHVtbj4gPSBbXTtcclxuICBnZXQgY29sdW1ucygpOiBBcnJheTxHcmlkQ29sdW1uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5zKHZhbHVlOiBBcnJheTxHcmlkQ29sdW1uPikge1xyXG4gICAgdmFsdWUuZm9yRWFjaChlbCA9PiBlbC50cmFuc2xhdGVkSGVhZGVyID0gdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybShlbC5oZWFkZXIgPz8gXCJcIikpO1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IHZhbHVlXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLl9jb2x1bW5zXHJcbiAgICB9XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBncmlkRGF0YShkYXRhOiBBcnJheTxhbnk+KSB7XHJcbiAgICB0aGlzLl9ncmlkRGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLl9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTtcclxuICB9XHJcbiAgZ2V0IGdyaWREYXRhKCkgeyByZXR1cm4gdGhpcy5fZ3JpZERhdGE7IH1cclxuXHJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xyXG5cclxuXHJcbiAgQElucHV0KCkgcGFyZW50OiBhbnk7XHJcbiAgQElucHV0KCkgZXZlbnRzPzogT2JzZXJ2YWJsZTx2b2lkPjsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG5cclxuICBASW5wdXQoKSBzaG93U2F2ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93QWN0aW9uQ29sdW1uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG5cclxuXHJcbiAgQElucHV0KCkgZW5hYmxlUm93RGlzYWJsaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHJvd1N1bW1hcnlDb25maWc6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBASW5wdXQoKSBzaG93SGF2ZVN1bWFyeT86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93Um93U3VtYXJ5PzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBzZWxlY3RLZXlPbmx5OiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSB8IGFueSA9IEdyaWRTZWxlY3Rpb25Nb2RlLk5vbmU7XHJcbiAgQElucHV0KCkgc2hvd0NvbnN1bHRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGdldCBlZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlR3JpZEJ1c2luZXNzQ2xhc3M7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBlZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKGNsYXNzTmFtZSA6IHN0cmluZykge1xyXG4gICAgdGhpcy5fZWRpdGFibGVHcmlkQnVzaW5lc3NDbGFzcyA9IGNsYXNzTmFtZTtcclxuICAgIHRoaXMuX2VudGl0eVZhbGlkYXRpb25zU2VydmljZS5nZXRFbnRpdHlWYWxpZGF0aW9ucyh0aGlzLmVkaXRhYmxlR3JpZEJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChlbnRpdHlWYWxpZGF0aW9ucykgPT4ge1xyXG4gICAgICAgIGVudGl0eVZhbGlkYXRpb25zLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbCA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5sYWJlbEZpZWxkPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBlbC5jb2x1bW5OYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5maWVsZD8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gZWwuY29sdW1uTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgIGlmKGNvbCl7XHJcbiAgICAgICAgICAgIGNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3MgPSBlbC5pc051bGxhYmxlICE9PSB0cnVlID8gJ2JvcmRlci1yZWQtNTAwIGJvcmRlci0zJyA6ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKm9yZGVyICovXHJcbiAgQElucHV0KCkgb3JkZXJDb2x1bW46IHN0cmluZyA9ICd1aWQnO1xyXG5cclxuICBASW5wdXQoKSBkZWxldGVMaW5lQnV0dG9uRGlzYWJsZWQhOiAoaXRlbTogYW55KSA9PiBhbnlcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIGl0ZW1zU2F2ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcbiAgLyoqXHJcbiAgICpcclxuICAgKi9cclxuXHJcblxyXG4gIEBPdXRwdXQoKSByZWZyZXNoRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy9AT3V0cHV0KCkgYWN0aW9uRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZEFjdGlvbkVtaXRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQWN0aW9uRW1pdFJlc3VsdD4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHNhdmVEYXRhRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIHJvd0NoYW5nZWRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRSb3dFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgYWRkZWRSb3dFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FkZGVkUmVzdWx0PigpXHJcblxyXG4gIEBPdXRwdXQoKSBmb2N1c091dEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBAT3V0cHV0KCkgY2VsbENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDaGFuZ2VkUmVzdWx0PigpO1xyXG5cclxuICBAT3V0cHV0KCkgcm93RGVsZXRlZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzT3V0Um93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvbkNvbnN1bHRDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKFwiZHRcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBkdDogVGFibGUgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIF9lbnRpdHlWYWxpZGF0aW9uc1NlcnZpY2UgPSBpbmplY3QoRW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlKTtcclxuICBcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxpemVQaXBlOiBMb2NhbGl6ZVBpcGUpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5faW5pdFNhdmVFdmVudFN1YnNjcmlwdGlvbigpO1xyXG4gICAgdGhpcy5fdmVyaWZ5R3JpZFJlcXVpcmVtZW50cygpO1xyXG4gICAgdGhpcy5faW5pdEN1cnJlbnRSb3dOdW1iZXJBbmRPcmRlckJ5Um93TnVtYmVyKCk7XHJcbiAgICB0aGlzLl9pbml0RXF1YXRhYmxlRmllbGRzKCk7XHJcbiAgICB0aGlzLl9pbml0U3VtQXRGdXNpb25GaWVsZHMoKTtcclxuICAgIGxldCBsYW5ndWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShydGxNb2RlS2V5cy5ydGxNb2RlRW5hYmxlZCk7XHJcbiAgICBpZiAobGFuZ3VlICYmIEpTT04ucGFyc2UobGFuZ3VlKSkge1xyXG4gICAgICB0aGlzLmlzQXIgPSB0cnVlXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5pc0FyID0gZmFsc2VcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMgfHwgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgIH1cclxuICAgIHRoaXMuX3RlbXBDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgZmluZENvbHVtbkJ5S2V5KGtleTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgIGZvciAobGV0IGNvbCBvZiB0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICBpZiAoY29sLmhlYWRlciA9PT0ga2V5IHx8IGNvbC5maWVsZCA9PT0ga2V5KSByZXR1cm4gY29sO1xyXG4gICAgICAgIGVsc2UgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHJlc3RvcmVTdGF0ZShjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IEpTT04ucGFyc2UoY29uZmlndXJhdGlvbilcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIGlmICh0aGlzLmR0KSB7XHJcblxyXG4gICAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgICAgdGhpcy5kdC50YWJsZVdpZHRoU3RhdGUgPSBzdGF0ZS50YWJsZVdpZHRoO1xyXG5cclxuICAgICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgICBsZXQgcmVvcmRlcmVkQ29sdW1ucyA9IHRoaXMuZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcik7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcjogc3RyaW5nW10pOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVvcmRlcmVkQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgICBjb2x1bW5PcmRlci5tYXAoKGtleSkgPT4ge1xyXG4gICAgICBsZXQgY29sID0gdGhpcy5maW5kQ29sdW1uQnlLZXkoa2V5KTtcclxuICAgICAgaWYgKGNvbCkge1xyXG4gICAgICAgIHJlb3JkZXJlZENvbHVtbnMucHVzaChjb2wpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVvcmRlcmVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRDb2x1bW5zKGNvbmZpZ3VyYXRpb246IHN0cmluZykge1xyXG4gICAgbGV0IHN0YXRlOiBUYWJsZVN0YXRlID0gSlNPTi5wYXJzZShjb25maWd1cmF0aW9uKVxyXG4gICAgaWYgKHRoaXMuZHQpIHtcclxuXHJcbiAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl90ZW1wQ29sdW1uc1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgaXNEZWxldGVCdXR0b25EaXNhYmxlZChpdGVtOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRlbGV0ZUxpbmVCdXR0b25EaXNhYmxlZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkKGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2ZUV2ZW50U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRDaGFuZ2VkKGNvbDogR3JpZENvbHVtbikge1xyXG4gICAgaWYgKGNvbC53YXRjaEZvckNoYW5nZXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5zYXZlRGF0YUV2ZW50RW1pdHRlci5lbWl0KHRoaXMuZ3JpZERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5pdGVtc1NhdmUuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICAgIHRoaXMuc2F2ZURhdGFFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICB9XHJcblxyXG4gIGFkZFJvdygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ncmlkRGF0YSkge1xyXG4gICAgICB0aGlzLmdyaWREYXRhID0gW107XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3Um93ID0gdGhpcy5faW5pdFJvdygpXHJcbiAgICB0aGlzLmdyaWREYXRhLnB1c2gobmV3Um93KVxyXG4gICAgbGV0IHJvd0FkZGVkUmVzdWx0OiBSb3dBZGRlZFJlc3VsdCA9IHtcclxuICAgICAgcm93TnVtYmVyOiB0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDEsXHJcbiAgICAgIGRhdGE6IG5ld1Jvd1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0T3JkZXIpIHtcclxuICAgICAgdGhpcy5lZGl0YWJsZVRhYmxlPy52YWx1ZS5wdXNoKG5ld1JvdylcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaFNvcnQoKVxyXG4gICAgdGhpcy5hZGRlZFJvd0V2ZW50RW1pdHRlci5lbWl0KHJvd0FkZGVkUmVzdWx0KVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFNvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZVRhYmxlPy5zb3J0RmllbGQpIHtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRGaWVsZDtcclxuICAgICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRPcmRlcjtcclxuXHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQSA9IGFbc29ydEZpZWxkXTtcclxuICAgICAgICBjb25zdCB2YWx1ZUIgPSBiW3NvcnRGaWVsZF07XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmVzdWx0ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAqIHNvcnRPcmRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmdyaWREYXRhID0gWy4uLnRoaXMuZ3JpZERhdGFdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUm93T25MYXN0RWxlbWVudChpdGVtOiBhbnksIGNvbDogR3JpZENvbHVtbikge1xyXG4gICAgdGhpcy5fdmVyaWZ5QWRkUm93T25MYXN0RWxlbWVudFJlcXVpcmVtZW50cygpO1xyXG4gICAgbGV0IGl0ZW1Qb3NpdGlvbiA9IHRoaXMuZ3JpZERhdGEuaW5kZXhPZihpdGVtKTtcclxuICAgIGxldCBjb2xQb3NpdGlvbiA9IHRoaXMuY29sdW1ucy5pbmRleE9mKGNvbCk7XHJcblxyXG4gICAgaWYgKGl0ZW1Qb3NpdGlvbiA9PSB0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDEgJiYgY29sUG9zaXRpb24gPT0gdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5hZGRSb3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZShpdGVtOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmVkaXRhYmxlVGFibGU/LnNvcnRGaWVsZCAmJiB0aGlzLmVkaXRhYmxlVGFibGUuc29ydE1vZGUpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmVkaXRhYmxlVGFibGUudmFsdWUuaW5kZXhPZihpdGVtLCAwKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlVGFibGUudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZERhdGEuaW5kZXhPZihpdGVtLCAwKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgdGhpcy5fb25EZWxldGVSb3coaXRlbSk7XHJcbiAgICAgIHRoaXMucm93RGVsZXRlZEV2ZW50RW1pdHRlci5lbWl0KHRoaXMuZ3JpZERhdGEpXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hTb3J0KClcclxuICB9XHJcblxyXG4gIGdldFN1bW1hcnkoY29sOiBHcmlkQ29sdW1uKTogbnVtYmVyIHtcclxuICAgIGlmIChjb2wuaGF2ZVN1bW1hcnkgPT0gdHJ1ZSkge1xyXG5cclxuICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcclxuICAgICAgICBzdW0gKz0gcm93W2NvbC5maWVsZF07XHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiBzdW07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIHJvd1N1bW1hcnkocm93OiBhbnkpOiBudW1iZXIge1xyXG4gICAgbGV0IHN1bSA9IDA7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICBpZiAoY29sLnJvd1N1bW1hcnkgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHN1bSArPSByb3dbY29sLmZpZWxkXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc3VtO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBvblJvd1NlbGVjdGVkKGV2ZW50OiBUYWJsZVJvd1NlbGVjdEV2ZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGV2ZW50LmRhdGFcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkgPT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgc2VsZWN0aW9uS2V5OiBhbnk7XHJcbiAgICAgIHNlbGVjdGlvbktleSA9IHRoaXMuc2VsZWN0ZWRJdGVtW3RoaXMua2V5XTtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHNlbGVjdGlvbktleSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJvd1Vuc2VsZWN0KGV2ZW50OiBUYWJsZVJvd1VuU2VsZWN0RXZlbnQpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdW5kZWZpbmVkXHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCgodjogYW55KSA9PiB7IGtleXMucHVzaCh2W3RoaXMua2V5XSkgfSk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSBrZXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0S2V5T25seSkge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcyA/IFt0aGlzLnNlbGVjdGVkSXRlbXNbdGhpcy5rZXldXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcyA/IFt0aGlzLnNlbGVjdGVkSXRlbXNdIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT0gR3JpZFNlbGVjdGlvbk1vZGUuTm9uZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChzZWxlY3Rpb24pXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5jb2RlID09PSAnU3BhY2UnKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Gb2N1c091dFJvdyhpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZm9jdXNPdXRSb3cuZW1pdChpdGVtKTtcclxuICB9XHJcblxyXG4gIGN1c3RvbVNvcnQoZXZlbnQ6IFNvcnRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmRhdGEgIT0gbnVsbCAmJiBldmVudC5kYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBldmVudC5kYXRhLnNvcnQoKGRhdGExLCBkYXRhMikgPT4ge1xyXG4gICAgICAgIGlmIChldmVudC5maWVsZCAhPSBudWxsICYmIGV2ZW50LmZpZWxkICE9IHVuZGVmaW5lZCAmJiBldmVudC5vcmRlcikge1xyXG4gICAgICAgICAgbGV0IHZhbHVlMSA9IGRhdGExW2V2ZW50LmZpZWxkXTtcclxuICAgICAgICAgIGxldCB2YWx1ZTIgPSBkYXRhMltldmVudC5maWVsZF07XHJcbiAgICAgICAgICBsZXQgcmVzdWx0IDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiAhPSBudWxsKVxyXG4gICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgZWxzZSBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUyID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA8IHZhbHVlMikgPyAtMSA6ICh2YWx1ZTEgPiB2YWx1ZTIpID8gMSA6IDA7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIChldmVudC5vcmRlciAqIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN1bHQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMub25Db25zdWx0Q2xpY2tlZC5lbWl0KGtleSk7XHJcbiAgfVxyXG5cclxuICBvbkNlbGxWYWx1ZUNoYW5nZWQoY29sOiBHcmlkQ29sdW1uLCBuZXdWYWx1ZTogYW55LCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIHNlbmQgZXZlbnRzXHJcbiAgICBpZiAoY29sLndhdGNoRm9yQ2hhbmdlcyA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgbGV0IGNlbGxDaGFuZ2VkUmVzdWx0OiBDZWxsQ2hhbmdlZFJlc3VsdCA9IHtcclxuICAgICAgICBrZXk6IGl0ZW1bdGhpcy5rZXldLFxyXG4gICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZWxsQ2hhbmdlZC5lbWl0KGNlbGxDaGFuZ2VkUmVzdWx0KTtcclxuXHJcbiAgICAgIHRoaXMuc2F2ZURhdGFFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZWNhbGN1bGF0ZSBjdXJyZW50Um93TnVtYmVyXHJcbiAgICBpZiAoY29sLmZpZWxkID09PSB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQpIHtcclxuICAgICAgdGhpcy5fb3JkZXJCeVJvd051bWJlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVkIHJvd3NcclxuICAgIC8vIGlmKHRoaXMuX2VxdWFsaXR5Q2hlY2tPbiAmJiBjb2wuaXNFcXVhdGFibGVDcml0ZXJpYSl7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdmb3VuZCBlcXVhdGFibGUgOiBjb2w6JywgY29sLCAncm93IDogJywgaXRlbSk7XHJcbiAgICAvLyAgIGFsZXJ0KCdAb25DZWxsVmFsdWVDaGFuZ2VkJyk7XHJcbiAgICAvLyAgIHRoaXMuX3RyeUZpbmRFcXVhdGFibGUoaXRlbSk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBfaW5pdFJvdygpIHtcclxuICAgIGxldCBuZXdSb3c6IGFueSA9IHt9O1xyXG4gICAgLy9jb25zb2xlLmxvZygnc3RhcnQgX2luaXRSb3cnLCB0aGlzLmNvbmZpZ3VyYXRpb24pO1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICAvL2NvbnNvbGUubG9nKCdfaW5pdFJvdyA6OiBjb25maWd1cmF0aW9uIDogJywgdGhpcy5jb25maWd1cmF0aW9uKTtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICBuZXdSb3dbY29sLmZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5faXNBdXRvUm93TnVtYmVyID09PSB0cnVlKSB7XHJcbiAgICAgICAgbmV3Um93W3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF0gPSB0aGlzLl9uZXh0Um93TnVtYmVyKCk7XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2coJ19pbml0Um93IDo6IG5ld1JvdyA6ICcsIG5ld1Jvdyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld1Jvd1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1JvdztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTYXZlRXZlbnRTdWJzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLnNhdmVFdmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuZXZlbnRzPy5zdWJzY3JpYmUoXHJcbiAgICAgICgpID0+IHRoaXMuc2F2ZUl0ZW1zKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92ZXJpZnlBZGRSb3dPbkxhc3RFbGVtZW50UmVxdWlyZW1lbnRzKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZERhdGEgPT0gbnVsbFxyXG4gICAgICB8fCB0aGlzLmdyaWREYXRhID09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyaWREYXRhIGNhblxcJ3QgYmUgbnVsbCcpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbFxyXG4gICAgICB8fCB0aGlzLmNvbHVtbnMgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgYmUgbnVsbCcpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHJvd051bWJlckNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0F1dG9Sb3dOdW1iZXJDb2x1bW4gPT09IHRydWUpO1xyXG5cclxuICAgICAgaWYgKHJvd051bWJlckNvbHVtbnMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIFJvd051bWJlckNvbHVtbicpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocm93TnVtYmVyQ29sdW1ucy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIHRoaXMuX2lzQXV0b1Jvd051bWJlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkID0gcm93TnVtYmVyQ29sdW1uc1swXS5maWVsZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmVyaWZ5R3JpZFJlcXVpcmVtZW50cygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbFxyXG4gICAgICB8fCB0aGlzLmNvbHVtbnMgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgYmUgbnVsbCcpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHJvd051bWJlckNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0F1dG9Sb3dOdW1iZXJDb2x1bW4gPT09IHRydWUpO1xyXG5cclxuICAgICAgLy9jb25zb2xlLmxvZygncm93TnVtYmVyQ29sdW1ucyA6ICcsIHJvd051bWJlckNvbHVtbnMpO1xyXG5cclxuICAgICAgaWYgKHJvd051bWJlckNvbHVtbnMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIFJvd051bWJlckNvbHVtbicpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocm93TnVtYmVyQ29sdW1ucy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIHRoaXMuX2lzQXV0b1Jvd051bWJlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkID0gcm93TnVtYmVyQ29sdW1uc1swXS5maWVsZDtcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX2lzQXV0b1Jvd051bWJlciA6ICcsIHRoaXMuX2lzQXV0b1Jvd051bWJlcik7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX2F1dG9Sb3dOdW1iZXJGaWVsZCA6ICcsIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpOiB2b2lkIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdfaW5pdEN1cnJlbnRSb3dOdW1iZXIgOjogX2lzQXV0b1Jvd051bWJlciA6ICcsIHRoaXMuX2lzQXV0b1Jvd051bWJlcik7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnX2luaXRDdXJyZW50Um93TnVtYmVyIDo6IF9hdXRvUm93TnVtYmVyRmllbGQgOiAnLCB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ19pbml0Q3VycmVudFJvd051bWJlciA6OiBncmlkRGF0YSA6ICcsIHRoaXMuZ3JpZERhdGEpO1xyXG4gICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlciA9PT0gdHJ1ZVxyXG4gICAgICAmJiB0aGlzLl9hdXRvUm93TnVtYmVyRmllbGQgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMuZ3JpZERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAvL2FsZXJ0KCdfY3VycmVudFJvd051bWJlcicpO1xyXG4gICAgICAvLyBsZXQgYXV4ID0gdGhpcy5ncmlkRGF0YS5tYXAoYSA9PiBhW3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF0pOztcclxuICAgICAgLy8gYXV4LnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIC1hICsgYiA7fSk7XHJcblxyXG4gICAgICB0aGlzLl9vcmRlckJ5Um93TnVtYmVyKCk7XHJcblxyXG4gICAgICB0aGlzLl9jdXJyZW50Um93TnVtYmVyID0gdGhpcy5ncmlkRGF0YVt0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDFdW3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF07XHJcbiAgICAgIC8vYWxlcnQodGhpcy5fY3VycmVudFJvd051bWJlcik7XHJcblxyXG4gICAgICAvL2NvbnNvbGUubG9nKCdfaW5pdEN1cnJlbnRSb3dOdW1iZXIgOiAnLHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIpO1xyXG4gICAgfVxyXG4gICAgLy9jb25zb2xlLmxvZygnX2luaXRDdXJyZW50Um93TnVtYmVyIDogJyx0aGlzLl9jdXJyZW50Um93TnVtYmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25leHRSb3dOdW1iZXIoKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIgPSB0aGlzLmdyaWREYXRhLmxlbmd0aCArIDE7XHJcbiAgICAvL2NvbnNvbGUubG9nKCdfbmV4dFJvd051bWJlciA6ICcsIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkRlbGV0ZVJvdyhyb3c6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHJvd1t0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdID09PSB0aGlzLl9jdXJyZW50Um93TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXItLTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29yZGVyQnlSb3dOdW1iZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWREYXRhLnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIGFbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXSAtIGJbdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXTsgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RXF1YXRhYmxlRmllbGRzKCk6IHZvaWQge1xyXG4gICAgbGV0IGVxdWF0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0VxdWF0YWJsZUNyaXRlcmlhID09IHRydWUpO1xyXG4gICAgaWYgKGVxdWF0YWJsZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5fZXF1YWxpdHlDaGVja09uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fZXF1YXRhYmxlRmllbGRzID0gZXF1YXRhYmxlQ29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuICAgIC8vY29uc29sZS5sb2coJ2VxdSBmaWVsZHMgOiAnLCB0aGlzLl9lcXVhdGFibGVGaWVsZHMpO1xyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFN1bUF0RnVzaW9uRmllbGRzKCk6IHZvaWQge1xyXG4gICAgbGV0IHN1bUF0RnVzaW9uQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzU3VtQXRGdXNpb24gPT0gdHJ1ZSk7XHJcbiAgICBpZiAoc3VtQXRGdXNpb25Db2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuX2VxdWFsaXR5Q2hlY2tPbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuX3N1bUF0RnVzaW9uRmllbGRzID0gc3VtQXRGdXNpb25Db2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG4gICAgLy9jb25zb2xlLmxvZygnc3VtIGZpZWxkcyA6ICcsIHRoaXMuX3N1bUF0RnVzaW9uRmllbGRzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RyeUZpbmRFcXVhdGFibGUocm93OiBhbnkpOiB2b2lkIHtcclxuICAgIGFsZXJ0KCdAX3RyeUZpbmRFcXVhdGFibGUnKTtcclxuICAgIGxldCBmb3VuZEVxdWFsUm93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5ncmlkRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zb2xlLmxvZygncHJvYyByb3cgOiAnLCB0aGlzLmdyaWREYXRhW2ldKTtcclxuICAgICAgbGV0IGlzQ3VycmVudFJvd0VxdWFsOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fZXF1YXRhYmxlRmllbGRzPy5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdwcm9jIGZpZWxkIDogJywgZik7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZERhdGFbaV1bZl0gIT0gcm93W2ZdKSB7XHJcbiAgICAgICAgICBhbGVydCgnY3VycmVudCByb3cgbm90IGVxdWFsJyk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnbm90IGVxdWFsICcsIHJvdywgdGhpcy5ncmlkRGF0YVtpXSk7XHJcbiAgICAgICAgICBpc0N1cnJlbnRSb3dFcXVhbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpc0N1cnJlbnRSb3dFcXVhbCkge1xyXG4gICAgICAgIGFsZXJ0KCdjdXJyZW50IHJvdyBpcyBlcXVhbCcpXHJcbiAgICAgICAgdGhpcy5fZnVzaW9uUm93cyh0aGlzLmdyaWREYXRhW2ldLCByb3cpO1xyXG4gICAgICAgIGZvdW5kRXF1YWxSb3cgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZm91bmRFcXVhbFJvdykge1xyXG4gICAgICBjb25zb2xlLmxvZygnZGVsZXRpbmcgOiAnLCByb3cpO1xyXG4gICAgICB0aGlzLmRlbGV0ZShyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZnVzaW9uUm93cyhyb3cxOiBhbnksIHJvdzI6IGFueSkge1xyXG4gICAgdGhpcy5fc3VtQXRGdXNpb25GaWVsZHM/LmZvckVhY2goZiA9PiB7XHJcbiAgICAgIHJvdzFbZl0gKz0gcm93MltmXTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gIDxwLXRhYmxlICNkdCBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCIgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkSXRlbXNcIiBlZGl0TW9kZT1cInJvd1wiIFtwYWdpbmF0b3JdPVwiZ3JpZERhdGEubGVuZ3RoID4gcGFnZVNpemVcIlxyXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dQZXJQYWdlXCIgW3Jvd3NdPVwicGFnZVNpemVcIiAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCIgY29sdW1uUmVzaXplTW9kZT1cImV4cGFuZFwiXHJcbiAgICBhcHBlbmRUbz1cImJvZHlcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc21cIiBbdmFsdWVdPVwiZ3JpZERhdGFcIiBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBbZGF0YUtleV09XCJrZXlcIlxyXG4gICAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtZ3JpZGxpbmVzXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAjZWRpdGFibGVUYWJsZSBbdG90YWxSZWNvcmRzXT1cImdyaWREYXRhLmxlbmd0aFwiPlxyXG4gICAgPCEtLSBbdGFibGVTdHlsZV09XCJ7J21pbi13aWR0aCc6ICc1MHJlbScsJ3dpZHRoJzogJ2luaGVyaXQnfVwiIC0tPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImNvbHVtbnNcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29sdW1uc1wiXHJcbiAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHt7ICdjb2x1bW5zX3NlbGVjdGVkJyB8IGxvY2FsaXplIH19XCIgb3B0aW9uTGFiZWw9XCJ0cmFuc2xhdGVkSGVhZGVyXCJcclxuICAgICAgICBbc3R5bGVdPVwieydtaW4td2lkdGgnOiAnMTgwcHgnfVwiIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1vcHRpb24gcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdGlvbi5oZWFkZXIgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlICE9IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6MnJlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDoycmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjJyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6MnJlbSAhaW1wb3J0YW50O1wiPlxyXG4gICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0hhdmVTdW1hcnlcIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG4gICAgICAgIDwhLS0gPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD4gLS0+XHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0RlbGV0ZUJ1dHRvblwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGg+XHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtO1wiIHBTb3J0YWJsZUNvbHVtbj1cInt7Y29sLmZpZWxkfX1cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgcFRvb2x0aXA9XCJ7e2NvbC50b29sVGlwVGV4dCB8IGxvY2FsaXplIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgcFJlb3JkZXJhYmxlQ29sdW1uPnt7IGNvbC5oZWFkZXIgfCBsb2NhbGl6ZVxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwie3tjb2wuZmllbGR9fVwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgIDxUc2ktQnViYmxlLUluZm8gW2luZm9UZXh0XT1cImNvbC5pbmZvVGV4dCB8IGxvY2FsaXplXCI+PC9Uc2ktQnViYmxlLUluZm8+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6M3JlbVwiICpuZ0lmPVwic2hvd1Jvd1N1bW1hcnlcIiBzY29wZT1cImNvbFwiPnt7J1Jvd1N1bW1hcnknIHwgbG9jYWxpemV9fTwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiaXRlbVwiXHJcbiAgICAgICAgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGUgfHwgc2VsZWN0aW9uTW9kZSA9PSB1bmRlZmluZWQ7IGVsc2Ugc2VsZWN0aW9uTW9kZUJsb2NrXCJcclxuICAgICAgICAoZm9jdXNPdXQpPVwib25Gb2N1c091dFJvdyhpdGVtKVwiPlxyXG4gICAgICAgIDx0ZD5cclxuICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPCEtLSA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLWNoZWNrXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93IGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RkPlxyXG4gICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0RlbGV0ZUJ1dHRvblwiIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1kZWxldGUtc3R5bGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgPFRzaS1CdXR0b24gW2Rpc2FibGVkXT1cImlzRGVsZXRlQnV0dG9uRGlzYWJsZWQoaXRlbSlcIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9zdXBwcmltZXJcIlxyXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAtMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1jb25zdWx0LXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuQnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktZXllXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfY29uc3VsdGVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJjb25zdWx0KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIGNsYXNzPVwidWktcmVzaXphYmxlLWNvbHVtblwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiaXNBciA/IHsndGV4dC1hbGlnbic6ICdzdGFydCd9IDoge31cIj5cclxuXHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI29yZGluYXJ5QmxvYz5cclxuXHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlNFQVJDSF9DT01CTzsgZWxzZSBjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIiAoYmluZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJjb2wuYnVzaW5lc3NDbGFzc1wiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgaWQtZmllbGQ9XCJ7e2NvbC5pZEZpZWxkfX1cIiBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50Um93SXRlbV09XCJpdGVtXCIgKGJpbmRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIiBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9JTlBVVDsgZWxzZSBjdXJyZW5jeU90aGVySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1QaWNrZXIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW3Nob3dUaW1lXT1cImNvbC5zaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtUGlja2VyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUNoZWNrQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrQm94PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1JbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgdGltZUlucHV0QmxvY1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1SYXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1UaW1lLXBpY2tlciBibG9jIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVJbnB1dEJsb2M+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPHRzaS10aW1lLXBpY2tlciAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L3RzaS10aW1lLXBpY2tlcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDwhLS08VHNpLUJ1YmJsZS1JbmZvXHJcbiAgICAgICAgICAgICAgICAgIFtpbmZvVGV4dF09XCJbJ2Zvcm11bGFfZXhwbGljYXRpb24nLFxyXG4gICAgICAgICAgICAgICAgICBdXCI+PC9Uc2ktQnViYmxlLUluZm8+IC0tPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1Gb3JtdWxhLUJveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbKHZhbHVlKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+PC9Uc2ktRm9ybXVsYS1Cb3g+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxUc2ktVGV4dC1Cb3ggW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNob3dSb3dTdW1tYXJ5XCIgY2xhc3M9XCJmb250LWJvbGRcIj5cclxuICAgICAgICAgIHt7cm93U3VtbWFyeShpdGVtKX19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3Rpb25Nb2RlQmxvY2s+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cIml0ZW1cIiBbcFNlbGVjdGFibGVSb3ddPVwiaXRlbVwiIFtwU2VsZWN0YWJsZVJvd0luZGV4XT1cInJvd0luZGV4XCJcclxuICAgICAgICAgICAgKGZvY3VzT3V0KT1cIm9uRm9jdXNPdXRSb3coaXRlbSlcIj5cclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIiBzdHlsZT1cIndpZHRoOiAycmVtO1wiPlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07bGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93IGljb249XCJwaSBwaS1wZW5jaWxcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktY2hlY2tcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0hhdmVTdW1hcnlcIiBzY29wZT1cImNvbFwiIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0RlbGV0ZUJ1dHRvblwiIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtMSBidG4tZGVsZXRlLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXRyYXNoXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcFRleHQ9XCJzaGFyZWRfZWRpdHRhYmxlX3N1cHByaW1lclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBwUmVzaXphYmxlQ29sdW1uICpuZ0lmPVwic2hvd0NvbnN1bHRCdXR0b25cIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTEgYnRuLWNvbnN1bHQtc3R5bGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbYnV0dG9uVHlwZV09XCJidXR0b25UeXBlLkJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWV5ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9jb25zdWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJjb25zdWx0KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ1aS1yZXNpemFibGUtY29sdW1uXCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZGlzcGxheU9ubHkgfHwgZGlzYWJsZWQ7IGVsc2Ugb3JkaW5hcnlCbG9jXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5TRUFSQ0hfQ09NQk87IGVsc2UgY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2Rpc2FibGVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiIFsoYmluZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICBpZC1maWVsZD1cInt7Y29sLmlkRmllbGR9fVwiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgbGFiZWwtZmllbGQ9XCJ7e2NvbC5sYWJlbEZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93U2VhcmNoQnV0dG9uXT1cImNvbC5zaG93U2VhcmNoQnV0dG9uID8/IHRydWVcIiBbc2hvd0FkZEJ1dHRvbl09XCJjb2wuc2hvd0FkZEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q29uc3VsdEJ1dHRvbl09XCJjb2wuc2hvd0NvbnN1bHRCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5Q29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DSEVDS0JPWDsgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UaW1lLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtZGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdHNpLXRpbWUtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUZvcm11bGEtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3JkaW5hcnlCbG9jPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktU2VhcmNoLUNvbWJvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIiAoYmluZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChiaW5kQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtUGlja2VyIFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLVBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlcklucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlciAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXIgW2NsYXNzXT1cIidtYXgtdy00cmVtJ1wiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuUkFURV9JTlBVVDsgZWxzZSB0aW1lSW5wdXRCbG9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lSW5wdXRCbG9jPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FIGVsc2UgZm9ybXVsYUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtcGlja2VyIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHNpLXRpbWUtcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+PC9Uc2ktRm9ybXVsYS1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRleHRJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktVGV4dC1Cb3ggW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwic2hvd1Jvd1N1bW1hcnlcIiBjbGFzcz1cImZvbnQtYm9sZFwiPlxyXG4gICAgICAgICAgICAgIHt7cm93U3VtbWFyeShpdGVtKX19XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgPHRyIGNsYXNzPVwidGZvb3RlclwiPlxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc2NvcGU9XCJjb2xcIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGQ+IC0tPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDoycmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjJyZW0gIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzY29wZT1cImNvbFwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPlRvdGFsPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPCEtLTx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiBbc3R5bGVdPVwiY29sLnN0eWxlXCIgc2NvcGU9XCJjb2xcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuaGF2ZVN1bW1hcnlcIj5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCI+XHJcbiAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lDb2RlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAge3tnZXRTdW1tYXJ5KGNvbCl9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIHt7J1RvdGFsUmVjb3Jkc0NvdW50JyB8IGxvY2FsaXplIH19IHt7Z3JpZERhdGEubGVuZ3RofX1cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLXRhYmxlPlxyXG4gIDxkaXY+XHJcbiAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiBzdHlsZT1cImhlaWdodDogMjBweDt3aWR0aDogMjBweDtcIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1wbHVzXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9ham91dGVyXCJcclxuICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1zdWNjZXNzIHAtYnV0dG9uLXRleHQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5IG5nLXN0YXItaW5zZXJ0ZWRcIlxyXG4gICAgICAoY2xpY2spPVwiYWRkUm93KClcIj48L1RzaS1CdXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|