@pepperi-addons/ngx-lib 0.4.1-beta.54 → 0.4.1-beta.56
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/address/address.component.d.ts +30 -30
- package/address/address.module.d.ts +15 -15
- package/address/index.d.ts +5 -5
- package/address/public-api.d.ts +2 -2
- package/attachment/attachment.component.d.ts +85 -85
- package/attachment/attachment.module.d.ts +14 -14
- package/attachment/index.d.ts +5 -5
- package/attachment/public-api.d.ts +2 -2
- package/bread-crumbs/bread-crumbs.component.d.ts +27 -27
- package/bread-crumbs/bread-crumbs.model.d.ts +11 -11
- package/bread-crumbs/bread-crumbs.module.d.ts +15 -15
- package/bread-crumbs/index.d.ts +5 -5
- package/bread-crumbs/public-api.d.ts +3 -3
- package/button/button.component.d.ts +102 -102
- package/button/button.model.d.ts +14 -14
- package/button/button.module.d.ts +13 -13
- package/button/index.d.ts +5 -5
- package/button/public-api.d.ts +3 -3
- package/carousel/carousel-item.directive.d.ts +12 -12
- package/carousel/carousel.component.d.ts +148 -148
- package/carousel/carousel.module.d.ts +8 -8
- package/carousel/index.d.ts +5 -5
- package/carousel/public-api.d.ts +3 -3
- package/checkbox/checkbox.component.d.ts +50 -50
- package/checkbox/checkbox.module.d.ts +19 -19
- package/checkbox/index.d.ts +5 -5
- package/checkbox/public-api.d.ts +2 -2
- package/chips/chips.component.d.ts +93 -93
- package/chips/chips.model.d.ts +14 -14
- package/chips/chips.module.d.ts +20 -20
- package/chips/chips.service.d.ts +15 -15
- package/chips/index.d.ts +5 -5
- package/chips/public-api.d.ts +3 -3
- package/color/color-picker.component.d.ts +57 -57
- package/color/color.component.d.ts +30 -30
- package/color/color.model.d.ts +1 -1
- package/color/color.module.d.ts +26 -26
- package/color/index.d.ts +5 -5
- package/color/public-api.d.ts +3 -3
- package/core/clipboard/clipboard.directive.d.ts +5 -5
- package/core/clipboard/clipboard.service.d.ts +5 -5
- package/core/clipboard/index.d.ts +1 -1
- package/core/clipboard/public-api.d.ts +2 -2
- package/core/common/directives/auto-width.directive.d.ts +19 -19
- package/core/common/directives/button-blur.directive.d.ts +9 -9
- package/core/common/directives/button-loader.directive.d.ts +26 -26
- package/core/common/directives/data-qa.directive.d.ts +11 -11
- package/core/common/directives/div-loader.directive.d.ts +21 -21
- package/core/common/directives/index.d.ts +1 -1
- package/core/common/directives/menu-blur.directive.d.ts +10 -10
- package/core/common/directives/prevent-multi-click.directive.d.ts +7 -7
- package/core/common/directives/print.directive.d.ts +75 -75
- package/core/common/directives/public-api.d.ts +8 -8
- package/core/common/index.d.ts +1 -1
- package/core/common/model/index.d.ts +1 -1
- package/core/common/model/papi.model.d.ts +2 -2
- package/core/common/model/public-api.d.ts +3 -3
- package/core/common/model/utilities.model.d.ts +5 -5
- package/core/common/model/wapi.model.d.ts +202 -202
- package/core/common/pipes/common-pipes.d.ts +57 -57
- package/core/common/pipes/date-ago.pipe.d.ts +11 -11
- package/core/common/pipes/index.d.ts +1 -1
- package/core/common/pipes/public-api.d.ts +2 -2
- package/core/common/public-api.d.ts +4 -4
- package/core/common/services/addon.service.d.ts +48 -48
- package/core/common/services/color.service.d.ts +51 -51
- package/core/common/services/cookie.service.d.ts +53 -53
- package/core/common/services/data-convertor.service.d.ts +45 -45
- package/core/common/services/file.service.d.ts +27 -27
- package/core/common/services/index.d.ts +1 -1
- package/core/common/services/jwt-helper.service.d.ts +13 -13
- package/core/common/services/public-api.d.ts +11 -11
- package/core/common/services/session.service.d.ts +18 -18
- package/core/common/services/translate.service.d.ts +12 -12
- package/core/common/services/utilities.service.d.ts +39 -39
- package/core/common/services/validator.service.d.ts +31 -31
- package/core/common/services/window-scrolling.service.d.ts +10 -10
- package/core/customization/customization.model.d.ts +277 -277
- package/core/customization/customization.service.d.ts +159 -159
- package/core/customization/index.d.ts +1 -1
- package/core/customization/public-api.d.ts +2 -2
- package/core/http/index.d.ts +1 -1
- package/core/http/interceptors/error.interceptor.d.ts +8 -8
- package/core/http/interceptors/index.d.ts +11 -11
- package/core/http/interceptors/loader.interceptor.d.ts +11 -11
- package/core/http/interceptors/profiler.interceptor.d.ts +8 -8
- package/core/http/public-api.d.ts +2 -2
- package/core/http/services/http.service.d.ts +28 -28
- package/core/http/services/loader.service.d.ts +13 -13
- package/core/index.d.ts +1 -1
- package/core/layout/index.d.ts +1 -1
- package/core/layout/layout.service.d.ts +36 -36
- package/core/layout/public-api.d.ts +2 -2
- package/core/layout/rtl.directive.d.ts +21 -21
- package/core/portal/attach.directive.d.ts +13 -13
- package/core/portal/index.d.ts +1 -1
- package/core/portal/portal.service.d.ts +12 -12
- package/core/portal/public-api.d.ts +3 -3
- package/core/portal/target.directive.d.ts +12 -12
- package/core/public-api.d.ts +7 -7
- package/core/scroll-to/index.d.ts +1 -1
- package/core/scroll-to/public-api.d.ts +1 -1
- package/core/scroll-to/scroll-to.service.d.ts +11 -11
- package/date/date.component.d.ts +69 -69
- package/date/date.model.d.ts +31 -31
- package/date/date.module.d.ts +23 -23
- package/date/index.d.ts +5 -5
- package/date/public-api.d.ts +2 -2
- package/dialog/default-dialog.component.d.ts +12 -12
- package/dialog/dialog.component.d.ts +13 -13
- package/dialog/dialog.model.d.ts +31 -31
- package/dialog/dialog.module.d.ts +18 -18
- package/dialog/dialog.service.d.ts +27 -27
- package/dialog/index.d.ts +5 -5
- package/dialog/public-api.d.ts +4 -4
- package/draggable-items/draggable-item/draggable-item.component.d.ts +11 -11
- package/draggable-items/draggable-items.component.d.ts +36 -36
- package/draggable-items/draggable-items.model.d.ts +11 -11
- package/draggable-items/draggable-items.module.d.ts +18 -18
- package/draggable-items/index.d.ts +5 -5
- package/draggable-items/public-api.d.ts +4 -4
- package/esm2020/address/address.component.mjs +108 -108
- package/esm2020/address/address.module.mjs +53 -53
- package/esm2020/address/pepperi-addons-ngx-lib-address.mjs +4 -4
- package/esm2020/address/public-api.mjs +5 -5
- package/esm2020/attachment/attachment.component.mjs +219 -219
- package/esm2020/attachment/attachment.module.mjs +49 -49
- package/esm2020/attachment/pepperi-addons-ngx-lib-attachment.mjs +4 -4
- package/esm2020/attachment/public-api.mjs +5 -5
- package/esm2020/bread-crumbs/bread-crumbs.component.mjs +84 -84
- package/esm2020/bread-crumbs/bread-crumbs.model.mjs +6 -6
- package/esm2020/bread-crumbs/bread-crumbs.module.mjs +49 -49
- package/esm2020/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.mjs +4 -4
- package/esm2020/bread-crumbs/public-api.mjs +6 -6
- package/esm2020/button/button.component.mjs +137 -137
- package/esm2020/button/button.model.mjs +5 -5
- package/esm2020/button/button.module.mjs +45 -45
- package/esm2020/button/pepperi-addons-ngx-lib-button.mjs +4 -4
- package/esm2020/button/public-api.mjs +6 -6
- package/esm2020/carousel/carousel-item.directive.mjs +32 -32
- package/esm2020/carousel/carousel.component.mjs +736 -736
- package/esm2020/carousel/carousel.module.mjs +16 -16
- package/esm2020/carousel/pepperi-addons-ngx-lib-carousel.mjs +4 -4
- package/esm2020/carousel/public-api.mjs +7 -7
- package/esm2020/checkbox/checkbox.component.mjs +167 -167
- package/esm2020/checkbox/checkbox.module.mjs +62 -62
- package/esm2020/checkbox/pepperi-addons-ngx-lib-checkbox.mjs +4 -4
- package/esm2020/checkbox/public-api.mjs +5 -5
- package/esm2020/chips/chips.component.mjs +157 -157
- package/esm2020/chips/chips.model.mjs +1 -1
- package/esm2020/chips/chips.module.mjs +80 -80
- package/esm2020/chips/chips.service.mjs +44 -44
- package/esm2020/chips/pepperi-addons-ngx-lib-chips.mjs +4 -4
- package/esm2020/chips/public-api.mjs +6 -6
- package/esm2020/color/color-picker.component.mjs +197 -197
- package/esm2020/color/color.component.mjs +89 -89
- package/esm2020/color/color.model.mjs +1 -1
- package/esm2020/color/color.module.mjs +92 -92
- package/esm2020/color/pepperi-addons-ngx-lib-color.mjs +4 -4
- package/esm2020/color/public-api.mjs +6 -6
- package/esm2020/core/clipboard/clipboard.directive.mjs +23 -23
- package/esm2020/core/clipboard/clipboard.service.mjs +13 -13
- package/esm2020/core/clipboard/index.mjs +4 -4
- package/esm2020/core/clipboard/public-api.mjs +5 -5
- package/esm2020/core/common/directives/auto-width.directive.mjs +76 -76
- package/esm2020/core/common/directives/button-blur.directive.mjs +23 -23
- package/esm2020/core/common/directives/button-loader.directive.mjs +111 -111
- package/esm2020/core/common/directives/data-qa.directive.mjs +22 -22
- package/esm2020/core/common/directives/div-loader.directive.mjs +60 -60
- package/esm2020/core/common/directives/index.mjs +4 -4
- package/esm2020/core/common/directives/menu-blur.directive.mjs +31 -31
- package/esm2020/core/common/directives/prevent-multi-click.directive.mjs +26 -26
- package/esm2020/core/common/directives/print.directive.mjs +144 -144
- package/esm2020/core/common/directives/public-api.mjs +12 -12
- package/esm2020/core/common/index.mjs +4 -4
- package/esm2020/core/common/model/index.mjs +4 -4
- package/esm2020/core/common/model/papi.model.mjs +2 -2
- package/esm2020/core/common/model/public-api.mjs +6 -6
- package/esm2020/core/common/model/utilities.model.mjs +56 -56
- package/esm2020/core/common/model/wapi.model.mjs +156 -156
- package/esm2020/core/common/pipes/common-pipes.mjs +166 -166
- package/esm2020/core/common/pipes/date-ago.pipe.mjs +45 -45
- package/esm2020/core/common/pipes/index.mjs +4 -4
- package/esm2020/core/common/pipes/public-api.mjs +5 -5
- package/esm2020/core/common/public-api.mjs +7 -7
- package/esm2020/core/common/services/addon.service.mjs +188 -188
- package/esm2020/core/common/services/color.service.mjs +358 -358
- package/esm2020/core/common/services/cookie.service.mjs +152 -152
- package/esm2020/core/common/services/data-convertor.service.mjs +121 -121
- package/esm2020/core/common/services/file.service.mjs +212 -212
- package/esm2020/core/common/services/index.mjs +4 -4
- package/esm2020/core/common/services/jwt-helper.service.mjs +105 -105
- package/esm2020/core/common/services/public-api.mjs +14 -14
- package/esm2020/core/common/services/session.service.mjs +70 -70
- package/esm2020/core/common/services/translate.service.mjs +45 -45
- package/esm2020/core/common/services/utilities.service.mjs +299 -299
- package/esm2020/core/common/services/validator.service.mjs +271 -271
- package/esm2020/core/common/services/window-scrolling.service.mjs +31 -31
- package/esm2020/core/customization/customization.model.mjs +301 -301
- package/esm2020/core/customization/customization.service.mjs +770 -770
- package/esm2020/core/customization/index.mjs +4 -4
- package/esm2020/core/customization/public-api.mjs +5 -5
- package/esm2020/core/http/index.mjs +4 -4
- package/esm2020/core/http/interceptors/error.interceptor.mjs +26 -26
- package/esm2020/core/http/interceptors/index.mjs +23 -23
- package/esm2020/core/http/interceptors/loader.interceptor.mjs +31 -31
- package/esm2020/core/http/interceptors/profiler.interceptor.mjs +31 -31
- package/esm2020/core/http/public-api.mjs +5 -5
- package/esm2020/core/http/services/http.service.mjs +154 -154
- package/esm2020/core/http/services/loader.service.mjs +49 -49
- package/esm2020/core/index.mjs +4 -4
- package/esm2020/core/layout/index.mjs +4 -4
- package/esm2020/core/layout/layout.service.mjs +167 -167
- package/esm2020/core/layout/public-api.mjs +5 -5
- package/esm2020/core/layout/rtl.directive.mjs +43 -43
- package/esm2020/core/portal/attach.directive.mjs +26 -26
- package/esm2020/core/portal/index.mjs +4 -4
- package/esm2020/core/portal/portal.service.mjs +35 -35
- package/esm2020/core/portal/public-api.mjs +6 -6
- package/esm2020/core/portal/target.directive.mjs +23 -23
- package/esm2020/core/public-api.mjs +10 -10
- package/esm2020/core/scroll-to/index.mjs +4 -4
- package/esm2020/core/scroll-to/public-api.mjs +5 -5
- package/esm2020/core/scroll-to/scroll-to.service.mjs +83 -83
- package/esm2020/date/date.component.mjs +306 -306
- package/esm2020/date/date.model.mjs +53 -53
- package/esm2020/date/date.module.mjs +87 -87
- package/esm2020/date/pepperi-addons-ngx-lib-date.mjs +4 -4
- package/esm2020/date/public-api.mjs +5 -5
- package/esm2020/dialog/default-dialog.component.mjs +36 -36
- package/esm2020/dialog/dialog.component.mjs +35 -35
- package/esm2020/dialog/dialog.model.mjs +32 -32
- package/esm2020/dialog/dialog.module.mjs +58 -58
- package/esm2020/dialog/dialog.service.mjs +81 -81
- package/esm2020/dialog/pepperi-addons-ngx-lib-dialog.mjs +4 -4
- package/esm2020/dialog/public-api.mjs +7 -7
- package/esm2020/draggable-items/draggable-item/draggable-item.component.mjs +26 -26
- package/esm2020/draggable-items/draggable-items.component.mjs +101 -101
- package/esm2020/draggable-items/draggable-items.model.mjs +1 -1
- package/esm2020/draggable-items/draggable-items.module.mjs +59 -59
- package/esm2020/draggable-items/pepperi-addons-ngx-lib-draggable-items.mjs +4 -4
- package/esm2020/draggable-items/public-api.mjs +7 -7
- package/esm2020/field-title/field-title.component.mjs +44 -44
- package/esm2020/field-title/field-title.module.mjs +46 -46
- package/esm2020/field-title/pepperi-addons-ngx-lib-field-title.mjs +4 -4
- package/esm2020/field-title/public-api.mjs +5 -5
- package/esm2020/files-uploader/files-uploader.component.mjs +240 -240
- package/esm2020/files-uploader/files-uploader.module.mjs +78 -78
- package/esm2020/files-uploader/pepperi-addons-ngx-lib-files-uploader.mjs +4 -4
- package/esm2020/files-uploader/public-api.mjs +5 -5
- package/esm2020/form/field-generator.component.mjs +152 -152
- package/esm2020/form/form.component.mjs +1226 -1226
- package/esm2020/form/form.model.mjs +1 -1
- package/esm2020/form/form.module.mjs +178 -178
- package/esm2020/form/indicators.component.mjs +22 -22
- package/esm2020/form/internal-button.component.mjs +183 -183
- package/esm2020/form/internal-carusel.component.mjs +116 -116
- package/esm2020/form/internal-carusel.service.mjs +31 -31
- package/esm2020/form/internal-field-generator.component.mjs +146 -146
- package/esm2020/form/internal-form.component.mjs +1215 -1215
- package/esm2020/form/internal-list.component.mjs +512 -512
- package/esm2020/form/internal-menu.component.mjs +65 -65
- package/esm2020/form/internal-page.component.mjs +361 -361
- package/esm2020/form/internal-page.service.mjs +119 -119
- package/esm2020/form/pepperi-addons-ngx-lib-form.mjs +4 -4
- package/esm2020/form/public-api.mjs +6 -6
- package/esm2020/group-buttons/group-buttons.component.mjs +70 -70
- package/esm2020/group-buttons/group-buttons.module.mjs +58 -58
- package/esm2020/group-buttons/pepperi-addons-ngx-lib-group-buttons.mjs +4 -4
- package/esm2020/group-buttons/public-api.mjs +5 -5
- package/esm2020/icon/icon-generated-all.model.mjs +113 -113
- package/esm2020/icon/icon-generated.model.mjs +441 -441
- package/esm2020/icon/icon-registry.service.mjs +24 -24
- package/esm2020/icon/icon.component.mjs +90 -90
- package/esm2020/icon/icon.module.mjs +19 -19
- package/esm2020/icon/icon.service.mjs +30 -30
- package/esm2020/icon/pepperi-addons-ngx-lib-icon.mjs +4 -4
- package/esm2020/icon/public-api.mjs +10 -10
- package/esm2020/image/image.component.mjs +246 -246
- package/esm2020/image/image.module.mjs +73 -73
- package/esm2020/image/image.service.mjs +51 -51
- package/esm2020/image/pepperi-addons-ngx-lib-image.mjs +4 -4
- package/esm2020/image/public-api.mjs +6 -6
- package/esm2020/images-filmstrip/images-filmstrip.component.mjs +336 -336
- package/esm2020/images-filmstrip/images-filmstrip.module.mjs +82 -82
- package/esm2020/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.mjs +4 -4
- package/esm2020/images-filmstrip/public-api.mjs +5 -5
- package/esm2020/link/link.component.mjs +325 -325
- package/esm2020/link/link.module.mjs +79 -79
- package/esm2020/link/link.pipes.mjs +17 -17
- package/esm2020/link/pepperi-addons-ngx-lib-link.mjs +4 -4
- package/esm2020/link/public-api.mjs +5 -5
- package/esm2020/list/list-actions.component.mjs +43 -43
- package/esm2020/list/list-carousel.component.mjs +106 -106
- package/esm2020/list/list-chooser.component.mjs +63 -63
- package/esm2020/list/list-pager.component.mjs +119 -119
- package/esm2020/list/list-sorting.component.mjs +60 -60
- package/esm2020/list/list-total.component.mjs +29 -29
- package/esm2020/list/list-views.component.mjs +84 -84
- package/esm2020/list/list.component.mjs +1162 -1162
- package/esm2020/list/list.model.mjs +3 -3
- package/esm2020/list/list.module.mjs +143 -143
- package/esm2020/list/list.pipes.mjs +46 -46
- package/esm2020/list/pepperi-addons-ngx-lib-list.mjs +4 -4
- package/esm2020/list/public-api.mjs +14 -14
- package/esm2020/list/virtual-scroller.mjs +1061 -1061
- package/esm2020/menu/menu-item.component.mjs +114 -114
- package/esm2020/menu/menu.component.mjs +212 -212
- package/esm2020/menu/menu.model.mjs +18 -18
- package/esm2020/menu/menu.module.mjs +58 -58
- package/esm2020/menu/pepperi-addons-ngx-lib-menu.mjs +4 -4
- package/esm2020/menu/public-api.mjs +6 -6
- package/esm2020/ngx-lib.module.mjs +161 -161
- package/esm2020/page-layout/page-layout.component.mjs +34 -34
- package/esm2020/page-layout/page-layout.module.mjs +33 -33
- package/esm2020/page-layout/pepperi-addons-ngx-lib-page-layout.mjs +4 -4
- package/esm2020/page-layout/public-api.mjs +5 -5
- package/esm2020/pepperi-addons-ngx-lib.mjs +4 -4
- package/esm2020/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.mjs +4 -4
- package/esm2020/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +44 -44
- package/esm2020/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +64 -64
- package/esm2020/profile-data-views-list/profile-data-views-list.component.mjs +94 -94
- package/esm2020/profile-data-views-list/profile-data-views-list.model.mjs +1 -1
- package/esm2020/profile-data-views-list/profile-data-views-list.module.mjs +87 -87
- package/esm2020/profile-data-views-list/public-api.mjs +8 -8
- package/esm2020/public-api.mjs +5 -5
- package/esm2020/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.mjs +4 -4
- package/esm2020/quantity-selector/public-api.mjs +5 -5
- package/esm2020/quantity-selector/quantity-selector-validation.directive.mjs +48 -48
- package/esm2020/quantity-selector/quantity-selector.component.mjs +577 -577
- package/esm2020/quantity-selector/quantity-selector.module.mjs +81 -81
- package/esm2020/quantity-selector/quantity-selector.pipes.mjs +22 -22
- package/esm2020/query-builder/common/model/field.mjs +1 -1
- package/esm2020/query-builder/common/model/filter.mjs +1 -1
- package/esm2020/query-builder/common/model/legacy.mjs +1 -1
- package/esm2020/query-builder/common/model/operator-unit.mjs +41 -41
- package/esm2020/query-builder/common/model/operator.mjs +265 -265
- package/esm2020/query-builder/common/model/structure.mjs +1 -1
- package/esm2020/query-builder/common/model/type-map.mjs +26 -26
- package/esm2020/query-builder/common/model/type.mjs +5 -5
- package/esm2020/query-builder/common/services/output-query.service.mjs +113 -113
- package/esm2020/query-builder/common/services/query-structure.service.mjs +225 -225
- package/esm2020/query-builder/common/services/type-convertor.service.mjs +41 -41
- package/esm2020/query-builder/pepperi-addons-ngx-lib-query-builder.mjs +4 -4
- package/esm2020/query-builder/public-api.mjs +8 -8
- package/esm2020/query-builder/query-builder-item/query-builder-item.component.mjs +124 -124
- package/esm2020/query-builder/query-builder-section/query-builder-section.component.mjs +70 -70
- package/esm2020/query-builder/query-builder.component.mjs +109 -109
- package/esm2020/query-builder/query-builder.module.mjs +58 -58
- package/esm2020/query-builder/query-builder.service.mjs +101 -101
- package/esm2020/remote-loader/addon-block-loader.component.mjs +101 -101
- package/esm2020/remote-loader/addon-block-loader.service.mjs +61 -61
- package/esm2020/remote-loader/pepperi-addons-ngx-lib-remote-loader.mjs +4 -4
- package/esm2020/remote-loader/public-api.mjs +10 -10
- package/esm2020/remote-loader/remote-loader-element.component.mjs +104 -104
- package/esm2020/remote-loader/remote-loader.component.mjs +108 -108
- package/esm2020/remote-loader/remote-loader.model.mjs +1 -1
- package/esm2020/remote-loader/remote-loader.module.mjs +68 -68
- package/esm2020/remote-loader/remote-loader.service.mjs +80 -80
- package/esm2020/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.mjs +4 -4
- package/esm2020/rich-html-textarea/public-api.mjs +5 -5
- package/esm2020/rich-html-textarea/rich-html-textarea.component.mjs +247 -247
- package/esm2020/rich-html-textarea/rich-html-textarea.module.mjs +94 -94
- package/esm2020/search/pepperi-addons-ngx-lib-search.mjs +4 -4
- package/esm2020/search/public-api.mjs +6 -6
- package/esm2020/search/search.component.mjs +316 -316
- package/esm2020/search/search.model.mjs +1 -1
- package/esm2020/search/search.module.mjs +69 -69
- package/esm2020/select/pepperi-addons-ngx-lib-select.mjs +4 -4
- package/esm2020/select/public-api.mjs +5 -5
- package/esm2020/select/select.component.mjs +266 -266
- package/esm2020/select/select.module.mjs +69 -69
- package/esm2020/select-panel/pepperi-addons-ngx-lib-select-panel.mjs +4 -4
- package/esm2020/select-panel/public-api.mjs +6 -6
- package/esm2020/select-panel/select-panel.component.mjs +159 -158
- package/esm2020/select-panel/select-panel.model.mjs +1 -1
- package/esm2020/select-panel/select-panel.module.mjs +69 -69
- package/esm2020/separator/pepperi-addons-ngx-lib-separator.mjs +4 -4
- package/esm2020/separator/public-api.mjs +5 -5
- package/esm2020/separator/separator.component.mjs +62 -62
- package/esm2020/separator/separator.module.mjs +17 -17
- package/esm2020/side-bar/pepperi-addons-ngx-lib-side-bar.mjs +4 -4
- package/esm2020/side-bar/public-api.mjs +6 -6
- package/esm2020/side-bar/side-bar.component.mjs +121 -121
- package/esm2020/side-bar/side-bar.model.mjs +1 -1
- package/esm2020/side-bar/side-bar.module.mjs +54 -54
- package/esm2020/signature/pepperi-addons-ngx-lib-signature.mjs +4 -4
- package/esm2020/signature/public-api.mjs +5 -5
- package/esm2020/signature/signature.component.mjs +253 -253
- package/esm2020/signature/signature.module.mjs +89 -89
- package/esm2020/size-detector/pepperi-addons-ngx-lib-size-detector.mjs +4 -4
- package/esm2020/size-detector/public-api.mjs +5 -5
- package/esm2020/size-detector/size-detector.component.mjs +91 -91
- package/esm2020/size-detector/size-detector.module.mjs +34 -34
- package/esm2020/slider/pepperi-addons-ngx-lib-slider.mjs +4 -4
- package/esm2020/slider/public-api.mjs +5 -5
- package/esm2020/slider/slider.component.mjs +100 -100
- package/esm2020/slider/slider.module.mjs +41 -41
- package/esm2020/smart-filters/boolean-filter/boolean-filter.component.mjs +74 -74
- package/esm2020/smart-filters/common/filter-actions.component.mjs +28 -28
- package/esm2020/smart-filters/common/model/base-filter-component.mjs +295 -295
- package/esm2020/smart-filters/common/model/creator.mjs +75 -75
- package/esm2020/smart-filters/common/model/field.mjs +116 -116
- package/esm2020/smart-filters/common/model/filter.mjs +1 -1
- package/esm2020/smart-filters/common/model/operator.mjs +270 -270
- package/esm2020/smart-filters/common/model/type.mjs +1 -1
- package/esm2020/smart-filters/date-filter/date-filter.component.mjs +181 -181
- package/esm2020/smart-filters/multi-select-filter/multi-select-filter.component.mjs +199 -199
- package/esm2020/smart-filters/number-filter/number-filter.component.mjs +135 -135
- package/esm2020/smart-filters/pepperi-addons-ngx-lib-smart-filters.mjs +4 -4
- package/esm2020/smart-filters/public-api.mjs +18 -18
- package/esm2020/smart-filters/smart-filters.component.mjs +140 -140
- package/esm2020/smart-filters/smart-filters.module.mjs +157 -157
- package/esm2020/smart-filters/text-filter/text-filter.component.mjs +92 -92
- package/esm2020/snack-bar/default-snack-bar.component.mjs +28 -28
- package/esm2020/snack-bar/pepperi-addons-ngx-lib-snack-bar.mjs +4 -4
- package/esm2020/snack-bar/public-api.mjs +7 -7
- package/esm2020/snack-bar/snack-bar.component.mjs +25 -25
- package/esm2020/snack-bar/snack-bar.model.mjs +6 -6
- package/esm2020/snack-bar/snack-bar.module.mjs +62 -62
- package/esm2020/snack-bar/snack-bar.service.mjs +59 -59
- package/esm2020/textarea/pepperi-addons-ngx-lib-textarea.mjs +4 -4
- package/esm2020/textarea/public-api.mjs +5 -5
- package/esm2020/textarea/textarea.component.mjs +188 -182
- package/esm2020/textarea/textarea.module.mjs +81 -81
- package/esm2020/textbox/pepperi-addons-ngx-lib-textbox.mjs +4 -4
- package/esm2020/textbox/public-api.mjs +5 -5
- package/esm2020/textbox/textbox-validation.directive.mjs +92 -92
- package/esm2020/textbox/textbox.component.mjs +552 -546
- package/esm2020/textbox/textbox.module.mjs +71 -71
- package/esm2020/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.mjs +4 -4
- package/esm2020/textbox-icon/public-api.mjs +5 -5
- package/esm2020/textbox-icon/textbox-icon.component.mjs +47 -47
- package/esm2020/textbox-icon/textbox-icon.module.mjs +63 -63
- package/esm2020/top-bar/pepperi-addons-ngx-lib-top-bar.mjs +4 -4
- package/esm2020/top-bar/public-api.mjs +6 -6
- package/esm2020/top-bar/top-bar.component.mjs +111 -111
- package/esm2020/top-bar/top-bar.model.mjs +1 -1
- package/esm2020/top-bar/top-bar.module.mjs +61 -61
- package/fesm2015/pepperi-addons-ngx-lib-address.mjs +143 -143
- package/fesm2015/pepperi-addons-ngx-lib-address.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs +253 -253
- package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs +122 -122
- package/fesm2015/pepperi-addons-ngx-lib-button.mjs +171 -171
- package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs +780 -780
- package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs +206 -206
- package/fesm2015/pepperi-addons-ngx-lib-chips.mjs +255 -255
- package/fesm2015/pepperi-addons-ngx-lib-color.mjs +336 -336
- package/fesm2015/pepperi-addons-ngx-lib-color.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-date.mjs +409 -409
- package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs +207 -207
- package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs +163 -163
- package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs +76 -76
- package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs +291 -291
- package/fesm2015/pepperi-addons-ngx-lib-form.mjs +4121 -4121
- package/fesm2015/pepperi-addons-ngx-lib-form.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +109 -109
- package/fesm2015/pepperi-addons-ngx-lib-icon.mjs +702 -702
- package/fesm2015/pepperi-addons-ngx-lib-image.mjs +340 -340
- package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs +390 -390
- package/fesm2015/pepperi-addons-ngx-lib-link.mjs +388 -388
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs +2826 -2826
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-menu.mjs +368 -368
- package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs +59 -59
- package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs +254 -254
- package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs +689 -689
- package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs +1119 -1119
- package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +504 -504
- package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs +303 -303
- package/fesm2015/pepperi-addons-ngx-lib-search.mjs +356 -356
- package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs +207 -206
- package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-select.mjs +308 -308
- package/fesm2015/pepperi-addons-ngx-lib-separator.mjs +73 -73
- package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs +158 -158
- package/fesm2015/pepperi-addons-ngx-lib-signature.mjs +311 -311
- package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs +114 -114
- package/fesm2015/pepperi-addons-ngx-lib-slider.mjs +130 -130
- package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs +1634 -1634
- package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs +152 -152
- package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs +238 -232
- package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs +95 -95
- package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs +679 -673
- package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs +155 -155
- package/fesm2015/pepperi-addons-ngx-lib.mjs +4615 -4615
- package/fesm2015/pepperi-addons-ngx-lib.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-address.mjs +143 -143
- package/fesm2020/pepperi-addons-ngx-lib-address.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs +253 -253
- package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs +122 -122
- package/fesm2020/pepperi-addons-ngx-lib-button.mjs +171 -171
- package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs +776 -776
- package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs +206 -206
- package/fesm2020/pepperi-addons-ngx-lib-chips.mjs +254 -254
- package/fesm2020/pepperi-addons-ngx-lib-color.mjs +333 -333
- package/fesm2020/pepperi-addons-ngx-lib-color.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-date.mjs +405 -405
- package/fesm2020/pepperi-addons-ngx-lib-dialog.mjs +203 -203
- package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs +162 -162
- package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs +76 -76
- package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs +288 -288
- package/fesm2020/pepperi-addons-ngx-lib-form.mjs +4120 -4120
- package/fesm2020/pepperi-addons-ngx-lib-form.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs +109 -109
- package/fesm2020/pepperi-addons-ngx-lib-icon.mjs +700 -700
- package/fesm2020/pepperi-addons-ngx-lib-image.mjs +338 -338
- package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs +387 -387
- package/fesm2020/pepperi-addons-ngx-lib-link.mjs +388 -388
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs +2812 -2812
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-menu.mjs +368 -368
- package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs +59 -59
- package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs +253 -253
- package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs +688 -688
- package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs +1108 -1108
- package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs +482 -482
- package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs +303 -303
- package/fesm2020/pepperi-addons-ngx-lib-search.mjs +355 -355
- package/fesm2020/pepperi-addons-ngx-lib-select-panel.mjs +206 -205
- package/fesm2020/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-select.mjs +308 -308
- package/fesm2020/pepperi-addons-ngx-lib-separator.mjs +73 -73
- package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs +158 -158
- package/fesm2020/pepperi-addons-ngx-lib-signature.mjs +311 -311
- package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs +114 -114
- package/fesm2020/pepperi-addons-ngx-lib-slider.mjs +129 -129
- package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs +1627 -1627
- package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs +149 -149
- package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs +237 -231
- package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-textbox-icon.mjs +95 -95
- package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs +679 -673
- package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs +154 -154
- package/fesm2020/pepperi-addons-ngx-lib.mjs +4585 -4585
- package/fesm2020/pepperi-addons-ngx-lib.mjs.map +1 -1
- package/field-title/field-title.component.d.ts +15 -15
- package/field-title/field-title.module.d.ts +15 -15
- package/field-title/index.d.ts +5 -5
- package/field-title/public-api.d.ts +2 -2
- package/files-uploader/files-uploader.component.d.ts +57 -57
- package/files-uploader/files-uploader.module.d.ts +21 -21
- package/files-uploader/index.d.ts +5 -5
- package/files-uploader/public-api.d.ts +2 -2
- package/form/field-generator.component.d.ts +39 -39
- package/form/form.component.d.ts +93 -93
- package/form/form.model.d.ts +20 -20
- package/form/form.module.d.ts +50 -50
- package/form/index.d.ts +5 -5
- package/form/indicators.component.d.ts +10 -10
- package/form/internal-button.component.d.ts +42 -42
- package/form/internal-carusel.component.d.ts +39 -39
- package/form/internal-carusel.service.d.ts +10 -10
- package/form/internal-field-generator.component.d.ts +35 -35
- package/form/internal-form.component.d.ts +89 -89
- package/form/internal-list.component.d.ts +95 -95
- package/form/internal-menu.component.d.ts +19 -19
- package/form/internal-page.component.d.ts +73 -73
- package/form/internal-page.service.d.ts +22 -22
- package/form/public-api.d.ts +3 -3
- package/group-buttons/group-buttons.component.d.ts +24 -24
- package/group-buttons/group-buttons.module.d.ts +18 -18
- package/group-buttons/index.d.ts +5 -5
- package/group-buttons/public-api.d.ts +2 -2
- package/icon/icon-generated-all.model.d.ts +112 -112
- package/icon/icon-generated.model.d.ts +446 -446
- package/icon/icon-registry.service.d.ts +9 -9
- package/icon/icon.component.d.ts +49 -49
- package/icon/icon.module.d.ts +7 -7
- package/icon/icon.service.d.ts +13 -13
- package/icon/index.d.ts +5 -5
- package/icon/public-api.d.ts +6 -6
- package/image/image.component.d.ts +66 -66
- package/image/image.module.d.ts +20 -20
- package/image/image.service.d.ts +14 -14
- package/image/index.d.ts +5 -5
- package/image/public-api.d.ts +3 -3
- package/images-filmstrip/images-filmstrip.component.d.ts +87 -87
- package/images-filmstrip/images-filmstrip.module.d.ts +22 -22
- package/images-filmstrip/index.d.ts +5 -5
- package/images-filmstrip/public-api.d.ts +2 -2
- package/index.d.ts +5 -5
- package/link/index.d.ts +5 -5
- package/link/link.component.d.ts +126 -126
- package/link/link.module.d.ts +22 -22
- package/link/link.pipes.d.ts +7 -7
- package/link/public-api.d.ts +2 -2
- package/list/index.d.ts +5 -5
- package/list/list-actions.component.d.ts +18 -18
- package/list/list-carousel.component.d.ts +40 -40
- package/list/list-chooser.component.d.ts +29 -29
- package/list/list-pager.component.d.ts +39 -39
- package/list/list-sorting.component.d.ts +30 -30
- package/list/list-total.component.d.ts +11 -11
- package/list/list-views.component.d.ts +35 -35
- package/list/list.component.d.ts +164 -164
- package/list/list.model.d.ts +31 -31
- package/list/list.module.d.ts +34 -34
- package/list/list.pipes.d.ts +16 -16
- package/list/public-api.d.ts +10 -10
- package/list/virtual-scroller.d.ts +183 -183
- package/menu/index.d.ts +5 -5
- package/menu/menu-item.component.d.ts +28 -28
- package/menu/menu.component.d.ts +48 -48
- package/menu/menu.model.d.ts +25 -25
- package/menu/menu.module.d.ts +18 -18
- package/menu/public-api.d.ts +3 -3
- package/ngx-lib.module.d.ts +24 -24
- package/package.json +1 -1
- package/page-layout/index.d.ts +5 -5
- package/page-layout/page-layout.component.d.ts +19 -19
- package/page-layout/page-layout.module.d.ts +10 -10
- package/page-layout/public-api.d.ts +2 -2
- package/profile-data-views-list/index.d.ts +5 -5
- package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +18 -18
- package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +24 -24
- package/profile-data-views-list/profile-data-views-list.component.d.ts +35 -35
- package/profile-data-views-list/profile-data-views-list.model.d.ts +18 -18
- package/profile-data-views-list/profile-data-views-list.module.d.ts +23 -23
- package/profile-data-views-list/public-api.d.ts +5 -5
- package/public-api.d.ts +2 -2
- package/quantity-selector/index.d.ts +5 -5
- package/quantity-selector/public-api.d.ts +2 -2
- package/quantity-selector/quantity-selector-validation.directive.d.ts +17 -17
- package/quantity-selector/quantity-selector.component.d.ts +112 -112
- package/quantity-selector/quantity-selector.module.d.ts +23 -23
- package/quantity-selector/quantity-selector.pipes.d.ts +7 -7
- package/query-builder/common/model/field.d.ts +8 -8
- package/query-builder/common/model/filter.d.ts +6 -6
- package/query-builder/common/model/legacy.d.ts +29 -29
- package/query-builder/common/model/operator-unit.d.ts +13 -13
- package/query-builder/common/model/operator.d.ts +21 -21
- package/query-builder/common/model/structure.d.ts +4 -4
- package/query-builder/common/model/type-map.d.ts +12 -12
- package/query-builder/common/model/type.d.ts +4 -4
- package/query-builder/common/services/output-query.service.d.ts +47 -47
- package/query-builder/common/services/query-structure.service.d.ts +82 -82
- package/query-builder/common/services/type-convertor.service.d.ts +13 -13
- package/query-builder/index.d.ts +5 -5
- package/query-builder/public-api.d.ts +5 -5
- package/query-builder/query-builder-item/query-builder-item.component.d.ts +41 -41
- package/query-builder/query-builder-section/query-builder-section.component.d.ts +30 -30
- package/query-builder/query-builder.component.d.ts +39 -39
- package/query-builder/query-builder.module.d.ts +16 -16
- package/query-builder/query-builder.service.d.ts +30 -30
- package/remote-loader/addon-block-loader.component.d.ts +36 -36
- package/remote-loader/addon-block-loader.service.d.ts +15 -15
- package/remote-loader/index.d.ts +5 -5
- package/remote-loader/public-api.d.ts +7 -7
- package/remote-loader/remote-loader-element.component.d.ts +30 -30
- package/remote-loader/remote-loader.component.d.ts +25 -25
- package/remote-loader/remote-loader.model.d.ts +41 -41
- package/remote-loader/remote-loader.module.d.ts +15 -15
- package/remote-loader/remote-loader.service.d.ts +15 -15
- package/rich-html-textarea/index.d.ts +5 -5
- package/rich-html-textarea/public-api.d.ts +2 -2
- package/rich-html-textarea/rich-html-textarea.component.d.ts +79 -79
- package/rich-html-textarea/rich-html-textarea.module.d.ts +25 -25
- package/search/index.d.ts +5 -5
- package/search/public-api.d.ts +3 -3
- package/search/search.component.d.ts +65 -65
- package/search/search.model.d.ts +14 -14
- package/search/search.module.d.ts +20 -20
- package/select/index.d.ts +5 -5
- package/select/public-api.d.ts +2 -2
- package/select/select.component.d.ts +60 -60
- package/select/select.module.d.ts +20 -20
- package/select-panel/index.d.ts +5 -5
- package/select-panel/public-api.d.ts +3 -3
- package/select-panel/select-panel.component.d.ts +51 -50
- package/select-panel/select-panel.model.d.ts +5 -5
- package/select-panel/select-panel.module.d.ts +19 -19
- package/separator/index.d.ts +5 -5
- package/separator/public-api.d.ts +2 -2
- package/separator/separator.component.d.ts +22 -22
- package/separator/separator.module.d.ts +8 -8
- package/side-bar/index.d.ts +5 -5
- package/side-bar/public-api.d.ts +3 -3
- package/side-bar/side-bar.component.d.ts +42 -42
- package/side-bar/side-bar.model.d.ts +4 -4
- package/side-bar/side-bar.module.d.ts +16 -16
- package/signature/index.d.ts +5 -5
- package/signature/public-api.d.ts +2 -2
- package/signature/signature.component.d.ts +68 -68
- package/signature/signature.module.d.ts +24 -24
- package/size-detector/index.d.ts +5 -5
- package/size-detector/public-api.d.ts +2 -2
- package/size-detector/size-detector.component.d.ts +29 -29
- package/size-detector/size-detector.module.d.ts +11 -11
- package/slider/index.d.ts +5 -5
- package/slider/public-api.d.ts +2 -2
- package/slider/slider.component.d.ts +39 -39
- package/slider/slider.module.d.ts +12 -12
- package/smart-filters/boolean-filter/boolean-filter.component.d.ts +28 -28
- package/smart-filters/common/filter-actions.component.d.ts +12 -12
- package/smart-filters/common/model/base-filter-component.d.ts +74 -74
- package/smart-filters/common/model/creator.d.ts +6 -6
- package/smart-filters/common/model/field.d.ts +69 -69
- package/smart-filters/common/model/filter.d.ts +11 -11
- package/smart-filters/common/model/operator.d.ts +51 -51
- package/smart-filters/common/model/type.d.ts +4 -4
- package/smart-filters/date-filter/date-filter.component.d.ts +60 -60
- package/smart-filters/index.d.ts +5 -5
- package/smart-filters/multi-select-filter/multi-select-filter.component.d.ts +56 -56
- package/smart-filters/number-filter/number-filter.component.d.ts +52 -52
- package/smart-filters/public-api.d.ts +14 -14
- package/smart-filters/smart-filters.component.d.ts +35 -35
- package/smart-filters/smart-filters.module.d.ts +37 -37
- package/smart-filters/text-filter/text-filter.component.d.ts +28 -28
- package/snack-bar/default-snack-bar.component.d.ts +13 -13
- package/snack-bar/index.d.ts +5 -5
- package/snack-bar/public-api.d.ts +4 -4
- package/snack-bar/snack-bar.component.d.ts +12 -12
- package/snack-bar/snack-bar.model.d.ts +8 -8
- package/snack-bar/snack-bar.module.d.ts +19 -19
- package/snack-bar/snack-bar.service.d.ts +24 -24
- package/textarea/index.d.ts +5 -5
- package/textarea/public-api.d.ts +2 -2
- package/textarea/textarea.component.d.ts +56 -54
- package/textarea/textarea.module.d.ts +23 -23
- package/textbox/index.d.ts +5 -5
- package/textbox/public-api.d.ts +2 -2
- package/textbox/textbox-validation.directive.d.ts +22 -22
- package/textbox/textbox.component.d.ts +155 -153
- package/textbox/textbox.module.d.ts +22 -22
- package/textbox-icon/index.d.ts +5 -5
- package/textbox-icon/public-api.d.ts +2 -2
- package/textbox-icon/textbox-icon.component.d.ts +13 -13
- package/textbox-icon/textbox-icon.module.d.ts +16 -16
- package/top-bar/index.d.ts +5 -5
- package/top-bar/public-api.d.ts +3 -3
- package/top-bar/top-bar.component.d.ts +39 -39
- package/top-bar/top-bar.model.d.ts +4 -4
- package/top-bar/top-bar.module.d.ts +18 -18
|
@@ -1,1216 +1,1216 @@
|
|
|
1
|
-
import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, } from '@angular/core';
|
|
2
|
-
import { Validators, } from '@angular/forms';
|
|
3
|
-
import { PepDialogData, } from '@pepperi-addons/ngx-lib/dialog';
|
|
4
|
-
import { FIELD_TYPE, PepCustomizationService, PepTextboxField, PepSelectField, PepInternalMenuField, PepQuantitySelectorField, PepAddressField, PepIndicatorsField, PepInternalPageField, PepInternalCaruselField, PepInternalButtonField, PepAttachmentField, PepSignatureField, PepImageField, PepImagesField, PepLinkField, PepTextareaField, PepRichHtmlTextareaField, PepDateField, PepCheckboxField, PepSeparatorField, PepPlaceholderField, X_ALIGNMENT_TYPE, Y_ALIGNMENT_TYPE, DEFAULT_VERTICAL_ALIGNMENT, DEFAULT_HORIZONTAL_ALIGNMENT, } from '@pepperi-addons/ngx-lib';
|
|
5
|
-
import { BehaviorSubject } from 'rxjs';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@pepperi-addons/ngx-lib/dialog";
|
|
8
|
-
import * as i2 from "@pepperi-addons/ngx-lib";
|
|
9
|
-
import * as i3 from "@angular/forms";
|
|
10
|
-
import * as i4 from "@ngx-translate/core";
|
|
11
|
-
import * as i5 from "@angular/common";
|
|
12
|
-
import * as i6 from "@angular/material/grid-list";
|
|
13
|
-
import * as i7 from "@pepperi-addons/ngx-lib/checkbox";
|
|
14
|
-
import * as i8 from "@pepperi-addons/ngx-lib/date";
|
|
15
|
-
import * as i9 from "@pepperi-addons/ngx-lib/image";
|
|
16
|
-
import * as i10 from "@pepperi-addons/ngx-lib/quantity-selector";
|
|
17
|
-
import * as i11 from "@pepperi-addons/ngx-lib/signature";
|
|
18
|
-
import * as i12 from "@pepperi-addons/ngx-lib/textarea";
|
|
19
|
-
import * as i13 from "./internal-field-generator.component";
|
|
20
|
-
import * as i14 from "./internal-button.component";
|
|
21
|
-
export class PepInternalFormComponent {
|
|
22
|
-
// eventServiceSub: Subscription;
|
|
23
|
-
// public jsonLib = JSON;
|
|
24
|
-
constructor(dialogService, customizationService, layoutService, fb, differs, translate) {
|
|
25
|
-
this.dialogService = dialogService;
|
|
26
|
-
this.customizationService = customizationService;
|
|
27
|
-
this.layoutService = layoutService;
|
|
28
|
-
this.fb = fb;
|
|
29
|
-
this.translate = translate;
|
|
30
|
-
this.isInternal = true;
|
|
31
|
-
this.isReport = false;
|
|
32
|
-
this.lockEvents = false;
|
|
33
|
-
this.canEditObject = true;
|
|
34
|
-
this._data = null;
|
|
35
|
-
this.isActive = false;
|
|
36
|
-
this.layoutType = 'card';
|
|
37
|
-
// @Input() listType = '';
|
|
38
|
-
this.objectId = '0';
|
|
39
|
-
this.parentId = '0';
|
|
40
|
-
this.searchCode = '0';
|
|
41
|
-
this.showTitle = true;
|
|
42
|
-
this.firstFieldAsLink = false;
|
|
43
|
-
this.checkForChanges = null;
|
|
44
|
-
this.valueChange = new EventEmitter();
|
|
45
|
-
this.formValidationChange = new EventEmitter();
|
|
46
|
-
this.fieldClick = new EventEmitter();
|
|
47
|
-
// @Output() internalFormFieldClick: EventEmitter<any> = new EventEmitter<any>();
|
|
48
|
-
// @Output() internalFormFieldChange: EventEmitter<any> = new EventEmitter<any>();
|
|
49
|
-
this.isLocked = false;
|
|
50
|
-
// payLoad = '';
|
|
51
|
-
this.rows = [];
|
|
52
|
-
this.fields = [];
|
|
53
|
-
this._fieldsSubject = new BehaviorSubject([]);
|
|
54
|
-
this.columns = 1;
|
|
55
|
-
this.hasMenuFloatingOnOtherField = false;
|
|
56
|
-
this.indicatorsDataField = null;
|
|
57
|
-
this._shouldReloadForm = false;
|
|
58
|
-
// store the initial value to compare with
|
|
59
|
-
this.differ = differs.find({}).create();
|
|
60
|
-
}
|
|
61
|
-
set data(value) {
|
|
62
|
-
const shouldReload = this.shouldReloadForm || !this._data;
|
|
63
|
-
this._data = value;
|
|
64
|
-
if (shouldReload) {
|
|
65
|
-
this._shouldReloadForm = false;
|
|
66
|
-
this.initForm();
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
this.updateForm();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
get data() {
|
|
73
|
-
return this._data;
|
|
74
|
-
}
|
|
75
|
-
set lockFields(value) {
|
|
76
|
-
this.isLocked = value;
|
|
77
|
-
}
|
|
78
|
-
get fields$() {
|
|
79
|
-
return this._fieldsSubject.asObservable();
|
|
80
|
-
}
|
|
81
|
-
get shouldReloadForm() {
|
|
82
|
-
return this._shouldReloadForm;
|
|
83
|
-
}
|
|
84
|
-
convertXAlignToHorizontalAlign(xAlign) {
|
|
85
|
-
let res = DEFAULT_HORIZONTAL_ALIGNMENT;
|
|
86
|
-
if (xAlign === X_ALIGNMENT_TYPE.None ||
|
|
87
|
-
xAlign === X_ALIGNMENT_TYPE.Left) {
|
|
88
|
-
res = 'left';
|
|
89
|
-
}
|
|
90
|
-
else if (xAlign === X_ALIGNMENT_TYPE.Right) {
|
|
91
|
-
res = 'right';
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
res = 'center';
|
|
95
|
-
}
|
|
96
|
-
return res;
|
|
97
|
-
}
|
|
98
|
-
convertYAlignToVerticalAlign(yAlign) {
|
|
99
|
-
let res = DEFAULT_VERTICAL_ALIGNMENT;
|
|
100
|
-
if (yAlign === Y_ALIGNMENT_TYPE.None ||
|
|
101
|
-
yAlign === Y_ALIGNMENT_TYPE.Top) {
|
|
102
|
-
res = 'top';
|
|
103
|
-
}
|
|
104
|
-
else if (yAlign === Y_ALIGNMENT_TYPE.Bottom) {
|
|
105
|
-
res = 'bottom';
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
res = 'middle';
|
|
109
|
-
}
|
|
110
|
-
return res;
|
|
111
|
-
}
|
|
112
|
-
convertOptionalValues(optionalValues) {
|
|
113
|
-
if (optionalValues && optionalValues.length > 0) {
|
|
114
|
-
return optionalValues.map((ov) => {
|
|
115
|
-
return { key: ov.Key, value: ov.Value };
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
return [];
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
convertAddressFields(controlField, addressFields, canEditObject) {
|
|
123
|
-
const fields = [];
|
|
124
|
-
addressFields.forEach((field) => {
|
|
125
|
-
let customField;
|
|
126
|
-
const placeholder = field.ApiName;
|
|
127
|
-
if (field.ApiName.toLowerCase().indexOf('street') >= 0) {
|
|
128
|
-
customField = new PepTextboxField({
|
|
129
|
-
key: field.ApiName,
|
|
130
|
-
label: field.ApiName,
|
|
131
|
-
type: 'text',
|
|
132
|
-
placeholder,
|
|
133
|
-
readonly: !canEditObject,
|
|
134
|
-
disabled: !field.Enabled || !canEditObject,
|
|
135
|
-
hidden: false,
|
|
136
|
-
mandatory: false,
|
|
137
|
-
value: field.Value,
|
|
138
|
-
formattedValue: field.FormattedValue,
|
|
139
|
-
row: 0,
|
|
140
|
-
rowSpan: 1,
|
|
141
|
-
col: 0,
|
|
142
|
-
colSpan: 2,
|
|
143
|
-
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
144
|
-
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
145
|
-
order: 0,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
else if (field.ApiName.toLowerCase().indexOf('city') >= 0) {
|
|
149
|
-
customField = new PepTextboxField({
|
|
150
|
-
key: field.ApiName,
|
|
151
|
-
label: field.ApiName,
|
|
152
|
-
type: 'text',
|
|
153
|
-
placeholder,
|
|
154
|
-
readonly: !canEditObject,
|
|
155
|
-
disabled: !field.Enabled || !canEditObject,
|
|
156
|
-
hidden: false,
|
|
157
|
-
mandatory: false,
|
|
158
|
-
value: field.Value,
|
|
159
|
-
formattedValue: field.FormattedValue,
|
|
160
|
-
row: 0,
|
|
161
|
-
rowSpan: 1,
|
|
162
|
-
col: 2,
|
|
163
|
-
colSpan: 1,
|
|
164
|
-
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
165
|
-
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
166
|
-
order: 1,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else if (field.ApiName.toLowerCase().indexOf('state') >= 0) {
|
|
170
|
-
customField = new PepSelectField({
|
|
171
|
-
key: field.ApiName,
|
|
172
|
-
label: field.ApiName,
|
|
173
|
-
placeholder,
|
|
174
|
-
options: this.convertOptionalValues(field.OptionalValues),
|
|
175
|
-
readonly: !canEditObject,
|
|
176
|
-
disabled: !field.Enabled || !canEditObject,
|
|
177
|
-
hidden: false,
|
|
178
|
-
mandatory: false,
|
|
179
|
-
value: field.Value,
|
|
180
|
-
formattedValue: field.FormattedValue,
|
|
181
|
-
row: 1,
|
|
182
|
-
rowSpan: 1,
|
|
183
|
-
col: 0,
|
|
184
|
-
colSpan: 1,
|
|
185
|
-
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
186
|
-
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
187
|
-
order: 2,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
else if (field.ApiName.toLowerCase().indexOf('zipcode') >= 0) {
|
|
191
|
-
customField = new PepTextboxField({
|
|
192
|
-
key: field.ApiName,
|
|
193
|
-
label: field.ApiName,
|
|
194
|
-
type: 'text',
|
|
195
|
-
placeholder,
|
|
196
|
-
readonly: !canEditObject,
|
|
197
|
-
disabled: !field.Enabled || !canEditObject,
|
|
198
|
-
hidden: false,
|
|
199
|
-
mandatory: false,
|
|
200
|
-
value: field.Value,
|
|
201
|
-
formattedValue: field.FormattedValue,
|
|
202
|
-
row: 1,
|
|
203
|
-
rowSpan: 1,
|
|
204
|
-
col: 1,
|
|
205
|
-
colSpan: 1,
|
|
206
|
-
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
207
|
-
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
208
|
-
order: 3,
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
else if (field.ApiName.toLowerCase().indexOf('country') >= 0) {
|
|
212
|
-
customField = new PepSelectField({
|
|
213
|
-
key: field.ApiName,
|
|
214
|
-
label: field.ApiName,
|
|
215
|
-
placeholder,
|
|
216
|
-
options: this.convertOptionalValues(field.OptionalValues),
|
|
217
|
-
readonly: !canEditObject,
|
|
218
|
-
disabled: !field.Enabled || !canEditObject,
|
|
219
|
-
hidden: false,
|
|
220
|
-
mandatory: false,
|
|
221
|
-
value: field.Value,
|
|
222
|
-
formattedValue: field.FormattedValue,
|
|
223
|
-
row: 2,
|
|
224
|
-
rowSpan: 1,
|
|
225
|
-
col: 2,
|
|
226
|
-
colSpan: 1,
|
|
227
|
-
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
228
|
-
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
229
|
-
order: 4,
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
fields.push(customField);
|
|
233
|
-
});
|
|
234
|
-
return fields.sort((n1, n2) => n1.order > n2.order ? 1 : n1.order < n2.order ? -1 : 0);
|
|
235
|
-
}
|
|
236
|
-
isMatrixField(apiNameToCheck) {
|
|
237
|
-
return apiNameToCheck.indexOf('Matrix') >= 0;
|
|
238
|
-
}
|
|
239
|
-
doesFieldHavaFloatingField(controlField, floatingField) {
|
|
240
|
-
let hasFloatingField = false;
|
|
241
|
-
if (floatingField.Layout.Y >= controlField.Layout.Y &&
|
|
242
|
-
floatingField.Layout.Y <
|
|
243
|
-
controlField.Layout.Y + controlField.Layout.Height &&
|
|
244
|
-
floatingField.Layout.X >= controlField.Layout.X &&
|
|
245
|
-
floatingField.Layout.X <
|
|
246
|
-
controlField.Layout.X + controlField.Layout.Width) {
|
|
247
|
-
hasFloatingField = true;
|
|
248
|
-
}
|
|
249
|
-
return hasFloatingField;
|
|
250
|
-
}
|
|
251
|
-
getOptionsForCustomField(controlField, dataField, canEditObject) {
|
|
252
|
-
if (!controlField || !dataField) {
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
const placeholder = controlField.ReadOnly || !canEditObject ? '' : controlField.Title;
|
|
256
|
-
return {
|
|
257
|
-
key: controlField.ApiName,
|
|
258
|
-
label: controlField.Title,
|
|
259
|
-
accessory: dataField.Accessory,
|
|
260
|
-
placeholder,
|
|
261
|
-
readonly: controlField.ReadOnly || !canEditObject,
|
|
262
|
-
disabled: !dataField.Enabled || !canEditObject,
|
|
263
|
-
hidden: controlField.Hidden,
|
|
264
|
-
mandatory: controlField.Mandatory,
|
|
265
|
-
value: dataField.Value,
|
|
266
|
-
formattedValue: dataField.FormattedValue,
|
|
267
|
-
additionalValue: dataField.AdditionalValue,
|
|
268
|
-
row: controlField.Layout.Y,
|
|
269
|
-
rowSpan: controlField.Layout.Height,
|
|
270
|
-
col: controlField.Layout.X,
|
|
271
|
-
colSpan: controlField.Layout.Width,
|
|
272
|
-
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
273
|
-
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
274
|
-
options: this.convertOptionalValues(dataField.OptionalValues),
|
|
275
|
-
groupFields: undefined,
|
|
276
|
-
maxFieldCharacters: controlField.MaxFieldCharacters,
|
|
277
|
-
minValue: controlField.MinValue,
|
|
278
|
-
maxValue: controlField.MaxValue,
|
|
279
|
-
// hasMenu: hasMenu,
|
|
280
|
-
// hasCampaign: hasCampaign,
|
|
281
|
-
// hasIndicators: hasIndicators,
|
|
282
|
-
textColor: dataField.TextColor,
|
|
283
|
-
visible: dataField.Visible,
|
|
284
|
-
digitsNumberAfterDecimalPoint: dataField.DigitsNumberAfterDecimalPoint,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
convertToCustomField(controlField, dataField, canEditObject, menuField, hasCampaignField, indicatorsField, objectId, parentId, searchCode) {
|
|
288
|
-
let customField;
|
|
289
|
-
const options = this.getOptionsForCustomField(controlField, dataField, canEditObject);
|
|
290
|
-
if (controlField.ApiName === 'ObjectMenu') {
|
|
291
|
-
options.type = 'menu';
|
|
292
|
-
customField = new PepInternalMenuField(options);
|
|
293
|
-
}
|
|
294
|
-
else if (controlField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
295
|
-
controlField.FieldType ===
|
|
296
|
-
FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
297
|
-
controlField.ApiName === 'QuantitySelector' ||
|
|
298
|
-
controlField.ApiName === 'UnitsQuantity' ||
|
|
299
|
-
controlField.ApiName.indexOf('size_') === 0) {
|
|
300
|
-
if (dataField.FieldType === FIELD_TYPE.InternalLink) {
|
|
301
|
-
options.type = 'button';
|
|
302
|
-
}
|
|
303
|
-
else if (dataField.FieldType === FIELD_TYPE.Package) {
|
|
304
|
-
options.type = 'packageButton';
|
|
305
|
-
}
|
|
306
|
-
else if (dataField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
307
|
-
dataField.FieldType === FIELD_TYPE.NumberReal) {
|
|
308
|
-
options.type = 'qs';
|
|
309
|
-
options.allowDecimal = true;
|
|
310
|
-
}
|
|
311
|
-
else if (dataField.FieldType ===
|
|
312
|
-
FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
313
|
-
dataField.FieldType === FIELD_TYPE.NumberInteger) {
|
|
314
|
-
options.type = 'qs';
|
|
315
|
-
options.allowDecimal = false;
|
|
316
|
-
}
|
|
317
|
-
else if (dataField.FieldType === FIELD_TYPE.NumberIntegerForMatrix) {
|
|
318
|
-
options.type = 'qsForMatrix';
|
|
319
|
-
options.allowDecimal = false;
|
|
320
|
-
}
|
|
321
|
-
else if (dataField.FieldType === FIELD_TYPE.NumberRealForMatrix) {
|
|
322
|
-
options.type = 'qsForMatrix';
|
|
323
|
-
options.allowDecimal = true;
|
|
324
|
-
}
|
|
325
|
-
options.notificationInfo = dataField.NotificationInfo;
|
|
326
|
-
customField = new PepQuantitySelectorField(options);
|
|
327
|
-
}
|
|
328
|
-
else {
|
|
329
|
-
// HACK: need to remove this..
|
|
330
|
-
if (dataField.FieldType === FIELD_TYPE.Indicators &&
|
|
331
|
-
this.isMatrixField(dataField.ApiName)) {
|
|
332
|
-
dataField.FieldType = FIELD_TYPE.InternalPage;
|
|
333
|
-
}
|
|
334
|
-
switch (dataField.FieldType) {
|
|
335
|
-
case FIELD_TYPE.Address: {
|
|
336
|
-
const canEditGroupObject = controlField.ReadOnly
|
|
337
|
-
? false
|
|
338
|
-
: canEditObject;
|
|
339
|
-
options.groupFields = this.convertAddressFields(controlField, dataField.GroupFields, canEditGroupObject);
|
|
340
|
-
customField = new PepAddressField(options);
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
case FIELD_TYPE.Indicators: {
|
|
344
|
-
// options['type'] = 'indicators'; // Not needed this is PepIndicatorsField.
|
|
345
|
-
customField = new PepIndicatorsField(options);
|
|
346
|
-
break;
|
|
347
|
-
}
|
|
348
|
-
case FIELD_TYPE.InternalPage: {
|
|
349
|
-
if (this.isMatrixField(controlField.ApiName)) {
|
|
350
|
-
options.rowSpan = controlField.Layout.Height;
|
|
351
|
-
options.objectId = objectId;
|
|
352
|
-
options.parentId = parentId;
|
|
353
|
-
options.searchCode = searchCode;
|
|
354
|
-
customField = new PepInternalPageField(options);
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
// Not supported
|
|
358
|
-
}
|
|
359
|
-
break;
|
|
360
|
-
}
|
|
361
|
-
case FIELD_TYPE.RelatedObjectsCards: {
|
|
362
|
-
options.rowSpan = controlField.Layout.Height;
|
|
363
|
-
options.searchCode = searchCode;
|
|
364
|
-
options.pageInfo = dataField.UIPageInfo;
|
|
365
|
-
customField = new PepInternalCaruselField(options);
|
|
366
|
-
break;
|
|
367
|
-
}
|
|
368
|
-
case FIELD_TYPE.Link: {
|
|
369
|
-
options.type = 'link';
|
|
370
|
-
customField = new PepLinkField(options);
|
|
371
|
-
break;
|
|
372
|
-
}
|
|
373
|
-
case FIELD_TYPE.InternalLink:
|
|
374
|
-
case FIELD_TYPE.Button: {
|
|
375
|
-
options.type = 'button';
|
|
376
|
-
customField = new PepInternalButtonField(options);
|
|
377
|
-
break;
|
|
378
|
-
}
|
|
379
|
-
case FIELD_TYPE.Attachment: {
|
|
380
|
-
// options.type = 'attachment';
|
|
381
|
-
customField = new PepAttachmentField(options);
|
|
382
|
-
break;
|
|
383
|
-
}
|
|
384
|
-
case FIELD_TYPE.Signature: {
|
|
385
|
-
// options.type = 'signature';
|
|
386
|
-
customField = new PepSignatureField(options);
|
|
387
|
-
break;
|
|
388
|
-
}
|
|
389
|
-
case FIELD_TYPE.Image:
|
|
390
|
-
case FIELD_TYPE.ImageURL: {
|
|
391
|
-
// options.type = 'image';
|
|
392
|
-
options.menuField =
|
|
393
|
-
menuField &&
|
|
394
|
-
this.doesFieldHavaFloatingField(controlField, menuField)
|
|
395
|
-
? menuField
|
|
396
|
-
: null;
|
|
397
|
-
options.hasCampaignField =
|
|
398
|
-
hasCampaignField &&
|
|
399
|
-
this.doesFieldHavaFloatingField(controlField, hasCampaignField)
|
|
400
|
-
? hasCampaignField
|
|
401
|
-
: null;
|
|
402
|
-
options.indicatorsField =
|
|
403
|
-
indicatorsField &&
|
|
404
|
-
this.doesFieldHavaFloatingField(controlField, indicatorsField)
|
|
405
|
-
? indicatorsField
|
|
406
|
-
: null;
|
|
407
|
-
customField = new PepImageField(options);
|
|
408
|
-
break;
|
|
409
|
-
}
|
|
410
|
-
case FIELD_TYPE.Images: {
|
|
411
|
-
// options.type = 'images';
|
|
412
|
-
customField = new PepImagesField(options);
|
|
413
|
-
break;
|
|
414
|
-
}
|
|
415
|
-
case FIELD_TYPE.Email: {
|
|
416
|
-
options.type = 'email';
|
|
417
|
-
customField = new PepLinkField(options);
|
|
418
|
-
break;
|
|
419
|
-
}
|
|
420
|
-
case FIELD_TYPE.Phone: {
|
|
421
|
-
options.type = 'phone';
|
|
422
|
-
customField = new PepLinkField(options);
|
|
423
|
-
break;
|
|
424
|
-
}
|
|
425
|
-
case FIELD_TYPE.Duration: {
|
|
426
|
-
options.type = 'duration';
|
|
427
|
-
customField = new PepTextboxField(options);
|
|
428
|
-
break;
|
|
429
|
-
}
|
|
430
|
-
case FIELD_TYPE.Default:
|
|
431
|
-
case FIELD_TYPE.TextBox:
|
|
432
|
-
case FIELD_TYPE.LimitedLengthTextBox:
|
|
433
|
-
case FIELD_TYPE.TextHeader:
|
|
434
|
-
case FIELD_TYPE.CalculatedString:
|
|
435
|
-
case FIELD_TYPE.MapDataString: {
|
|
436
|
-
customField = new PepTextboxField(options);
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
case FIELD_TYPE.TextArea: {
|
|
440
|
-
customField = new PepTextareaField(options);
|
|
441
|
-
break;
|
|
442
|
-
}
|
|
443
|
-
case FIELD_TYPE.RichTextHTML: {
|
|
444
|
-
customField = new PepRichHtmlTextareaField(options);
|
|
445
|
-
break;
|
|
446
|
-
}
|
|
447
|
-
case FIELD_TYPE.Date:
|
|
448
|
-
case FIELD_TYPE.LimitedDate:
|
|
449
|
-
case FIELD_TYPE.CalculatedDate:
|
|
450
|
-
case FIELD_TYPE.DateAndTime: {
|
|
451
|
-
options.type =
|
|
452
|
-
dataField.FieldType === FIELD_TYPE.DateAndTime
|
|
453
|
-
? 'datetime'
|
|
454
|
-
: 'date';
|
|
455
|
-
customField = new PepDateField(options);
|
|
456
|
-
break;
|
|
457
|
-
}
|
|
458
|
-
case FIELD_TYPE.NumberInteger:
|
|
459
|
-
case FIELD_TYPE.CalculatedInt:
|
|
460
|
-
case FIELD_TYPE.MapDataInt: {
|
|
461
|
-
options.type = 'int';
|
|
462
|
-
customField = new PepTextboxField(options);
|
|
463
|
-
break;
|
|
464
|
-
}
|
|
465
|
-
case FIELD_TYPE.Percentage: {
|
|
466
|
-
options.type = 'percentage';
|
|
467
|
-
customField = new PepTextboxField(options);
|
|
468
|
-
break;
|
|
469
|
-
}
|
|
470
|
-
case FIELD_TYPE.Currency: {
|
|
471
|
-
options.type = 'currency';
|
|
472
|
-
customField = new PepTextboxField(options);
|
|
473
|
-
break;
|
|
474
|
-
}
|
|
475
|
-
case FIELD_TYPE.NumberReal:
|
|
476
|
-
case FIELD_TYPE.CalculatedReal:
|
|
477
|
-
case FIELD_TYPE.MapDataReal:
|
|
478
|
-
case FIELD_TYPE.Sum:
|
|
479
|
-
case FIELD_TYPE.Totals: {
|
|
480
|
-
options.type = 'real';
|
|
481
|
-
customField = new PepTextboxField(options);
|
|
482
|
-
break;
|
|
483
|
-
}
|
|
484
|
-
case FIELD_TYPE.Boolean:
|
|
485
|
-
case FIELD_TYPE.CalculatedBool: {
|
|
486
|
-
customField = new PepCheckboxField(options);
|
|
487
|
-
break;
|
|
488
|
-
}
|
|
489
|
-
case FIELD_TYPE.BooleanText: {
|
|
490
|
-
options.type = 'booleanText';
|
|
491
|
-
customField = new PepCheckboxField(options);
|
|
492
|
-
break;
|
|
493
|
-
}
|
|
494
|
-
case FIELD_TYPE.ComboBox:
|
|
495
|
-
case FIELD_TYPE.EmptyComboBox:
|
|
496
|
-
case FIELD_TYPE.MapDataDropDown: {
|
|
497
|
-
// options.type = 'select';
|
|
498
|
-
customField = new PepSelectField(options);
|
|
499
|
-
break;
|
|
500
|
-
}
|
|
501
|
-
case FIELD_TYPE.MultiTickBox:
|
|
502
|
-
case FIELD_TYPE.MultiTickBoxToComboBox:
|
|
503
|
-
case FIELD_TYPE.EmptyMultiTickBox: {
|
|
504
|
-
options.type = 'multi';
|
|
505
|
-
customField = new PepSelectField(options);
|
|
506
|
-
break;
|
|
507
|
-
}
|
|
508
|
-
case FIELD_TYPE.GuidReferenceType: {
|
|
509
|
-
options.type = 'reference';
|
|
510
|
-
options.referenceObjectType = dataField.ReferenceObjectType;
|
|
511
|
-
options.referenceObjectSubType =
|
|
512
|
-
dataField.ReferenceObjectSubType;
|
|
513
|
-
options.referenceObjectInternalType =
|
|
514
|
-
dataField.ReferenceObjectInternalType;
|
|
515
|
-
customField = new PepInternalButtonField(options);
|
|
516
|
-
break;
|
|
517
|
-
}
|
|
518
|
-
case FIELD_TYPE.ListOfObjects: {
|
|
519
|
-
options.type = 'listofobjects';
|
|
520
|
-
customField = new PepInternalButtonField(options);
|
|
521
|
-
break;
|
|
522
|
-
}
|
|
523
|
-
case FIELD_TYPE.Separator: {
|
|
524
|
-
customField = new PepSeparatorField(options);
|
|
525
|
-
break;
|
|
526
|
-
}
|
|
527
|
-
/*
|
|
528
|
-
case FIELD_TYPE.Images: return that.field(value);
|
|
529
|
-
*/
|
|
530
|
-
case FIELD_TYPE.NumberRealQuantitySelector:
|
|
531
|
-
case FIELD_TYPE.NumberIntegerQuantitySelector: {
|
|
532
|
-
options.type = 'qs';
|
|
533
|
-
options.allowDecimal =
|
|
534
|
-
dataField.FieldType ===
|
|
535
|
-
FIELD_TYPE.NumberRealQuantitySelector;
|
|
536
|
-
options.notificationInfo = dataField.NotificationInfo;
|
|
537
|
-
customField = new PepQuantitySelectorField(options);
|
|
538
|
-
break;
|
|
539
|
-
}
|
|
540
|
-
case FIELD_TYPE.Package: {
|
|
541
|
-
options.type = 'packageButton';
|
|
542
|
-
options.notificationInfo = dataField.NotificationInfo;
|
|
543
|
-
customField = new PepQuantitySelectorField(options);
|
|
544
|
-
break;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
if (!customField) {
|
|
549
|
-
options.label = controlField.ApiName + ' is not supported!!!';
|
|
550
|
-
customField = new PepSeparatorField(options);
|
|
551
|
-
}
|
|
552
|
-
return customField;
|
|
553
|
-
}
|
|
554
|
-
getFieldFormattedValue(field) {
|
|
555
|
-
let fieldFormattedValue = field.formattedValue;
|
|
556
|
-
// Fix for the custom check box component.
|
|
557
|
-
if (field.controlType === 'checkbox') {
|
|
558
|
-
fieldFormattedValue = fieldFormattedValue === 'true';
|
|
559
|
-
}
|
|
560
|
-
// Fix for the custom button component.
|
|
561
|
-
if (field.controlType === 'button') {
|
|
562
|
-
fieldFormattedValue =
|
|
563
|
-
fieldFormattedValue === '0' ? '' : fieldFormattedValue;
|
|
564
|
-
}
|
|
565
|
-
return fieldFormattedValue;
|
|
566
|
-
}
|
|
567
|
-
toControlGroup(fields) {
|
|
568
|
-
const group = {};
|
|
569
|
-
if (fields && fields.length > 0) {
|
|
570
|
-
fields.forEach((field) => {
|
|
571
|
-
if (field.groupFields && field.groupFields.length > 0) {
|
|
572
|
-
const subGroup = {};
|
|
573
|
-
field.groupFields.forEach((groupField) => {
|
|
574
|
-
if (groupField.mandatory &&
|
|
575
|
-
!field.readonly &&
|
|
576
|
-
!field.disabled) {
|
|
577
|
-
subGroup[groupField.key] = [
|
|
578
|
-
{
|
|
579
|
-
value: groupField.formattedValue || '',
|
|
580
|
-
disabled: field.readonly ||
|
|
581
|
-
field.disabled ||
|
|
582
|
-
groupField.disabled,
|
|
583
|
-
},
|
|
584
|
-
[Validators.required],
|
|
585
|
-
];
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
subGroup[groupField.key] = [
|
|
589
|
-
{
|
|
590
|
-
value: groupField.formattedValue || '',
|
|
591
|
-
disabled: field.readonly ||
|
|
592
|
-
field.disabled ||
|
|
593
|
-
groupField.disabled,
|
|
594
|
-
},
|
|
595
|
-
[Validators.nullValidator],
|
|
596
|
-
];
|
|
597
|
-
}
|
|
598
|
-
});
|
|
599
|
-
group[field.key] = this.fb.group(subGroup);
|
|
600
|
-
}
|
|
601
|
-
else {
|
|
602
|
-
const validators = field.getValidators();
|
|
603
|
-
const fieldFormattedValue = this.getFieldFormattedValue(field);
|
|
604
|
-
group[field.key] = [
|
|
605
|
-
{
|
|
606
|
-
value: fieldFormattedValue || '',
|
|
607
|
-
disabled: field.disabled,
|
|
608
|
-
},
|
|
609
|
-
validators,
|
|
610
|
-
];
|
|
611
|
-
}
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
return this.fb.group(group);
|
|
615
|
-
}
|
|
616
|
-
createBaseField(uiControlField, dataField) {
|
|
617
|
-
const customField = this.convertToCustomField(uiControlField, dataField, this.canEditObject, this.menuDataField, this.hasCampaignDataField, this.indicatorsDataField, this.objectId, this.parentId, this.searchCode);
|
|
618
|
-
return customField;
|
|
619
|
-
}
|
|
620
|
-
showFormValidationMessage() {
|
|
621
|
-
const fields = this.fields;
|
|
622
|
-
let emptyMandatoryFieldsMsg = '';
|
|
623
|
-
let notValidFieldsMsg = '';
|
|
624
|
-
// for (let i: number = 0; i < fields.length; i++) {
|
|
625
|
-
// let field = fields[i];
|
|
626
|
-
for (const field of fields) {
|
|
627
|
-
const formControl = this.form && this.form.get(field.key);
|
|
628
|
-
if (formControl) {
|
|
629
|
-
// Mandatory is empty.
|
|
630
|
-
if (field.mandatory &&
|
|
631
|
-
formControl.value.toString().trim().length === 0) {
|
|
632
|
-
emptyMandatoryFieldsMsg +=
|
|
633
|
-
'<li><small>' + field.label + '</small></li>';
|
|
634
|
-
}
|
|
635
|
-
else if (!field.disabled && !formControl.valid) {
|
|
636
|
-
notValidFieldsMsg +=
|
|
637
|
-
'<li><small>' + field.label + '</small></li>';
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
// Add the header message of the empty mandatory fields
|
|
642
|
-
if (emptyMandatoryFieldsMsg.length > 0) {
|
|
643
|
-
emptyMandatoryFieldsMsg =
|
|
644
|
-
'<div>' +
|
|
645
|
-
this.translate.instant('MESSAGES.ERROR_MANDATORY_FIELDS') +
|
|
646
|
-
"</div><ul style='padding: 0 20px;'>" +
|
|
647
|
-
emptyMandatoryFieldsMsg +
|
|
648
|
-
'</ul><br/>';
|
|
649
|
-
}
|
|
650
|
-
// Add the header message of the empty mandatory fields
|
|
651
|
-
if (notValidFieldsMsg.length > 0) {
|
|
652
|
-
notValidFieldsMsg =
|
|
653
|
-
'<div>' +
|
|
654
|
-
this.translate.instant('MESSAGES.ERROR_INVALID_FIELDS') +
|
|
655
|
-
"</div><ul style='padding: 0 20px;'>" +
|
|
656
|
-
notValidFieldsMsg +
|
|
657
|
-
'</ul>';
|
|
658
|
-
}
|
|
659
|
-
const title = this.translate.instant('MESSAGES.TITLE_NOTICE');
|
|
660
|
-
const data = new PepDialogData({
|
|
661
|
-
title,
|
|
662
|
-
content: emptyMandatoryFieldsMsg + notValidFieldsMsg,
|
|
663
|
-
});
|
|
664
|
-
this.dialogService.openDefaultDialog(data);
|
|
665
|
-
}
|
|
666
|
-
ngOnInit() {
|
|
667
|
-
const themeVars = this.customizationService.getThemeVariables();
|
|
668
|
-
// convert rem to pixel
|
|
669
|
-
const RemToPixel = 16;
|
|
670
|
-
this.formGutterSize =
|
|
671
|
-
this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_SPACEING_KEY) * RemToPixel;
|
|
672
|
-
this.cardGutterSize =
|
|
673
|
-
this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_SPACEING_KEY) * RemToPixel;
|
|
674
|
-
}
|
|
675
|
-
ngDoCheck() {
|
|
676
|
-
const changes = this.differ.diff(this.data); // check for changes
|
|
677
|
-
if (changes) {
|
|
678
|
-
this.updateForm();
|
|
679
|
-
this.checkForChanges = new Date();
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
ngOnChanges(changes) {
|
|
683
|
-
// if (changes.data && changes.data.currentValue) {
|
|
684
|
-
// // Load changes
|
|
685
|
-
// if (!this.shouldReloadForm && changes.data.previousValue) {
|
|
686
|
-
// this.data = changes.data.currentValue;
|
|
687
|
-
// this.updateForm();
|
|
688
|
-
// } else {
|
|
689
|
-
// this._shouldReloadForm = false;
|
|
690
|
-
// this.initForm();
|
|
691
|
-
// }
|
|
692
|
-
// }
|
|
693
|
-
// if (this.shouldReloadForm || !changes?.data?.previousValue) {
|
|
694
|
-
// this._shouldReloadForm = false;
|
|
695
|
-
// this.initForm();
|
|
696
|
-
// this.checkForChanges = new Date();
|
|
697
|
-
// }
|
|
698
|
-
}
|
|
699
|
-
ngOnDestroy() {
|
|
700
|
-
//
|
|
701
|
-
}
|
|
702
|
-
getUiControlFields() {
|
|
703
|
-
return this.layout ? this.layout.ControlFields : [];
|
|
704
|
-
}
|
|
705
|
-
initFieldsStructure(fields, maxRow) {
|
|
706
|
-
const themeVars = this.customizationService.getThemeVariables();
|
|
707
|
-
// Set form row height.
|
|
708
|
-
if (this.layoutType === 'card') {
|
|
709
|
-
const cardFieldHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_FIELD_HEIGHT_KEY);
|
|
710
|
-
this.rowHeight = cardFieldHeight;
|
|
711
|
-
}
|
|
712
|
-
else {
|
|
713
|
-
const rowFieldHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_HEIGHT_KEY);
|
|
714
|
-
const rowFieldTitleHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_TITLE_HEIGHT_KEY);
|
|
715
|
-
this.rowHeight = rowFieldHeight + rowFieldTitleHeight;
|
|
716
|
-
}
|
|
717
|
-
// Create the fields structure (the fields must be sorted!!!).
|
|
718
|
-
if (fields.length > 0) {
|
|
719
|
-
// Init the layout.
|
|
720
|
-
if (
|
|
721
|
-
// this.layoutType === 'form' ||
|
|
722
|
-
this.layoutType === 'table') {
|
|
723
|
-
this.fields = fields;
|
|
724
|
-
this._fieldsSubject.next(fields);
|
|
725
|
-
this.rows = [];
|
|
726
|
-
for (let i = 0; i <= maxRow; i++) {
|
|
727
|
-
this.rows[i] = [];
|
|
728
|
-
}
|
|
729
|
-
// for (let i = 0; i < fields.length; i++) {
|
|
730
|
-
// const field = fields[i]
|
|
731
|
-
for (const field of fields) {
|
|
732
|
-
this.rows[field.row].push(field);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
else {
|
|
736
|
-
const doesfieldExistIn = new Array(maxRow);
|
|
737
|
-
for (let i = 0; i < doesfieldExistIn.length; i++) {
|
|
738
|
-
doesfieldExistIn[i] = new Array(this.columns);
|
|
739
|
-
for (let j = 0; j < doesfieldExistIn[i].length; j++) {
|
|
740
|
-
doesfieldExistIn[i][j] = false;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
// Run in squere (row - colspan, col - rowspan) and put true where it should.
|
|
744
|
-
// for (let index = 0; index < fields.length; index++) {
|
|
745
|
-
// const currentField = fields[index];
|
|
746
|
-
for (const currentField of fields) {
|
|
747
|
-
if (currentField.rowSpan > 1) {
|
|
748
|
-
for (let row = currentField.row; row < currentField.row + currentField.rowSpan; row++) {
|
|
749
|
-
if (currentField.colSpan > 1) {
|
|
750
|
-
for (let col = currentField.col; col <
|
|
751
|
-
currentField.col + currentField.colSpan; col++) {
|
|
752
|
-
if (doesfieldExistIn.length > row &&
|
|
753
|
-
doesfieldExistIn[0].length > col) {
|
|
754
|
-
doesfieldExistIn[row][col] = true;
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
else {
|
|
759
|
-
if (doesfieldExistIn.length > row &&
|
|
760
|
-
doesfieldExistIn[0].length >
|
|
761
|
-
currentField.col) {
|
|
762
|
-
doesfieldExistIn[row][currentField.col] = true;
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
else if (currentField.colSpan > 1) {
|
|
768
|
-
for (let col = currentField.col; col < currentField.col + currentField.colSpan; col++) {
|
|
769
|
-
if (doesfieldExistIn.length > currentField.row &&
|
|
770
|
-
doesfieldExistIn[0].length > col) {
|
|
771
|
-
doesfieldExistIn[currentField.row][col] = true;
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
else {
|
|
776
|
-
if (doesfieldExistIn.length > currentField.row &&
|
|
777
|
-
doesfieldExistIn[0].length > currentField.col) {
|
|
778
|
-
doesfieldExistIn[currentField.row][currentField.col] = true;
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
// Create empty fields where doesfieldExistIn is false (For the md-grid-list UI Component).
|
|
783
|
-
for (let i = 0; i < doesfieldExistIn.length; i++) {
|
|
784
|
-
for (let j = 0; j < doesfieldExistIn[i].length; j++) {
|
|
785
|
-
if (!doesfieldExistIn[i][j]) {
|
|
786
|
-
// Create empty field and add it to the fields list.
|
|
787
|
-
fields.push(new PepPlaceholderField({
|
|
788
|
-
key: i + '_' + j,
|
|
789
|
-
label: '',
|
|
790
|
-
placeholder: '',
|
|
791
|
-
readonly: false,
|
|
792
|
-
disabled: false,
|
|
793
|
-
hidden: false,
|
|
794
|
-
mandatory: false,
|
|
795
|
-
value: '',
|
|
796
|
-
formattedValue: '',
|
|
797
|
-
row: i,
|
|
798
|
-
rowSpan: 1,
|
|
799
|
-
col: j,
|
|
800
|
-
colSpan: 1,
|
|
801
|
-
order: 1,
|
|
802
|
-
}));
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
// Sort the fields again.
|
|
807
|
-
this.fields = fields.sort((f1, f2) => f1.row > f2.row
|
|
808
|
-
? 1
|
|
809
|
-
: f1.row < f2.row
|
|
810
|
-
? -1
|
|
811
|
-
: f1.col > f2.col
|
|
812
|
-
? 1
|
|
813
|
-
: f1.col < f2.col
|
|
814
|
-
? -1
|
|
815
|
-
: 0);
|
|
816
|
-
this._fieldsSubject.next(fields);
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
setForm(isForUpdate = false) {
|
|
821
|
-
let allFieldsAreReadOnly = true;
|
|
822
|
-
if (!isForUpdate) {
|
|
823
|
-
const fields = [];
|
|
824
|
-
for (const currentField of this.fields) {
|
|
825
|
-
// Add all fields except 'internalPage' (for children).
|
|
826
|
-
if (currentField.controlType !== 'internalPage') {
|
|
827
|
-
fields.push(currentField);
|
|
828
|
-
}
|
|
829
|
-
if (!currentField.readonly) {
|
|
830
|
-
allFieldsAreReadOnly = false;
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
this.form = this.toControlGroup(fields);
|
|
834
|
-
}
|
|
835
|
-
else {
|
|
836
|
-
// Update form values if changed by calculated fields.
|
|
837
|
-
for (let i = 0; i < this.fields.length; i++) {
|
|
838
|
-
let currentField = this.fields[i];
|
|
839
|
-
if (currentField.controlType === 'internalCarusel') {
|
|
840
|
-
// Hack to override (update) the field.
|
|
841
|
-
const uiControlField = this.getUiControlFields().find(cf => cf.ApiName === currentField.key);
|
|
842
|
-
const dataField = this.data.Fields.find(df => df.ApiName === currentField.key);
|
|
843
|
-
currentField = this.createBaseField(uiControlField, dataField);
|
|
844
|
-
this._fieldsSubject.value[i] = currentField;
|
|
845
|
-
}
|
|
846
|
-
else if (currentField.controlType !== 'internalPage') {
|
|
847
|
-
if (currentField.groupFields &&
|
|
848
|
-
currentField.groupFields.length > 0) {
|
|
849
|
-
// for (let j = 0; j < currentField.groupFields.length; j++) {
|
|
850
|
-
// let currentGroupField = currentField.groupFields[j];
|
|
851
|
-
for (const currentGroupField of currentField.groupFields) {
|
|
852
|
-
const fieldFormattedValue = this.getFieldFormattedValue(currentGroupField);
|
|
853
|
-
this.customizationService.updateFormField(this.form, currentGroupField, fieldFormattedValue, currentField);
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
else {
|
|
857
|
-
const fieldFormattedValue = this.getFieldFormattedValue(currentField);
|
|
858
|
-
// this.form.controls[currentField.key].setValue(fieldFormattedValue);
|
|
859
|
-
this.customizationService.updateFormField(this.form, currentField, fieldFormattedValue);
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
if (!currentField.readonly) {
|
|
863
|
-
allFieldsAreReadOnly = false;
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
let isFormValid = this.form?.valid;
|
|
868
|
-
// Change validation to true if all fields are read only.
|
|
869
|
-
if (!isFormValid && allFieldsAreReadOnly) {
|
|
870
|
-
isFormValid = true;
|
|
871
|
-
}
|
|
872
|
-
this.onFormValidationChanged(isFormValid);
|
|
873
|
-
// Set it to false to enable all fields.
|
|
874
|
-
if (this.isInternal && this.isLocked) {
|
|
875
|
-
this.isLocked = false;
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
initForm() {
|
|
879
|
-
if (this.data && this.data.Fields) {
|
|
880
|
-
const fields = this.convertCustomFields(this.getUiControlFields(), this.data.Fields);
|
|
881
|
-
const maxRow = Math.max(...fields.map((f) => {
|
|
882
|
-
return f.row + f.rowSpan;
|
|
883
|
-
}));
|
|
884
|
-
this.columns = Math.max(...fields.map((f) => {
|
|
885
|
-
return f.col + f.colSpan;
|
|
886
|
-
}));
|
|
887
|
-
this.initFieldsStructure(fields, maxRow);
|
|
888
|
-
this.setForm();
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
updateField(customField, updatedField) {
|
|
892
|
-
const options = {
|
|
893
|
-
disabled: !updatedField.Enabled || !this.canEditObject,
|
|
894
|
-
readonly: !updatedField.Enabled || !this.canEditObject,
|
|
895
|
-
visible: updatedField.Visible,
|
|
896
|
-
value: updatedField.Value,
|
|
897
|
-
additionalValue: updatedField.AdditionalValue,
|
|
898
|
-
formattedValue: updatedField.FormattedValue,
|
|
899
|
-
textColor: updatedField.TextColor,
|
|
900
|
-
digitsNumberAfterDecimalPoint: updatedField.DigitsNumberAfterDecimalPoint,
|
|
901
|
-
};
|
|
902
|
-
if (customField instanceof PepQuantitySelectorField) {
|
|
903
|
-
const notificationInfo = updatedField.NotificationInfo;
|
|
904
|
-
options.notificationInfo = notificationInfo;
|
|
905
|
-
// Change type if it's change (only for allowDecimal).
|
|
906
|
-
let allowDecimal = false;
|
|
907
|
-
if (updatedField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
908
|
-
updatedField.FieldType === FIELD_TYPE.NumberReal ||
|
|
909
|
-
updatedField.FieldType === FIELD_TYPE.NumberRealForMatrix) {
|
|
910
|
-
allowDecimal = true;
|
|
911
|
-
}
|
|
912
|
-
options.allowDecimal = allowDecimal;
|
|
913
|
-
}
|
|
914
|
-
else if (customField instanceof PepSelectField) {
|
|
915
|
-
options.options = this.convertOptionalValues(updatedField.OptionalValues);
|
|
916
|
-
if (!options.options || options.options.length === 0) {
|
|
917
|
-
options.options.push({
|
|
918
|
-
key: options.value,
|
|
919
|
-
value: options.formattedValue,
|
|
920
|
-
});
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
else if (customField instanceof PepInternalCaruselField) {
|
|
924
|
-
options.pageInfo = updatedField.UIPageInfo;
|
|
925
|
-
}
|
|
926
|
-
customField.update(options);
|
|
927
|
-
}
|
|
928
|
-
updateForm() {
|
|
929
|
-
if (this.data && this.data.Fields) {
|
|
930
|
-
for (const currentField of this.data.Fields) {
|
|
931
|
-
const customField = this.fields.filter((f) => f.key === currentField.ApiName)[0];
|
|
932
|
-
// Update all fields except 'internalPage' type (for children).
|
|
933
|
-
if (customField && customField.controlType !== 'internalPage') {
|
|
934
|
-
this.updateField(customField, currentField);
|
|
935
|
-
// Update the group fields.
|
|
936
|
-
if (customField.controlType === 'address' &&
|
|
937
|
-
currentField.GroupFields) {
|
|
938
|
-
// for (let j = 0; j < currentField.GroupFields.length; j++) {
|
|
939
|
-
// let currentGroupField = currentField.GroupFields[j];
|
|
940
|
-
for (const currentGroupField of currentField.GroupFields) {
|
|
941
|
-
currentGroupField.Enabled = !currentField.Enabled
|
|
942
|
-
? false
|
|
943
|
-
: currentGroupField.Enabled;
|
|
944
|
-
const customGroupField = customField.groupFields.filter((f) => f.key === currentGroupField.ApiName)[0];
|
|
945
|
-
this.updateField(customGroupField, currentGroupField);
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
}
|
|
950
|
-
this.setForm(true);
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
|
-
ReloadForm() {
|
|
954
|
-
this._shouldReloadForm = true;
|
|
955
|
-
}
|
|
956
|
-
// onSubmit() {
|
|
957
|
-
// if (this.form.valid) {
|
|
958
|
-
// this.payLoad = JSON.stringify(this.form.value);
|
|
959
|
-
// //this.submitted.emit(this.form.value);
|
|
960
|
-
// }
|
|
961
|
-
// }
|
|
962
|
-
getFormControlById(key) {
|
|
963
|
-
let formControl = null;
|
|
964
|
-
this.fields.forEach((field) => {
|
|
965
|
-
if (field.key === key) {
|
|
966
|
-
formControl = this.form.get(field.key);
|
|
967
|
-
return;
|
|
968
|
-
}
|
|
969
|
-
else if (field.groupFields && field.groupFields.length > 0) {
|
|
970
|
-
field.groupFields.forEach((groupField) => {
|
|
971
|
-
if (groupField.key === key) {
|
|
972
|
-
formControl = this.form.get(field.key + '.' + groupField.key);
|
|
973
|
-
return;
|
|
974
|
-
}
|
|
975
|
-
});
|
|
976
|
-
}
|
|
977
|
-
});
|
|
978
|
-
return formControl;
|
|
979
|
-
}
|
|
980
|
-
setSpecialFields(controlFields, dataFields) {
|
|
981
|
-
// let cf;
|
|
982
|
-
// for (let index = 0; index < controlFields.length; index++) {
|
|
983
|
-
// cf = controlFields[index];
|
|
984
|
-
for (const cf of controlFields) {
|
|
985
|
-
if (cf.ApiName === 'ObjectMenu') {
|
|
986
|
-
this.menuField = cf;
|
|
987
|
-
}
|
|
988
|
-
else if (cf.ApiName === 'ItemHasActiveCampaign') {
|
|
989
|
-
this.hasCampaignField = cf;
|
|
990
|
-
}
|
|
991
|
-
else if (cf.ApiName === 'ItemIndicatorsWithoutCampaign') {
|
|
992
|
-
this.indicatorsField = cf;
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
// let df;
|
|
996
|
-
// for (let index = 0; index < dataFields.length; index++) {
|
|
997
|
-
// df = dataFields[index];
|
|
998
|
-
for (const df of dataFields) {
|
|
999
|
-
if (df.ApiName === 'ObjectMenu') {
|
|
1000
|
-
this.menuDataField = df;
|
|
1001
|
-
}
|
|
1002
|
-
else if (df.ApiName === 'ItemHasActiveCampaign') {
|
|
1003
|
-
this.hasCampaignDataField = df;
|
|
1004
|
-
}
|
|
1005
|
-
else if (df.ApiName === 'ItemIndicatorsWithoutCampaign') {
|
|
1006
|
-
this.indicatorsDataField = df;
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
if (this.menuField && this.menuDataField) {
|
|
1010
|
-
this.menuDataField.Layout = this.menuField.Layout;
|
|
1011
|
-
}
|
|
1012
|
-
if (this.hasCampaignField && this.hasCampaignDataField) {
|
|
1013
|
-
this.hasCampaignDataField.Layout = this.hasCampaignField.Layout;
|
|
1014
|
-
}
|
|
1015
|
-
if (this.indicatorsField && this.indicatorsDataField) {
|
|
1016
|
-
this.indicatorsDataField.Layout = this.indicatorsField.Layout;
|
|
1017
|
-
}
|
|
1018
|
-
// Check if menu is floating on other field.
|
|
1019
|
-
// for (let index = 0; index < controlFields.length; index++) {
|
|
1020
|
-
// cf = controlFields[index];
|
|
1021
|
-
for (const cf of controlFields) {
|
|
1022
|
-
if (this.menuField && cf.ApiName !== 'ObjectMenu') {
|
|
1023
|
-
this.hasMenuFloatingOnOtherField = this.doesFieldHavaFloatingField(cf, this.menuField);
|
|
1024
|
-
if (this.hasMenuFloatingOnOtherField) {
|
|
1025
|
-
break;
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
}
|
|
1030
|
-
convertCustomFields(controlFields, dataFields) {
|
|
1031
|
-
if (this.layoutType !== 'table') {
|
|
1032
|
-
this.setSpecialFields(controlFields, dataFields);
|
|
1033
|
-
}
|
|
1034
|
-
else {
|
|
1035
|
-
// HACK: convert to center alignment if table view & special fields)
|
|
1036
|
-
controlFields.forEach((field, index) => {
|
|
1037
|
-
if (field.ApiName === 'UnitsQuantity' ||
|
|
1038
|
-
field.ApiName === 'QuantitySelector' ||
|
|
1039
|
-
field.ApiName === 'ObjectMenu' ||
|
|
1040
|
-
field.FieldType === FIELD_TYPE.Image ||
|
|
1041
|
-
field.FieldType === FIELD_TYPE.ImageURL ||
|
|
1042
|
-
field.FieldType === FIELD_TYPE.Indicators ||
|
|
1043
|
-
field.FieldType === FIELD_TYPE.Boolean ||
|
|
1044
|
-
field.FieldType === FIELD_TYPE.CalculatedBool ||
|
|
1045
|
-
field.FieldType === FIELD_TYPE.Signature ||
|
|
1046
|
-
field.FieldType ===
|
|
1047
|
-
FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
1048
|
-
field.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
1049
|
-
field.FieldType === FIELD_TYPE.Package ||
|
|
1050
|
-
field.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
|
|
1051
|
-
field.FieldType === FIELD_TYPE.NumberRealForMatrix) {
|
|
1052
|
-
field.Layout.XAlignment = X_ALIGNMENT_TYPE.Center;
|
|
1053
|
-
}
|
|
1054
|
-
else {
|
|
1055
|
-
// HACK: align the rest of the fields by the culture.
|
|
1056
|
-
// field.Layout.XAlignment = this.layoutService.isRtl() ? X_ALIGNMENT_TYPE.Right : X_ALIGNMENT_TYPE.Left;
|
|
1057
|
-
}
|
|
1058
|
-
});
|
|
1059
|
-
}
|
|
1060
|
-
const fields = [];
|
|
1061
|
-
controlFields.forEach((field, index) => {
|
|
1062
|
-
const dataField = dataFields.filter((df) => df.ApiName === field.ApiName)[0];
|
|
1063
|
-
if (!dataField) {
|
|
1064
|
-
return;
|
|
1065
|
-
}
|
|
1066
|
-
// If current view is not table view and those fields are special.
|
|
1067
|
-
if (this.layoutType !== 'table' &&
|
|
1068
|
-
((this.hasMenuFloatingOnOtherField &&
|
|
1069
|
-
this.menuField &&
|
|
1070
|
-
this.menuField.ApiName === field.ApiName) ||
|
|
1071
|
-
(this.indicatorsField &&
|
|
1072
|
-
this.indicatorsField.ApiName === field.ApiName) ||
|
|
1073
|
-
(this.hasCampaignField &&
|
|
1074
|
-
this.hasCampaignField.ApiName === field.ApiName))) {
|
|
1075
|
-
return;
|
|
1076
|
-
}
|
|
1077
|
-
// Set type to link
|
|
1078
|
-
if (index === 0 && this.firstFieldAsLink) {
|
|
1079
|
-
dataField.FieldType = FIELD_TYPE.InternalLink;
|
|
1080
|
-
// dataField.Value = this.getInternalLinkHref();
|
|
1081
|
-
}
|
|
1082
|
-
if (field.ApiName === 'ObjectMenu') {
|
|
1083
|
-
dataField.Enabled = true;
|
|
1084
|
-
// HACK : Until "Enabled" returns from the server, we set PepMenu to be
|
|
1085
|
-
// Disabled in cart on regular items and not campign items.
|
|
1086
|
-
}
|
|
1087
|
-
const customField = this.createBaseField(field, dataField);
|
|
1088
|
-
fields.push(customField);
|
|
1089
|
-
});
|
|
1090
|
-
return fields.sort((f1, f2) => f1.row > f2.row
|
|
1091
|
-
? 1
|
|
1092
|
-
: f1.row < f2.row
|
|
1093
|
-
? -1
|
|
1094
|
-
: f1.col > f2.col
|
|
1095
|
-
? 1
|
|
1096
|
-
: f1.col < f2.col
|
|
1097
|
-
? -1
|
|
1098
|
-
: 0);
|
|
1099
|
-
}
|
|
1100
|
-
onFormValidationChanged(formValidationChange) {
|
|
1101
|
-
this.formValidationChange.emit(formValidationChange);
|
|
1102
|
-
}
|
|
1103
|
-
onValueChanged(event) {
|
|
1104
|
-
this.onFormValidationChanged(this.form.valid);
|
|
1105
|
-
const formControl = this.getFormControlById(event.key);
|
|
1106
|
-
const isValid = formControl ? formControl.valid : true;
|
|
1107
|
-
// const isValid = true;
|
|
1108
|
-
if (isValid) {
|
|
1109
|
-
// Set it to false to disable all fields.
|
|
1110
|
-
if (this.isInternal && this.layoutType === 'form') {
|
|
1111
|
-
this.isLocked = true;
|
|
1112
|
-
}
|
|
1113
|
-
// Update the current field value.
|
|
1114
|
-
const currentField = this.fields.find((f) => f.key === event.key);
|
|
1115
|
-
if (currentField) {
|
|
1116
|
-
currentField.formattedValue = currentField.value = event.value;
|
|
1117
|
-
}
|
|
1118
|
-
this.valueChange.emit({
|
|
1119
|
-
id: this.data.UID.toString(),
|
|
1120
|
-
uiObjectKey: this.data.Key,
|
|
1121
|
-
key: event.key,
|
|
1122
|
-
value: event.value,
|
|
1123
|
-
controlType: event.controlType,
|
|
1124
|
-
});
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
onClick(fieldClickEvent) {
|
|
1128
|
-
const clickedUiControlField = this.data.Fields.filter((f) => f.ApiName === fieldClickEvent.key)[0];
|
|
1129
|
-
const idType = this.data.Type ? this.data.Type.toString() : '';
|
|
1130
|
-
if (clickedUiControlField) {
|
|
1131
|
-
this.fieldClick.emit({
|
|
1132
|
-
id: this.data.UID.toString(),
|
|
1133
|
-
uiObjectKey: this.data.Key,
|
|
1134
|
-
key: fieldClickEvent.key,
|
|
1135
|
-
idType,
|
|
1136
|
-
which: fieldClickEvent.eventWhich,
|
|
1137
|
-
value: fieldClickEvent.value,
|
|
1138
|
-
controlType: fieldClickEvent.controlType,
|
|
1139
|
-
fieldType: clickedUiControlField.FieldType,
|
|
1140
|
-
otherData: fieldClickEvent.otherData,
|
|
1141
|
-
});
|
|
1142
|
-
}
|
|
1143
|
-
else {
|
|
1144
|
-
// For other api names (like enter children etc).
|
|
1145
|
-
this.fieldClick.emit({
|
|
1146
|
-
id: this.data.UID.toString(),
|
|
1147
|
-
uiObjectKey: this.data.Key,
|
|
1148
|
-
key: fieldClickEvent.key,
|
|
1149
|
-
idType,
|
|
1150
|
-
which: fieldClickEvent.eventWhich,
|
|
1151
|
-
value: fieldClickEvent.value,
|
|
1152
|
-
controlType: fieldClickEvent.controlType,
|
|
1153
|
-
otherData: fieldClickEvent.otherData,
|
|
1154
|
-
});
|
|
1155
|
-
}
|
|
1156
|
-
}
|
|
1157
|
-
// // This event is for handle the internal page events.
|
|
1158
|
-
// onInternalFormFieldClicked(internalFormFieldClick: any): void {
|
|
1159
|
-
// this.internalFormFieldClick.emit(internalFormFieldClick);
|
|
1160
|
-
// }
|
|
1161
|
-
// // This event is for handle the internal page events.
|
|
1162
|
-
// onInternalFormFieldChanged(internalFormFieldChange: any): void {
|
|
1163
|
-
// this.internalFormFieldChange.emit(internalFormFieldChange);
|
|
1164
|
-
// }
|
|
1165
|
-
// This event is for handle the related items change events.
|
|
1166
|
-
onFormValueChanged(event) {
|
|
1167
|
-
// this.valueChange.emit(event);
|
|
1168
|
-
}
|
|
1169
|
-
// This event is for handle the related items change events.
|
|
1170
|
-
onFormFieldClick(event) {
|
|
1171
|
-
this.fieldClick.emit(event);
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
PepInternalFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalFormComponent, deps: [{ token: i1.PepDialogService }, { token: i2.PepCustomizationService }, { token: i2.PepLayoutService }, { token: i3.FormBuilder }, { token: i0.KeyValueDiffers }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1175
|
-
PepInternalFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PepInternalFormComponent, selector: "pep-internal-form", inputs: { isInternal: "isInternal", isReport: "isReport", layout: "layout", lockEvents: "lockEvents", canEditObject: "canEditObject", data: "data", lockFields: "lockFields", isActive: "isActive", layoutType: "layoutType", objectId: "objectId", parentId: "parentId", searchCode: "searchCode", showTitle: "showTitle", firstFieldAsLink: "firstFieldAsLink", checkForChanges: "checkForChanges" }, outputs: { valueChange: "valueChange", formValidationChange: "formValidationChange", fieldClick: "fieldClick" }, usesOnChanges: true, ngImport: i0, template: "<fieldset *ngIf=\"form\" [formGroup]=\"form\" [disabled]=\"isLocked\" class=\"pep-form\"\n [ngStyle]=\"{ 'background-color': layoutType == 'card' && data?.BackgroundColor }\">\n <!-- New Form -->\n <mat-grid-list *ngIf=\"layoutType == 'form'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"formGutterSize\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [checkForChanges]=\"checkForChanges\" [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\"\n (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n (formValidationChange)=\"onFormValidationChanged($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <!-- Thumbnails -->\n <mat-grid-list *ngIf=\"layoutType == 'card'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"cardGutterSize\" class=\"card-spacing\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\"\n [ngStyle]=\"{ overflow: field.type == 'qs' ? 'unset' : 'hidden' }\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [ngClass]=\"{ 'lock-events': lockEvents }\" [isActive]=\"isActive\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\" (valueChange)=\"onValueChanged($event)\"\n (elementClick)=\"onClick($event)\" (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <ng-container *ngIf=\"layoutType == 'table'\">\n <ng-container *ngIf=\"isReport; then reportBlock; else notReportBlock\"></ng-container>\n <ng-template #reportBlock>\n <ng-container *ngTemplateOutlet=\"report\"></ng-container>\n </ng-template>\n <ng-template #notReportBlock>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip table-cell \"\n [ngClass]=\"['text-align-' + field.xAlignment]\" style=\"height: 100%\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString}\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [form]=\"form\" [layoutType]=\"layoutType\" [showTitle]=\"false\"\n (elementClick)=\"onClick($event)\" (valueChange)=\"onValueChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n [isActive]=\"isActive\">\n </pep-internal-field-generator>\n </div>\n </ng-template>\n </ng-container>\n\n <!------- For testing ------------\n {{ form.value | json }}\n {{ form.valid }}\n ---------------------------------->\n</fieldset>\n\n<ng-template #report>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip pep-report-fields\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString }\"\n [ngClass]=\"['text-align-' + field.xAlignment]\">\n <ng-container [ngSwitch]=\"field.controlType\">\n <pep-image *ngSwitchCase=\"'image'\" [uid]=\"data?.UID\" [form]=\"form\" [key]=\"field.key\"\n [src]=\"field.formattedValue\" [srcLarge]=\"field.value\" [options]=\"field.options\" [label]=\"field.label\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\" [layoutType]=\"layoutType\"\n (elementClick)=\"onClick($event)\">\n </pep-image>\n\n <pep-signature *ngSwitchCase=\"'signature'\" [form]=\"form\" [key]=\"field.key\" [src]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-signature>\n\n <pep-checkbox *ngSwitchCase=\"'checkbox'\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"(field.value | lowercase) == 'true' || field.value == '1' ? true : false\" [label]=\"field.label\"\n [type]=\"field.type\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [additionalValue]=\"field.additionalValue\" [layoutType]=\"layoutType\">\n </pep-checkbox>\n\n <pep-date *ngSwitchCase=\"'date'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [minValue]=\"field.minValue\" [maxValue]=\"field.maxValue\" [layoutType]=\"layoutType\">\n </pep-date>\n\n <pep-internal-button *ngSwitchCase=\"'button'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [disabled]=\"field.disabled\" [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\"\n [layoutType]=\"layoutType\" (elementClick)=\"onClick($event)\">\n </pep-internal-button>\n\n <pep-textarea *ngSwitchCase=\"'textarea'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [maxFieldCharacters]=\"field.maxFieldCharacters\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-textarea>\n\n <pep-quantity-selector *ngSwitchCase=\"'qs'\" [id]=\"field.key\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"field.value\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\" (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\">\n </pep-quantity-selector>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"field.formattedValue?.length > 0; then notEmptyBlock; else emptyBlock\">\n </ng-container>\n <ng-template #notEmptyBlock>\n <ng-container\n *ngIf=\"field.controlType === 'attachment' || field.type === 'link'; then linkBlock; else notLinkBlock\">\n </ng-container>\n <ng-template #linkBlock>\n <a [id]=\"field.key\" class=\"color-link body-sm pep-report-input readonly\"\n *ngIf=\"field.formattedValue != null\" title=\"{{ field.formattedValue }}\" target=\"_blank\"\n href=\"{{ field.value }}\">{{ field.formattedValue }}</a>\n </ng-template>\n <ng-template #notLinkBlock>\n <span [id]=\"field.key\" class=\"body-sm pep-report-input readonly\"\n title=\"{{ field.formattedValue }}\" [ngStyle]=\"{ color: field.textColor }\">{{\n field.formattedValue }}</span>\n </ng-template>\n </ng-template>\n <ng-template #emptyBlock>\n <span> </span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{display:grid}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { kind: "component", type: i6.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { kind: "component", type: i7.PepCheckboxComponent, selector: "pep-checkbox", inputs: ["key", "value", "label", "type", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "additionalValue", "form", "isActive", "showTitle", "renderTitle", "layoutType", "visible"], outputs: ["valueChange"] }, { kind: "component", type: i8.PepDateComponent, selector: "pep-date", inputs: ["key", "value", "label", "type", "mandatory", "disabled", "readonly", "textColor", "xAlignment", "rowSpan", "visible", "minValue", "maxValue", "minDateValue", "maxDateValue", "form", "isActive", "showTitle", "renderTitle", "renderError", "renderSymbol", "layoutType"], outputs: ["valueChange"] }, { kind: "component", type: i9.PepImageComponent, selector: "pep-image", inputs: ["key", "srcLarge", "src", "options", "label", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "indicatorsField", "menuField", "hasCampaignField", "visible", "form", "uid", "showTitle", "renderTitle", "layoutType", "isActive", "sizeLimitMB", "acceptImagesType"], outputs: ["fileChange", "elementClick"] }, { kind: "component", type: i10.PepQuantitySelectorComponent, selector: "pep-quantity-selector", inputs: ["key", "value", "minFractionDigits", "maxFractionDigits", "label", "type", "mandatory", "disabled", "readonly", "textColor", "xAlignment", "rowSpan", "allowDecimal", "additionalValue", "notificationInfo", "visible", "form", "showTitle", "renderTitle", "layoutType", "isActive", "styleType", "isInFocus"], outputs: ["valueChange", "elementClick"] }, { kind: "component", type: i11.PepSignatureComponent, selector: "pep-signature", inputs: ["key", "src", "label", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "signatureURL", "visible", "form", "showTitle", "renderTitle", "layoutType", "isActive"], outputs: ["fileChange"] }, { kind: "component", type: i12.PepTextareaComponent, selector: "pep-textarea", inputs: ["key", "value", "label", "mandatory", "disabled", "readonly", "maxFieldCharacters", "textColor", "xAlignment", "rowSpan", "visible", "form", "isActive", "showTitle", "renderTitle", "layoutType"], outputs: ["valueChange"] }, { kind: "component", type: i13.PepInternalFieldGeneratorComponent, selector: "pep-internal-field-generator", inputs: ["field", "isActive", "uid", "form", "layoutType", "showTitle", "checkForChanges"], outputs: ["valueChange", "formValidationChange", "elementClick", "formValueChange", "formFieldClick"] }, { kind: "component", type: i14.PepInternalButtonComponent, selector: "pep-internal-button", inputs: ["key", "value", "formattedValue", "label", "referenceObjectInternalType", "type", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "visible", "form", "showTitle", "layoutType"], outputs: ["elementClick", "valueChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.LowerCasePipe, name: "lowercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1176
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalFormComponent, decorators: [{
|
|
1177
|
-
type: Component,
|
|
1178
|
-
args: [{ selector: 'pep-internal-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<fieldset *ngIf=\"form\" [formGroup]=\"form\" [disabled]=\"isLocked\" class=\"pep-form\"\n [ngStyle]=\"{ 'background-color': layoutType == 'card' && data?.BackgroundColor }\">\n <!-- New Form -->\n <mat-grid-list *ngIf=\"layoutType == 'form'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"formGutterSize\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [checkForChanges]=\"checkForChanges\" [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\"\n (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n (formValidationChange)=\"onFormValidationChanged($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <!-- Thumbnails -->\n <mat-grid-list *ngIf=\"layoutType == 'card'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"cardGutterSize\" class=\"card-spacing\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\"\n [ngStyle]=\"{ overflow: field.type == 'qs' ? 'unset' : 'hidden' }\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [ngClass]=\"{ 'lock-events': lockEvents }\" [isActive]=\"isActive\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\" (valueChange)=\"onValueChanged($event)\"\n (elementClick)=\"onClick($event)\" (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <ng-container *ngIf=\"layoutType == 'table'\">\n <ng-container *ngIf=\"isReport; then reportBlock; else notReportBlock\"></ng-container>\n <ng-template #reportBlock>\n <ng-container *ngTemplateOutlet=\"report\"></ng-container>\n </ng-template>\n <ng-template #notReportBlock>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip table-cell \"\n [ngClass]=\"['text-align-' + field.xAlignment]\" style=\"height: 100%\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString}\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [form]=\"form\" [layoutType]=\"layoutType\" [showTitle]=\"false\"\n (elementClick)=\"onClick($event)\" (valueChange)=\"onValueChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n [isActive]=\"isActive\">\n </pep-internal-field-generator>\n </div>\n </ng-template>\n </ng-container>\n\n <!------- For testing ------------\n {{ form.value | json }}\n {{ form.valid }}\n ---------------------------------->\n</fieldset>\n\n<ng-template #report>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip pep-report-fields\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString }\"\n [ngClass]=\"['text-align-' + field.xAlignment]\">\n <ng-container [ngSwitch]=\"field.controlType\">\n <pep-image *ngSwitchCase=\"'image'\" [uid]=\"data?.UID\" [form]=\"form\" [key]=\"field.key\"\n [src]=\"field.formattedValue\" [srcLarge]=\"field.value\" [options]=\"field.options\" [label]=\"field.label\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\" [layoutType]=\"layoutType\"\n (elementClick)=\"onClick($event)\">\n </pep-image>\n\n <pep-signature *ngSwitchCase=\"'signature'\" [form]=\"form\" [key]=\"field.key\" [src]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-signature>\n\n <pep-checkbox *ngSwitchCase=\"'checkbox'\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"(field.value | lowercase) == 'true' || field.value == '1' ? true : false\" [label]=\"field.label\"\n [type]=\"field.type\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [additionalValue]=\"field.additionalValue\" [layoutType]=\"layoutType\">\n </pep-checkbox>\n\n <pep-date *ngSwitchCase=\"'date'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [minValue]=\"field.minValue\" [maxValue]=\"field.maxValue\" [layoutType]=\"layoutType\">\n </pep-date>\n\n <pep-internal-button *ngSwitchCase=\"'button'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [disabled]=\"field.disabled\" [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\"\n [layoutType]=\"layoutType\" (elementClick)=\"onClick($event)\">\n </pep-internal-button>\n\n <pep-textarea *ngSwitchCase=\"'textarea'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [maxFieldCharacters]=\"field.maxFieldCharacters\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-textarea>\n\n <pep-quantity-selector *ngSwitchCase=\"'qs'\" [id]=\"field.key\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"field.value\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\" (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\">\n </pep-quantity-selector>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"field.formattedValue?.length > 0; then notEmptyBlock; else emptyBlock\">\n </ng-container>\n <ng-template #notEmptyBlock>\n <ng-container\n *ngIf=\"field.controlType === 'attachment' || field.type === 'link'; then linkBlock; else notLinkBlock\">\n </ng-container>\n <ng-template #linkBlock>\n <a [id]=\"field.key\" class=\"color-link body-sm pep-report-input readonly\"\n *ngIf=\"field.formattedValue != null\" title=\"{{ field.formattedValue }}\" target=\"_blank\"\n href=\"{{ field.value }}\">{{ field.formattedValue }}</a>\n </ng-template>\n <ng-template #notLinkBlock>\n <span [id]=\"field.key\" class=\"body-sm pep-report-input readonly\"\n title=\"{{ field.formattedValue }}\" [ngStyle]=\"{ color: field.textColor }\">{{\n field.formattedValue }}</span>\n </ng-template>\n </ng-template>\n <ng-template #emptyBlock>\n <span> </span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{display:grid}\n"] }]
|
|
1179
|
-
}], ctorParameters: function () { return [{ type: i1.PepDialogService }, { type: i2.PepCustomizationService }, { type: i2.PepLayoutService }, { type: i3.FormBuilder }, { type: i0.KeyValueDiffers }, { type: i4.TranslateService }]; }, propDecorators: { isInternal: [{
|
|
1180
|
-
type: Input
|
|
1181
|
-
}], isReport: [{
|
|
1182
|
-
type: Input
|
|
1183
|
-
}], layout: [{
|
|
1184
|
-
type: Input
|
|
1185
|
-
}], lockEvents: [{
|
|
1186
|
-
type: Input
|
|
1187
|
-
}], canEditObject: [{
|
|
1188
|
-
type: Input
|
|
1189
|
-
}], data: [{
|
|
1190
|
-
type: Input
|
|
1191
|
-
}], lockFields: [{
|
|
1192
|
-
type: Input
|
|
1193
|
-
}], isActive: [{
|
|
1194
|
-
type: Input
|
|
1195
|
-
}], layoutType: [{
|
|
1196
|
-
type: Input
|
|
1197
|
-
}], objectId: [{
|
|
1198
|
-
type: Input
|
|
1199
|
-
}], parentId: [{
|
|
1200
|
-
type: Input
|
|
1201
|
-
}], searchCode: [{
|
|
1202
|
-
type: Input
|
|
1203
|
-
}], showTitle: [{
|
|
1204
|
-
type: Input
|
|
1205
|
-
}], firstFieldAsLink: [{
|
|
1206
|
-
type: Input
|
|
1207
|
-
}], checkForChanges: [{
|
|
1208
|
-
type: Input
|
|
1209
|
-
}], valueChange: [{
|
|
1210
|
-
type: Output
|
|
1211
|
-
}], formValidationChange: [{
|
|
1212
|
-
type: Output
|
|
1213
|
-
}], fieldClick: [{
|
|
1214
|
-
type: Output
|
|
1215
|
-
}] } });
|
|
1
|
+
import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, } from '@angular/core';
|
|
2
|
+
import { Validators, } from '@angular/forms';
|
|
3
|
+
import { PepDialogData, } from '@pepperi-addons/ngx-lib/dialog';
|
|
4
|
+
import { FIELD_TYPE, PepCustomizationService, PepTextboxField, PepSelectField, PepInternalMenuField, PepQuantitySelectorField, PepAddressField, PepIndicatorsField, PepInternalPageField, PepInternalCaruselField, PepInternalButtonField, PepAttachmentField, PepSignatureField, PepImageField, PepImagesField, PepLinkField, PepTextareaField, PepRichHtmlTextareaField, PepDateField, PepCheckboxField, PepSeparatorField, PepPlaceholderField, X_ALIGNMENT_TYPE, Y_ALIGNMENT_TYPE, DEFAULT_VERTICAL_ALIGNMENT, DEFAULT_HORIZONTAL_ALIGNMENT, } from '@pepperi-addons/ngx-lib';
|
|
5
|
+
import { BehaviorSubject } from 'rxjs';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@pepperi-addons/ngx-lib/dialog";
|
|
8
|
+
import * as i2 from "@pepperi-addons/ngx-lib";
|
|
9
|
+
import * as i3 from "@angular/forms";
|
|
10
|
+
import * as i4 from "@ngx-translate/core";
|
|
11
|
+
import * as i5 from "@angular/common";
|
|
12
|
+
import * as i6 from "@angular/material/grid-list";
|
|
13
|
+
import * as i7 from "@pepperi-addons/ngx-lib/checkbox";
|
|
14
|
+
import * as i8 from "@pepperi-addons/ngx-lib/date";
|
|
15
|
+
import * as i9 from "@pepperi-addons/ngx-lib/image";
|
|
16
|
+
import * as i10 from "@pepperi-addons/ngx-lib/quantity-selector";
|
|
17
|
+
import * as i11 from "@pepperi-addons/ngx-lib/signature";
|
|
18
|
+
import * as i12 from "@pepperi-addons/ngx-lib/textarea";
|
|
19
|
+
import * as i13 from "./internal-field-generator.component";
|
|
20
|
+
import * as i14 from "./internal-button.component";
|
|
21
|
+
export class PepInternalFormComponent {
|
|
22
|
+
// eventServiceSub: Subscription;
|
|
23
|
+
// public jsonLib = JSON;
|
|
24
|
+
constructor(dialogService, customizationService, layoutService, fb, differs, translate) {
|
|
25
|
+
this.dialogService = dialogService;
|
|
26
|
+
this.customizationService = customizationService;
|
|
27
|
+
this.layoutService = layoutService;
|
|
28
|
+
this.fb = fb;
|
|
29
|
+
this.translate = translate;
|
|
30
|
+
this.isInternal = true;
|
|
31
|
+
this.isReport = false;
|
|
32
|
+
this.lockEvents = false;
|
|
33
|
+
this.canEditObject = true;
|
|
34
|
+
this._data = null;
|
|
35
|
+
this.isActive = false;
|
|
36
|
+
this.layoutType = 'card';
|
|
37
|
+
// @Input() listType = '';
|
|
38
|
+
this.objectId = '0';
|
|
39
|
+
this.parentId = '0';
|
|
40
|
+
this.searchCode = '0';
|
|
41
|
+
this.showTitle = true;
|
|
42
|
+
this.firstFieldAsLink = false;
|
|
43
|
+
this.checkForChanges = null;
|
|
44
|
+
this.valueChange = new EventEmitter();
|
|
45
|
+
this.formValidationChange = new EventEmitter();
|
|
46
|
+
this.fieldClick = new EventEmitter();
|
|
47
|
+
// @Output() internalFormFieldClick: EventEmitter<any> = new EventEmitter<any>();
|
|
48
|
+
// @Output() internalFormFieldChange: EventEmitter<any> = new EventEmitter<any>();
|
|
49
|
+
this.isLocked = false;
|
|
50
|
+
// payLoad = '';
|
|
51
|
+
this.rows = [];
|
|
52
|
+
this.fields = [];
|
|
53
|
+
this._fieldsSubject = new BehaviorSubject([]);
|
|
54
|
+
this.columns = 1;
|
|
55
|
+
this.hasMenuFloatingOnOtherField = false;
|
|
56
|
+
this.indicatorsDataField = null;
|
|
57
|
+
this._shouldReloadForm = false;
|
|
58
|
+
// store the initial value to compare with
|
|
59
|
+
this.differ = differs.find({}).create();
|
|
60
|
+
}
|
|
61
|
+
set data(value) {
|
|
62
|
+
const shouldReload = this.shouldReloadForm || !this._data;
|
|
63
|
+
this._data = value;
|
|
64
|
+
if (shouldReload) {
|
|
65
|
+
this._shouldReloadForm = false;
|
|
66
|
+
this.initForm();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.updateForm();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
get data() {
|
|
73
|
+
return this._data;
|
|
74
|
+
}
|
|
75
|
+
set lockFields(value) {
|
|
76
|
+
this.isLocked = value;
|
|
77
|
+
}
|
|
78
|
+
get fields$() {
|
|
79
|
+
return this._fieldsSubject.asObservable();
|
|
80
|
+
}
|
|
81
|
+
get shouldReloadForm() {
|
|
82
|
+
return this._shouldReloadForm;
|
|
83
|
+
}
|
|
84
|
+
convertXAlignToHorizontalAlign(xAlign) {
|
|
85
|
+
let res = DEFAULT_HORIZONTAL_ALIGNMENT;
|
|
86
|
+
if (xAlign === X_ALIGNMENT_TYPE.None ||
|
|
87
|
+
xAlign === X_ALIGNMENT_TYPE.Left) {
|
|
88
|
+
res = 'left';
|
|
89
|
+
}
|
|
90
|
+
else if (xAlign === X_ALIGNMENT_TYPE.Right) {
|
|
91
|
+
res = 'right';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
res = 'center';
|
|
95
|
+
}
|
|
96
|
+
return res;
|
|
97
|
+
}
|
|
98
|
+
convertYAlignToVerticalAlign(yAlign) {
|
|
99
|
+
let res = DEFAULT_VERTICAL_ALIGNMENT;
|
|
100
|
+
if (yAlign === Y_ALIGNMENT_TYPE.None ||
|
|
101
|
+
yAlign === Y_ALIGNMENT_TYPE.Top) {
|
|
102
|
+
res = 'top';
|
|
103
|
+
}
|
|
104
|
+
else if (yAlign === Y_ALIGNMENT_TYPE.Bottom) {
|
|
105
|
+
res = 'bottom';
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
res = 'middle';
|
|
109
|
+
}
|
|
110
|
+
return res;
|
|
111
|
+
}
|
|
112
|
+
convertOptionalValues(optionalValues) {
|
|
113
|
+
if (optionalValues && optionalValues.length > 0) {
|
|
114
|
+
return optionalValues.map((ov) => {
|
|
115
|
+
return { key: ov.Key, value: ov.Value };
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
convertAddressFields(controlField, addressFields, canEditObject) {
|
|
123
|
+
const fields = [];
|
|
124
|
+
addressFields.forEach((field) => {
|
|
125
|
+
let customField;
|
|
126
|
+
const placeholder = field.ApiName;
|
|
127
|
+
if (field.ApiName.toLowerCase().indexOf('street') >= 0) {
|
|
128
|
+
customField = new PepTextboxField({
|
|
129
|
+
key: field.ApiName,
|
|
130
|
+
label: field.ApiName,
|
|
131
|
+
type: 'text',
|
|
132
|
+
placeholder,
|
|
133
|
+
readonly: !canEditObject,
|
|
134
|
+
disabled: !field.Enabled || !canEditObject,
|
|
135
|
+
hidden: false,
|
|
136
|
+
mandatory: false,
|
|
137
|
+
value: field.Value,
|
|
138
|
+
formattedValue: field.FormattedValue,
|
|
139
|
+
row: 0,
|
|
140
|
+
rowSpan: 1,
|
|
141
|
+
col: 0,
|
|
142
|
+
colSpan: 2,
|
|
143
|
+
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
144
|
+
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
145
|
+
order: 0,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
else if (field.ApiName.toLowerCase().indexOf('city') >= 0) {
|
|
149
|
+
customField = new PepTextboxField({
|
|
150
|
+
key: field.ApiName,
|
|
151
|
+
label: field.ApiName,
|
|
152
|
+
type: 'text',
|
|
153
|
+
placeholder,
|
|
154
|
+
readonly: !canEditObject,
|
|
155
|
+
disabled: !field.Enabled || !canEditObject,
|
|
156
|
+
hidden: false,
|
|
157
|
+
mandatory: false,
|
|
158
|
+
value: field.Value,
|
|
159
|
+
formattedValue: field.FormattedValue,
|
|
160
|
+
row: 0,
|
|
161
|
+
rowSpan: 1,
|
|
162
|
+
col: 2,
|
|
163
|
+
colSpan: 1,
|
|
164
|
+
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
165
|
+
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
166
|
+
order: 1,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else if (field.ApiName.toLowerCase().indexOf('state') >= 0) {
|
|
170
|
+
customField = new PepSelectField({
|
|
171
|
+
key: field.ApiName,
|
|
172
|
+
label: field.ApiName,
|
|
173
|
+
placeholder,
|
|
174
|
+
options: this.convertOptionalValues(field.OptionalValues),
|
|
175
|
+
readonly: !canEditObject,
|
|
176
|
+
disabled: !field.Enabled || !canEditObject,
|
|
177
|
+
hidden: false,
|
|
178
|
+
mandatory: false,
|
|
179
|
+
value: field.Value,
|
|
180
|
+
formattedValue: field.FormattedValue,
|
|
181
|
+
row: 1,
|
|
182
|
+
rowSpan: 1,
|
|
183
|
+
col: 0,
|
|
184
|
+
colSpan: 1,
|
|
185
|
+
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
186
|
+
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
187
|
+
order: 2,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else if (field.ApiName.toLowerCase().indexOf('zipcode') >= 0) {
|
|
191
|
+
customField = new PepTextboxField({
|
|
192
|
+
key: field.ApiName,
|
|
193
|
+
label: field.ApiName,
|
|
194
|
+
type: 'text',
|
|
195
|
+
placeholder,
|
|
196
|
+
readonly: !canEditObject,
|
|
197
|
+
disabled: !field.Enabled || !canEditObject,
|
|
198
|
+
hidden: false,
|
|
199
|
+
mandatory: false,
|
|
200
|
+
value: field.Value,
|
|
201
|
+
formattedValue: field.FormattedValue,
|
|
202
|
+
row: 1,
|
|
203
|
+
rowSpan: 1,
|
|
204
|
+
col: 1,
|
|
205
|
+
colSpan: 1,
|
|
206
|
+
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
207
|
+
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
208
|
+
order: 3,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else if (field.ApiName.toLowerCase().indexOf('country') >= 0) {
|
|
212
|
+
customField = new PepSelectField({
|
|
213
|
+
key: field.ApiName,
|
|
214
|
+
label: field.ApiName,
|
|
215
|
+
placeholder,
|
|
216
|
+
options: this.convertOptionalValues(field.OptionalValues),
|
|
217
|
+
readonly: !canEditObject,
|
|
218
|
+
disabled: !field.Enabled || !canEditObject,
|
|
219
|
+
hidden: false,
|
|
220
|
+
mandatory: false,
|
|
221
|
+
value: field.Value,
|
|
222
|
+
formattedValue: field.FormattedValue,
|
|
223
|
+
row: 2,
|
|
224
|
+
rowSpan: 1,
|
|
225
|
+
col: 2,
|
|
226
|
+
colSpan: 1,
|
|
227
|
+
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
228
|
+
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
229
|
+
order: 4,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
fields.push(customField);
|
|
233
|
+
});
|
|
234
|
+
return fields.sort((n1, n2) => n1.order > n2.order ? 1 : n1.order < n2.order ? -1 : 0);
|
|
235
|
+
}
|
|
236
|
+
isMatrixField(apiNameToCheck) {
|
|
237
|
+
return apiNameToCheck.indexOf('Matrix') >= 0;
|
|
238
|
+
}
|
|
239
|
+
doesFieldHavaFloatingField(controlField, floatingField) {
|
|
240
|
+
let hasFloatingField = false;
|
|
241
|
+
if (floatingField.Layout.Y >= controlField.Layout.Y &&
|
|
242
|
+
floatingField.Layout.Y <
|
|
243
|
+
controlField.Layout.Y + controlField.Layout.Height &&
|
|
244
|
+
floatingField.Layout.X >= controlField.Layout.X &&
|
|
245
|
+
floatingField.Layout.X <
|
|
246
|
+
controlField.Layout.X + controlField.Layout.Width) {
|
|
247
|
+
hasFloatingField = true;
|
|
248
|
+
}
|
|
249
|
+
return hasFloatingField;
|
|
250
|
+
}
|
|
251
|
+
getOptionsForCustomField(controlField, dataField, canEditObject) {
|
|
252
|
+
if (!controlField || !dataField) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const placeholder = controlField.ReadOnly || !canEditObject ? '' : controlField.Title;
|
|
256
|
+
return {
|
|
257
|
+
key: controlField.ApiName,
|
|
258
|
+
label: controlField.Title,
|
|
259
|
+
accessory: dataField.Accessory,
|
|
260
|
+
placeholder,
|
|
261
|
+
readonly: controlField.ReadOnly || !canEditObject,
|
|
262
|
+
disabled: !dataField.Enabled || !canEditObject,
|
|
263
|
+
hidden: controlField.Hidden,
|
|
264
|
+
mandatory: controlField.Mandatory,
|
|
265
|
+
value: dataField.Value,
|
|
266
|
+
formattedValue: dataField.FormattedValue,
|
|
267
|
+
additionalValue: dataField.AdditionalValue,
|
|
268
|
+
row: controlField.Layout.Y,
|
|
269
|
+
rowSpan: controlField.Layout.Height,
|
|
270
|
+
col: controlField.Layout.X,
|
|
271
|
+
colSpan: controlField.Layout.Width,
|
|
272
|
+
xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
|
|
273
|
+
yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
|
|
274
|
+
options: this.convertOptionalValues(dataField.OptionalValues),
|
|
275
|
+
groupFields: undefined,
|
|
276
|
+
maxFieldCharacters: controlField.MaxFieldCharacters,
|
|
277
|
+
minValue: controlField.MinValue,
|
|
278
|
+
maxValue: controlField.MaxValue,
|
|
279
|
+
// hasMenu: hasMenu,
|
|
280
|
+
// hasCampaign: hasCampaign,
|
|
281
|
+
// hasIndicators: hasIndicators,
|
|
282
|
+
textColor: dataField.TextColor,
|
|
283
|
+
visible: dataField.Visible,
|
|
284
|
+
digitsNumberAfterDecimalPoint: dataField.DigitsNumberAfterDecimalPoint,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
convertToCustomField(controlField, dataField, canEditObject, menuField, hasCampaignField, indicatorsField, objectId, parentId, searchCode) {
|
|
288
|
+
let customField;
|
|
289
|
+
const options = this.getOptionsForCustomField(controlField, dataField, canEditObject);
|
|
290
|
+
if (controlField.ApiName === 'ObjectMenu') {
|
|
291
|
+
options.type = 'menu';
|
|
292
|
+
customField = new PepInternalMenuField(options);
|
|
293
|
+
}
|
|
294
|
+
else if (controlField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
295
|
+
controlField.FieldType ===
|
|
296
|
+
FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
297
|
+
controlField.ApiName === 'QuantitySelector' ||
|
|
298
|
+
controlField.ApiName === 'UnitsQuantity' ||
|
|
299
|
+
controlField.ApiName.indexOf('size_') === 0) {
|
|
300
|
+
if (dataField.FieldType === FIELD_TYPE.InternalLink) {
|
|
301
|
+
options.type = 'button';
|
|
302
|
+
}
|
|
303
|
+
else if (dataField.FieldType === FIELD_TYPE.Package) {
|
|
304
|
+
options.type = 'packageButton';
|
|
305
|
+
}
|
|
306
|
+
else if (dataField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
307
|
+
dataField.FieldType === FIELD_TYPE.NumberReal) {
|
|
308
|
+
options.type = 'qs';
|
|
309
|
+
options.allowDecimal = true;
|
|
310
|
+
}
|
|
311
|
+
else if (dataField.FieldType ===
|
|
312
|
+
FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
313
|
+
dataField.FieldType === FIELD_TYPE.NumberInteger) {
|
|
314
|
+
options.type = 'qs';
|
|
315
|
+
options.allowDecimal = false;
|
|
316
|
+
}
|
|
317
|
+
else if (dataField.FieldType === FIELD_TYPE.NumberIntegerForMatrix) {
|
|
318
|
+
options.type = 'qsForMatrix';
|
|
319
|
+
options.allowDecimal = false;
|
|
320
|
+
}
|
|
321
|
+
else if (dataField.FieldType === FIELD_TYPE.NumberRealForMatrix) {
|
|
322
|
+
options.type = 'qsForMatrix';
|
|
323
|
+
options.allowDecimal = true;
|
|
324
|
+
}
|
|
325
|
+
options.notificationInfo = dataField.NotificationInfo;
|
|
326
|
+
customField = new PepQuantitySelectorField(options);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
// HACK: need to remove this..
|
|
330
|
+
if (dataField.FieldType === FIELD_TYPE.Indicators &&
|
|
331
|
+
this.isMatrixField(dataField.ApiName)) {
|
|
332
|
+
dataField.FieldType = FIELD_TYPE.InternalPage;
|
|
333
|
+
}
|
|
334
|
+
switch (dataField.FieldType) {
|
|
335
|
+
case FIELD_TYPE.Address: {
|
|
336
|
+
const canEditGroupObject = controlField.ReadOnly
|
|
337
|
+
? false
|
|
338
|
+
: canEditObject;
|
|
339
|
+
options.groupFields = this.convertAddressFields(controlField, dataField.GroupFields, canEditGroupObject);
|
|
340
|
+
customField = new PepAddressField(options);
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
case FIELD_TYPE.Indicators: {
|
|
344
|
+
// options['type'] = 'indicators'; // Not needed this is PepIndicatorsField.
|
|
345
|
+
customField = new PepIndicatorsField(options);
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
case FIELD_TYPE.InternalPage: {
|
|
349
|
+
if (this.isMatrixField(controlField.ApiName)) {
|
|
350
|
+
options.rowSpan = controlField.Layout.Height;
|
|
351
|
+
options.objectId = objectId;
|
|
352
|
+
options.parentId = parentId;
|
|
353
|
+
options.searchCode = searchCode;
|
|
354
|
+
customField = new PepInternalPageField(options);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
// Not supported
|
|
358
|
+
}
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
case FIELD_TYPE.RelatedObjectsCards: {
|
|
362
|
+
options.rowSpan = controlField.Layout.Height;
|
|
363
|
+
options.searchCode = searchCode;
|
|
364
|
+
options.pageInfo = dataField.UIPageInfo;
|
|
365
|
+
customField = new PepInternalCaruselField(options);
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
case FIELD_TYPE.Link: {
|
|
369
|
+
options.type = 'link';
|
|
370
|
+
customField = new PepLinkField(options);
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
case FIELD_TYPE.InternalLink:
|
|
374
|
+
case FIELD_TYPE.Button: {
|
|
375
|
+
options.type = 'button';
|
|
376
|
+
customField = new PepInternalButtonField(options);
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
case FIELD_TYPE.Attachment: {
|
|
380
|
+
// options.type = 'attachment';
|
|
381
|
+
customField = new PepAttachmentField(options);
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
case FIELD_TYPE.Signature: {
|
|
385
|
+
// options.type = 'signature';
|
|
386
|
+
customField = new PepSignatureField(options);
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
case FIELD_TYPE.Image:
|
|
390
|
+
case FIELD_TYPE.ImageURL: {
|
|
391
|
+
// options.type = 'image';
|
|
392
|
+
options.menuField =
|
|
393
|
+
menuField &&
|
|
394
|
+
this.doesFieldHavaFloatingField(controlField, menuField)
|
|
395
|
+
? menuField
|
|
396
|
+
: null;
|
|
397
|
+
options.hasCampaignField =
|
|
398
|
+
hasCampaignField &&
|
|
399
|
+
this.doesFieldHavaFloatingField(controlField, hasCampaignField)
|
|
400
|
+
? hasCampaignField
|
|
401
|
+
: null;
|
|
402
|
+
options.indicatorsField =
|
|
403
|
+
indicatorsField &&
|
|
404
|
+
this.doesFieldHavaFloatingField(controlField, indicatorsField)
|
|
405
|
+
? indicatorsField
|
|
406
|
+
: null;
|
|
407
|
+
customField = new PepImageField(options);
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
case FIELD_TYPE.Images: {
|
|
411
|
+
// options.type = 'images';
|
|
412
|
+
customField = new PepImagesField(options);
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
case FIELD_TYPE.Email: {
|
|
416
|
+
options.type = 'email';
|
|
417
|
+
customField = new PepLinkField(options);
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
case FIELD_TYPE.Phone: {
|
|
421
|
+
options.type = 'phone';
|
|
422
|
+
customField = new PepLinkField(options);
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
case FIELD_TYPE.Duration: {
|
|
426
|
+
options.type = 'duration';
|
|
427
|
+
customField = new PepTextboxField(options);
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
case FIELD_TYPE.Default:
|
|
431
|
+
case FIELD_TYPE.TextBox:
|
|
432
|
+
case FIELD_TYPE.LimitedLengthTextBox:
|
|
433
|
+
case FIELD_TYPE.TextHeader:
|
|
434
|
+
case FIELD_TYPE.CalculatedString:
|
|
435
|
+
case FIELD_TYPE.MapDataString: {
|
|
436
|
+
customField = new PepTextboxField(options);
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
case FIELD_TYPE.TextArea: {
|
|
440
|
+
customField = new PepTextareaField(options);
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
case FIELD_TYPE.RichTextHTML: {
|
|
444
|
+
customField = new PepRichHtmlTextareaField(options);
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
case FIELD_TYPE.Date:
|
|
448
|
+
case FIELD_TYPE.LimitedDate:
|
|
449
|
+
case FIELD_TYPE.CalculatedDate:
|
|
450
|
+
case FIELD_TYPE.DateAndTime: {
|
|
451
|
+
options.type =
|
|
452
|
+
dataField.FieldType === FIELD_TYPE.DateAndTime
|
|
453
|
+
? 'datetime'
|
|
454
|
+
: 'date';
|
|
455
|
+
customField = new PepDateField(options);
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
case FIELD_TYPE.NumberInteger:
|
|
459
|
+
case FIELD_TYPE.CalculatedInt:
|
|
460
|
+
case FIELD_TYPE.MapDataInt: {
|
|
461
|
+
options.type = 'int';
|
|
462
|
+
customField = new PepTextboxField(options);
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
case FIELD_TYPE.Percentage: {
|
|
466
|
+
options.type = 'percentage';
|
|
467
|
+
customField = new PepTextboxField(options);
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
case FIELD_TYPE.Currency: {
|
|
471
|
+
options.type = 'currency';
|
|
472
|
+
customField = new PepTextboxField(options);
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
case FIELD_TYPE.NumberReal:
|
|
476
|
+
case FIELD_TYPE.CalculatedReal:
|
|
477
|
+
case FIELD_TYPE.MapDataReal:
|
|
478
|
+
case FIELD_TYPE.Sum:
|
|
479
|
+
case FIELD_TYPE.Totals: {
|
|
480
|
+
options.type = 'real';
|
|
481
|
+
customField = new PepTextboxField(options);
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
case FIELD_TYPE.Boolean:
|
|
485
|
+
case FIELD_TYPE.CalculatedBool: {
|
|
486
|
+
customField = new PepCheckboxField(options);
|
|
487
|
+
break;
|
|
488
|
+
}
|
|
489
|
+
case FIELD_TYPE.BooleanText: {
|
|
490
|
+
options.type = 'booleanText';
|
|
491
|
+
customField = new PepCheckboxField(options);
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
case FIELD_TYPE.ComboBox:
|
|
495
|
+
case FIELD_TYPE.EmptyComboBox:
|
|
496
|
+
case FIELD_TYPE.MapDataDropDown: {
|
|
497
|
+
// options.type = 'select';
|
|
498
|
+
customField = new PepSelectField(options);
|
|
499
|
+
break;
|
|
500
|
+
}
|
|
501
|
+
case FIELD_TYPE.MultiTickBox:
|
|
502
|
+
case FIELD_TYPE.MultiTickBoxToComboBox:
|
|
503
|
+
case FIELD_TYPE.EmptyMultiTickBox: {
|
|
504
|
+
options.type = 'multi';
|
|
505
|
+
customField = new PepSelectField(options);
|
|
506
|
+
break;
|
|
507
|
+
}
|
|
508
|
+
case FIELD_TYPE.GuidReferenceType: {
|
|
509
|
+
options.type = 'reference';
|
|
510
|
+
options.referenceObjectType = dataField.ReferenceObjectType;
|
|
511
|
+
options.referenceObjectSubType =
|
|
512
|
+
dataField.ReferenceObjectSubType;
|
|
513
|
+
options.referenceObjectInternalType =
|
|
514
|
+
dataField.ReferenceObjectInternalType;
|
|
515
|
+
customField = new PepInternalButtonField(options);
|
|
516
|
+
break;
|
|
517
|
+
}
|
|
518
|
+
case FIELD_TYPE.ListOfObjects: {
|
|
519
|
+
options.type = 'listofobjects';
|
|
520
|
+
customField = new PepInternalButtonField(options);
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
523
|
+
case FIELD_TYPE.Separator: {
|
|
524
|
+
customField = new PepSeparatorField(options);
|
|
525
|
+
break;
|
|
526
|
+
}
|
|
527
|
+
/*
|
|
528
|
+
case FIELD_TYPE.Images: return that.field(value);
|
|
529
|
+
*/
|
|
530
|
+
case FIELD_TYPE.NumberRealQuantitySelector:
|
|
531
|
+
case FIELD_TYPE.NumberIntegerQuantitySelector: {
|
|
532
|
+
options.type = 'qs';
|
|
533
|
+
options.allowDecimal =
|
|
534
|
+
dataField.FieldType ===
|
|
535
|
+
FIELD_TYPE.NumberRealQuantitySelector;
|
|
536
|
+
options.notificationInfo = dataField.NotificationInfo;
|
|
537
|
+
customField = new PepQuantitySelectorField(options);
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
case FIELD_TYPE.Package: {
|
|
541
|
+
options.type = 'packageButton';
|
|
542
|
+
options.notificationInfo = dataField.NotificationInfo;
|
|
543
|
+
customField = new PepQuantitySelectorField(options);
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
if (!customField) {
|
|
549
|
+
options.label = controlField.ApiName + ' is not supported!!!';
|
|
550
|
+
customField = new PepSeparatorField(options);
|
|
551
|
+
}
|
|
552
|
+
return customField;
|
|
553
|
+
}
|
|
554
|
+
getFieldFormattedValue(field) {
|
|
555
|
+
let fieldFormattedValue = field.formattedValue;
|
|
556
|
+
// Fix for the custom check box component.
|
|
557
|
+
if (field.controlType === 'checkbox') {
|
|
558
|
+
fieldFormattedValue = fieldFormattedValue === 'true';
|
|
559
|
+
}
|
|
560
|
+
// Fix for the custom button component.
|
|
561
|
+
if (field.controlType === 'button') {
|
|
562
|
+
fieldFormattedValue =
|
|
563
|
+
fieldFormattedValue === '0' ? '' : fieldFormattedValue;
|
|
564
|
+
}
|
|
565
|
+
return fieldFormattedValue;
|
|
566
|
+
}
|
|
567
|
+
toControlGroup(fields) {
|
|
568
|
+
const group = {};
|
|
569
|
+
if (fields && fields.length > 0) {
|
|
570
|
+
fields.forEach((field) => {
|
|
571
|
+
if (field.groupFields && field.groupFields.length > 0) {
|
|
572
|
+
const subGroup = {};
|
|
573
|
+
field.groupFields.forEach((groupField) => {
|
|
574
|
+
if (groupField.mandatory &&
|
|
575
|
+
!field.readonly &&
|
|
576
|
+
!field.disabled) {
|
|
577
|
+
subGroup[groupField.key] = [
|
|
578
|
+
{
|
|
579
|
+
value: groupField.formattedValue || '',
|
|
580
|
+
disabled: field.readonly ||
|
|
581
|
+
field.disabled ||
|
|
582
|
+
groupField.disabled,
|
|
583
|
+
},
|
|
584
|
+
[Validators.required],
|
|
585
|
+
];
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
subGroup[groupField.key] = [
|
|
589
|
+
{
|
|
590
|
+
value: groupField.formattedValue || '',
|
|
591
|
+
disabled: field.readonly ||
|
|
592
|
+
field.disabled ||
|
|
593
|
+
groupField.disabled,
|
|
594
|
+
},
|
|
595
|
+
[Validators.nullValidator],
|
|
596
|
+
];
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
group[field.key] = this.fb.group(subGroup);
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
const validators = field.getValidators();
|
|
603
|
+
const fieldFormattedValue = this.getFieldFormattedValue(field);
|
|
604
|
+
group[field.key] = [
|
|
605
|
+
{
|
|
606
|
+
value: fieldFormattedValue || '',
|
|
607
|
+
disabled: field.disabled,
|
|
608
|
+
},
|
|
609
|
+
validators,
|
|
610
|
+
];
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
return this.fb.group(group);
|
|
615
|
+
}
|
|
616
|
+
createBaseField(uiControlField, dataField) {
|
|
617
|
+
const customField = this.convertToCustomField(uiControlField, dataField, this.canEditObject, this.menuDataField, this.hasCampaignDataField, this.indicatorsDataField, this.objectId, this.parentId, this.searchCode);
|
|
618
|
+
return customField;
|
|
619
|
+
}
|
|
620
|
+
showFormValidationMessage() {
|
|
621
|
+
const fields = this.fields;
|
|
622
|
+
let emptyMandatoryFieldsMsg = '';
|
|
623
|
+
let notValidFieldsMsg = '';
|
|
624
|
+
// for (let i: number = 0; i < fields.length; i++) {
|
|
625
|
+
// let field = fields[i];
|
|
626
|
+
for (const field of fields) {
|
|
627
|
+
const formControl = this.form && this.form.get(field.key);
|
|
628
|
+
if (formControl) {
|
|
629
|
+
// Mandatory is empty.
|
|
630
|
+
if (field.mandatory &&
|
|
631
|
+
formControl.value.toString().trim().length === 0) {
|
|
632
|
+
emptyMandatoryFieldsMsg +=
|
|
633
|
+
'<li><small>' + field.label + '</small></li>';
|
|
634
|
+
}
|
|
635
|
+
else if (!field.disabled && !formControl.valid) {
|
|
636
|
+
notValidFieldsMsg +=
|
|
637
|
+
'<li><small>' + field.label + '</small></li>';
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
// Add the header message of the empty mandatory fields
|
|
642
|
+
if (emptyMandatoryFieldsMsg.length > 0) {
|
|
643
|
+
emptyMandatoryFieldsMsg =
|
|
644
|
+
'<div>' +
|
|
645
|
+
this.translate.instant('MESSAGES.ERROR_MANDATORY_FIELDS') +
|
|
646
|
+
"</div><ul style='padding: 0 20px;'>" +
|
|
647
|
+
emptyMandatoryFieldsMsg +
|
|
648
|
+
'</ul><br/>';
|
|
649
|
+
}
|
|
650
|
+
// Add the header message of the empty mandatory fields
|
|
651
|
+
if (notValidFieldsMsg.length > 0) {
|
|
652
|
+
notValidFieldsMsg =
|
|
653
|
+
'<div>' +
|
|
654
|
+
this.translate.instant('MESSAGES.ERROR_INVALID_FIELDS') +
|
|
655
|
+
"</div><ul style='padding: 0 20px;'>" +
|
|
656
|
+
notValidFieldsMsg +
|
|
657
|
+
'</ul>';
|
|
658
|
+
}
|
|
659
|
+
const title = this.translate.instant('MESSAGES.TITLE_NOTICE');
|
|
660
|
+
const data = new PepDialogData({
|
|
661
|
+
title,
|
|
662
|
+
content: emptyMandatoryFieldsMsg + notValidFieldsMsg,
|
|
663
|
+
});
|
|
664
|
+
this.dialogService.openDefaultDialog(data);
|
|
665
|
+
}
|
|
666
|
+
ngOnInit() {
|
|
667
|
+
const themeVars = this.customizationService.getThemeVariables();
|
|
668
|
+
// convert rem to pixel
|
|
669
|
+
const RemToPixel = 16;
|
|
670
|
+
this.formGutterSize =
|
|
671
|
+
this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_SPACEING_KEY) * RemToPixel;
|
|
672
|
+
this.cardGutterSize =
|
|
673
|
+
this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_SPACEING_KEY) * RemToPixel;
|
|
674
|
+
}
|
|
675
|
+
ngDoCheck() {
|
|
676
|
+
const changes = this.differ.diff(this.data); // check for changes
|
|
677
|
+
if (changes) {
|
|
678
|
+
this.updateForm();
|
|
679
|
+
this.checkForChanges = new Date();
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
ngOnChanges(changes) {
|
|
683
|
+
// if (changes.data && changes.data.currentValue) {
|
|
684
|
+
// // Load changes
|
|
685
|
+
// if (!this.shouldReloadForm && changes.data.previousValue) {
|
|
686
|
+
// this.data = changes.data.currentValue;
|
|
687
|
+
// this.updateForm();
|
|
688
|
+
// } else {
|
|
689
|
+
// this._shouldReloadForm = false;
|
|
690
|
+
// this.initForm();
|
|
691
|
+
// }
|
|
692
|
+
// }
|
|
693
|
+
// if (this.shouldReloadForm || !changes?.data?.previousValue) {
|
|
694
|
+
// this._shouldReloadForm = false;
|
|
695
|
+
// this.initForm();
|
|
696
|
+
// this.checkForChanges = new Date();
|
|
697
|
+
// }
|
|
698
|
+
}
|
|
699
|
+
ngOnDestroy() {
|
|
700
|
+
//
|
|
701
|
+
}
|
|
702
|
+
getUiControlFields() {
|
|
703
|
+
return this.layout ? this.layout.ControlFields : [];
|
|
704
|
+
}
|
|
705
|
+
initFieldsStructure(fields, maxRow) {
|
|
706
|
+
const themeVars = this.customizationService.getThemeVariables();
|
|
707
|
+
// Set form row height.
|
|
708
|
+
if (this.layoutType === 'card') {
|
|
709
|
+
const cardFieldHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_FIELD_HEIGHT_KEY);
|
|
710
|
+
this.rowHeight = cardFieldHeight;
|
|
711
|
+
}
|
|
712
|
+
else {
|
|
713
|
+
const rowFieldHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_HEIGHT_KEY);
|
|
714
|
+
const rowFieldTitleHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_TITLE_HEIGHT_KEY);
|
|
715
|
+
this.rowHeight = rowFieldHeight + rowFieldTitleHeight;
|
|
716
|
+
}
|
|
717
|
+
// Create the fields structure (the fields must be sorted!!!).
|
|
718
|
+
if (fields.length > 0) {
|
|
719
|
+
// Init the layout.
|
|
720
|
+
if (
|
|
721
|
+
// this.layoutType === 'form' ||
|
|
722
|
+
this.layoutType === 'table') {
|
|
723
|
+
this.fields = fields;
|
|
724
|
+
this._fieldsSubject.next(fields);
|
|
725
|
+
this.rows = [];
|
|
726
|
+
for (let i = 0; i <= maxRow; i++) {
|
|
727
|
+
this.rows[i] = [];
|
|
728
|
+
}
|
|
729
|
+
// for (let i = 0; i < fields.length; i++) {
|
|
730
|
+
// const field = fields[i]
|
|
731
|
+
for (const field of fields) {
|
|
732
|
+
this.rows[field.row].push(field);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
else {
|
|
736
|
+
const doesfieldExistIn = new Array(maxRow);
|
|
737
|
+
for (let i = 0; i < doesfieldExistIn.length; i++) {
|
|
738
|
+
doesfieldExistIn[i] = new Array(this.columns);
|
|
739
|
+
for (let j = 0; j < doesfieldExistIn[i].length; j++) {
|
|
740
|
+
doesfieldExistIn[i][j] = false;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
// Run in squere (row - colspan, col - rowspan) and put true where it should.
|
|
744
|
+
// for (let index = 0; index < fields.length; index++) {
|
|
745
|
+
// const currentField = fields[index];
|
|
746
|
+
for (const currentField of fields) {
|
|
747
|
+
if (currentField.rowSpan > 1) {
|
|
748
|
+
for (let row = currentField.row; row < currentField.row + currentField.rowSpan; row++) {
|
|
749
|
+
if (currentField.colSpan > 1) {
|
|
750
|
+
for (let col = currentField.col; col <
|
|
751
|
+
currentField.col + currentField.colSpan; col++) {
|
|
752
|
+
if (doesfieldExistIn.length > row &&
|
|
753
|
+
doesfieldExistIn[0].length > col) {
|
|
754
|
+
doesfieldExistIn[row][col] = true;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
else {
|
|
759
|
+
if (doesfieldExistIn.length > row &&
|
|
760
|
+
doesfieldExistIn[0].length >
|
|
761
|
+
currentField.col) {
|
|
762
|
+
doesfieldExistIn[row][currentField.col] = true;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
else if (currentField.colSpan > 1) {
|
|
768
|
+
for (let col = currentField.col; col < currentField.col + currentField.colSpan; col++) {
|
|
769
|
+
if (doesfieldExistIn.length > currentField.row &&
|
|
770
|
+
doesfieldExistIn[0].length > col) {
|
|
771
|
+
doesfieldExistIn[currentField.row][col] = true;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
else {
|
|
776
|
+
if (doesfieldExistIn.length > currentField.row &&
|
|
777
|
+
doesfieldExistIn[0].length > currentField.col) {
|
|
778
|
+
doesfieldExistIn[currentField.row][currentField.col] = true;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
// Create empty fields where doesfieldExistIn is false (For the md-grid-list UI Component).
|
|
783
|
+
for (let i = 0; i < doesfieldExistIn.length; i++) {
|
|
784
|
+
for (let j = 0; j < doesfieldExistIn[i].length; j++) {
|
|
785
|
+
if (!doesfieldExistIn[i][j]) {
|
|
786
|
+
// Create empty field and add it to the fields list.
|
|
787
|
+
fields.push(new PepPlaceholderField({
|
|
788
|
+
key: i + '_' + j,
|
|
789
|
+
label: '',
|
|
790
|
+
placeholder: '',
|
|
791
|
+
readonly: false,
|
|
792
|
+
disabled: false,
|
|
793
|
+
hidden: false,
|
|
794
|
+
mandatory: false,
|
|
795
|
+
value: '',
|
|
796
|
+
formattedValue: '',
|
|
797
|
+
row: i,
|
|
798
|
+
rowSpan: 1,
|
|
799
|
+
col: j,
|
|
800
|
+
colSpan: 1,
|
|
801
|
+
order: 1,
|
|
802
|
+
}));
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
// Sort the fields again.
|
|
807
|
+
this.fields = fields.sort((f1, f2) => f1.row > f2.row
|
|
808
|
+
? 1
|
|
809
|
+
: f1.row < f2.row
|
|
810
|
+
? -1
|
|
811
|
+
: f1.col > f2.col
|
|
812
|
+
? 1
|
|
813
|
+
: f1.col < f2.col
|
|
814
|
+
? -1
|
|
815
|
+
: 0);
|
|
816
|
+
this._fieldsSubject.next(fields);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
setForm(isForUpdate = false) {
|
|
821
|
+
let allFieldsAreReadOnly = true;
|
|
822
|
+
if (!isForUpdate) {
|
|
823
|
+
const fields = [];
|
|
824
|
+
for (const currentField of this.fields) {
|
|
825
|
+
// Add all fields except 'internalPage' (for children).
|
|
826
|
+
if (currentField.controlType !== 'internalPage') {
|
|
827
|
+
fields.push(currentField);
|
|
828
|
+
}
|
|
829
|
+
if (!currentField.readonly) {
|
|
830
|
+
allFieldsAreReadOnly = false;
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
this.form = this.toControlGroup(fields);
|
|
834
|
+
}
|
|
835
|
+
else {
|
|
836
|
+
// Update form values if changed by calculated fields.
|
|
837
|
+
for (let i = 0; i < this.fields.length; i++) {
|
|
838
|
+
let currentField = this.fields[i];
|
|
839
|
+
if (currentField.controlType === 'internalCarusel') {
|
|
840
|
+
// Hack to override (update) the field.
|
|
841
|
+
const uiControlField = this.getUiControlFields().find(cf => cf.ApiName === currentField.key);
|
|
842
|
+
const dataField = this.data.Fields.find(df => df.ApiName === currentField.key);
|
|
843
|
+
currentField = this.createBaseField(uiControlField, dataField);
|
|
844
|
+
this._fieldsSubject.value[i] = currentField;
|
|
845
|
+
}
|
|
846
|
+
else if (currentField.controlType !== 'internalPage') {
|
|
847
|
+
if (currentField.groupFields &&
|
|
848
|
+
currentField.groupFields.length > 0) {
|
|
849
|
+
// for (let j = 0; j < currentField.groupFields.length; j++) {
|
|
850
|
+
// let currentGroupField = currentField.groupFields[j];
|
|
851
|
+
for (const currentGroupField of currentField.groupFields) {
|
|
852
|
+
const fieldFormattedValue = this.getFieldFormattedValue(currentGroupField);
|
|
853
|
+
this.customizationService.updateFormField(this.form, currentGroupField, fieldFormattedValue, currentField);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
else {
|
|
857
|
+
const fieldFormattedValue = this.getFieldFormattedValue(currentField);
|
|
858
|
+
// this.form.controls[currentField.key].setValue(fieldFormattedValue);
|
|
859
|
+
this.customizationService.updateFormField(this.form, currentField, fieldFormattedValue);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
if (!currentField.readonly) {
|
|
863
|
+
allFieldsAreReadOnly = false;
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
let isFormValid = this.form?.valid;
|
|
868
|
+
// Change validation to true if all fields are read only.
|
|
869
|
+
if (!isFormValid && allFieldsAreReadOnly) {
|
|
870
|
+
isFormValid = true;
|
|
871
|
+
}
|
|
872
|
+
this.onFormValidationChanged(isFormValid);
|
|
873
|
+
// Set it to false to enable all fields.
|
|
874
|
+
if (this.isInternal && this.isLocked) {
|
|
875
|
+
this.isLocked = false;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
initForm() {
|
|
879
|
+
if (this.data && this.data.Fields) {
|
|
880
|
+
const fields = this.convertCustomFields(this.getUiControlFields(), this.data.Fields);
|
|
881
|
+
const maxRow = Math.max(...fields.map((f) => {
|
|
882
|
+
return f.row + f.rowSpan;
|
|
883
|
+
}));
|
|
884
|
+
this.columns = Math.max(...fields.map((f) => {
|
|
885
|
+
return f.col + f.colSpan;
|
|
886
|
+
}));
|
|
887
|
+
this.initFieldsStructure(fields, maxRow);
|
|
888
|
+
this.setForm();
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
updateField(customField, updatedField) {
|
|
892
|
+
const options = {
|
|
893
|
+
disabled: !updatedField.Enabled || !this.canEditObject,
|
|
894
|
+
readonly: !updatedField.Enabled || !this.canEditObject,
|
|
895
|
+
visible: updatedField.Visible,
|
|
896
|
+
value: updatedField.Value,
|
|
897
|
+
additionalValue: updatedField.AdditionalValue,
|
|
898
|
+
formattedValue: updatedField.FormattedValue,
|
|
899
|
+
textColor: updatedField.TextColor,
|
|
900
|
+
digitsNumberAfterDecimalPoint: updatedField.DigitsNumberAfterDecimalPoint,
|
|
901
|
+
};
|
|
902
|
+
if (customField instanceof PepQuantitySelectorField) {
|
|
903
|
+
const notificationInfo = updatedField.NotificationInfo;
|
|
904
|
+
options.notificationInfo = notificationInfo;
|
|
905
|
+
// Change type if it's change (only for allowDecimal).
|
|
906
|
+
let allowDecimal = false;
|
|
907
|
+
if (updatedField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
908
|
+
updatedField.FieldType === FIELD_TYPE.NumberReal ||
|
|
909
|
+
updatedField.FieldType === FIELD_TYPE.NumberRealForMatrix) {
|
|
910
|
+
allowDecimal = true;
|
|
911
|
+
}
|
|
912
|
+
options.allowDecimal = allowDecimal;
|
|
913
|
+
}
|
|
914
|
+
else if (customField instanceof PepSelectField) {
|
|
915
|
+
options.options = this.convertOptionalValues(updatedField.OptionalValues);
|
|
916
|
+
if (!options.options || options.options.length === 0) {
|
|
917
|
+
options.options.push({
|
|
918
|
+
key: options.value,
|
|
919
|
+
value: options.formattedValue,
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
else if (customField instanceof PepInternalCaruselField) {
|
|
924
|
+
options.pageInfo = updatedField.UIPageInfo;
|
|
925
|
+
}
|
|
926
|
+
customField.update(options);
|
|
927
|
+
}
|
|
928
|
+
updateForm() {
|
|
929
|
+
if (this.data && this.data.Fields) {
|
|
930
|
+
for (const currentField of this.data.Fields) {
|
|
931
|
+
const customField = this.fields.filter((f) => f.key === currentField.ApiName)[0];
|
|
932
|
+
// Update all fields except 'internalPage' type (for children).
|
|
933
|
+
if (customField && customField.controlType !== 'internalPage') {
|
|
934
|
+
this.updateField(customField, currentField);
|
|
935
|
+
// Update the group fields.
|
|
936
|
+
if (customField.controlType === 'address' &&
|
|
937
|
+
currentField.GroupFields) {
|
|
938
|
+
// for (let j = 0; j < currentField.GroupFields.length; j++) {
|
|
939
|
+
// let currentGroupField = currentField.GroupFields[j];
|
|
940
|
+
for (const currentGroupField of currentField.GroupFields) {
|
|
941
|
+
currentGroupField.Enabled = !currentField.Enabled
|
|
942
|
+
? false
|
|
943
|
+
: currentGroupField.Enabled;
|
|
944
|
+
const customGroupField = customField.groupFields.filter((f) => f.key === currentGroupField.ApiName)[0];
|
|
945
|
+
this.updateField(customGroupField, currentGroupField);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
this.setForm(true);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
ReloadForm() {
|
|
954
|
+
this._shouldReloadForm = true;
|
|
955
|
+
}
|
|
956
|
+
// onSubmit() {
|
|
957
|
+
// if (this.form.valid) {
|
|
958
|
+
// this.payLoad = JSON.stringify(this.form.value);
|
|
959
|
+
// //this.submitted.emit(this.form.value);
|
|
960
|
+
// }
|
|
961
|
+
// }
|
|
962
|
+
getFormControlById(key) {
|
|
963
|
+
let formControl = null;
|
|
964
|
+
this.fields.forEach((field) => {
|
|
965
|
+
if (field.key === key) {
|
|
966
|
+
formControl = this.form.get(field.key);
|
|
967
|
+
return;
|
|
968
|
+
}
|
|
969
|
+
else if (field.groupFields && field.groupFields.length > 0) {
|
|
970
|
+
field.groupFields.forEach((groupField) => {
|
|
971
|
+
if (groupField.key === key) {
|
|
972
|
+
formControl = this.form.get(field.key + '.' + groupField.key);
|
|
973
|
+
return;
|
|
974
|
+
}
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
});
|
|
978
|
+
return formControl;
|
|
979
|
+
}
|
|
980
|
+
setSpecialFields(controlFields, dataFields) {
|
|
981
|
+
// let cf;
|
|
982
|
+
// for (let index = 0; index < controlFields.length; index++) {
|
|
983
|
+
// cf = controlFields[index];
|
|
984
|
+
for (const cf of controlFields) {
|
|
985
|
+
if (cf.ApiName === 'ObjectMenu') {
|
|
986
|
+
this.menuField = cf;
|
|
987
|
+
}
|
|
988
|
+
else if (cf.ApiName === 'ItemHasActiveCampaign') {
|
|
989
|
+
this.hasCampaignField = cf;
|
|
990
|
+
}
|
|
991
|
+
else if (cf.ApiName === 'ItemIndicatorsWithoutCampaign') {
|
|
992
|
+
this.indicatorsField = cf;
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
// let df;
|
|
996
|
+
// for (let index = 0; index < dataFields.length; index++) {
|
|
997
|
+
// df = dataFields[index];
|
|
998
|
+
for (const df of dataFields) {
|
|
999
|
+
if (df.ApiName === 'ObjectMenu') {
|
|
1000
|
+
this.menuDataField = df;
|
|
1001
|
+
}
|
|
1002
|
+
else if (df.ApiName === 'ItemHasActiveCampaign') {
|
|
1003
|
+
this.hasCampaignDataField = df;
|
|
1004
|
+
}
|
|
1005
|
+
else if (df.ApiName === 'ItemIndicatorsWithoutCampaign') {
|
|
1006
|
+
this.indicatorsDataField = df;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
if (this.menuField && this.menuDataField) {
|
|
1010
|
+
this.menuDataField.Layout = this.menuField.Layout;
|
|
1011
|
+
}
|
|
1012
|
+
if (this.hasCampaignField && this.hasCampaignDataField) {
|
|
1013
|
+
this.hasCampaignDataField.Layout = this.hasCampaignField.Layout;
|
|
1014
|
+
}
|
|
1015
|
+
if (this.indicatorsField && this.indicatorsDataField) {
|
|
1016
|
+
this.indicatorsDataField.Layout = this.indicatorsField.Layout;
|
|
1017
|
+
}
|
|
1018
|
+
// Check if menu is floating on other field.
|
|
1019
|
+
// for (let index = 0; index < controlFields.length; index++) {
|
|
1020
|
+
// cf = controlFields[index];
|
|
1021
|
+
for (const cf of controlFields) {
|
|
1022
|
+
if (this.menuField && cf.ApiName !== 'ObjectMenu') {
|
|
1023
|
+
this.hasMenuFloatingOnOtherField = this.doesFieldHavaFloatingField(cf, this.menuField);
|
|
1024
|
+
if (this.hasMenuFloatingOnOtherField) {
|
|
1025
|
+
break;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
convertCustomFields(controlFields, dataFields) {
|
|
1031
|
+
if (this.layoutType !== 'table') {
|
|
1032
|
+
this.setSpecialFields(controlFields, dataFields);
|
|
1033
|
+
}
|
|
1034
|
+
else {
|
|
1035
|
+
// HACK: convert to center alignment if table view & special fields)
|
|
1036
|
+
controlFields.forEach((field, index) => {
|
|
1037
|
+
if (field.ApiName === 'UnitsQuantity' ||
|
|
1038
|
+
field.ApiName === 'QuantitySelector' ||
|
|
1039
|
+
field.ApiName === 'ObjectMenu' ||
|
|
1040
|
+
field.FieldType === FIELD_TYPE.Image ||
|
|
1041
|
+
field.FieldType === FIELD_TYPE.ImageURL ||
|
|
1042
|
+
field.FieldType === FIELD_TYPE.Indicators ||
|
|
1043
|
+
field.FieldType === FIELD_TYPE.Boolean ||
|
|
1044
|
+
field.FieldType === FIELD_TYPE.CalculatedBool ||
|
|
1045
|
+
field.FieldType === FIELD_TYPE.Signature ||
|
|
1046
|
+
field.FieldType ===
|
|
1047
|
+
FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
1048
|
+
field.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
1049
|
+
field.FieldType === FIELD_TYPE.Package ||
|
|
1050
|
+
field.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
|
|
1051
|
+
field.FieldType === FIELD_TYPE.NumberRealForMatrix) {
|
|
1052
|
+
field.Layout.XAlignment = X_ALIGNMENT_TYPE.Center;
|
|
1053
|
+
}
|
|
1054
|
+
else {
|
|
1055
|
+
// HACK: align the rest of the fields by the culture.
|
|
1056
|
+
// field.Layout.XAlignment = this.layoutService.isRtl() ? X_ALIGNMENT_TYPE.Right : X_ALIGNMENT_TYPE.Left;
|
|
1057
|
+
}
|
|
1058
|
+
});
|
|
1059
|
+
}
|
|
1060
|
+
const fields = [];
|
|
1061
|
+
controlFields.forEach((field, index) => {
|
|
1062
|
+
const dataField = dataFields.filter((df) => df.ApiName === field.ApiName)[0];
|
|
1063
|
+
if (!dataField) {
|
|
1064
|
+
return;
|
|
1065
|
+
}
|
|
1066
|
+
// If current view is not table view and those fields are special.
|
|
1067
|
+
if (this.layoutType !== 'table' &&
|
|
1068
|
+
((this.hasMenuFloatingOnOtherField &&
|
|
1069
|
+
this.menuField &&
|
|
1070
|
+
this.menuField.ApiName === field.ApiName) ||
|
|
1071
|
+
(this.indicatorsField &&
|
|
1072
|
+
this.indicatorsField.ApiName === field.ApiName) ||
|
|
1073
|
+
(this.hasCampaignField &&
|
|
1074
|
+
this.hasCampaignField.ApiName === field.ApiName))) {
|
|
1075
|
+
return;
|
|
1076
|
+
}
|
|
1077
|
+
// Set type to link
|
|
1078
|
+
if (index === 0 && this.firstFieldAsLink) {
|
|
1079
|
+
dataField.FieldType = FIELD_TYPE.InternalLink;
|
|
1080
|
+
// dataField.Value = this.getInternalLinkHref();
|
|
1081
|
+
}
|
|
1082
|
+
if (field.ApiName === 'ObjectMenu') {
|
|
1083
|
+
dataField.Enabled = true;
|
|
1084
|
+
// HACK : Until "Enabled" returns from the server, we set PepMenu to be
|
|
1085
|
+
// Disabled in cart on regular items and not campign items.
|
|
1086
|
+
}
|
|
1087
|
+
const customField = this.createBaseField(field, dataField);
|
|
1088
|
+
fields.push(customField);
|
|
1089
|
+
});
|
|
1090
|
+
return fields.sort((f1, f2) => f1.row > f2.row
|
|
1091
|
+
? 1
|
|
1092
|
+
: f1.row < f2.row
|
|
1093
|
+
? -1
|
|
1094
|
+
: f1.col > f2.col
|
|
1095
|
+
? 1
|
|
1096
|
+
: f1.col < f2.col
|
|
1097
|
+
? -1
|
|
1098
|
+
: 0);
|
|
1099
|
+
}
|
|
1100
|
+
onFormValidationChanged(formValidationChange) {
|
|
1101
|
+
this.formValidationChange.emit(formValidationChange);
|
|
1102
|
+
}
|
|
1103
|
+
onValueChanged(event) {
|
|
1104
|
+
this.onFormValidationChanged(this.form.valid);
|
|
1105
|
+
const formControl = this.getFormControlById(event.key);
|
|
1106
|
+
const isValid = formControl ? formControl.valid : true;
|
|
1107
|
+
// const isValid = true;
|
|
1108
|
+
if (isValid) {
|
|
1109
|
+
// Set it to false to disable all fields.
|
|
1110
|
+
if (this.isInternal && this.layoutType === 'form') {
|
|
1111
|
+
this.isLocked = true;
|
|
1112
|
+
}
|
|
1113
|
+
// Update the current field value.
|
|
1114
|
+
const currentField = this.fields.find((f) => f.key === event.key);
|
|
1115
|
+
if (currentField) {
|
|
1116
|
+
currentField.formattedValue = currentField.value = event.value;
|
|
1117
|
+
}
|
|
1118
|
+
this.valueChange.emit({
|
|
1119
|
+
id: this.data.UID.toString(),
|
|
1120
|
+
uiObjectKey: this.data.Key,
|
|
1121
|
+
key: event.key,
|
|
1122
|
+
value: event.value,
|
|
1123
|
+
controlType: event.controlType,
|
|
1124
|
+
});
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
onClick(fieldClickEvent) {
|
|
1128
|
+
const clickedUiControlField = this.data.Fields.filter((f) => f.ApiName === fieldClickEvent.key)[0];
|
|
1129
|
+
const idType = this.data.Type ? this.data.Type.toString() : '';
|
|
1130
|
+
if (clickedUiControlField) {
|
|
1131
|
+
this.fieldClick.emit({
|
|
1132
|
+
id: this.data.UID.toString(),
|
|
1133
|
+
uiObjectKey: this.data.Key,
|
|
1134
|
+
key: fieldClickEvent.key,
|
|
1135
|
+
idType,
|
|
1136
|
+
which: fieldClickEvent.eventWhich,
|
|
1137
|
+
value: fieldClickEvent.value,
|
|
1138
|
+
controlType: fieldClickEvent.controlType,
|
|
1139
|
+
fieldType: clickedUiControlField.FieldType,
|
|
1140
|
+
otherData: fieldClickEvent.otherData,
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
1143
|
+
else {
|
|
1144
|
+
// For other api names (like enter children etc).
|
|
1145
|
+
this.fieldClick.emit({
|
|
1146
|
+
id: this.data.UID.toString(),
|
|
1147
|
+
uiObjectKey: this.data.Key,
|
|
1148
|
+
key: fieldClickEvent.key,
|
|
1149
|
+
idType,
|
|
1150
|
+
which: fieldClickEvent.eventWhich,
|
|
1151
|
+
value: fieldClickEvent.value,
|
|
1152
|
+
controlType: fieldClickEvent.controlType,
|
|
1153
|
+
otherData: fieldClickEvent.otherData,
|
|
1154
|
+
});
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
// // This event is for handle the internal page events.
|
|
1158
|
+
// onInternalFormFieldClicked(internalFormFieldClick: any): void {
|
|
1159
|
+
// this.internalFormFieldClick.emit(internalFormFieldClick);
|
|
1160
|
+
// }
|
|
1161
|
+
// // This event is for handle the internal page events.
|
|
1162
|
+
// onInternalFormFieldChanged(internalFormFieldChange: any): void {
|
|
1163
|
+
// this.internalFormFieldChange.emit(internalFormFieldChange);
|
|
1164
|
+
// }
|
|
1165
|
+
// This event is for handle the related items change events.
|
|
1166
|
+
onFormValueChanged(event) {
|
|
1167
|
+
// this.valueChange.emit(event);
|
|
1168
|
+
}
|
|
1169
|
+
// This event is for handle the related items change events.
|
|
1170
|
+
onFormFieldClick(event) {
|
|
1171
|
+
this.fieldClick.emit(event);
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
PepInternalFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalFormComponent, deps: [{ token: i1.PepDialogService }, { token: i2.PepCustomizationService }, { token: i2.PepLayoutService }, { token: i3.FormBuilder }, { token: i0.KeyValueDiffers }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1175
|
+
PepInternalFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PepInternalFormComponent, selector: "pep-internal-form", inputs: { isInternal: "isInternal", isReport: "isReport", layout: "layout", lockEvents: "lockEvents", canEditObject: "canEditObject", data: "data", lockFields: "lockFields", isActive: "isActive", layoutType: "layoutType", objectId: "objectId", parentId: "parentId", searchCode: "searchCode", showTitle: "showTitle", firstFieldAsLink: "firstFieldAsLink", checkForChanges: "checkForChanges" }, outputs: { valueChange: "valueChange", formValidationChange: "formValidationChange", fieldClick: "fieldClick" }, usesOnChanges: true, ngImport: i0, template: "<fieldset *ngIf=\"form\" [formGroup]=\"form\" [disabled]=\"isLocked\" class=\"pep-form\"\n [ngStyle]=\"{ 'background-color': layoutType == 'card' && data?.BackgroundColor }\">\n <!-- New Form -->\n <mat-grid-list *ngIf=\"layoutType == 'form'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"formGutterSize\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [checkForChanges]=\"checkForChanges\" [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\"\n (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n (formValidationChange)=\"onFormValidationChanged($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <!-- Thumbnails -->\n <mat-grid-list *ngIf=\"layoutType == 'card'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"cardGutterSize\" class=\"card-spacing\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\"\n [ngStyle]=\"{ overflow: field.type == 'qs' ? 'unset' : 'hidden' }\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [ngClass]=\"{ 'lock-events': lockEvents }\" [isActive]=\"isActive\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\" (valueChange)=\"onValueChanged($event)\"\n (elementClick)=\"onClick($event)\" (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <ng-container *ngIf=\"layoutType == 'table'\">\n <ng-container *ngIf=\"isReport; then reportBlock; else notReportBlock\"></ng-container>\n <ng-template #reportBlock>\n <ng-container *ngTemplateOutlet=\"report\"></ng-container>\n </ng-template>\n <ng-template #notReportBlock>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip table-cell \"\n [ngClass]=\"['text-align-' + field.xAlignment]\" style=\"height: 100%\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString}\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [form]=\"form\" [layoutType]=\"layoutType\" [showTitle]=\"false\"\n (elementClick)=\"onClick($event)\" (valueChange)=\"onValueChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n [isActive]=\"isActive\">\n </pep-internal-field-generator>\n </div>\n </ng-template>\n </ng-container>\n\n <!------- For testing ------------\n {{ form.value | json }}\n {{ form.valid }}\n ---------------------------------->\n</fieldset>\n\n<ng-template #report>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip pep-report-fields\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString }\"\n [ngClass]=\"['text-align-' + field.xAlignment]\">\n <ng-container [ngSwitch]=\"field.controlType\">\n <pep-image *ngSwitchCase=\"'image'\" [uid]=\"data?.UID\" [form]=\"form\" [key]=\"field.key\"\n [src]=\"field.formattedValue\" [srcLarge]=\"field.value\" [options]=\"field.options\" [label]=\"field.label\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\" [layoutType]=\"layoutType\"\n (elementClick)=\"onClick($event)\">\n </pep-image>\n\n <pep-signature *ngSwitchCase=\"'signature'\" [form]=\"form\" [key]=\"field.key\" [src]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-signature>\n\n <pep-checkbox *ngSwitchCase=\"'checkbox'\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"(field.value | lowercase) == 'true' || field.value == '1' ? true : false\" [label]=\"field.label\"\n [type]=\"field.type\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [additionalValue]=\"field.additionalValue\" [layoutType]=\"layoutType\">\n </pep-checkbox>\n\n <pep-date *ngSwitchCase=\"'date'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [minValue]=\"field.minValue\" [maxValue]=\"field.maxValue\" [layoutType]=\"layoutType\">\n </pep-date>\n\n <pep-internal-button *ngSwitchCase=\"'button'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [disabled]=\"field.disabled\" [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\"\n [layoutType]=\"layoutType\" (elementClick)=\"onClick($event)\">\n </pep-internal-button>\n\n <pep-textarea *ngSwitchCase=\"'textarea'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [maxFieldCharacters]=\"field.maxFieldCharacters\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-textarea>\n\n <pep-quantity-selector *ngSwitchCase=\"'qs'\" [id]=\"field.key\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"field.value\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\" (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\">\n </pep-quantity-selector>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"field.formattedValue?.length > 0; then notEmptyBlock; else emptyBlock\">\n </ng-container>\n <ng-template #notEmptyBlock>\n <ng-container\n *ngIf=\"field.controlType === 'attachment' || field.type === 'link'; then linkBlock; else notLinkBlock\">\n </ng-container>\n <ng-template #linkBlock>\n <a [id]=\"field.key\" class=\"color-link body-sm pep-report-input readonly\"\n *ngIf=\"field.formattedValue != null\" title=\"{{ field.formattedValue }}\" target=\"_blank\"\n href=\"{{ field.value }}\">{{ field.formattedValue }}</a>\n </ng-template>\n <ng-template #notLinkBlock>\n <span [id]=\"field.key\" class=\"body-sm pep-report-input readonly\"\n title=\"{{ field.formattedValue }}\" [ngStyle]=\"{ color: field.textColor }\">{{\n field.formattedValue }}</span>\n </ng-template>\n </ng-template>\n <ng-template #emptyBlock>\n <span> </span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{display:grid}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { kind: "component", type: i6.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { kind: "component", type: i7.PepCheckboxComponent, selector: "pep-checkbox", inputs: ["key", "value", "label", "type", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "additionalValue", "form", "isActive", "showTitle", "renderTitle", "layoutType", "visible"], outputs: ["valueChange"] }, { kind: "component", type: i8.PepDateComponent, selector: "pep-date", inputs: ["key", "value", "label", "type", "mandatory", "disabled", "readonly", "textColor", "xAlignment", "rowSpan", "visible", "minValue", "maxValue", "minDateValue", "maxDateValue", "form", "isActive", "showTitle", "renderTitle", "renderError", "renderSymbol", "layoutType"], outputs: ["valueChange"] }, { kind: "component", type: i9.PepImageComponent, selector: "pep-image", inputs: ["key", "srcLarge", "src", "options", "label", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "indicatorsField", "menuField", "hasCampaignField", "visible", "form", "uid", "showTitle", "renderTitle", "layoutType", "isActive", "sizeLimitMB", "acceptImagesType"], outputs: ["fileChange", "elementClick"] }, { kind: "component", type: i10.PepQuantitySelectorComponent, selector: "pep-quantity-selector", inputs: ["key", "value", "minFractionDigits", "maxFractionDigits", "label", "type", "mandatory", "disabled", "readonly", "textColor", "xAlignment", "rowSpan", "allowDecimal", "additionalValue", "notificationInfo", "visible", "form", "showTitle", "renderTitle", "layoutType", "isActive", "styleType", "isInFocus"], outputs: ["valueChange", "elementClick"] }, { kind: "component", type: i11.PepSignatureComponent, selector: "pep-signature", inputs: ["key", "src", "label", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "signatureURL", "visible", "form", "showTitle", "renderTitle", "layoutType", "isActive"], outputs: ["fileChange"] }, { kind: "component", type: i12.PepTextareaComponent, selector: "pep-textarea", inputs: ["key", "value", "label", "mandatory", "disabled", "readonly", "maxFieldCharacters", "textColor", "xAlignment", "rowSpan", "visible", "form", "isActive", "showTitle", "renderTitle", "layoutType"], outputs: ["valueChange", "keydown"] }, { kind: "component", type: i13.PepInternalFieldGeneratorComponent, selector: "pep-internal-field-generator", inputs: ["field", "isActive", "uid", "form", "layoutType", "showTitle", "checkForChanges"], outputs: ["valueChange", "formValidationChange", "elementClick", "formValueChange", "formFieldClick"] }, { kind: "component", type: i14.PepInternalButtonComponent, selector: "pep-internal-button", inputs: ["key", "value", "formattedValue", "label", "referenceObjectInternalType", "type", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "visible", "form", "showTitle", "layoutType"], outputs: ["elementClick", "valueChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.LowerCasePipe, name: "lowercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1176
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalFormComponent, decorators: [{
|
|
1177
|
+
type: Component,
|
|
1178
|
+
args: [{ selector: 'pep-internal-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<fieldset *ngIf=\"form\" [formGroup]=\"form\" [disabled]=\"isLocked\" class=\"pep-form\"\n [ngStyle]=\"{ 'background-color': layoutType == 'card' && data?.BackgroundColor }\">\n <!-- New Form -->\n <mat-grid-list *ngIf=\"layoutType == 'form'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"formGutterSize\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [checkForChanges]=\"checkForChanges\" [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\"\n (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n (formValidationChange)=\"onFormValidationChanged($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <!-- Thumbnails -->\n <mat-grid-list *ngIf=\"layoutType == 'card'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"cardGutterSize\" class=\"card-spacing\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\"\n [ngStyle]=\"{ overflow: field.type == 'qs' ? 'unset' : 'hidden' }\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [ngClass]=\"{ 'lock-events': lockEvents }\" [isActive]=\"isActive\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\" (valueChange)=\"onValueChanged($event)\"\n (elementClick)=\"onClick($event)\" (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\">\n </pep-internal-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <ng-container *ngIf=\"layoutType == 'table'\">\n <ng-container *ngIf=\"isReport; then reportBlock; else notReportBlock\"></ng-container>\n <ng-template #reportBlock>\n <ng-container *ngTemplateOutlet=\"report\"></ng-container>\n </ng-template>\n <ng-template #notReportBlock>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip table-cell \"\n [ngClass]=\"['text-align-' + field.xAlignment]\" style=\"height: 100%\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString}\">\n <pep-internal-field-generator *ngIf=\"field.controlType != 'placeholder'\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [form]=\"form\" [layoutType]=\"layoutType\" [showTitle]=\"false\"\n (elementClick)=\"onClick($event)\" (valueChange)=\"onValueChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n [isActive]=\"isActive\">\n </pep-internal-field-generator>\n </div>\n </ng-template>\n </ng-container>\n\n <!------- For testing ------------\n {{ form.value | json }}\n {{ form.valid }}\n ---------------------------------->\n</fieldset>\n\n<ng-template #report>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip pep-report-fields\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString }\"\n [ngClass]=\"['text-align-' + field.xAlignment]\">\n <ng-container [ngSwitch]=\"field.controlType\">\n <pep-image *ngSwitchCase=\"'image'\" [uid]=\"data?.UID\" [form]=\"form\" [key]=\"field.key\"\n [src]=\"field.formattedValue\" [srcLarge]=\"field.value\" [options]=\"field.options\" [label]=\"field.label\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\" [layoutType]=\"layoutType\"\n (elementClick)=\"onClick($event)\">\n </pep-image>\n\n <pep-signature *ngSwitchCase=\"'signature'\" [form]=\"form\" [key]=\"field.key\" [src]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-signature>\n\n <pep-checkbox *ngSwitchCase=\"'checkbox'\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"(field.value | lowercase) == 'true' || field.value == '1' ? true : false\" [label]=\"field.label\"\n [type]=\"field.type\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [additionalValue]=\"field.additionalValue\" [layoutType]=\"layoutType\">\n </pep-checkbox>\n\n <pep-date *ngSwitchCase=\"'date'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [minValue]=\"field.minValue\" [maxValue]=\"field.maxValue\" [layoutType]=\"layoutType\">\n </pep-date>\n\n <pep-internal-button *ngSwitchCase=\"'button'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [disabled]=\"field.disabled\" [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\"\n [layoutType]=\"layoutType\" (elementClick)=\"onClick($event)\">\n </pep-internal-button>\n\n <pep-textarea *ngSwitchCase=\"'textarea'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [maxFieldCharacters]=\"field.maxFieldCharacters\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-textarea>\n\n <pep-quantity-selector *ngSwitchCase=\"'qs'\" [id]=\"field.key\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"field.value\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\" (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\">\n </pep-quantity-selector>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"field.formattedValue?.length > 0; then notEmptyBlock; else emptyBlock\">\n </ng-container>\n <ng-template #notEmptyBlock>\n <ng-container\n *ngIf=\"field.controlType === 'attachment' || field.type === 'link'; then linkBlock; else notLinkBlock\">\n </ng-container>\n <ng-template #linkBlock>\n <a [id]=\"field.key\" class=\"color-link body-sm pep-report-input readonly\"\n *ngIf=\"field.formattedValue != null\" title=\"{{ field.formattedValue }}\" target=\"_blank\"\n href=\"{{ field.value }}\">{{ field.formattedValue }}</a>\n </ng-template>\n <ng-template #notLinkBlock>\n <span [id]=\"field.key\" class=\"body-sm pep-report-input readonly\"\n title=\"{{ field.formattedValue }}\" [ngStyle]=\"{ color: field.textColor }\">{{\n field.formattedValue }}</span>\n </ng-template>\n </ng-template>\n <ng-template #emptyBlock>\n <span> </span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{display:grid}\n"] }]
|
|
1179
|
+
}], ctorParameters: function () { return [{ type: i1.PepDialogService }, { type: i2.PepCustomizationService }, { type: i2.PepLayoutService }, { type: i3.FormBuilder }, { type: i0.KeyValueDiffers }, { type: i4.TranslateService }]; }, propDecorators: { isInternal: [{
|
|
1180
|
+
type: Input
|
|
1181
|
+
}], isReport: [{
|
|
1182
|
+
type: Input
|
|
1183
|
+
}], layout: [{
|
|
1184
|
+
type: Input
|
|
1185
|
+
}], lockEvents: [{
|
|
1186
|
+
type: Input
|
|
1187
|
+
}], canEditObject: [{
|
|
1188
|
+
type: Input
|
|
1189
|
+
}], data: [{
|
|
1190
|
+
type: Input
|
|
1191
|
+
}], lockFields: [{
|
|
1192
|
+
type: Input
|
|
1193
|
+
}], isActive: [{
|
|
1194
|
+
type: Input
|
|
1195
|
+
}], layoutType: [{
|
|
1196
|
+
type: Input
|
|
1197
|
+
}], objectId: [{
|
|
1198
|
+
type: Input
|
|
1199
|
+
}], parentId: [{
|
|
1200
|
+
type: Input
|
|
1201
|
+
}], searchCode: [{
|
|
1202
|
+
type: Input
|
|
1203
|
+
}], showTitle: [{
|
|
1204
|
+
type: Input
|
|
1205
|
+
}], firstFieldAsLink: [{
|
|
1206
|
+
type: Input
|
|
1207
|
+
}], checkForChanges: [{
|
|
1208
|
+
type: Input
|
|
1209
|
+
}], valueChange: [{
|
|
1210
|
+
type: Output
|
|
1211
|
+
}], formValidationChange: [{
|
|
1212
|
+
type: Output
|
|
1213
|
+
}], fieldClick: [{
|
|
1214
|
+
type: Output
|
|
1215
|
+
}] } });
|
|
1216
1216
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULHVCQUF1QixFQUd2QixLQUFLLEVBRUwsTUFBTSxFQUNOLFlBQVksR0FJZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0gsVUFBVSxHQUViLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUVILGFBQWEsR0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBSUgsVUFBVSxFQUNWLHVCQUF1QixFQU92QixlQUFlLEVBQ2YsY0FBYyxFQUNkLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixjQUFjLEVBQ2QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsbUJBQW1CLEVBR25CLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDRCQUE0QixHQUcvQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTbkQsTUFBTSxPQUFPLHdCQUF3QjtJQW1GakMsaUNBQWlDO0lBQ2pDLHlCQUF5QjtJQUV6QixZQUNZLGFBQStCLEVBQy9CLG9CQUE2QyxFQUM3QyxhQUErQixFQUMvQixF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Qyw2bFJBaUljOzJGRHZERCx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0ksbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU07bVFBR3RDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUlGLElBQUk7c0JBRFAsS0FBSztnQkFpQkYsVUFBVTtzQkFEYixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdOLFdBQVc7c0JBRFYsTUFBTTtnQkFHUCxvQkFBb0I7c0JBRG5CLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgT25Jbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBJbnB1dCxcbiAgICBLZXlWYWx1ZURpZmZlcnMsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPbkNoYW5nZXMsXG4gICAgRG9DaGVjayxcbiAgICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Hcm91cCxcbiAgICBGb3JtQnVpbGRlcixcbiAgICBWYWxpZGF0b3JzLFxuICAgIEFic3RyYWN0Q29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBQZXBEaWFsb2dTZXJ2aWNlLFxuICAgIFBlcERpYWxvZ0RhdGEsXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2RpYWxvZyc7XG5pbXBvcnQge1xuICAgIElQZXBGaWVsZFZhbHVlQ2hhbmdlRXZlbnQsXG4gICAgSVBlcEZpZWxkQ2xpY2tFdmVudCxcbiAgICBQZXBMYXlvdXRUeXBlLFxuICAgIEZJRUxEX1RZUEUsXG4gICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgUGVwTGF5b3V0U2VydmljZSxcbiAgICBVSUNvbnRyb2wsXG4gICAgVUlDb250cm9sRmllbGQsXG4gICAgT2JqZWN0c0RhdGFSb3csXG4gICAgT2JqZWN0c0RhdGFSb3dDZWxsLFxuICAgIFBlcEZpZWxkQmFzZSxcbiAgICBQZXBUZXh0Ym94RmllbGQsXG4gICAgUGVwU2VsZWN0RmllbGQsXG4gICAgUGVwSW50ZXJuYWxNZW51RmllbGQsXG4gICAgUGVwUXVhbnRpdHlTZWxlY3RvckZpZWxkLFxuICAgIFBlcEFkZHJlc3NGaWVsZCxcbiAgICBQZXBJbmRpY2F0b3JzRmllbGQsXG4gICAgUGVwSW50ZXJuYWxQYWdlRmllbGQsXG4gICAgUGVwSW50ZXJuYWxDYXJ1c2VsRmllbGQsXG4gICAgUGVwSW50ZXJuYWxCdXR0b25GaWVsZCxcbiAgICBQZXBBdHRhY2htZW50RmllbGQsXG4gICAgUGVwU2lnbmF0dXJlRmllbGQsXG4gICAgUGVwSW1hZ2VGaWVsZCxcbiAgICBQZXBJbWFnZXNGaWVsZCxcbiAgICBQZXBMaW5rRmllbGQsXG4gICAgUGVwVGV4dGFyZWFGaWVsZCxcbiAgICBQZXBSaWNoSHRtbFRleHRhcmVhRmllbGQsXG4gICAgUGVwRGF0ZUZpZWxkLFxuICAgIFBlcENoZWNrYm94RmllbGQsXG4gICAgUGVwU2VwYXJhdG9yRmllbGQsXG4gICAgUGVwUGxhY2Vob2xkZXJGaWVsZCxcbiAgICBQZXBIb3Jpem9udGFsQWxpZ25tZW50LFxuICAgIFBlcFZlcnRpY2FsQWxpZ25tZW50LFxuICAgIFhfQUxJR05NRU5UX1RZUEUsXG4gICAgWV9BTElHTk1FTlRfVFlQRSxcbiAgICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOTUVOVCxcbiAgICBERUZBVUxUX0hPUklaT05UQUxfQUxJR05NRU5ULFxuICAgIEtleVZhbHVlUGFpcixcbiAgICBJUGVwT3B0aW9uLFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50LCBJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudCB9IGZyb20gJy4vZm9ybS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGVwLWludGVybmFsLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnRlcm5hbC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnRlcm5hbC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFBlcEludGVybmFsRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVjaywgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIGlzSW50ZXJuYWwgPSB0cnVlO1xuICAgIEBJbnB1dCgpIGlzUmVwb3J0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgbGF5b3V0OiBVSUNvbnRyb2w7XG4gICAgQElucHV0KCkgbG9ja0V2ZW50cyA9IGZhbHNlOyAgIFxuICAgIEBJbnB1dCgpIGNhbkVkaXRPYmplY3QgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBfZGF0YTogT2JqZWN0c0RhdGFSb3cgPSBudWxsO1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGRhdGEodmFsdWU6IE9iamVjdHNEYXRhUm93KSB7XG4gICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHRoaXMuc2hvdWxkUmVsb2FkRm9ybSB8fCAhdGhpcy5fZGF0YTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChzaG91bGRSZWxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZEZvcm0gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkYXRhKCk6IE9iamVjdHNEYXRhUm93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgbG9ja0ZpZWxkcyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmlzTG9ja2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KCkgaXNBY3RpdmUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBsYXlvdXRUeXBlOiBQZXBMYXlvdXRUeXBlID0gJ2NhcmQnO1xuICAgIC8vIEBJbnB1dCgpIGxpc3RUeXBlID0gJyc7XG4gICAgQElucHV0KCkgb2JqZWN0SWQgPSAnMCc7XG4gICAgQElucHV0KCkgcGFyZW50SWQgPSAnMCc7XG4gICAgQElucHV0KCkgc2VhcmNoQ29kZSA9ICcwJztcbiAgICBASW5wdXQoKSBzaG93VGl0bGUgPSB0cnVlO1xuICAgIEBJbnB1dCgpIGZpcnN0RmllbGRBc0xpbmsgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjaGVja0ZvckNoYW5nZXM6IGFueSA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpXG4gICAgZm9ybVZhbGlkYXRpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIGZpZWxkQ2xpY2s6IEV2ZW50RW1pdHRlcjxJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRDbGlja0V2ZW50PigpO1xuXG4gICAgLy8gQE91dHB1dCgpIGludGVybmFsRm9ybUZpZWxkQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgLy8gQE91dHB1dCgpIGludGVybmFsRm9ybUZpZWxkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgaXNMb2NrZWQgPSBmYWxzZTtcbiAgICBmb3JtR3V0dGVyU2l6ZTtcbiAgICBjYXJkR3V0dGVyU2l6ZTtcbiAgICByb3dIZWlnaHQ7XG4gICAgLy8gcHJpdmF0ZSBtYXRyaXhJc0xhc3QgPSBmYWxzZTtcbiAgICAvLyBsYXN0VXBkYXRlZEZpZWxkQXBpTmFtZTogc3RyaW5nID0gJyc7XG4gICAgZm9ybTogRm9ybUdyb3VwO1xuICAgIGRpZmZlcjogYW55O1xuXG4gICAgLy8gcGF5TG9hZCA9ICcnO1xuICAgIHByaXZhdGUgcm93czogQXJyYXk8UGVwRmllbGRCYXNlW10+ID0gW107XG4gICAgZmllbGRzOiBQZXBGaWVsZEJhc2VbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfZmllbGRzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFBlcEZpZWxkQmFzZVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGVwRmllbGRCYXNlW10+KFtdKTtcbiAgICBnZXQgZmllbGRzJCgpOiBPYnNlcnZhYmxlPFBlcEZpZWxkQmFzZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGNvbHVtbnMgPSAxO1xuXG4gICAgcHJpdmF0ZSBoYXNNZW51RmxvYXRpbmdPbk90aGVyRmllbGQgPSBmYWxzZTtcbiAgICBwcml2YXRlIG1lbnVGaWVsZDogYW55O1xuICAgIHByaXZhdGUgbWVudURhdGFGaWVsZDogYW55O1xuICAgIHByaXZhdGUgaGFzQ2FtcGFpZ25GaWVsZDogYW55O1xuICAgIHByaXZhdGUgaGFzQ2FtcGFpZ25EYXRhRmllbGQ6IGFueTtcbiAgICBwcml2YXRlIGluZGljYXRvcnNGaWVsZDogYW55O1xuICAgIHByaXZhdGUgaW5kaWNhdG9yc0RhdGFGaWVsZDogYW55ID0gbnVsbDtcblxuICAgIHByaXZhdGUgX3Nob3VsZFJlbG9hZEZvcm0gPSBmYWxzZTtcbiAgICBnZXQgc2hvdWxkUmVsb2FkRm9ybSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3VsZFJlbG9hZEZvcm07XG4gICAgfVxuXG4gICAgLy8gZXZlbnRTZXJ2aWNlU3ViOiBTdWJzY3JpcHRpb247XG4gICAgLy8gcHVibGljIGpzb25MaWIgPSBKU09OO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogUGVwRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21pemF0aW9uU2VydmljZTogUGVwQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbGF5b3V0U2VydmljZTogUGVwTGF5b3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIGRpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWUgdG8gY29tcGFyZSB3aXRoXG4gICAgICAgIHRoaXMuZGlmZmVyID0gZGlmZmVycy5maW5kKHt9KS5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICBjb252ZXJ0WEFsaWduVG9Ib3Jpem9udGFsQWxpZ24oXG4gICAgICAgIHhBbGlnbjogWF9BTElHTk1FTlRfVFlQRVxuICAgICk6IFBlcEhvcml6b250YWxBbGlnbm1lbnQge1xuICAgICAgICBsZXQgcmVzID0gREVGQVVMVF9IT1JJWk9OVEFMX0FMSUdOTUVOVDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB4QWxpZ24gPT09IFhfQUxJR05NRU5UX1RZUEUuTm9uZSB8fFxuICAgICAgICAgICAgeEFsaWduID09PSBYX0FMSUdOTUVOVF9UWVBFLkxlZnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXMgPSAnbGVmdCc7XG4gICAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSBYX0FMSUdOTUVOVF9UWVBFLlJpZ2h0KSB7XG4gICAgICAgICAgICByZXMgPSAncmlnaHQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gJ2NlbnRlcic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGNvbnZlcnRZQWxpZ25Ub1ZlcnRpY2FsQWxpZ24oXG4gICAgICAgIHlBbGlnbjogWV9BTElHTk1FTlRfVFlQRVxuICAgICk6IFBlcFZlcnRpY2FsQWxpZ25tZW50IHtcbiAgICAgICAgbGV0IHJlcyA9IERFRkFVTFRfVkVSVElDQUxfQUxJR05NRU5UO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHlBbGlnbiA9PT0gWV9BTElHTk1FTlRfVFlQRS5Ob25lIHx8XG4gICAgICAgICAgICB5QWxpZ24gPT09IFlfQUxJR05NRU5UX1RZUEUuVG9wXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzID0gJ3RvcCc7XG4gICAgICAgIH0gZWxzZSBpZiAoeUFsaWduID09PSBZX0FMSUdOTUVOVF9UWVBFLkJvdHRvbSkge1xuICAgICAgICAgICAgcmVzID0gJ2JvdHRvbSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSAnbWlkZGxlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgY29udmVydE9wdGlvbmFsVmFsdWVzKFxuICAgICAgICBvcHRpb25hbFZhbHVlczogQXJyYXk8S2V5VmFsdWVQYWlyPHN0cmluZz4+XG4gICAgKTogSVBlcE9wdGlvbltdIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsVmFsdWVzICYmIG9wdGlvbmFsVmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25hbFZhbHVlcy5tYXAoKG92KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5OiBvdi5LZXksIHZhbHVlOiBvdi5WYWx1ZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb252ZXJ0QWRkcmVzc0ZpZWxkcyhcbiAgICAgICAgY29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCxcbiAgICAgICAgYWRkcmVzc0ZpZWxkczogQXJyYXk8T2JqZWN0c0RhdGFSb3dDZWxsPixcbiAgICAgICAgY2FuRWRpdE9iamVjdDogYm9vbGVhblxuICAgICk6IFBlcEZpZWxkQmFzZVtdIHtcbiAgICAgICAgY29uc3QgZmllbGRzOiBQZXBGaWVsZEJhc2VbXSA9IFtdO1xuXG4gICAgICAgIGFkZHJlc3NGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGxldCBjdXN0b21GaWVsZDogUGVwRmllbGRCYXNlO1xuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBmaWVsZC5BcGlOYW1lO1xuXG4gICAgICAgICAgICBpZiAoZmllbGQuQXBpTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3N0cmVldCcpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICByZWFkb25seTogIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZmllbGQuRW5hYmxlZCB8fCAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLlZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZmllbGQuRm9ybWF0dGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgY29sOiAwLFxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiAyLFxuICAgICAgICAgICAgICAgICAgICB4QWxpZ25tZW50OiB0aGlzLmNvbnZlcnRYQWxpZ25Ub0hvcml6b250YWxBbGlnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWEFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB5QWxpZ25tZW50OiB0aGlzLmNvbnZlcnRZQWxpZ25Ub1ZlcnRpY2FsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LllBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLkFwaU5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjaXR5JykgPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFRleHRib3hGaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFmaWVsZC5FbmFibGVkIHx8ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlOiBmaWVsZC5Gb3JtYXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2w6IDIsXG4gICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIHhBbGlnbm1lbnQ6IHRoaXMuY29udmVydFhBbGlnblRvSG9yaXpvbnRhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5YQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHlBbGlnbm1lbnQ6IHRoaXMuY29udmVydFlBbGlnblRvVmVydGljYWxBbGlnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWUFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuQXBpTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3N0YXRlJykgPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNlbGVjdEZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydE9wdGlvbmFsVmFsdWVzKGZpZWxkLk9wdGlvbmFsVmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWZpZWxkLkVuYWJsZWQgfHwgIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIGNvbDogMCxcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgeEFsaWdubWVudDogdGhpcy5jb252ZXJ0WEFsaWduVG9Ib3Jpem9udGFsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LlhBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgeUFsaWdubWVudDogdGhpcy5jb252ZXJ0WUFsaWduVG9WZXJ0aWNhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5ZQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiAyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5BcGlOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignemlwY29kZScpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICByZWFkb25seTogIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZmllbGQuRW5hYmxlZCB8fCAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLlZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZmllbGQuRm9ybWF0dGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgY29sOiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICAgICAgICB4QWxpZ25tZW50OiB0aGlzLmNvbnZlcnRYQWxpZ25Ub0hvcml6b250YWxBbGlnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWEFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB5QWxpZ25tZW50OiB0aGlzLmNvbnZlcnRZQWxpZ25Ub1ZlcnRpY2FsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LllBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IDMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLkFwaU5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjb3VudHJ5JykgPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNlbGVjdEZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydE9wdGlvbmFsVmFsdWVzKGZpZWxkLk9wdGlvbmFsVmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWZpZWxkLkVuYWJsZWQgfHwgIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByb3c6IDIsXG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIGNvbDogMixcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgeEFsaWdubWVudDogdGhpcy5jb252ZXJ0WEFsaWduVG9Ib3Jpem9udGFsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LlhBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgeUFsaWdubWVudDogdGhpcy5jb252ZXJ0WUFsaWduVG9WZXJ0aWNhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5ZQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiA0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWVsZHMucHVzaChjdXN0b21GaWVsZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmaWVsZHMuc29ydCgobjEsIG4yKSA9PlxuICAgICAgICAgICAgbjEub3JkZXIgPiBuMi5vcmRlciA/IDEgOiBuMS5vcmRlciA8IG4yLm9yZGVyID8gLTEgOiAwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaXNNYXRyaXhGaWVsZChhcGlOYW1lVG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhcGlOYW1lVG9DaGVjay5pbmRleE9mKCdNYXRyaXgnKSA+PSAwO1xuICAgIH1cblxuICAgIGRvZXNGaWVsZEhhdmFGbG9hdGluZ0ZpZWxkKFxuICAgICAgICBjb250cm9sRmllbGQ6IFVJQ29udHJvbEZpZWxkLFxuICAgICAgICBmbG9hdGluZ0ZpZWxkOiBhbnlcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGhhc0Zsb2F0aW5nRmllbGQgPSBmYWxzZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmxvYXRpbmdGaWVsZC5MYXlvdXQuWSA+PSBjb250cm9sRmllbGQuTGF5b3V0LlkgJiZcbiAgICAgICAgICAgIGZsb2F0aW5nRmllbGQuTGF5b3V0LlkgPFxuICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5ZICsgY29udHJvbEZpZWxkLkxheW91dC5IZWlnaHQgJiZcbiAgICAgICAgICAgIGZsb2F0aW5nRmllbGQuTGF5b3V0LlggPj0gY29udHJvbEZpZWxkLkxheW91dC5YICYmXG4gICAgICAgICAgICBmbG9hdGluZ0ZpZWxkLkxheW91dC5YIDxcbiAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWCArIGNvbnRyb2xGaWVsZC5MYXlvdXQuV2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNGbG9hdGluZ0ZpZWxkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNGbG9hdGluZ0ZpZWxkO1xuICAgIH1cblxuICAgIGdldE9wdGlvbnNGb3JDdXN0b21GaWVsZChcbiAgICAgICAgY29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCxcbiAgICAgICAgZGF0YUZpZWxkOiBhbnksXG4gICAgICAgIGNhbkVkaXRPYmplY3Q6IGJvb2xlYW5cbiAgICApOiBhbnkge1xuICAgICAgICBpZiAoIWNvbnRyb2xGaWVsZCB8fCAhZGF0YUZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9XG4gICAgICAgICAgICBjb250cm9sRmllbGQuUmVhZE9ubHkgfHwgIWNhbkVkaXRPYmplY3QgPyAnJyA6IGNvbnRyb2xGaWVsZC5UaXRsZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBjb250cm9sRmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgIGxhYmVsOiBjb250cm9sRmllbGQuVGl0bGUsXG4gICAgICAgICAgICBhY2Nlc3Nvcnk6IGRhdGFGaWVsZC5BY2Nlc3NvcnksXG4gICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgIHJlYWRvbmx5OiBjb250cm9sRmllbGQuUmVhZE9ubHkgfHwgIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICBkaXNhYmxlZDogIWRhdGFGaWVsZC5FbmFibGVkIHx8ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgaGlkZGVuOiBjb250cm9sRmllbGQuSGlkZGVuLFxuICAgICAgICAgICAgbWFuZGF0b3J5OiBjb250cm9sRmllbGQuTWFuZGF0b3J5LFxuICAgICAgICAgICAgdmFsdWU6IGRhdGFGaWVsZC5WYWx1ZSxcbiAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlOiBkYXRhRmllbGQuRm9ybWF0dGVkVmFsdWUsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVmFsdWU6IGRhdGFGaWVsZC5BZGRpdGlvbmFsVmFsdWUsXG4gICAgICAgICAgICByb3c6IGNvbnRyb2xGaWVsZC5MYXlvdXQuWSxcbiAgICAgICAgICAgIHJvd1NwYW46IGNvbnRyb2xGaWVsZC5MYXlvdXQuSGVpZ2h0LFxuICAgICAgICAgICAgY29sOiBjb250cm9sRmllbGQuTGF5b3V0LlgsXG4gICAgICAgICAgICBjb2xTcGFuOiBjb250cm9sRmllbGQuTGF5b3V0LldpZHRoLFxuICAgICAgICAgICAgeEFsaWdubWVudDogdGhpcy5jb252ZXJ0WEFsaWduVG9Ib3Jpem9udGFsQWxpZ24oXG4gICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5YQWxpZ25tZW50XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgeUFsaWdubWVudDogdGhpcy5jb252ZXJ0WUFsaWduVG9WZXJ0aWNhbEFsaWduKFxuICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWUFsaWdubWVudFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuY29udmVydE9wdGlvbmFsVmFsdWVzKGRhdGFGaWVsZC5PcHRpb25hbFZhbHVlcyksXG4gICAgICAgICAgICBncm91cEZpZWxkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWF4RmllbGRDaGFyYWN0ZXJzOiBjb250cm9sRmllbGQuTWF4RmllbGRDaGFyYWN0ZXJzLFxuICAgICAgICAgICAgbWluVmFsdWU6IGNvbnRyb2xGaWVsZC5NaW5WYWx1ZSxcbiAgICAgICAgICAgIG1heFZhbHVlOiBjb250cm9sRmllbGQuTWF4VmFsdWUsXG4gICAgICAgICAgICAvLyBoYXNNZW51OiBoYXNNZW51LFxuICAgICAgICAgICAgLy8gaGFzQ2FtcGFpZ246IGhhc0NhbXBhaWduLFxuICAgICAgICAgICAgLy8gaGFzSW5kaWNhdG9yczogaGFzSW5kaWNhdG9ycyxcbiAgICAgICAgICAgIHRleHRDb2xvcjogZGF0YUZpZWxkLlRleHRDb2xvcixcbiAgICAgICAgICAgIHZpc2libGU6IGRhdGFGaWVsZC5WaXNpYmxlLFxuICAgICAgICAgICAgZGlnaXRzTnVtYmVyQWZ0ZXJEZWNpbWFsUG9pbnQ6IGRhdGFGaWVsZC5EaWdpdHNOdW1iZXJBZnRlckRlY2ltYWxQb2ludCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb252ZXJ0VG9DdXN0b21GaWVsZChcbiAgICAgICAgY29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCxcbiAgICAgICAgZGF0YUZpZWxkOiBhbnksXG4gICAgICAgIGNhbkVkaXRPYmplY3Q6IGJvb2xlYW4sXG4gICAgICAgIG1lbnVGaWVsZDogYW55LFxuICAgICAgICBoYXNDYW1wYWlnbkZpZWxkOiBhbnksXG4gICAgICAgIGluZGljYXRvcnNGaWVsZDogYW55LFxuICAgICAgICBvYmplY3RJZDogYW55LFxuICAgICAgICBwYXJlbnRJZDogYW55LFxuICAgICAgICBzZWFyY2hDb2RlOiBhbnlcbiAgICApOiBQZXBGaWVsZEJhc2Uge1xuICAgICAgICBsZXQgY3VzdG9tRmllbGQ6IFBlcEZpZWxkQmFzZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9uc0ZvckN1c3RvbUZpZWxkKFxuICAgICAgICAgICAgY29udHJvbEZpZWxkLFxuICAgICAgICAgICAgZGF0YUZpZWxkLFxuICAgICAgICAgICAgY2FuRWRpdE9iamVjdFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb250cm9sRmllbGQuQXBpTmFtZSA9PT0gJ09iamVjdE1lbnUnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnbWVudSc7XG4gICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBJbnRlcm5hbE1lbnVGaWVsZChvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5GaWVsZFR5cGUgPT09XG4gICAgICAgICAgICBGSUVMRF9UWVBFLk51bWJlckludGVnZXJRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuQXBpTmFtZSA9PT0gJ1F1YW50aXR5U2VsZWN0b3InIHx8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuQXBpTmFtZSA9PT0gJ1VuaXRzUXVhbnRpdHknIHx8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuQXBpTmFtZS5pbmRleE9mKCdzaXplXycpID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW50ZXJuYWxMaW5rKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuUGFja2FnZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdwYWNrYWdlQnV0dG9uJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3FzJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09XG4gICAgICAgICAgICAgICAgRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlclxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3FzJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlckludGVnZXJGb3JNYXRyaXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdxc0Zvck1hdHJpeCc7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsRm9yTWF0cml4KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3FzRm9yTWF0cml4JztcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9wdGlvbnMubm90aWZpY2F0aW9uSW5mbyA9IGRhdGFGaWVsZC5Ob3RpZmljYXRpb25JbmZvO1xuICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwUXVhbnRpdHlTZWxlY3RvckZpZWxkKG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSEFDSzogbmVlZCB0byByZW1vdmUgdGhpcy4uXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5JbmRpY2F0b3JzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5pc01hdHJpeEZpZWxkKGRhdGFGaWVsZC5BcGlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9IEZJRUxEX1RZUEUuSW50ZXJuYWxQYWdlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGRhdGFGaWVsZC5GaWVsZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQWRkcmVzczoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5FZGl0R3JvdXBPYmplY3QgPSBjb250cm9sRmllbGQuUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuRWRpdE9iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ncm91cEZpZWxkcyA9IHRoaXMuY29udmVydEFkZHJlc3NGaWVsZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQuR3JvdXBGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5FZGl0R3JvdXBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwQWRkcmVzc0ZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkluZGljYXRvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uc1sndHlwZSddID0gJ2luZGljYXRvcnMnOyAvLyBOb3QgbmVlZGVkIHRoaXMgaXMgUGVwSW5kaWNhdG9yc0ZpZWxkLlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBJbmRpY2F0b3JzRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuSW50ZXJuYWxQYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWF0cml4RmllbGQoY29udHJvbEZpZWxkLkFwaU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJvd1NwYW4gPSBjb250cm9sRmllbGQuTGF5b3V0LkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub2JqZWN0SWQgPSBvYmplY3RJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQ29kZSA9IHNlYXJjaENvZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsUGFnZUZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuUmVsYXRlZE9iamVjdHNDYXJkczoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJvd1NwYW4gPSBjb250cm9sRmllbGQuTGF5b3V0LkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hDb2RlID0gc2VhcmNoQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYWdlSW5mbyA9IGRhdGFGaWVsZC5VSVBhZ2VJbmZvO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQ2FydXNlbEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkxpbms6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2xpbmsnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBMaW5rRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuSW50ZXJuYWxMaW5rOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5CdXR0b246IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQnV0dG9uRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQXR0YWNobWVudDoge1xuICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25zLnR5cGUgPSAnYXR0YWNobWVudCc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEF0dGFjaG1lbnRGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5TaWduYXR1cmU6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucy50eXBlID0gJ3NpZ25hdHVyZSc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNpZ25hdHVyZUZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkltYWdlOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5JbWFnZVVSTDoge1xuICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25zLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1lbnVGaWVsZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51RmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvZXNGaWVsZEhhdmFGbG9hdGluZ0ZpZWxkKGNvbnRyb2xGaWVsZCwgbWVudUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWVudUZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhhc0NhbXBhaWduRmllbGQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2FtcGFpZ25GaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9lc0ZpZWxkSGF2YUZsb2F0aW5nRmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2FtcGFpZ25GaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGhhc0NhbXBhaWduRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kaWNhdG9yc0ZpZWxkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvcnNGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9lc0ZpZWxkSGF2YUZsb2F0aW5nRmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5kaWNhdG9yc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEltYWdlRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuSW1hZ2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMudHlwZSA9ICdpbWFnZXMnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBJbWFnZXNGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5FbWFpbDoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnZW1haWwnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBMaW5rRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuUGhvbmU6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3Bob25lJztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwTGlua0ZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdkdXJhdGlvbic7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFRleHRib3hGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5EZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5UZXh0Qm94OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5MaW1pdGVkTGVuZ3RoVGV4dEJveDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuVGV4dEhlYWRlcjpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ2FsY3VsYXRlZFN0cmluZzpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTWFwRGF0YVN0cmluZzoge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuVGV4dEFyZWE6IHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGFyZWFGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLlJpY2hUZXh0SFRNTDoge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBSaWNoSHRtbFRleHRhcmVhRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuRGF0ZTpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTGltaXRlZERhdGU6XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkNhbGN1bGF0ZWREYXRlOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5EYXRlQW5kVGltZToge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5EYXRlQW5kVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2RhdGV0aW1lJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2RhdGUnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBEYXRlRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlcjpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ2FsY3VsYXRlZEludDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTWFwRGF0YUludDoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnaW50JztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGJveEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLlBlcmNlbnRhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3BlcmNlbnRhZ2UnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ3VycmVuY3k6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2N1cnJlbmN5JztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGJveEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLk51bWJlclJlYWw6XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkNhbGN1bGF0ZWRSZWFsOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5NYXBEYXRhUmVhbDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuU3VtOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5Ub3RhbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3JlYWwnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ2FsY3VsYXRlZEJvb2w6IHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwQ2hlY2tib3hGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5Cb29sZWFuVGV4dDoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnYm9vbGVhblRleHQnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBDaGVja2JveEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkNvbWJvQm94OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5FbXB0eUNvbWJvQm94OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5NYXBEYXRhRHJvcERvd246IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucy50eXBlID0gJ3NlbGVjdCc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNlbGVjdEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLk11bHRpVGlja0JveDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTXVsdGlUaWNrQm94VG9Db21ib0JveDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuRW1wdHlNdWx0aVRpY2tCb3g6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ211bHRpJztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwU2VsZWN0RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuR3VpZFJlZmVyZW5jZVR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3JlZmVyZW5jZSc7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmZXJlbmNlT2JqZWN0VHlwZSA9IGRhdGFGaWVsZC5SZWZlcmVuY2VPYmplY3RUeXBlO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJlZmVyZW5jZU9iamVjdFN1YlR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkLlJlZmVyZW5jZU9iamVjdFN1YlR5cGU7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmZXJlbmNlT2JqZWN0SW50ZXJuYWxUeXBlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5SZWZlcmVuY2VPYmplY3RJbnRlcm5hbFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQnV0dG9uRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTGlzdE9mT2JqZWN0czoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnbGlzdG9mb2JqZWN0cyc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQnV0dG9uRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuU2VwYXJhdG9yOiB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNlcGFyYXRvckZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkltYWdlczogcmV0dXJuIHRoYXQuZmllbGQodmFsdWUpO1xuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLk51bWJlclJlYWxRdWFudGl0eVNlbGVjdG9yOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyUXVhbnRpdHlTZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAncXMnO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQuRmllbGRUeXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub3RpZmljYXRpb25JbmZvID0gZGF0YUZpZWxkLk5vdGlmaWNhdGlvbkluZm87XG5cbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwUXVhbnRpdHlTZWxlY3RvckZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLlBhY2thZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3BhY2thZ2VCdXR0b24nO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmaWNhdGlvbkluZm8gPSBkYXRhRmllbGQuTm90aWZpY2F0aW9uSW5mbztcblxuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBRdWFudGl0eVNlbGVjdG9yRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY3VzdG9tRmllbGQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubGFiZWwgPSBjb250cm9sRmllbGQuQXBpTmFtZSArICcgaXMgbm90IHN1cHBvcnRlZCEhISc7XG4gICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBTZXBhcmF0b3JGaWVsZChvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXN0b21GaWVsZDtcbiAgICB9XG5cbiAgICBnZXRGaWVsZEZvcm1hdHRlZFZhbHVlKGZpZWxkOiBQZXBGaWVsZEJhc2UpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZmllbGRGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkLmZvcm1hdHRlZFZhbHVlO1xuXG4gICAgICAgIC8vIEZpeCBmb3IgdGhlIGN1c3RvbSBjaGVjayBib3ggY29tcG9uZW50LlxuICAgICAgICBpZiAoZmllbGQuY29udHJvbFR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgIGZpZWxkRm9ybWF0dGVkVmFsdWUgPSBmaWVsZEZvcm1hdHRlZFZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXggZm9yIHRoZSBjdXN0b20gYnV0dG9uIGNvbXBvbmVudC5cbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2xUeXBlID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZSA9PT0gJzAnID8gJycgOiBmaWVsZEZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkRm9ybWF0dGVkVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b0NvbnRyb2xHcm91cChmaWVsZHM6IFBlcEZpZWxkQmFzZVtdKTogRm9ybUdyb3VwIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB7fTtcbiAgICAgICAgaWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdyb3VwRmllbGRzICYmIGZpZWxkLmdyb3VwRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViR3JvdXAgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5ncm91cEZpZWxkcy5mb3JFYWNoKChncm91cEZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZC5tYW5kYXRvcnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmllbGQucmVhZG9ubHkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmllbGQuZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ykdyb3VwW2dyb3VwRmllbGQua2V5XSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwRmllbGQuZm9ybWF0dGVkVmFsdWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWFkb25seSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRpc2FibGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ykdyb3VwW2dyb3VwRmllbGQua2V5XSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwRmllbGQuZm9ybWF0dGVkVmFsdWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWFkb25seSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRpc2FibGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZmllbGQua2V5XSA9IHRoaXMuZmIuZ3JvdXAoc3ViR3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBmaWVsZC5nZXRWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0dGVkVmFsdWUgPSB0aGlzLmdldEZpZWxkRm9ybWF0dGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwW2ZpZWxkLmtleV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkRm9ybWF0dGVkVmFsdWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mYi5ncm91cChncm91cCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCYXNlRmllbGQodWlDb250cm9sRmllbGQ6IFVJQ29udHJvbEZpZWxkLCBkYXRhRmllbGQ6IGFueSkge1xuICAgICAgICBjb25zdCBjdXN0b21GaWVsZDogUGVwRmllbGRCYXNlID0gdGhpcy5jb252ZXJ0VG9DdXN0b21GaWVsZChcbiAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLFxuICAgICAgICAgICAgZGF0YUZpZWxkLFxuICAgICAgICAgICAgdGhpcy5jYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgdGhpcy5tZW51RGF0YUZpZWxkLFxuICAgICAgICAgICAgdGhpcy5oYXNDYW1wYWlnbkRhdGFGaWVsZCxcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0RhdGFGaWVsZCxcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQsXG4gICAgICAgICAgICB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb2RlXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGN1c3RvbUZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93Rm9ybVZhbGlkYXRpb25NZXNzYWdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZHM6IFBlcEZpZWxkQmFzZVtdID0gdGhpcy5maWVsZHM7XG4gICAgICAgIGxldCBlbXB0eU1hbmRhdG9yeUZpZWxkc01zZyA9ICcnO1xuICAgICAgICBsZXQgbm90VmFsaWRGaWVsZHNNc2cgPSAnJztcblxuICAgICAgICAvLyBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vICAgICBsZXQgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZ2V0KGZpZWxkLmtleSk7XG5cbiAgICAgICAgICAgIGlmIChmb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIC8vIE1hbmRhdG9yeSBpcyBlbXB0eS5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLm1hbmRhdG9yeSAmJlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC52YWx1ZS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1wdHlNYW5kYXRvcnlGaWVsZHNNc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGk+PHNtYWxsPicgKyBmaWVsZC5sYWJlbCArICc8L3NtYWxsPjwvbGk+JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC5kaXNhYmxlZCAmJiAhZm9ybUNvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90VmFsaWRGaWVsZHNNc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGk+PHNtYWxsPicgKyBmaWVsZC5sYWJlbCArICc8L3NtYWxsPjwvbGk+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIGhlYWRlciBtZXNzYWdlIG9mIHRoZSBlbXB0eSBtYW5kYXRvcnkgZmllbGRzXG4gICAgICAgIGlmIChlbXB0eU1hbmRhdG9yeUZpZWxkc01zZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlbXB0eU1hbmRhdG9yeUZpZWxkc01zZyA9XG4gICAgICAgICAgICAgICAgJzxkaXY+JyArXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuRVJST1JfTUFOREFUT1JZX0ZJRUxEUycpICtcbiAgICAgICAgICAgICAgICBcIjwvZGl2Pjx1bCBzdHlsZT0ncGFkZGluZzogMCAyMHB4Oyc+XCIgK1xuICAgICAgICAgICAgICAgIGVtcHR5TWFuZGF0b3J5RmllbGRzTXNnICtcbiAgICAgICAgICAgICAgICAnPC91bD48YnIvPic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIGhlYWRlciBtZXNzYWdlIG9mIHRoZSBlbXB0eSBtYW5kYXRvcnkgZmllbGRzXG4gICAgICAgIGlmIChub3RWYWxpZEZpZWxkc01zZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBub3RWYWxpZEZpZWxkc01zZyA9XG4gICAgICAgICAgICAgICAgJzxkaXY+JyArXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuRVJST1JfSU5WQUxJRF9GSUVMRFMnKSArXG4gICAgICAgICAgICAgICAgXCI8L2Rpdj48dWwgc3R5bGU9J3BhZGRpbmc6IDAgMjBweDsnPlwiICtcbiAgICAgICAgICAgICAgICBub3RWYWxpZEZpZWxkc01zZyArXG4gICAgICAgICAgICAgICAgJzwvdWw+JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuVElUTEVfTk9USUNFJyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgUGVwRGlhbG9nRGF0YSh7XG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGVtcHR5TWFuZGF0b3J5RmllbGRzTXNnICsgbm90VmFsaWRGaWVsZHNNc2csXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkRlZmF1bHREaWFsb2coZGF0YSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoZW1lVmFycyA9IHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0VGhlbWVWYXJpYWJsZXMoKTtcbiAgICAgICAgLy8gY29udmVydCByZW0gdG8gcGl4ZWxcbiAgICAgICAgY29uc3QgUmVtVG9QaXhlbCA9IDE2O1xuICAgICAgICB0aGlzLmZvcm1HdXR0ZXJTaXplID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9STV9TUEFDRUlOR19LRVlcbiAgICAgICAgICAgICkgKiBSZW1Ub1BpeGVsO1xuICAgICAgICB0aGlzLmNhcmRHdXR0ZXJTaXplID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ0FSRF9TUEFDRUlOR19LRVlcbiAgICAgICAgICAgICkgKiBSZW1Ub1BpeGVsO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYodGhpcy5kYXRhKTsgLy8gY2hlY2sgZm9yIGNoYW5nZXNcbiAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckNoYW5nZXMgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcyk6IHZvaWQge1xuICAgICAgICAvLyBpZiAoY2hhbmdlcy5kYXRhICYmIGNoYW5nZXMuZGF0YS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgLy8gICAgIC8vIExvYWQgY2hhbmdlc1xuICAgICAgICAvLyAgICAgaWYgKCF0aGlzLnNob3VsZFJlbG9hZEZvcm0gJiYgY2hhbmdlcy5kYXRhLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmRhdGEgPSBjaGFuZ2VzLmRhdGEuY3VycmVudFZhbHVlO1xuICAgICAgICAvLyAgICAgICAgIHRoaXMudXBkYXRlRm9ybSgpO1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRGb3JtID0gZmFsc2U7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmICh0aGlzLnNob3VsZFJlbG9hZEZvcm0gfHwgIWNoYW5nZXM/LmRhdGE/LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3Nob3VsZFJlbG9hZEZvcm0gPSBmYWxzZTtcbiAgICAgICAgLy8gICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICAgICAgLy8gICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIGdldFVpQ29udHJvbEZpZWxkcygpOiBBcnJheTxVSUNvbnRyb2xGaWVsZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQgPyB0aGlzLmxheW91dC5Db250cm9sRmllbGRzIDogW107XG4gICAgfVxuXG4gICAgaW5pdEZpZWxkc1N0cnVjdHVyZShmaWVsZHM6IFBlcEZpZWxkQmFzZVtdLCBtYXhSb3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldFRoZW1lVmFyaWFibGVzKCk7XG5cbiAgICAgICAgLy8gU2V0IGZvcm0gcm93IGhlaWdodC5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0VHlwZSA9PT0gJ2NhcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBjYXJkRmllbGRIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNBUkRfRklFTERfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gY2FyZEZpZWxkSGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgcm93RmllbGRIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPUk1fRklFTERfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZpZWxkVGl0bGVIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPUk1fRklFTERfVElUTEVfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gcm93RmllbGRIZWlnaHQgKyByb3dGaWVsZFRpdGxlSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWVsZHMgc3RydWN0dXJlICh0aGUgZmllbGRzIG11c3QgYmUgc29ydGVkISEhKS5cbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJbml0IHRoZSBsYXlvdXQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRUeXBlID09PSAnZm9ybScgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFR5cGUgPT09ICd0YWJsZSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkc1N1YmplY3QubmV4dChmaWVsZHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhSb3c7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd3NbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dzW2ZpZWxkLnJvd10ucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2VzZmllbGRFeGlzdEluOiBib29sZWFuW11bXSA9IG5ldyBBcnJheShtYXhSb3cpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2VzZmllbGRFeGlzdEluLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5baV0gPSBuZXcgQXJyYXkodGhpcy5jb2x1bW5zKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRvZXNmaWVsZEV4aXN0SW5baV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5baV1bal0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJ1biBpbiBzcXVlcmUgKHJvdyAtIGNvbHNwYW4sIGNvbCAtIHJvd3NwYW4pIGFuZCBwdXQgdHJ1ZSB3aGVyZSBpdCBzaG91bGQuXG4gICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc3QgY3VycmVudEZpZWxkID0gZmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRGaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5yb3dTcGFuID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93OiBudW1iZXIgPSBjdXJyZW50RmllbGQucm93O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8IGN1cnJlbnRGaWVsZC5yb3cgKyBjdXJyZW50RmllbGQucm93U3BhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3crK1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5jb2xTcGFuID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbDogbnVtYmVyID0gY3VycmVudEZpZWxkLmNvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuY29sICsgY3VycmVudEZpZWxkLmNvbFNwYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wrK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzZmllbGRFeGlzdEluLmxlbmd0aCA+IHJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bMF0ubGVuZ3RoID4gY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzZmllbGRFeGlzdEluW3Jvd11bY29sXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzZmllbGRFeGlzdEluLmxlbmd0aCA+IHJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc2ZpZWxkRXhpc3RJblswXS5sZW5ndGggPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bcm93XVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmllbGQuY29sU3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbDogbnVtYmVyID0gY3VycmVudEZpZWxkLmNvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPCBjdXJyZW50RmllbGQuY29sICsgY3VycmVudEZpZWxkLmNvbFNwYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sKytcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc2ZpZWxkRXhpc3RJbi5sZW5ndGggPiBjdXJyZW50RmllbGQucm93ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bMF0ubGVuZ3RoID4gY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bY3VycmVudEZpZWxkLnJvd11bY29sXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW4ubGVuZ3RoID4gY3VycmVudEZpZWxkLnJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bMF0ubGVuZ3RoID4gY3VycmVudEZpZWxkLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc2ZpZWxkRXhpc3RJbltjdXJyZW50RmllbGQucm93XVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGVtcHR5IGZpZWxkcyB3aGVyZSBkb2VzZmllbGRFeGlzdEluIGlzIGZhbHNlIChGb3IgdGhlIG1kLWdyaWQtbGlzdCBVSSBDb21wb25lbnQpLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9lc2ZpZWxkRXhpc3RJbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRvZXNmaWVsZEV4aXN0SW5baV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9lc2ZpZWxkRXhpc3RJbltpXVtqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBlbXB0eSBmaWVsZCBhbmQgYWRkIGl0IHRvIHRoZSBmaWVsZHMgbGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBlcFBsYWNlaG9sZGVyRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBpICsgJ18nICsgaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU29ydCB0aGUgZmllbGRzIGFnYWluLlxuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzLnNvcnQoKGYxLCBmMikgPT5cbiAgICAgICAgICAgICAgICAgICAgZjEucm93ID4gZjIucm93XG4gICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZjEucm93IDwgZjIucm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZjEuY29sID4gZjIuY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGYxLmNvbCA8IGYyLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWVsZHNTdWJqZWN0Lm5leHQoZmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvcm0oaXNGb3JVcGRhdGUgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBsZXQgYWxsRmllbGRzQXJlUmVhZE9ubHkgPSB0cnVlO1xuXG4gICAgICAgIGlmICghaXNGb3JVcGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50RmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIGZpZWxkcyBleGNlcHQgJ2ludGVybmFsUGFnZScgKGZvciBjaGlsZHJlbikuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5jb250cm9sVHlwZSAhPT0gJ2ludGVybmFsUGFnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzLnB1c2goY3VycmVudEZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRGaWVsZC5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxGaWVsZHNBcmVSZWFkT25seSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy50b0NvbnRyb2xHcm91cChmaWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gdmFsdWVzIGlmIGNoYW5nZWQgYnkgY2FsY3VsYXRlZCBmaWVsZHMuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRGaWVsZCA9IHRoaXMuZmllbGRzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5jb250cm9sVHlwZSA9PT0gJ2ludGVybmFsQ2FydXNlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFjayB0byBvdmVycmlkZSAodXBkYXRlKSB0aGUgZmllbGQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkID0gdGhpcy5nZXRVaUNvbnRyb2xGaWVsZHMoKS5maW5kKGNmID0+IGNmLkFwaU5hbWUgPT09IGN1cnJlbnRGaWVsZC5rZXkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSB0aGlzLmRhdGEuRmllbGRzLmZpbmQoZGYgPT4gZGYuQXBpTmFtZSA9PT0gY3VycmVudEZpZWxkLmtleSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCA9IHRoaXMuY3JlYXRlQmFzZUZpZWxkKHVpQ29udHJvbEZpZWxkLCBkYXRhRmllbGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWVsZHNTdWJqZWN0LnZhbHVlW2ldID0gY3VycmVudEZpZWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpZWxkLmNvbnRyb2xUeXBlICE9PSAnaW50ZXJuYWxQYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuZ3JvdXBGaWVsZHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5ncm91cEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RmllbGQuZ3JvdXBGaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsZXQgY3VycmVudEdyb3VwRmllbGQgPSBjdXJyZW50RmllbGQuZ3JvdXBGaWVsZHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRHcm91cEZpZWxkIG9mIGN1cnJlbnRGaWVsZC5ncm91cEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0dGVkVmFsdWUgPSB0aGlzLmdldEZpZWxkRm9ybWF0dGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLnVwZGF0ZUZvcm1GaWVsZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0dGVkVmFsdWUgPSB0aGlzLmdldEZpZWxkRm9ybWF0dGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5mb3JtLmNvbnRyb2xzW2N1cnJlbnRGaWVsZC5rZXldLnNldFZhbHVlKGZpZWxkRm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXN0b21pemF0aW9uU2VydmljZS51cGRhdGVGb3JtRmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50RmllbGQucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRmllbGRzQXJlUmVhZE9ubHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNGb3JtVmFsaWQgPSB0aGlzLmZvcm0/LnZhbGlkO1xuXG4gICAgICAgIC8vIENoYW5nZSB2YWxpZGF0aW9uIHRvIHRydWUgaWYgYWxsIGZpZWxkcyBhcmUgcmVhZCBvbmx5LlxuICAgICAgICBpZiAoIWlzRm9ybVZhbGlkICYmIGFsbEZpZWxkc0FyZVJlYWRPbmx5KSB7XG4gICAgICAgICAgICBpc0Zvcm1WYWxpZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRm9ybVZhbGlkYXRpb25DaGFuZ2VkKGlzRm9ybVZhbGlkKTtcblxuICAgICAgICAvLyBTZXQgaXQgdG8gZmFsc2UgdG8gZW5hYmxlIGFsbCBmaWVsZHMuXG4gICAgICAgIGlmICh0aGlzLmlzSW50ZXJuYWwgJiYgdGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlOyBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRGb3JtKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5GaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUGVwRmllbGRCYXNlW10gPSB0aGlzLmNvbnZlcnRDdXN0b21GaWVsZHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVaUNvbnRyb2xGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuRmllbGRzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXhSb3cgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAuLi5maWVsZHMubWFwKChmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmLnJvdyArIGYucm93U3BhbjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgIC4uLmZpZWxkcy5tYXAoKGYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYuY29sICsgZi5jb2xTcGFuO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLmluaXRGaWVsZHNTdHJ1Y3R1cmUoZmllbGRzLCBtYXhSb3cpO1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkKFxuICAgICAgICBjdXN0b21GaWVsZDogUGVwRmllbGRCYXNlLFxuICAgICAgICB1cGRhdGVkRmllbGQ6IE9iamVjdHNEYXRhUm93Q2VsbFxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgICAgICAgICBkaXNhYmxlZDogIXVwZGF0ZWRGaWVsZC5FbmFibGVkIHx8ICF0aGlzLmNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICByZWFkb25seTogIXVwZGF0ZWRGaWVsZC5FbmFibGVkIHx8ICF0aGlzLmNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICB2aXNpYmxlOiB1cGRhdGVkRmllbGQuVmlzaWJsZSxcbiAgICAgICAgICAgIHZhbHVlOiB1cGRhdGVkRmllbGQuVmFsdWUsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVmFsdWU6IHVwZGF0ZWRGaWVsZC5BZGRpdGlvbmFsVmFsdWUsXG4gICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdXBkYXRlZEZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgdGV4dENvbG9yOiB1cGRhdGVkRmllbGQuVGV4dENvbG9yLFxuICAgICAgICAgICAgZGlnaXRzTnVtYmVyQWZ0ZXJEZWNpbWFsUG9pbnQ6IHVwZGF0ZWRGaWVsZC5EaWdpdHNOdW1iZXJBZnRlckRlY2ltYWxQb2ludCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY3VzdG9tRmllbGQgaW5zdGFuY2VvZiBQZXBRdWFudGl0eVNlbGVjdG9yRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkluZm8gPSB1cGRhdGVkRmllbGQuTm90aWZpY2F0aW9uSW5mbztcbiAgICAgICAgICAgIG9wdGlvbnMubm90aWZpY2F0aW9uSW5mbyA9IG5vdGlmaWNhdGlvbkluZm87XG5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0eXBlIGlmIGl0J3MgY2hhbmdlIChvbmx5IGZvciBhbGxvd0RlY2ltYWwpLlxuICAgICAgICAgICAgbGV0IGFsbG93RGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZWRGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICB1cGRhdGVkRmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlclJlYWwgfHxcbiAgICAgICAgICAgICAgICB1cGRhdGVkRmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlclJlYWxGb3JNYXRyaXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFsbG93RGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IGFsbG93RGVjaW1hbDtcblxuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUZpZWxkIGluc3RhbmNlb2YgUGVwU2VsZWN0RmllbGQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub3B0aW9ucyA9IHRoaXMuY29udmVydE9wdGlvbmFsVmFsdWVzKFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWVsZC5PcHRpb25hbFZhbHVlc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLm9wdGlvbnMgfHwgb3B0aW9ucy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5mb3JtYXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21GaWVsZCBpbnN0YW5jZW9mIFBlcEludGVybmFsQ2FydXNlbEZpZWxkKSB7XG4gICAgICAgICAgICBvcHRpb25zLnBhZ2VJbmZvID0gdXBkYXRlZEZpZWxkLlVJUGFnZUluZm87XG4gICAgICAgIH1cblxuICAgICAgICBjdXN0b21GaWVsZC51cGRhdGUob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlRm9ybSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuRmllbGRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRGaWVsZCBvZiB0aGlzLmRhdGEuRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRmllbGQgPSB0aGlzLmZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmKSA9PiBmLmtleSA9PT0gY3VycmVudEZpZWxkLkFwaU5hbWVcbiAgICAgICAgICAgICAgICApWzBdO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgZmllbGRzIGV4Y2VwdCAnaW50ZXJuYWxQYWdlJyB0eXBlIChmb3IgY2hpbGRyZW4pLlxuICAgICAgICAgICAgICAgIGlmIChjdXN0b21GaWVsZCAmJiBjdXN0b21GaWVsZC5jb250cm9sVHlwZSAhPT0gJ2ludGVybmFsUGFnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZChjdXN0b21GaWVsZCwgY3VycmVudEZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGdyb3VwIGZpZWxkcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQuY29udHJvbFR5cGUgPT09ICdhZGRyZXNzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLkdyb3VwRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RmllbGQuR3JvdXBGaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBjdXJyZW50R3JvdXBGaWVsZCA9IGN1cnJlbnRGaWVsZC5Hcm91cEZpZWxkc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudEdyb3VwRmllbGQgb2YgY3VycmVudEZpZWxkLkdyb3VwRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwRmllbGQuRW5hYmxlZCA9ICFjdXJyZW50RmllbGQuRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudEdyb3VwRmllbGQuRW5hYmxlZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUdyb3VwRmllbGQgPSBjdXN0b21GaWVsZC5ncm91cEZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmKSA9PiBmLmtleSA9PT0gY3VycmVudEdyb3VwRmllbGQuQXBpTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tR3JvdXBGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldEZvcm0odHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgUmVsb2FkRm9ybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkRm9ybSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gb25TdWJtaXQoKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAvLyAgICAgICAgIHRoaXMucGF5TG9hZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgLy8gICAgICAgICAvL3RoaXMuc3VibWl0dGVkLmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybUNvbnRyb2xCeUlkKGtleTogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB7XG4gICAgICAgIGxldCBmb3JtQ29udHJvbCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZC5rZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ3JvdXBGaWVsZHMgJiYgZmllbGQuZ3JvdXBGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpZWxkLmdyb3VwRmllbGRzLmZvckVhY2goKGdyb3VwRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwRmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5rZXkgKyAnLicgKyBncm91cEZpZWxkLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTcGVjaWFsRmllbGRzKFxuICAgICAgICBjb250cm9sRmllbGRzOiBBcnJheTxhbnk+LFxuICAgICAgICBkYXRhRmllbGRzOiBBcnJheTxhbnk+XG4gICAgKTogdm9pZCB7XG4gICAgICAgIC8vIGxldCBjZjtcbiAgICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRyb2xGaWVsZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIC8vICAgICBjZiA9IGNvbnRyb2xGaWVsZHNbaW5kZXhdO1xuICAgICAgICBmb3IgKGNvbnN0IGNmIG9mIGNvbnRyb2xGaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChjZi5BcGlOYW1lID09PSAnT2JqZWN0TWVudScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVGaWVsZCA9IGNmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjZi5BcGlOYW1lID09PSAnSXRlbUhhc0FjdGl2ZUNhbXBhaWduJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ2FtcGFpZ25GaWVsZCA9IGNmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjZi5BcGlOYW1lID09PSAnSXRlbUluZGljYXRvcnNXaXRob3V0Q2FtcGFpZ24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3JzRmllbGQgPSBjZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldCBkZjtcbiAgICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFGaWVsZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIC8vICAgICBkZiA9IGRhdGFGaWVsZHNbaW5kZXhdO1xuICAgICAgICBmb3IgKGNvbnN0IGRmIG9mIGRhdGFGaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChkZi5BcGlOYW1lID09PSAnT2JqZWN0TWVudScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVEYXRhRmllbGQgPSBkZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGYuQXBpTmFtZSA9PT0gJ0l0ZW1IYXNBY3RpdmVDYW1wYWlnbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NhbXBhaWduRGF0YUZpZWxkID0gZGY7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRmLkFwaU5hbWUgPT09ICdJdGVtSW5kaWNhdG9yc1dpdGhvdXRDYW1wYWlnbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljYXRvcnNEYXRhRmllbGQgPSBkZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1lbnVGaWVsZCAmJiB0aGlzLm1lbnVEYXRhRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMubWVudURhdGFGaWVsZC5MYXlvdXQgPSB0aGlzLm1lbnVGaWVsZC5MYXlvdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNDYW1wYWlnbkZpZWxkICYmIHRoaXMuaGFzQ2FtcGFpZ25EYXRhRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzQ2FtcGFpZ25EYXRhRmllbGQuTGF5b3V0ID0gdGhpcy5oYXNDYW1wYWlnbkZpZWxkLkxheW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGljYXRvcnNGaWVsZCAmJiB0aGlzLmluZGljYXRvcnNEYXRhRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0RhdGFGaWVsZC5MYXlvdXQgPSB0aGlzLmluZGljYXRvcnNGaWVsZC5MYXlvdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBtZW51IGlzIGZsb2F0aW5nIG9uIG90aGVyIGZpZWxkLlxuICAgICAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udHJvbEZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgLy8gICAgIGNmID0gY29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgIGZvciAoY29uc3QgY2Ygb2YgY29udHJvbEZpZWxkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVudUZpZWxkICYmIGNmLkFwaU5hbWUgIT09ICdPYmplY3RNZW51Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzTWVudUZsb2F0aW5nT25PdGhlckZpZWxkID0gdGhpcy5kb2VzRmllbGRIYXZhRmxvYXRpbmdGaWVsZChcbiAgICAgICAgICAgICAgICAgICAgY2YsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVudUZpZWxkXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc01lbnVGbG9hdGluZ09uT3RoZXJGaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb252ZXJ0Q3VzdG9tRmllbGRzKFxuICAgICAgICBjb250cm9sRmllbGRzOiBBcnJheTxhbnk+LFxuICAgICAgICBkYXRhRmllbGRzOiBBcnJheTxhbnk+XG4gICAgKTogUGVwRmllbGRCYXNlW10ge1xuICAgICAgICBpZiAodGhpcy5sYXlvdXRUeXBlICE9PSAndGFibGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNwZWNpYWxGaWVsZHMoY29udHJvbEZpZWxkcywgZGF0YUZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBIQUNLOiBjb252ZXJ0IHRvIGNlbnRlciBhbGlnbm1lbnQgaWYgdGFibGUgdmlldyAmIHNwZWNpYWwgZmllbGRzKVxuICAgICAgICAgICAgY29udHJvbEZpZWxkcy5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkFwaU5hbWUgPT09ICdVbml0c1F1YW50aXR5JyB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5BcGlOYW1lID09PSAnUXVhbnRpdHlTZWxlY3RvcicgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuQXBpTmFtZSA9PT0gJ09iamVjdE1lbnUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5JbWFnZSB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW1hZ2VVUkwgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkluZGljYXRvcnMgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkJvb2xlYW4gfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkNhbGN1bGF0ZWRCb29sIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5TaWduYXR1cmUgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PVxuICAgICAgICAgICAgICAgICAgICBGSUVMRF9UWVBFLk51bWJlckludGVnZXJRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuUGFja2FnZSB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlckZvck1hdHJpeCB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbEZvck1hdHJpeFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5MYXlvdXQuWEFsaWdubWVudCA9IFhfQUxJR05NRU5UX1RZUEUuQ2VudGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhBQ0s6IGFsaWduIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgYnkgdGhlIGN1bHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkLkxheW91dC5YQWxpZ25tZW50ID0gdGhpcy5sYXlvdXRTZXJ2aWNlLmlzUnRsKCkgPyBYX0FMSUdOTUVOVF9UWVBFLlJpZ2h0IDogWF9BTElHTk1FTlRfVFlQRS5MZWZ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRzOiBQZXBGaWVsZEJhc2VbXSA9IFtdO1xuXG4gICAgICAgIGNvbnRyb2xGaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSBkYXRhRmllbGRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZGYpID0+IGRmLkFwaU5hbWUgPT09IGZpZWxkLkFwaU5hbWVcbiAgICAgICAgICAgIClbMF07XG5cbiAgICAgICAgICAgIGlmICghZGF0YUZpZWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgbm90IHRhYmxlIHZpZXcgYW5kIHRob3NlIGZpZWxkcyBhcmUgc3BlY2lhbC5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFR5cGUgIT09ICd0YWJsZScgJiZcbiAgICAgICAgICAgICAgICAoKHRoaXMuaGFzTWVudUZsb2F0aW5nT25PdGhlckZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVudUZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVudUZpZWxkLkFwaU5hbWUgPT09IGZpZWxkLkFwaU5hbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmluZGljYXRvcnNGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3JzRmllbGQuQXBpTmFtZSA9PT0gZmllbGQuQXBpTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaGFzQ2FtcGFpZ25GaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNDYW1wYWlnbkZpZWxkLkFwaU5hbWUgPT09IGZpZWxkLkFwaU5hbWUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdHlwZSB0byBsaW5rXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgdGhpcy5maXJzdEZpZWxkQXNMaW5rKSB7XG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9IEZJRUxEX1RZUEUuSW50ZXJuYWxMaW5rO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFGaWVsZC5WYWx1ZSA9IHRoaXMuZ2V0SW50ZXJuYWxMaW5rSHJlZigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmllbGQuQXBpTmFtZSA9PT0gJ09iamVjdE1lbnUnKSB7XG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEhBQ0sgOiBVbnRpbCBcIkVuYWJsZWRcIiByZXR1cm5zIGZyb20gdGhlIHNlcnZlciwgd2Ugc2V0IFBlcE1lbnUgdG8gYmVcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgRGlzYWJsZWQgaW4gY2FydCBvbiByZWd1bGFyIGl0ZW1zIGFuZCBub3QgY2FtcGlnbiBpdGVtcy5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZpZWxkOiBQZXBGaWVsZEJhc2UgPSB0aGlzLmNyZWF0ZUJhc2VGaWVsZChmaWVsZCwgZGF0YUZpZWxkKTtcbiAgICAgICAgICAgIGZpZWxkcy5wdXNoKGN1c3RvbUZpZWxkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcy5zb3J0KChmMSwgZjIpID0+XG4gICAgICAgICAgICBmMS5yb3cgPiBmMi5yb3dcbiAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICA6IGYxLnJvdyA8IGYyLnJvd1xuICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgIDogZjEuY29sID4gZjIuY29sXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZjEuY29sIDwgZjIuY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkYXRpb25DaGFuZ2VkKGZvcm1WYWxpZGF0aW9uQ2hhbmdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGlvbkNoYW5nZS5lbWl0KGZvcm1WYWxpZGF0aW9uQ2hhbmdlKTtcbiAgICB9XG5cbiAgICBvblZhbHVlQ2hhbmdlZChldmVudDogSVBlcEZpZWxkVmFsdWVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRm9ybVZhbGlkYXRpb25DaGFuZ2VkKHRoaXMuZm9ybS52YWxpZCk7XG5cbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmdldEZvcm1Db250cm9sQnlJZChldmVudC5rZXkpO1xuXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBmb3JtQ29udHJvbCA/IGZvcm1Db250cm9sLnZhbGlkIDogdHJ1ZTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgIC8vIFNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBmaWVsZHMuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ludGVybmFsICYmIHRoaXMubGF5b3V0VHlwZSA9PT0gJ2Zvcm0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBmaWVsZCB2YWx1ZS5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoKGYpID0+IGYua2V5ID09PSBldmVudC5rZXkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5mb3JtYXR0ZWRWYWx1ZSA9IGN1cnJlbnRGaWVsZC52YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuVUlELnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdWlPYmplY3RLZXk6IHRoaXMuZGF0YS5LZXksXG4gICAgICAgICAgICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlOiBldmVudC5jb250cm9sVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DbGljayhmaWVsZENsaWNrRXZlbnQ6IElQZXBGaWVsZENsaWNrRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xpY2tlZFVpQ29udHJvbEZpZWxkID0gdGhpcy5kYXRhLkZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAoZikgPT4gZi5BcGlOYW1lID09PSBmaWVsZENsaWNrRXZlbnQua2V5XG4gICAgICAgIClbMF07XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IHRoaXMuZGF0YS5UeXBlID8gdGhpcy5kYXRhLlR5cGUudG9TdHJpbmcoKSA6ICcnO1xuXG4gICAgICAgIGlmIChjbGlja2VkVWlDb250cm9sRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGRDbGljay5lbWl0KHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhLlVJRC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHVpT2JqZWN0S2V5OiB0aGlzLmRhdGEuS2V5LFxuICAgICAgICAgICAgICAgIGtleTogZmllbGRDbGlja0V2ZW50LmtleSxcbiAgICAgICAgICAgICAgICBpZFR5cGUsXG4gICAgICAgICAgICAgICAgd2hpY2g6IGZpZWxkQ2xpY2tFdmVudC5ldmVudFdoaWNoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZENsaWNrRXZlbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgY29udHJvbFR5cGU6IGZpZWxkQ2xpY2tFdmVudC5jb250cm9sVHlwZSxcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGU6IGNsaWNrZWRVaUNvbnRyb2xGaWVsZC5GaWVsZFR5cGUsXG4gICAgICAgICAgICAgICAgb3RoZXJEYXRhOiBmaWVsZENsaWNrRXZlbnQub3RoZXJEYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGb3Igb3RoZXIgYXBpIG5hbWVzIChsaWtlIGVudGVyIGNoaWxkcmVuIGV0YykuXG4gICAgICAgICAgICB0aGlzLmZpZWxkQ2xpY2suZW1pdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5VSUQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB1aU9iamVjdEtleTogdGhpcy5kYXRhLktleSxcbiAgICAgICAgICAgICAgICBrZXk6IGZpZWxkQ2xpY2tFdmVudC5rZXksXG4gICAgICAgICAgICAgICAgaWRUeXBlLFxuICAgICAgICAgICAgICAgIHdoaWNoOiBmaWVsZENsaWNrRXZlbnQuZXZlbnRXaGljaCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRDbGlja0V2ZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlOiBmaWVsZENsaWNrRXZlbnQuY29udHJvbFR5cGUsXG4gICAgICAgICAgICAgICAgb3RoZXJEYXRhOiBmaWVsZENsaWNrRXZlbnQub3RoZXJEYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAvLyBUaGlzIGV2ZW50IGlzIGZvciBoYW5kbGUgdGhlIGludGVybmFsIHBhZ2UgZXZlbnRzLlxuICAgIC8vIG9uSW50ZXJuYWxGb3JtRmllbGRDbGlja2VkKGludGVybmFsRm9ybUZpZWxkQ2xpY2s6IGFueSk6IHZvaWQge1xuICAgIC8vICAgICB0aGlzLmludGVybmFsRm9ybUZpZWxkQ2xpY2suZW1pdChpbnRlcm5hbEZvcm1GaWVsZENsaWNrKTtcbiAgICAvLyB9XG5cbiAgICAvLyAvLyBUaGlzIGV2ZW50IGlzIGZvciBoYW5kbGUgdGhlIGludGVybmFsIHBhZ2UgZXZlbnRzLlxuICAgIC8vIG9uSW50ZXJuYWxGb3JtRmllbGRDaGFuZ2VkKGludGVybmFsRm9ybUZpZWxkQ2hhbmdlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyAgICAgdGhpcy5pbnRlcm5hbEZvcm1GaWVsZENoYW5nZS5lbWl0KGludGVybmFsRm9ybUZpZWxkQ2hhbmdlKTtcbiAgICAvLyB9XG5cbiAgICAvLyBUaGlzIGV2ZW50IGlzIGZvciBoYW5kbGUgdGhlIHJlbGF0ZWQgaXRlbXMgY2hhbmdlIGV2ZW50cy5cbiAgICBvbkZvcm1WYWx1ZUNoYW5nZWQoZXZlbnQ6IElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBldmVudCBpcyBmb3IgaGFuZGxlIHRoZSByZWxhdGVkIGl0ZW1zIGNoYW5nZSBldmVudHMuXG4gICAgb25Gb3JtRmllbGRDbGljayhldmVudDogSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWVsZENsaWNrLmVtaXQoZXZlbnQpO1xuICAgIH1cbn1cbiIsIjxmaWVsZHNldCAqbmdJZj1cImZvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1cIiBbZGlzYWJsZWRdPVwiaXNMb2NrZWRcIiBjbGFzcz1cInBlcC1mb3JtXCJcbiAgICBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogbGF5b3V0VHlwZSA9PSAnY2FyZCcgJiYgZGF0YT8uQmFja2dyb3VuZENvbG9yIH1cIj5cbiAgICA8IS0tIE5ldyBGb3JtIC0tPlxuICAgIDxtYXQtZ3JpZC1saXN0ICpuZ0lmPVwibGF5b3V0VHlwZSA9PSAnZm9ybSdcIiBbY29sc109XCJjb2x1bW5zXCIgW3Jvd0hlaWdodF09XCJyb3dIZWlnaHQgKyAncmVtJ1wiXG4gICAgICAgIFtndXR0ZXJTaXplXT1cImZvcm1HdXR0ZXJTaXplXCI+XG4gICAgICAgIDxtYXQtZ3JpZC10aWxlICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHMkIHwgYXN5bmNcIiBbcm93c3Bhbl09XCJmaWVsZC5yb3dTcGFuXCIgW2NvbHNwYW5dPVwiZmllbGQuY29sU3BhblwiPlxuICAgICAgICAgICAgPHBlcC1pbnRlcm5hbC1maWVsZC1nZW5lcmF0b3IgKm5nSWY9XCJmaWVsZC5jb250cm9sVHlwZSAhPSAncGxhY2Vob2xkZXInXCIgW2Zvcm1dPVwiZm9ybVwiIFtsYXlvdXRUeXBlXT1cImxheW91dFR5cGVcIlxuICAgICAgICAgICAgICAgIFtjaGVja0ZvckNoYW5nZXNdPVwiY2hlY2tGb3JDaGFuZ2VzXCIgW3VpZF09XCJkYXRhPy5VSURcIiBbZmllbGRdPVwiZmllbGRcIiBbc2hvd1RpdGxlXT1cInNob3dUaXRsZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZWxlbWVudENsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvcm1WYWx1ZUNoYW5nZSk9XCJvbkZvcm1WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChmb3JtRmllbGRDbGljayk9XCJvbkZvcm1GaWVsZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb3JtVmFsaWRhdGlvbkNoYW5nZSk9XCJvbkZvcm1WYWxpZGF0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L3BlcC1pbnRlcm5hbC1maWVsZC1nZW5lcmF0b3I+XG4gICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICA8L21hdC1ncmlkLWxpc3Q+XG5cbiAgICA8IS0tIFRodW1ibmFpbHMgLS0+XG4gICAgPG1hdC1ncmlkLWxpc3QgKm5nSWY9XCJsYXlvdXRUeXBlID09ICdjYXJkJ1wiIFtjb2xzXT1cImNvbHVtbnNcIiBbcm93SGVpZ2h0XT1cInJvd0hlaWdodCArICdyZW0nXCJcbiAgICAgICAgW2d1dHRlclNpemVdPVwiY2FyZEd1dHRlclNpemVcIiBjbGFzcz1cImNhcmQtc3BhY2luZ1wiPlxuICAgICAgICA8bWF0LWdyaWQtdGlsZSAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzJCB8IGFzeW5jXCIgW3Jvd3NwYW5dPVwiZmllbGQucm93U3BhblwiIFtjb2xzcGFuXT1cImZpZWxkLmNvbFNwYW5cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyBvdmVyZmxvdzogZmllbGQudHlwZSA9PSAncXMnID8gJ3Vuc2V0JyA6ICdoaWRkZW4nIH1cIj5cbiAgICAgICAgICAgIDxwZXAtaW50ZXJuYWwtZmllbGQtZ2VuZXJhdG9yICpuZ0lmPVwiZmllbGQuY29udHJvbFR5cGUgIT0gJ3BsYWNlaG9sZGVyJ1wiIFtmb3JtXT1cImZvcm1cIiBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdsb2NrLWV2ZW50cyc6IGxvY2tFdmVudHMgfVwiIFtpc0FjdGl2ZV09XCJpc0FjdGl2ZVwiIFtjaGVja0ZvckNoYW5nZXNdPVwiY2hlY2tGb3JDaGFuZ2VzXCJcbiAgICAgICAgICAgICAgICBbdWlkXT1cImRhdGE/LlVJRFwiIFtmaWVsZF09XCJmaWVsZFwiIFtzaG93VGl0bGVdPVwic2hvd1RpdGxlXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChlbGVtZW50Q2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgKGZvcm1WYWx1ZUNoYW5nZSk9XCJvbkZvcm1WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChmb3JtRmllbGRDbGljayk9XCJvbkZvcm1GaWVsZENsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvcGVwLWludGVybmFsLWZpZWxkLWdlbmVyYXRvcj5cbiAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgIDwvbWF0LWdyaWQtbGlzdD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYXlvdXRUeXBlID09ICd0YWJsZSdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUmVwb3J0OyB0aGVuIHJlcG9ydEJsb2NrOyBlbHNlIG5vdFJlcG9ydEJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVwb3J0QmxvY2s+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVwb3J0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90UmVwb3J0QmxvY2s+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHMkIHwgYXN5bmM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwIHRhYmxlLWNlbGwgXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ3RleHQtYWxpZ24tJyArIGZpZWxkLnhBbGlnbm1lbnRdXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IChsYXlvdXQ/LkNvbnRyb2xGaWVsZHMpW2pdPy5jYWxjQ29sdW1uV2lkdGhTdHJpbmd9XCI+XG4gICAgICAgICAgICAgICAgPHBlcC1pbnRlcm5hbC1maWVsZC1nZW5lcmF0b3IgKm5nSWY9XCJmaWVsZC5jb250cm9sVHlwZSAhPSAncGxhY2Vob2xkZXInXCIgW2NoZWNrRm9yQ2hhbmdlc109XCJjaGVja0ZvckNoYW5nZXNcIlxuICAgICAgICAgICAgICAgICAgICBbdWlkXT1cImRhdGE/LlVJRFwiIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCIgW3Nob3dUaXRsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIChlbGVtZW50Q2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZm9ybVZhbHVlQ2hhbmdlKT1cIm9uRm9ybVZhbHVlQ2hhbmdlZCgkZXZlbnQpXCIgKGZvcm1GaWVsZENsaWNrKT1cIm9uRm9ybUZpZWxkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtpc0FjdGl2ZV09XCJpc0FjdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDwvcGVwLWludGVybmFsLWZpZWxkLWdlbmVyYXRvcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLS0tLS0tIEZvciB0ZXN0aW5nIC0tLS0tLS0tLS0tLVxuICAgIHt7IGZvcm0udmFsdWUgfCBqc29uIH19XG4gICAge3sgZm9ybS52YWxpZCB9fVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48L2ZpZWxkc2V0PlxuXG48bmctdGVtcGxhdGUgI3JlcG9ydD5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHMkIHwgYXN5bmM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwIHBlcC1yZXBvcnQtZmllbGRzXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogKGxheW91dD8uQ29udHJvbEZpZWxkcylbal0/LmNhbGNDb2x1bW5XaWR0aFN0cmluZyB9XCJcbiAgICAgICAgW25nQ2xhc3NdPVwiWyd0ZXh0LWFsaWduLScgKyBmaWVsZC54QWxpZ25tZW50XVwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmaWVsZC5jb250cm9sVHlwZVwiPlxuICAgICAgICAgICAgPHBlcC1pbWFnZSAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlJ1wiIFt1aWRdPVwiZGF0YT8uVUlEXCIgW2Zvcm1dPVwiZm9ybVwiIFtrZXldPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImZpZWxkLmZvcm1hdHRlZFZhbHVlXCIgW3NyY0xhcmdlXT1cImZpZWxkLnZhbHVlXCIgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW21hbmRhdG9yeV09XCJmaWVsZC5tYW5kYXRvcnlcIiBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIiBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt4QWxpZ25tZW50XT1cImZpZWxkLnhBbGlnbm1lbnRcIiBbcm93U3Bhbl09XCJmaWVsZC5yb3dTcGFuXCIgW2xheW91dFR5cGVdPVwibGF5b3V0VHlwZVwiXG4gICAgICAgICAgICAgICAgKGVsZW1lbnRDbGljayk9XCJvbkNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvcGVwLWltYWdlPlxuXG4gICAgICAgICAgICA8cGVwLXNpZ25hdHVyZSAqbmdTd2l0Y2hDYXNlPVwiJ3NpZ25hdHVyZSdcIiBbZm9ybV09XCJmb3JtXCIgW2tleV09XCJmaWVsZC5rZXlcIiBbc3JjXT1cImZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQubGFiZWxcIiBbbWFuZGF0b3J5XT1cImZpZWxkLm1hbmRhdG9yeVwiIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCIgW3hBbGlnbm1lbnRdPVwiZmllbGQueEFsaWdubWVudFwiIFtyb3dTcGFuXT1cImZpZWxkLnJvd1NwYW5cIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRUeXBlXT1cImxheW91dFR5cGVcIj5cbiAgICAgICAgICAgIDwvcGVwLXNpZ25hdHVyZT5cblxuICAgICAgICAgICAgPHBlcC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiIFtmb3JtXT1cImZvcm1cIiBba2V5XT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIihmaWVsZC52YWx1ZSB8IGxvd2VyY2FzZSkgPT0gJ3RydWUnIHx8IGZpZWxkLnZhbHVlID09ICcxJyA/IHRydWUgOiBmYWxzZVwiIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiZmllbGQudHlwZVwiIFttYW5kYXRvcnldPVwiZmllbGQubWFuZGF0b3J5XCIgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIiBbeEFsaWdubWVudF09XCJmaWVsZC54QWxpZ25tZW50XCIgW3Jvd1NwYW5dPVwiZmllbGQucm93U3BhblwiXG4gICAgICAgICAgICAgICAgW2FkZGl0aW9uYWxWYWx1ZV09XCJmaWVsZC5hZGRpdGlvbmFsVmFsdWVcIiBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCI+XG4gICAgICAgICAgICA8L3BlcC1jaGVja2JveD5cblxuICAgICAgICAgICAgPHBlcC1kYXRlICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIiBbZm9ybV09XCJmb3JtXCIgW2tleV09XCJmaWVsZC5rZXlcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiIFt0eXBlXT1cImZpZWxkLnR5cGVcIlxuICAgICAgICAgICAgICAgIFttYW5kYXRvcnldPVwiZmllbGQubWFuZGF0b3J5XCIgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkXCIgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbdGV4dENvbG9yXT1cImZpZWxkLnRleHRDb2xvclwiIFt4QWxpZ25tZW50XT1cImZpZWxkLnhBbGlnbm1lbnRcIiBbcm93U3Bhbl09XCJmaWVsZC5yb3dTcGFuXCJcbiAgICAgICAgICAgICAgICBbbWluVmFsdWVdPVwiZmllbGQubWluVmFsdWVcIiBbbWF4VmFsdWVdPVwiZmllbGQubWF4VmFsdWVcIiBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCI+XG4gICAgICAgICAgICA8L3BlcC1kYXRlPlxuXG4gICAgICAgICAgICA8cGVwLWludGVybmFsLWJ1dHRvbiAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIiBbZm9ybV09XCJmb3JtXCIgW2tleV09XCJmaWVsZC5rZXlcIiBbdmFsdWVdPVwiZmllbGQudmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmb3JtYXR0ZWRWYWx1ZV09XCJmaWVsZC5mb3JtYXR0ZWRWYWx1ZVwiIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiIFt0eXBlXT1cImZpZWxkLnR5cGVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiIFt4QWxpZ25tZW50XT1cImZpZWxkLnhBbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRUeXBlXT1cImxheW91dFR5cGVcIiAoZWxlbWVudENsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9wZXAtaW50ZXJuYWwtYnV0dG9uPlxuXG4gICAgICAgICAgICA8cGVwLXRleHRhcmVhICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCIgW2Zvcm1dPVwiZm9ybVwiIFtrZXldPVwiZmllbGQua2V5XCIgW3ZhbHVlXT1cImZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQubGFiZWxcIiBbbWFuZGF0b3J5XT1cImZpZWxkLm1hbmRhdG9yeVwiIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCIgW21heEZpZWxkQ2hhcmFjdGVyc109XCJmaWVsZC5tYXhGaWVsZENoYXJhY3RlcnNcIlxuICAgICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiZmllbGQudGV4dENvbG9yXCIgW3hBbGlnbm1lbnRdPVwiZmllbGQueEFsaWdubWVudFwiIFtyb3dTcGFuXT1cImZpZWxkLnJvd1NwYW5cIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRUeXBlXT1cImxheW91dFR5cGVcIj5cbiAgICAgICAgICAgIDwvcGVwLXRleHRhcmVhPlxuXG4gICAgICAgICAgICA8cGVwLXF1YW50aXR5LXNlbGVjdG9yICpuZ1N3aXRjaENhc2U9XCIncXMnXCIgW2lkXT1cImZpZWxkLmtleVwiIFtmb3JtXT1cImZvcm1cIiBba2V5XT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLnZhbHVlXCIgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCIgW3R5cGVdPVwiZmllbGQudHlwZVwiXG4gICAgICAgICAgICAgICAgW21hbmRhdG9yeV09XCJmaWVsZC5tYW5kYXRvcnlcIiBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIiBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiZmllbGQudGV4dENvbG9yXCIgW3hBbGlnbm1lbnRdPVwiZmllbGQueEFsaWdubWVudFwiIFtyb3dTcGFuXT1cImZpZWxkLnJvd1NwYW5cIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRUeXBlXT1cImxheW91dFR5cGVcIiAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChlbGVtZW50Q2xpY2spPVwib25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L3BlcC1xdWFudGl0eS1zZWxlY3Rvcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5mb3JtYXR0ZWRWYWx1ZT8ubGVuZ3RoID4gMDsgdGhlbiBub3RFbXB0eUJsb2NrOyBlbHNlIGVtcHR5QmxvY2tcIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vdEVtcHR5QmxvY2s+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQuY29udHJvbFR5cGUgPT09ICdhdHRhY2htZW50JyB8fCBmaWVsZC50eXBlID09PSAnbGluayc7IHRoZW4gbGlua0Jsb2NrOyBlbHNlIG5vdExpbmtCbG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsaW5rQmxvY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBbaWRdPVwiZmllbGQua2V5XCIgY2xhc3M9XCJjb2xvci1saW5rIGJvZHktc20gcGVwLXJlcG9ydC1pbnB1dCByZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWVsZC5mb3JtYXR0ZWRWYWx1ZSAhPSBudWxsXCIgdGl0bGU9XCJ7eyBmaWVsZC5mb3JtYXR0ZWRWYWx1ZSB9fVwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cInt7IGZpZWxkLnZhbHVlIH19XCI+e3sgZmllbGQuZm9ybWF0dGVkVmFsdWUgfX08L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90TGlua0Jsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lkXT1cImZpZWxkLmtleVwiIGNsYXNzPVwiYm9keS1zbSBwZXAtcmVwb3J0LWlucHV0IHJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGZpZWxkLmZvcm1hdHRlZFZhbHVlIH19XCIgW25nU3R5bGVdPVwieyBjb2xvcjogZmllbGQudGV4dENvbG9yIH1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmZvcm1hdHRlZFZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|