@ecodev/natural 41.3.0 → 42.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ecodev-natural.d.ts +1 -9
- package/esm2020/ecodev-natural.mjs +5 -0
- package/esm2020/lib/classes/abstract-controller.mjs +30 -0
- package/esm2020/lib/classes/abstract-detail.mjs +152 -0
- package/esm2020/lib/classes/abstract-editable-list.mjs +96 -0
- package/esm2020/lib/classes/abstract-list.mjs +406 -0
- package/esm2020/lib/classes/abstract-navigable-list.mjs +126 -0
- package/{esm2015/lib/classes/apollo-utils.js → esm2020/lib/classes/apollo-utils.mjs} +0 -0
- package/esm2020/lib/classes/data-source.mjs +76 -0
- package/{esm2015/lib/classes/query-variable-manager-utils.js → esm2020/lib/classes/query-variable-manager-utils.mjs} +0 -0
- package/esm2020/lib/classes/query-variable-manager.mjs +172 -0
- package/{esm2015/lib/classes/rxjs.js → esm2020/lib/classes/rxjs.mjs} +0 -0
- package/{esm2015/lib/classes/tld.js → esm2020/lib/classes/tld.mjs} +0 -0
- package/{esm2015/lib/classes/utility.js → esm2020/lib/classes/utility.mjs} +0 -0
- package/esm2020/lib/classes/validators.mjs +179 -0
- package/esm2020/lib/directives/http-prefix.directive.mjs +50 -0
- package/esm2020/lib/modules/alert/alert.module.mjs +20 -0
- package/esm2020/lib/modules/alert/alert.service.mjs +55 -0
- package/esm2020/lib/modules/alert/confirm.component.mjs +20 -0
- package/{esm2015/lib/modules/alert/public-api.js → esm2020/lib/modules/alert/public-api.mjs} +0 -0
- package/esm2020/lib/modules/avatar/avatar.module.mjs +19 -0
- package/esm2020/lib/modules/avatar/component/avatar.component.mjs +190 -0
- package/{esm2015/lib/modules/avatar/public-api.js → esm2020/lib/modules/avatar/public-api.mjs} +0 -0
- package/esm2020/lib/modules/avatar/service/avatar.service.mjs +66 -0
- package/esm2020/lib/modules/avatar/sources/gravatar.mjs +29 -0
- package/{esm2015/lib/modules/avatar/sources/image.js → esm2020/lib/modules/avatar/sources/image.mjs} +0 -0
- package/{esm2015/lib/modules/avatar/sources/initials.js → esm2020/lib/modules/avatar/sources/initials.mjs} +0 -0
- package/{esm2015/lib/modules/avatar/sources/source.js → esm2020/lib/modules/avatar/sources/source.mjs} +1 -1
- package/esm2020/lib/modules/columns-picker/columns-picker-column.directive.mjs +43 -0
- package/esm2020/lib/modules/columns-picker/columns-picker.component.mjs +84 -0
- package/esm2020/lib/modules/columns-picker/columns-picker.module.mjs +47 -0
- package/{esm2015/lib/modules/columns-picker/public-api.js → esm2020/lib/modules/columns-picker/public-api.mjs} +0 -0
- package/esm2020/lib/modules/common/common-module.mjs +50 -0
- package/esm2020/lib/modules/common/directives/linkable-tab.directive.mjs +79 -0
- package/esm2020/lib/modules/common/directives/src-density.directive.mjs +62 -0
- package/esm2020/lib/modules/common/pipes/capitalize.pipe.mjs +18 -0
- package/esm2020/lib/modules/common/pipes/ellipsis.pipe.mjs +14 -0
- package/esm2020/lib/modules/common/pipes/enum.pipe.mjs +25 -0
- package/esm2020/lib/modules/common/pipes/swiss-date.pipe.mjs +20 -0
- package/esm2020/lib/modules/common/public-api.mjs +13 -0
- package/esm2020/lib/modules/common/services/memory-storage.mjs +112 -0
- package/esm2020/lib/modules/common/services/seo.service.mjs +114 -0
- package/esm2020/lib/modules/detail-header/detail-header.component.mjs +76 -0
- package/esm2020/lib/modules/detail-header/detail-header.module.mjs +21 -0
- package/{esm2015/lib/modules/detail-header/public-api.js → esm2020/lib/modules/detail-header/public-api.mjs} +0 -0
- package/esm2020/lib/modules/dialog-trigger/dialog-trigger.component.mjs +69 -0
- package/esm2020/lib/modules/dialog-trigger/dialog-trigger.module.mjs +19 -0
- package/{esm2015/lib/modules/dialog-trigger/public-api.js → esm2020/lib/modules/dialog-trigger/public-api.mjs} +0 -0
- package/esm2020/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +98 -0
- package/esm2020/lib/modules/dropdown-components/natural-dropdown-components.module.mjs +92 -0
- package/{esm2015/lib/modules/dropdown-components/public-api.js → esm2020/lib/modules/dropdown-components/public-api.mjs} +0 -0
- package/esm2020/lib/modules/dropdown-components/type-date/type-date.component.mjs +133 -0
- package/esm2020/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +137 -0
- package/esm2020/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +69 -0
- package/esm2020/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +38 -0
- package/esm2020/lib/modules/dropdown-components/type-number/type-number.component.mjs +104 -0
- package/esm2020/lib/modules/dropdown-components/type-select/type-select.component.mjs +169 -0
- package/esm2020/lib/modules/dropdown-components/type-text/type-text.component.mjs +57 -0
- package/{esm2015/lib/modules/dropdown-components/types.js → esm2020/lib/modules/dropdown-components/types.mjs} +0 -0
- package/{esm2015/lib/modules/dropdown-components/utils.js → esm2020/lib/modules/dropdown-components/utils.mjs} +0 -0
- package/esm2020/lib/modules/file/abstract-file.mjs +231 -0
- package/esm2020/lib/modules/file/component/file.component.mjs +143 -0
- package/esm2020/lib/modules/file/file-drop.directive.mjs +110 -0
- package/esm2020/lib/modules/file/file-select.directive.mjs +28 -0
- package/esm2020/lib/modules/file/file.module.mjs +24 -0
- package/esm2020/lib/modules/file/file.service.mjs +48 -0
- package/{esm2015/lib/modules/file/public-api.js → esm2020/lib/modules/file/public-api.mjs} +0 -0
- package/{esm2015/lib/modules/file/types.js → esm2020/lib/modules/file/types.mjs} +0 -0
- package/{esm2015/lib/modules/file/utils.js → esm2020/lib/modules/file/utils.mjs} +3 -4
- package/esm2020/lib/modules/fixed-button/fixed-button.component.mjs +27 -0
- package/esm2020/lib/modules/fixed-button/fixed-button.module.mjs +21 -0
- package/{esm2015/lib/modules/fixed-button/public-api.js → esm2020/lib/modules/fixed-button/public-api.mjs} +0 -0
- package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +36 -0
- package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.module.mjs +20 -0
- package/{esm2015/lib/modules/fixed-button-detail/public-api.js → esm2020/lib/modules/fixed-button-detail/public-api.mjs} +0 -0
- package/{esm2015/lib/modules/hierarchic-selector/classes/flat-node.js → esm2020/lib/modules/hierarchic-selector/classes/flat-node.mjs} +1 -1
- package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs} +0 -0
- package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs} +0 -0
- package/{esm2015/lib/modules/hierarchic-selector/classes/model-node.js → esm2020/lib/modules/hierarchic-selector/classes/model-node.mjs} +1 -1
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +364 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +258 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +31 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +23 -0
- package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector.module.mjs +81 -0
- package/{esm2015/lib/modules/hierarchic-selector/public-api.js → esm2020/lib/modules/hierarchic-selector/public-api.mjs} +0 -0
- package/esm2020/lib/modules/icon/icon.component.mjs +92 -0
- package/esm2020/lib/modules/icon/icon.module.mjs +30 -0
- package/{esm2015/lib/modules/icon/public-api.js → esm2020/lib/modules/icon/public-api.mjs} +0 -0
- package/esm2020/lib/modules/matomo/matomo-module.module.mjs +12 -0
- package/esm2020/lib/modules/matomo/matomo.service.mjs +105 -0
- package/{esm2015/lib/modules/matomo/public-api.js → esm2020/lib/modules/matomo/public-api.mjs} +0 -0
- package/esm2020/lib/modules/panels/abstract-panel.mjs +56 -0
- package/{esm2015/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.js → esm2020/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs} +0 -0
- package/esm2020/lib/modules/panels/panels.component.mjs +26 -0
- package/esm2020/lib/modules/panels/panels.module.mjs +33 -0
- package/esm2020/lib/modules/panels/panels.service.mjs +325 -0
- package/{esm2015/lib/modules/panels/panels.urlmatcher.js → esm2020/lib/modules/panels/panels.urlmatcher.mjs} +0 -0
- package/{esm2015/lib/modules/panels/public-api.js → esm2020/lib/modules/panels/public-api.mjs} +0 -0
- package/{esm2015/lib/modules/panels/types.js → esm2020/lib/modules/panels/types.mjs} +0 -0
- package/{esm2015/lib/modules/relations/public-api.js → esm2020/lib/modules/relations/public-api.mjs} +0 -0
- package/esm2020/lib/modules/relations/relations.component.mjs +198 -0
- package/esm2020/lib/modules/relations/relations.module.mjs +58 -0
- package/{esm2015/lib/modules/search/classes/graphql-doctrine.js → esm2020/lib/modules/search/classes/graphql-doctrine.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/graphql-doctrine.types.js → esm2020/lib/modules/search/classes/graphql-doctrine.types.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/transformers.js → esm2020/lib/modules/search/classes/transformers.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/url.js → esm2020/lib/modules/search/classes/url.mjs} +0 -0
- package/{esm2015/lib/modules/search/classes/utils.js → esm2020/lib/modules/search/classes/utils.mjs} +0 -0
- package/{esm2015/lib/modules/search/dropdown-container/dropdown-container-animations.js → esm2020/lib/modules/search/dropdown-container/dropdown-container-animations.mjs} +0 -0
- package/esm2020/lib/modules/search/dropdown-container/dropdown-container.component.mjs +88 -0
- package/{esm2015/lib/modules/search/dropdown-container/dropdown-ref.js → esm2020/lib/modules/search/dropdown-container/dropdown-ref.mjs} +1 -1
- package/esm2020/lib/modules/search/dropdown-container/dropdown.service.mjs +93 -0
- package/esm2020/lib/modules/search/facet-selector/facet-selector.component.mjs +50 -0
- package/esm2020/lib/modules/search/group/group.component.mjs +45 -0
- package/esm2020/lib/modules/search/input/input.component.mjs +328 -0
- package/{esm2015/lib/modules/search/public-api.js → esm2020/lib/modules/search/public-api.mjs} +0 -0
- package/esm2020/lib/modules/search/search/search.component.mjs +78 -0
- package/esm2020/lib/modules/search/search.module.mjs +84 -0
- package/{esm2015/lib/modules/search/types/dropdown-component.js → esm2020/lib/modules/search/types/dropdown-component.mjs} +0 -0
- package/{esm2015/lib/modules/search/types/facet.js → esm2020/lib/modules/search/types/facet.mjs} +0 -0
- package/{esm2015/lib/modules/search/types/values.js → esm2020/lib/modules/search/types/values.mjs} +0 -0
- package/esm2020/lib/modules/select/abstract-select.component.mjs +186 -0
- package/{esm2015/lib/modules/select/public-api.js → esm2020/lib/modules/select/public-api.mjs} +0 -0
- package/esm2020/lib/modules/select/select/select.component.mjs +207 -0
- package/esm2020/lib/modules/select/select-enum/select-enum.component.mjs +47 -0
- package/esm2020/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +127 -0
- package/esm2020/lib/modules/select/select.module.mjs +68 -0
- package/{esm2015/lib/modules/sidenav/public-api.js → esm2020/lib/modules/sidenav/public-api.mjs} +0 -0
- package/esm2020/lib/modules/sidenav/sidenav/sidenav.component.mjs +15 -0
- package/esm2020/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +87 -0
- package/esm2020/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +12 -0
- package/esm2020/lib/modules/sidenav/sidenav-stack.service.mjs +52 -0
- package/esm2020/lib/modules/sidenav/sidenav.module.mjs +25 -0
- package/esm2020/lib/modules/sidenav/sidenav.service.mjs +195 -0
- package/{esm2015/lib/modules/stamp/public-api.js → esm2020/lib/modules/stamp/public-api.mjs} +0 -0
- package/esm2020/lib/modules/stamp/stamp-module.module.mjs +18 -0
- package/esm2020/lib/modules/stamp/stamp.component.mjs +14 -0
- package/{esm2015/lib/modules/table-button/public-api.js → esm2020/lib/modules/table-button/public-api.mjs} +0 -0
- package/esm2020/lib/modules/table-button/table-button.component.mjs +48 -0
- package/esm2020/lib/modules/table-button/table-button.module.mjs +21 -0
- package/esm2020/lib/services/abstract-model.service.mjs +509 -0
- package/esm2020/lib/services/enum.service.mjs +67 -0
- package/esm2020/lib/services/link-mutation.service.mjs +153 -0
- package/esm2020/lib/services/persistence.service.mjs +113 -0
- package/esm2020/lib/services/swiss-parsing-date-adapter.service.mjs +55 -0
- package/{esm2015/lib/types/types.js → esm2020/lib/types/types.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{ecodev-natural.js → ecodev-natural.mjs} +2808 -2392
- package/fesm2015/ecodev-natural.mjs.map +1 -0
- package/fesm2020/ecodev-natural.mjs +10495 -0
- package/fesm2020/ecodev-natural.mjs.map +1 -0
- package/lib/classes/abstract-controller.d.ts +3 -0
- package/lib/classes/abstract-detail.d.ts +3 -0
- package/lib/classes/abstract-editable-list.d.ts +3 -0
- package/lib/classes/abstract-list.d.ts +3 -0
- package/lib/classes/abstract-navigable-list.d.ts +3 -0
- package/lib/classes/query-variable-manager.d.ts +19 -8
- package/lib/directives/http-prefix.directive.d.ts +3 -0
- package/lib/modules/alert/alert.module.d.ts +9 -0
- package/lib/modules/alert/alert.service.d.ts +3 -0
- package/lib/modules/alert/confirm.component.d.ts +3 -0
- package/lib/modules/avatar/avatar.module.d.ts +6 -0
- package/lib/modules/avatar/component/avatar.component.d.ts +4 -0
- package/lib/modules/avatar/service/avatar.service.d.ts +3 -0
- package/lib/modules/columns-picker/columns-picker-column.directive.d.ts +3 -0
- package/lib/modules/columns-picker/columns-picker.component.d.ts +3 -0
- package/lib/modules/columns-picker/columns-picker.module.d.ts +13 -0
- package/lib/modules/common/common-module.d.ts +15 -0
- package/lib/modules/common/directives/linkable-tab.directive.d.ts +3 -0
- package/lib/modules/common/directives/src-density.directive.d.ts +3 -0
- package/lib/modules/common/pipes/capitalize.pipe.d.ts +3 -0
- package/lib/modules/common/pipes/ellipsis.pipe.d.ts +3 -0
- package/lib/modules/common/pipes/enum.pipe.d.ts +3 -0
- package/lib/modules/common/pipes/swiss-date.pipe.d.ts +3 -0
- package/lib/modules/common/public-api.d.ts +0 -1
- package/lib/modules/common/services/memory-storage.d.ts +3 -0
- package/lib/modules/common/services/seo.service.d.ts +3 -0
- package/lib/modules/detail-header/detail-header.component.d.ts +3 -0
- package/lib/modules/detail-header/detail-header.module.d.ts +9 -0
- package/lib/modules/dialog-trigger/dialog-trigger.component.d.ts +3 -0
- package/lib/modules/dialog-trigger/dialog-trigger.module.d.ts +7 -0
- package/lib/modules/dropdown-components/abstract-association-select-component.directive.d.ts +3 -0
- package/lib/modules/dropdown-components/natural-dropdown-components.module.d.ts +22 -0
- package/lib/modules/dropdown-components/type-date/type-date.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-date-range/type-date-range.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-number/type-number.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +3 -0
- package/lib/modules/dropdown-components/type-text/type-text.component.d.ts +3 -0
- package/lib/modules/file/abstract-file.d.ts +3 -0
- package/lib/modules/file/component/file.component.d.ts +3 -0
- package/lib/modules/file/file-drop.directive.d.ts +3 -0
- package/lib/modules/file/file-select.directive.d.ts +3 -0
- package/lib/modules/file/file.module.d.ts +11 -0
- package/lib/modules/file/file.service.d.ts +3 -0
- package/lib/modules/fixed-button/fixed-button.component.d.ts +3 -0
- package/lib/modules/fixed-button/fixed-button.module.d.ts +9 -0
- package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +3 -0
- package/lib/modules/fixed-button-detail/fixed-button-detail.module.d.ts +8 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.d.ts +3 -0
- package/lib/modules/hierarchic-selector/hierarchic-selector.module.d.ts +21 -0
- package/lib/modules/icon/icon.component.d.ts +3 -0
- package/lib/modules/icon/icon.module.d.ts +7 -0
- package/lib/modules/matomo/matomo-module.module.d.ts +4 -0
- package/lib/modules/matomo/matomo.service.d.ts +3 -0
- package/lib/modules/panels/abstract-panel.d.ts +3 -0
- package/lib/modules/panels/panels.component.d.ts +3 -0
- package/lib/modules/panels/panels.module.d.ts +8 -0
- package/lib/modules/panels/panels.service.d.ts +3 -0
- package/lib/modules/relations/relations.component.d.ts +3 -0
- package/lib/modules/relations/relations.module.d.ts +15 -0
- package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +3 -0
- package/lib/modules/search/dropdown-container/dropdown-ref.d.ts +1 -1
- package/lib/modules/search/dropdown-container/dropdown.service.d.ts +3 -0
- package/lib/modules/search/facet-selector/facet-selector.component.d.ts +3 -0
- package/lib/modules/search/group/group.component.d.ts +3 -0
- package/lib/modules/search/input/input.component.d.ts +3 -0
- package/lib/modules/search/search/search.component.d.ts +3 -0
- package/lib/modules/search/search.module.d.ts +19 -0
- package/lib/modules/select/abstract-select.component.d.ts +4 -1
- package/lib/modules/select/select/select.component.d.ts +3 -0
- package/lib/modules/select/select-enum/select-enum.component.d.ts +9 -2
- package/lib/modules/select/select-hierarchic/select-hierarchic.component.d.ts +3 -0
- package/lib/modules/select/select.module.d.ts +19 -0
- package/lib/modules/sidenav/sidenav/sidenav.component.d.ts +3 -0
- package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +3 -0
- package/lib/modules/sidenav/sidenav-content/sidenav-content.component.d.ts +3 -0
- package/lib/modules/sidenav/sidenav-stack.service.d.ts +4 -1
- package/lib/modules/sidenav/sidenav.module.d.ts +11 -0
- package/lib/modules/sidenav/sidenav.service.d.ts +3 -0
- package/lib/modules/stamp/stamp-module.module.d.ts +6 -0
- package/lib/modules/stamp/stamp.component.d.ts +3 -0
- package/lib/modules/table-button/table-button.component.d.ts +3 -0
- package/lib/modules/table-button/table-button.module.d.ts +9 -0
- package/lib/services/enum.service.d.ts +3 -0
- package/lib/services/link-mutation.service.d.ts +3 -0
- package/lib/services/persistence.service.d.ts +3 -0
- package/lib/services/swiss-parsing-date-adapter.service.d.ts +4 -1
- package/package.json +25 -12
- package/src/lib/modules/alert/_alert.theme.scss +1 -1
- package/src/lib/modules/file/component/_file.theme.scss +1 -1
- package/src/lib/modules/icon/_icon.theme.scss +1 -1
- package/src/lib/modules/search/dropdown-container/_dropdown-container.theme.scss +1 -1
- package/src/lib/modules/table-button/_table-button.theme.scss +1 -1
- package/src/lib/styles/_table.scss +1 -1
- package/theming/_natural.theme.scss +1 -1
- package/bundles/ecodev-natural.umd.js +0 -11318
- package/bundles/ecodev-natural.umd.js.map +0 -1
- package/ecodev-natural.metadata.json +0 -1
- package/esm2015/ecodev-natural.js +0 -14
- package/esm2015/lib/classes/abstract-controller.js +0 -29
- package/esm2015/lib/classes/abstract-detail.js +0 -157
- package/esm2015/lib/classes/abstract-editable-list.js +0 -97
- package/esm2015/lib/classes/abstract-list.js +0 -409
- package/esm2015/lib/classes/abstract-navigable-list.js +0 -126
- package/esm2015/lib/classes/data-source.js +0 -76
- package/esm2015/lib/classes/query-variable-manager.js +0 -161
- package/esm2015/lib/classes/validators.js +0 -176
- package/esm2015/lib/directives/http-prefix.directive.js +0 -46
- package/esm2015/lib/modules/alert/alert.module.js +0 -15
- package/esm2015/lib/modules/alert/alert.service.js +0 -59
- package/esm2015/lib/modules/alert/confirm.component.js +0 -17
- package/esm2015/lib/modules/avatar/avatar.module.js +0 -14
- package/esm2015/lib/modules/avatar/component/avatar.component.js +0 -158
- package/esm2015/lib/modules/avatar/service/avatar.service.js +0 -65
- package/esm2015/lib/modules/avatar/sources/gravatar.js +0 -29
- package/esm2015/lib/modules/columns-picker/columns-picker-column.directive.js +0 -41
- package/esm2015/lib/modules/columns-picker/columns-picker.component.js +0 -82
- package/esm2015/lib/modules/columns-picker/columns-picker.module.js +0 -28
- package/esm2015/lib/modules/common/common-module.js +0 -35
- package/esm2015/lib/modules/common/directives/linkable-tab.directive.js +0 -82
- package/esm2015/lib/modules/common/directives/reactive-asterisk.directive.js +0 -31
- package/esm2015/lib/modules/common/directives/src-density.directive.js +0 -63
- package/esm2015/lib/modules/common/pipes/capitalize.pipe.js +0 -14
- package/esm2015/lib/modules/common/pipes/ellipsis.pipe.js +0 -10
- package/esm2015/lib/modules/common/pipes/enum.pipe.js +0 -24
- package/esm2015/lib/modules/common/pipes/swiss-date.pipe.js +0 -16
- package/esm2015/lib/modules/common/public-api.js +0 -14
- package/esm2015/lib/modules/common/services/memory-storage.js +0 -110
- package/esm2015/lib/modules/common/services/seo.service.js +0 -120
- package/esm2015/lib/modules/detail-header/detail-header.component.js +0 -63
- package/esm2015/lib/modules/detail-header/detail-header.module.js +0 -16
- package/esm2015/lib/modules/dialog-trigger/dialog-trigger.component.js +0 -68
- package/esm2015/lib/modules/dialog-trigger/dialog-trigger.module.js +0 -14
- package/esm2015/lib/modules/dropdown-components/abstract-association-select-component.directive.js +0 -96
- package/esm2015/lib/modules/dropdown-components/natural-dropdown-components.module.js +0 -51
- package/esm2015/lib/modules/dropdown-components/type-date/type-date.component.js +0 -123
- package/esm2015/lib/modules/dropdown-components/type-date-range/type-date-range.component.js +0 -128
- package/esm2015/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.js +0 -63
- package/esm2015/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.js +0 -31
- package/esm2015/lib/modules/dropdown-components/type-number/type-number.component.js +0 -99
- package/esm2015/lib/modules/dropdown-components/type-select/type-select.component.js +0 -161
- package/esm2015/lib/modules/dropdown-components/type-text/type-text.component.js +0 -53
- package/esm2015/lib/modules/file/abstract-file.js +0 -223
- package/esm2015/lib/modules/file/component/file.component.js +0 -133
- package/esm2015/lib/modules/file/file-drop.directive.js +0 -99
- package/esm2015/lib/modules/file/file-select.directive.js +0 -25
- package/esm2015/lib/modules/file/file.module.js +0 -19
- package/esm2015/lib/modules/file/file.service.js +0 -47
- package/esm2015/lib/modules/fixed-button/fixed-button.component.js +0 -23
- package/esm2015/lib/modules/fixed-button/fixed-button.module.js +0 -16
- package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.component.js +0 -31
- package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.module.js +0 -15
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.js +0 -351
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.js +0 -258
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.js +0 -28
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.js +0 -23
- package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector.module.js +0 -46
- package/esm2015/lib/modules/icon/icon.component.js +0 -78
- package/esm2015/lib/modules/icon/icon.module.js +0 -25
- package/esm2015/lib/modules/matomo/matomo-module.module.js +0 -7
- package/esm2015/lib/modules/matomo/matomo.service.js +0 -106
- package/esm2015/lib/modules/panels/abstract-panel.js +0 -50
- package/esm2015/lib/modules/panels/panels.component.js +0 -26
- package/esm2015/lib/modules/panels/panels.module.js +0 -28
- package/esm2015/lib/modules/panels/panels.service.js +0 -331
- package/esm2015/lib/modules/relations/relations.component.js +0 -181
- package/esm2015/lib/modules/relations/relations.module.js +0 -33
- package/esm2015/lib/modules/search/dropdown-container/dropdown-container.component.js +0 -87
- package/esm2015/lib/modules/search/dropdown-container/dropdown.service.js +0 -95
- package/esm2015/lib/modules/search/facet-selector/facet-selector.component.js +0 -47
- package/esm2015/lib/modules/search/group/group.component.js +0 -39
- package/esm2015/lib/modules/search/input/input.component.js +0 -316
- package/esm2015/lib/modules/search/search/search.component.js +0 -71
- package/esm2015/lib/modules/search/search.module.js +0 -52
- package/esm2015/lib/modules/select/abstract-select.component.js +0 -176
- package/esm2015/lib/modules/select/select/select.component.js +0 -190
- package/esm2015/lib/modules/select/select-enum/select-enum.component.js +0 -34
- package/esm2015/lib/modules/select/select-hierarchic/select-hierarchic.component.js +0 -120
- package/esm2015/lib/modules/select/select.module.js +0 -39
- package/esm2015/lib/modules/sidenav/sidenav/sidenav.component.js +0 -12
- package/esm2015/lib/modules/sidenav/sidenav-container/sidenav-container.component.js +0 -79
- package/esm2015/lib/modules/sidenav/sidenav-content/sidenav-content.component.js +0 -13
- package/esm2015/lib/modules/sidenav/sidenav-stack.service.js +0 -50
- package/esm2015/lib/modules/sidenav/sidenav.module.js +0 -20
- package/esm2015/lib/modules/sidenav/sidenav.service.js +0 -199
- package/esm2015/lib/modules/stamp/stamp-module.module.js +0 -13
- package/esm2015/lib/modules/stamp/stamp.component.js +0 -13
- package/esm2015/lib/modules/table-button/table-button.component.js +0 -38
- package/esm2015/lib/modules/table-button/table-button.module.js +0 -16
- package/esm2015/lib/services/abstract-model.service.js +0 -509
- package/esm2015/lib/services/enum.service.js +0 -68
- package/esm2015/lib/services/link-mutation.service.js +0 -155
- package/esm2015/lib/services/persistence.service.js +0 -114
- package/esm2015/lib/services/swiss-parsing-date-adapter.service.js +0 -55
- package/fesm2015/ecodev-natural.js.map +0 -1
- package/lib/modules/common/directives/reactive-asterisk.directive.d.ts +0 -10
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import { gql } from 'apollo-angular';
|
|
2
|
+
import { NetworkStatus } from '@apollo/client/core';
|
|
3
|
+
import { FormControl, FormGroup } from '@angular/forms';
|
|
4
|
+
import { defaults, merge, mergeWith, omit, pick } from 'lodash-es';
|
|
5
|
+
import { EMPTY, Observable, of, ReplaySubject, Subject } from 'rxjs';
|
|
6
|
+
import { debounceTime, filter, map, mergeMap, shareReplay, switchMap, take, takeWhile, tap } from 'rxjs/operators';
|
|
7
|
+
import { NaturalQueryVariablesManager } from '../classes/query-variable-manager';
|
|
8
|
+
import { makePlural, mergeOverrideArray, relationsToIds, upperCaseFirstLetter } from '../classes/utility';
|
|
9
|
+
export class NaturalAbstractModelService {
|
|
10
|
+
constructor(apollo, name, oneQuery, allQuery, createMutation, updateMutation, deleteMutation) {
|
|
11
|
+
this.apollo = apollo;
|
|
12
|
+
this.name = name;
|
|
13
|
+
this.oneQuery = oneQuery;
|
|
14
|
+
this.allQuery = allQuery;
|
|
15
|
+
this.createMutation = createMutation;
|
|
16
|
+
this.updateMutation = updateMutation;
|
|
17
|
+
this.deleteMutation = deleteMutation;
|
|
18
|
+
/**
|
|
19
|
+
* Stores the debounced update function
|
|
20
|
+
*/
|
|
21
|
+
this.debouncedUpdateCache = new Map();
|
|
22
|
+
/**
|
|
23
|
+
* Store the creation mutations that are pending
|
|
24
|
+
*/
|
|
25
|
+
this.creatingCache = new Map();
|
|
26
|
+
}
|
|
27
|
+
getConsolidatedForClient() {
|
|
28
|
+
return Object.assign(this.getDefaultForServer(), this.getDefaultForClient());
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* List of individual fields validators
|
|
32
|
+
*/
|
|
33
|
+
getFormValidators(model) {
|
|
34
|
+
return {};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* List of individual async fields validators
|
|
38
|
+
*/
|
|
39
|
+
getFormAsyncValidators(model) {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* List of grouped fields validators (like password + confirm password)
|
|
44
|
+
*/
|
|
45
|
+
getFormGroupValidators(model) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* List of async group fields validators (like unique constraint on multiple columns)
|
|
50
|
+
*/
|
|
51
|
+
getFormGroupAsyncValidators(model) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
getFormConfig(model) {
|
|
55
|
+
const values = this.getConsolidatedForClient();
|
|
56
|
+
const validators = this.getFormValidators(model);
|
|
57
|
+
const asyncValidators = this.getFormAsyncValidators(model);
|
|
58
|
+
const controls = {};
|
|
59
|
+
const disabled = model.permissions ? !model.permissions.update : false;
|
|
60
|
+
if (model.id) {
|
|
61
|
+
controls['id'] = new FormControl({ value: model.id, disabled: true });
|
|
62
|
+
}
|
|
63
|
+
// Configure form for each field of model
|
|
64
|
+
for (const key of Object.keys(values)) {
|
|
65
|
+
const value = model[key] !== undefined ? model[key] : values[key];
|
|
66
|
+
const formState = {
|
|
67
|
+
value: value,
|
|
68
|
+
disabled: disabled,
|
|
69
|
+
};
|
|
70
|
+
const validator = typeof validators[key] !== 'undefined' ? validators[key] : null;
|
|
71
|
+
const asyncValidator = typeof asyncValidators[key] !== 'undefined' ? asyncValidators[key] : null;
|
|
72
|
+
controls[key] = new FormControl(formState, validator, asyncValidator);
|
|
73
|
+
}
|
|
74
|
+
// Configure form for extra validators that are not on a specific field
|
|
75
|
+
for (const key of Object.keys(validators)) {
|
|
76
|
+
if (!controls[key]) {
|
|
77
|
+
const formState = {
|
|
78
|
+
value: model[key] ? model[key] : null,
|
|
79
|
+
disabled: disabled,
|
|
80
|
+
};
|
|
81
|
+
controls[key] = new FormControl(formState, validators[key]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const key of Object.keys(asyncValidators)) {
|
|
85
|
+
if (controls[key] && asyncValidators[key]) {
|
|
86
|
+
controls[key].setAsyncValidators(asyncValidators[key]);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const formState = {
|
|
90
|
+
value: model[key] ? model[key] : null,
|
|
91
|
+
disabled: disabled,
|
|
92
|
+
};
|
|
93
|
+
controls[key] = new FormControl(formState, null, asyncValidators[key]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return controls;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create the final FormGroup for the object, including all validators
|
|
100
|
+
*
|
|
101
|
+
* This method should **not** be overridden, but instead `getFormConfig`,
|
|
102
|
+
* `getFormGroupValidators`, `getFormGroupAsyncValidators` might be.
|
|
103
|
+
*/
|
|
104
|
+
getFormGroup(model) {
|
|
105
|
+
const formConfig = this.getFormConfig(model);
|
|
106
|
+
return new FormGroup(formConfig, {
|
|
107
|
+
validators: this.getFormGroupValidators(model),
|
|
108
|
+
asyncValidators: this.getFormGroupAsyncValidators(model),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get a single object
|
|
113
|
+
*
|
|
114
|
+
* If available it will emit object from cache immediately, then it
|
|
115
|
+
* will **always** fetch from network and then the observable will be completed
|
|
116
|
+
*/
|
|
117
|
+
getOne(id) {
|
|
118
|
+
this.throwIfObservable(id);
|
|
119
|
+
this.throwIfNotQuery(this.oneQuery);
|
|
120
|
+
const queryRef = this.apollo.watchQuery({
|
|
121
|
+
query: this.oneQuery,
|
|
122
|
+
variables: this.getVariablesForOne(id),
|
|
123
|
+
fetchPolicy: 'cache-and-network',
|
|
124
|
+
nextFetchPolicy: 'cache-only',
|
|
125
|
+
});
|
|
126
|
+
return queryRef.valueChanges.pipe(filter(result => !!result.data), takeWhile(result => result.networkStatus !== NetworkStatus.ready, true), map(result => result.data[this.name]));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get a collection of objects
|
|
130
|
+
*
|
|
131
|
+
* It will **always** fetch from network and then the observable will be completed.
|
|
132
|
+
* No cache is ever used, so it's slow but correct.
|
|
133
|
+
*/
|
|
134
|
+
getAll(queryVariablesManager) {
|
|
135
|
+
this.throwIfNotQuery(this.allQuery);
|
|
136
|
+
// Copy manager to prevent to apply internal variables to external QueryVariablesManager
|
|
137
|
+
const manager = new NaturalQueryVariablesManager(queryVariablesManager);
|
|
138
|
+
manager.merge('partial-variables', this.getPartialVariablesForAll());
|
|
139
|
+
return this.apollo
|
|
140
|
+
.query({
|
|
141
|
+
query: this.allQuery,
|
|
142
|
+
variables: manager.variables.value,
|
|
143
|
+
fetchPolicy: 'network-only',
|
|
144
|
+
})
|
|
145
|
+
.pipe(this.mapAll());
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get a collection of objects
|
|
149
|
+
*
|
|
150
|
+
* Every time the observable variables change, and they are not undefined,
|
|
151
|
+
* it will return result from cache, then it will **always** fetch from network.
|
|
152
|
+
*
|
|
153
|
+
* You must subscribe to start getting results (and fetch from network).
|
|
154
|
+
*
|
|
155
|
+
* The observable result will only complete when unsubscribing. That means you **must** unsubscribe.
|
|
156
|
+
*/
|
|
157
|
+
watchAll(queryVariablesManager, fetchPolicy = 'cache-and-network') {
|
|
158
|
+
this.throwIfNotQuery(this.allQuery);
|
|
159
|
+
return queryVariablesManager.variables.pipe(
|
|
160
|
+
// Ignore very fast variable changes
|
|
161
|
+
debounceTime(20),
|
|
162
|
+
// Wait for variables to be defined to prevent duplicate query: with and without variables
|
|
163
|
+
// Null is accepted value for "no variables"
|
|
164
|
+
filter(variables => typeof variables !== 'undefined'), switchMap(() => {
|
|
165
|
+
// Apply partial variables from service
|
|
166
|
+
// Copy manager to prevent to apply internal variables to external QueryVariablesManager
|
|
167
|
+
const manager = new NaturalQueryVariablesManager(queryVariablesManager);
|
|
168
|
+
manager.merge('partial-variables', this.getPartialVariablesForAll());
|
|
169
|
+
this.throwIfNotQuery(this.allQuery);
|
|
170
|
+
return this.apollo
|
|
171
|
+
.watchQuery({
|
|
172
|
+
query: this.allQuery,
|
|
173
|
+
variables: manager.variables.value,
|
|
174
|
+
fetchPolicy: fetchPolicy,
|
|
175
|
+
})
|
|
176
|
+
.valueChanges.pipe(filter(r => !!r.data), this.mapAll());
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* This functions allow to quickly create or update objects.
|
|
181
|
+
*
|
|
182
|
+
* Manages a "creation is pending" status, and update when creation is ready.
|
|
183
|
+
* Uses regular update/updateNow and create methods.
|
|
184
|
+
* Used mainly when editing multiple objects in same controller (like in editable arrays)
|
|
185
|
+
*/
|
|
186
|
+
createOrUpdate(object, now = false) {
|
|
187
|
+
this.throwIfObservable(object);
|
|
188
|
+
this.throwIfNotQuery(this.createMutation);
|
|
189
|
+
this.throwIfNotQuery(this.updateMutation);
|
|
190
|
+
// If creation is pending, listen to creation observable and when ready, fire update
|
|
191
|
+
const pendingCreation = this.creatingCache.get(object);
|
|
192
|
+
if (pendingCreation) {
|
|
193
|
+
return pendingCreation.pipe(switchMap(() => {
|
|
194
|
+
return this.update(object);
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
// If object has Id, just save it
|
|
198
|
+
if ('id' in object && object.id) {
|
|
199
|
+
if (now) {
|
|
200
|
+
// used mainly for tests, because lodash debounced used in update() does not work fine with fakeAsync and tick()
|
|
201
|
+
return this.updateNow(object);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
return this.update(object);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// If object was not saving, and has no ID, create it
|
|
208
|
+
const creation = this.create(object).pipe(tap(() => {
|
|
209
|
+
this.creatingCache.delete(object); // remove from cache
|
|
210
|
+
}));
|
|
211
|
+
// stores creating observable in a cache replayable version of the observable,
|
|
212
|
+
// so several update() can subscribe to the same creation
|
|
213
|
+
this.creatingCache.set(object, creation.pipe(shareReplay()));
|
|
214
|
+
return creation;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Create an object in DB and then refetch the list of objects
|
|
218
|
+
*/
|
|
219
|
+
create(object) {
|
|
220
|
+
this.throwIfObservable(object);
|
|
221
|
+
this.throwIfNotQuery(this.createMutation);
|
|
222
|
+
const variables = merge({}, { input: this.getInput(object) }, this.getPartialVariablesForCreation(object));
|
|
223
|
+
return this.apollo
|
|
224
|
+
.mutate({
|
|
225
|
+
mutation: this.createMutation,
|
|
226
|
+
variables: variables,
|
|
227
|
+
})
|
|
228
|
+
.pipe(map(result => {
|
|
229
|
+
this.apollo.client.reFetchObservableQueries();
|
|
230
|
+
const newObject = this.mapCreation(result);
|
|
231
|
+
if (newObject) {
|
|
232
|
+
return mergeWith(object, newObject, mergeOverrideArray);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
return newObject;
|
|
236
|
+
}
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Update an object, after a short debounce
|
|
241
|
+
*/
|
|
242
|
+
update(object) {
|
|
243
|
+
this.throwIfObservable(object);
|
|
244
|
+
this.throwIfNotQuery(this.updateMutation);
|
|
245
|
+
// Keep a single instance of the debounced update function
|
|
246
|
+
const id = object.id;
|
|
247
|
+
let debounced = this.debouncedUpdateCache.get(id);
|
|
248
|
+
if (!debounced) {
|
|
249
|
+
const source = new ReplaySubject(1);
|
|
250
|
+
let wasCancelled = false;
|
|
251
|
+
const canceller = new Subject();
|
|
252
|
+
canceller.subscribe(() => {
|
|
253
|
+
wasCancelled = true;
|
|
254
|
+
source.complete();
|
|
255
|
+
canceller.complete();
|
|
256
|
+
});
|
|
257
|
+
// Create debounced update function
|
|
258
|
+
const result = source.pipe(debounceTime(2000), // Wait 2sec.
|
|
259
|
+
take(1), mergeMap(() => {
|
|
260
|
+
this.debouncedUpdateCache.delete(id);
|
|
261
|
+
if (wasCancelled) {
|
|
262
|
+
return EMPTY;
|
|
263
|
+
}
|
|
264
|
+
return this.updateNow(object);
|
|
265
|
+
}), shareReplay());
|
|
266
|
+
debounced = {
|
|
267
|
+
source,
|
|
268
|
+
canceller,
|
|
269
|
+
result,
|
|
270
|
+
};
|
|
271
|
+
this.debouncedUpdateCache.set(id, debounced);
|
|
272
|
+
}
|
|
273
|
+
// Notify our debounced update each time we ask to update
|
|
274
|
+
debounced.source.next();
|
|
275
|
+
// Return and observable that is updated when mutation is done
|
|
276
|
+
return debounced.result;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Update an object immediately when subscribing
|
|
280
|
+
*/
|
|
281
|
+
updateNow(object) {
|
|
282
|
+
this.throwIfObservable(object);
|
|
283
|
+
this.throwIfNotQuery(this.updateMutation);
|
|
284
|
+
const variables = merge({
|
|
285
|
+
id: object.id,
|
|
286
|
+
input: this.getInput(object),
|
|
287
|
+
}, this.getPartialVariablesForUpdate(object));
|
|
288
|
+
return this.apollo
|
|
289
|
+
.mutate({
|
|
290
|
+
mutation: this.updateMutation,
|
|
291
|
+
variables: variables,
|
|
292
|
+
})
|
|
293
|
+
.pipe(map(result => {
|
|
294
|
+
this.apollo.client.reFetchObservableQueries();
|
|
295
|
+
const mappedResult = this.mapUpdate(result);
|
|
296
|
+
return mergeWith(object, mappedResult, mergeOverrideArray);
|
|
297
|
+
}));
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Update an object but without automatically injecting values coming
|
|
301
|
+
* from `getDefaultForServer()`.
|
|
302
|
+
*/
|
|
303
|
+
updatePartially(object) {
|
|
304
|
+
this.throwIfObservable(object);
|
|
305
|
+
this.throwIfNotQuery(this.updateMutation);
|
|
306
|
+
const variables = {
|
|
307
|
+
id: object.id,
|
|
308
|
+
input: omit(relationsToIds(object), 'id'),
|
|
309
|
+
};
|
|
310
|
+
return this.apollo
|
|
311
|
+
.mutate({
|
|
312
|
+
mutation: this.updateMutation,
|
|
313
|
+
variables: variables,
|
|
314
|
+
})
|
|
315
|
+
.pipe(map(result => {
|
|
316
|
+
this.apollo.client.reFetchObservableQueries();
|
|
317
|
+
return this.mapUpdate(result);
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Delete objects and then refetch the list of objects
|
|
322
|
+
*/
|
|
323
|
+
delete(objects) {
|
|
324
|
+
this.throwIfObservable(objects);
|
|
325
|
+
this.throwIfNotQuery(this.deleteMutation);
|
|
326
|
+
const ids = objects.map(o => {
|
|
327
|
+
// Cancel pending update
|
|
328
|
+
const debounced = this.debouncedUpdateCache.get(o.id);
|
|
329
|
+
debounced?.canceller.next();
|
|
330
|
+
return o.id;
|
|
331
|
+
});
|
|
332
|
+
const variables = merge({
|
|
333
|
+
ids: ids,
|
|
334
|
+
}, this.getPartialVariablesForDelete(objects));
|
|
335
|
+
return this.apollo
|
|
336
|
+
.mutate({
|
|
337
|
+
mutation: this.deleteMutation,
|
|
338
|
+
variables: variables,
|
|
339
|
+
})
|
|
340
|
+
.pipe(map(result => {
|
|
341
|
+
this.apollo.client.reFetchObservableQueries();
|
|
342
|
+
return this.mapDelete(result);
|
|
343
|
+
}));
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Resolve model and items related to the model, if the id is provided, in order to show a form
|
|
347
|
+
*/
|
|
348
|
+
resolve(id) {
|
|
349
|
+
// Load model if id is given
|
|
350
|
+
let observable;
|
|
351
|
+
if (id) {
|
|
352
|
+
observable = this.getOne(id);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
observable = of(this.getConsolidatedForClient());
|
|
356
|
+
}
|
|
357
|
+
return observable.pipe(map(result => {
|
|
358
|
+
return { model: result };
|
|
359
|
+
}));
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Return an object that match the GraphQL input type.
|
|
363
|
+
* It creates an object with manually filled data and add uncompleted data (like required attributes that can be empty strings)
|
|
364
|
+
*/
|
|
365
|
+
getInput(object) {
|
|
366
|
+
// Convert relations to their IDs for mutation
|
|
367
|
+
object = relationsToIds(object);
|
|
368
|
+
// Pick only attributes that we can find in the empty object
|
|
369
|
+
// In other words, prevent to select data that has unwanted attributes
|
|
370
|
+
const emptyObject = this.getDefaultForServer();
|
|
371
|
+
let input = pick(object, Object.keys(emptyObject));
|
|
372
|
+
// Complete a potentially uncompleted object with default values
|
|
373
|
+
input = defaults(input, emptyObject);
|
|
374
|
+
return input;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Return the number of objects matching the query
|
|
378
|
+
*
|
|
379
|
+
* This is used for the unique validator
|
|
380
|
+
*/
|
|
381
|
+
count(queryVariablesManager) {
|
|
382
|
+
const plural = makePlural(this.name);
|
|
383
|
+
const queryName = 'Count' + upperCaseFirstLetter(plural);
|
|
384
|
+
const filterType = upperCaseFirstLetter(this.name) + 'Filter';
|
|
385
|
+
// Copy manager to prevent to apply internal variables to external QueryVariablesManager
|
|
386
|
+
const manager = new NaturalQueryVariablesManager(queryVariablesManager);
|
|
387
|
+
manager.merge('partial-variables', this.getPartialVariablesForAll());
|
|
388
|
+
const query = gql `
|
|
389
|
+
query ${queryName} ($filter: ${filterType}) {
|
|
390
|
+
count: ${plural} (filter: $filter, pagination: {pageSize: 0, pageIndex: 0}) {
|
|
391
|
+
length
|
|
392
|
+
}
|
|
393
|
+
}`;
|
|
394
|
+
return this.apollo
|
|
395
|
+
.query({
|
|
396
|
+
query: query,
|
|
397
|
+
variables: manager.variables.value,
|
|
398
|
+
fetchPolicy: 'network-only',
|
|
399
|
+
})
|
|
400
|
+
.pipe(map(result => result.data.count.length));
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Return empty object with some default values from server perspective
|
|
404
|
+
*
|
|
405
|
+
* This is typically useful when showing a form for creation
|
|
406
|
+
*/
|
|
407
|
+
getDefaultForServer() {
|
|
408
|
+
return {};
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Return empty object with some default values from frontend perspective
|
|
412
|
+
*
|
|
413
|
+
* Where empty object must respect graphql XXXInput type, may need some default values for other fields
|
|
414
|
+
*/
|
|
415
|
+
getDefaultForClient() {
|
|
416
|
+
return {};
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* This is used to extract only the array of fetched objects out of the entire fetched data
|
|
420
|
+
*/
|
|
421
|
+
mapAll() {
|
|
422
|
+
const plural = makePlural(this.name);
|
|
423
|
+
return map(result => result.data[plural]); // See https://github.com/apollographql/apollo-client/issues/5662
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* This is used to extract only the created object out of the entire fetched data
|
|
427
|
+
*/
|
|
428
|
+
mapCreation(result) {
|
|
429
|
+
const name = 'create' + upperCaseFirstLetter(this.name);
|
|
430
|
+
return result.data[name]; // See https://github.com/apollographql/apollo-client/issues/5662
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* This is used to extract only the updated object out of the entire fetched data
|
|
434
|
+
*/
|
|
435
|
+
mapUpdate(result) {
|
|
436
|
+
const name = 'update' + upperCaseFirstLetter(this.name);
|
|
437
|
+
return result.data[name]; // See https://github.com/apollographql/apollo-client/issues/5662
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* This is used to extract only flag when deleting an object
|
|
441
|
+
*/
|
|
442
|
+
mapDelete(result) {
|
|
443
|
+
const name = 'delete' + makePlural(upperCaseFirstLetter(this.name));
|
|
444
|
+
return result.data[name]; // See https://github.com/apollographql/apollo-client/issues/5662
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Returns additional variables to be used when getting a single object
|
|
448
|
+
*
|
|
449
|
+
* This is typically a site or state ID, and is needed to get appropriate access rights
|
|
450
|
+
*/
|
|
451
|
+
getPartialVariablesForOne() {
|
|
452
|
+
return {};
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Returns additional variables to be used when getting multiple objects
|
|
456
|
+
*
|
|
457
|
+
* This is typically a site or state ID, but it could be something else to further filter the query
|
|
458
|
+
*/
|
|
459
|
+
getPartialVariablesForAll() {
|
|
460
|
+
return {};
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Returns additional variables to be used when creating an object
|
|
464
|
+
*
|
|
465
|
+
* This is typically a site or state ID
|
|
466
|
+
*/
|
|
467
|
+
getPartialVariablesForCreation(object) {
|
|
468
|
+
return {};
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Returns additional variables to be used when updating an object
|
|
472
|
+
*
|
|
473
|
+
* This is typically a site or state ID
|
|
474
|
+
*/
|
|
475
|
+
getPartialVariablesForUpdate(object) {
|
|
476
|
+
return {};
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Return additional variables to be used when deleting an object
|
|
480
|
+
*
|
|
481
|
+
* This is typically a site or state ID
|
|
482
|
+
*/
|
|
483
|
+
getPartialVariablesForDelete(objects) {
|
|
484
|
+
return {};
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Throw exception to prevent executing queries with invalid variables
|
|
488
|
+
*/
|
|
489
|
+
throwIfObservable(value) {
|
|
490
|
+
if (value instanceof Observable) {
|
|
491
|
+
throw new Error('Cannot use Observable as variables. Instead you should use .subscribe() to call the method with a real value');
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Merge given ID with additional partial variables if there is any
|
|
496
|
+
*/
|
|
497
|
+
getVariablesForOne(id) {
|
|
498
|
+
return merge({}, { id: id }, this.getPartialVariablesForOne());
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Throw exception to prevent executing null queries
|
|
502
|
+
*/
|
|
503
|
+
throwIfNotQuery(query) {
|
|
504
|
+
if (!query) {
|
|
505
|
+
throw new Error('GraphQL query for this method was not configured in this service constructor');
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBUyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWMsYUFBYSxFQUF3QixNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFBb0MsV0FBVyxFQUFFLFNBQVMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBSXRHLE9BQU8sRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBb0IsYUFBYSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyRixPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQUMsNEJBQTRCLEVBQWlCLE1BQU0sbUNBQW1DLENBQUM7QUFFL0YsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQXlCeEcsTUFBTSxPQUFnQiwyQkFBMkI7SUE2QjdDLFlBQ3VCLE1BQWMsRUFDZCxJQUFZLEVBQ1osUUFBNkIsRUFDN0IsUUFBNkIsRUFDN0IsY0FBbUMsRUFDbkMsY0FBbUMsRUFDbkMsY0FBbUM7UUFObkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixhQUFRLEdB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LE9BQWtCO1FBQ3JELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ08saUJBQWlCLENBQUMsS0FBVTtRQUNsQyxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCw4R0FBOEcsQ0FDakgsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsRUFBVTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxFQUFFLEVBQUUsRUFBRSxFQUFDLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQVMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsS0FBMEI7UUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztTQUNuRztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBvbGxvLCBncWx9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7RmV0Y2hSZXN1bHQsIE5ldHdvcmtTdGF0dXMsIFdhdGNoUXVlcnlGZXRjaFBvbGljeX0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtEb2N1bWVudE5vZGV9IGZyb20gJ2dyYXBocWwnO1xuXG5pbXBvcnQge2RlZmF1bHRzLCBtZXJnZSwgbWVyZ2VXaXRoLCBvbWl0LCBwaWNrfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtFTVBUWSwgT2JzZXJ2YWJsZSwgb2YsIE9wZXJhdG9yRnVuY3Rpb24sIFJlcGxheVN1YmplY3QsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVdoaWxlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7bWFrZVBsdXJhbCwgbWVyZ2VPdmVycmlkZUFycmF5LCByZWxhdGlvbnNUb0lkcywgdXBwZXJDYXNlRmlyc3RMZXR0ZXJ9IGZyb20gJy4uL2NsYXNzZXMvdXRpbGl0eSc7XG5pbXBvcnQge1BhZ2luYXRlZERhdGF9IGZyb20gJy4uL2NsYXNzZXMvZGF0YS1zb3VyY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1WYWxpZGF0b3JzIHtcbiAgICBba2V5OiBzdHJpbmddOiBWYWxpZGF0b3JGbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Bc3luY1ZhbGlkYXRvcnMge1xuICAgIFtrZXk6IHN0cmluZ106IEFzeW5jVmFsaWRhdG9yRm5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZXNXaXRoSW5wdXQge1xuICAgIGlucHV0OiBMaXRlcmFsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db250cm9scyB7XG4gICAgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZTxUT25lPiB7XG4gICAgbW9kZWw6IFRPbmU7XG59XG5cbmV4cG9ydCB0eXBlIFdpdGhJZDxUPiA9IHtpZDogc3RyaW5nfSAmIFQ7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgVG9uZSxcbiAgICBWb25lIGV4dGVuZHMge2lkOiBzdHJpbmd9LFxuICAgIFRhbGwgZXh0ZW5kcyBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgIFZhbGwgZXh0ZW5kcyBRdWVyeVZhcmlhYmxlcyxcbiAgICBUY3JlYXRlLFxuICAgIFZjcmVhdGUgZXh0ZW5kcyBWYXJpYWJsZXNXaXRoSW5wdXQsXG4gICAgVHVwZGF0ZSxcbiAgICBWdXBkYXRlIGV4dGVuZHMge2lkOiBzdHJpbmc7IGlucHV0OiBMaXRlcmFsfSxcbiAgICBUZGVsZXRlLFxuICAgIFZkZWxldGUgZXh0ZW5kcyB7aWRzOiBzdHJpbmdbXX0sXG4+IHtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlYm91bmNlZFVwZGF0ZUNhY2hlID0gbmV3IE1hcDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IFN1YmplY3Q8dm9pZD47XG4gICAgICAgICAgICBjYW5jZWxsZXI6IFN1YmplY3Q8dm9pZD47XG4gICAgICAgICAgICByZXN1bHQ6IE9ic2VydmFibGU8VHVwZGF0ZT47XG4gICAgICAgIH1cbiAgICA+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgY3JlYXRpb24gbXV0YXRpb25zIHRoYXQgYXJlIHBlbmRpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0aW5nQ2FjaGUgPSBuZXcgTWFwPFZjcmVhdGVbJ2lucHV0J10gfCBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4sIE9ic2VydmFibGU8VGNyZWF0ZT4+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhcG9sbG86IEFwb2xsbyxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uZVF1ZXJ5OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxsUXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBjcmVhdGVNdXRhdGlvbjogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHVwZGF0ZU11dGF0aW9uOiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVsZXRlTXV0YXRpb246IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldENvbnNvbGlkYXRlZEZvckNsaWVudCgpOiBMaXRlcmFsIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCksIHRoaXMuZ2V0RGVmYXVsdEZvckNsaWVudCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgZmllbGRzIHZhbGlkYXRvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybVZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogRm9ybVZhbGlkYXRvcnMge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIGFzeW5jIGZpZWxkcyB2YWxpZGF0b3JzXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Bc3luY1ZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogRm9ybUFzeW5jVmFsaWRhdG9ycyB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGdyb3VwZWQgZmllbGRzIHZhbGlkYXRvcnMgKGxpa2UgcGFzc3dvcmQgKyBjb25maXJtIHBhc3N3b3JkKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtR3JvdXBWYWxpZGF0b3JzKG1vZGVsPzogTGl0ZXJhbCk6IFZhbGlkYXRvckZuW10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhc3luYyBncm91cCBmaWVsZHMgdmFsaWRhdG9ycyAobGlrZSB1bmlxdWUgY29uc3RyYWludCBvbiBtdWx0aXBsZSBjb2x1bW5zKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtR3JvdXBBc3luY1ZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogQXN5bmNWYWxpZGF0b3JGbltdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtQ29uZmlnKG1vZGVsOiBMaXRlcmFsKTogRm9ybUNvbnRyb2xzIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRDb25zb2xpZGF0ZWRGb3JDbGllbnQoKTtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0Rm9ybVZhbGlkYXRvcnMobW9kZWwpO1xuICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSB0aGlzLmdldEZvcm1Bc3luY1ZhbGlkYXRvcnMobW9kZWwpO1xuICAgICAgICBjb25zdCBjb250cm9sczogRm9ybUNvbnRyb2xzID0ge307XG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gbW9kZWwucGVybWlzc2lvbnMgPyAhbW9kZWwucGVybWlzc2lvbnMudXBkYXRlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKG1vZGVsLmlkKSB7XG4gICAgICAgICAgICBjb250cm9sc1snaWQnXSA9IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6IG1vZGVsLmlkLCBkaXNhYmxlZDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlndXJlIGZvcm0gZm9yIGVhY2ggZmllbGQgb2YgbW9kZWxcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXldICE9PSB1bmRlZmluZWQgPyBtb2RlbFtrZXldIDogdmFsdWVzW2tleV07XG4gICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB0eXBlb2YgdmFsaWRhdG9yc1trZXldICE9PSAndW5kZWZpbmVkJyA/IHZhbGlkYXRvcnNba2V5XSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvciA9IHR5cGVvZiBhc3luY1ZhbGlkYXRvcnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcgPyBhc3luY1ZhbGlkYXRvcnNba2V5XSA6IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpZ3VyZSBmb3JtIGZvciBleHRyYSB2YWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBvbiBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbGlkYXRvcnMpKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRyb2xzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbHNba2V5XSAmJiBhc3luY1ZhbGlkYXRvcnNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0uc2V0QXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlLCBudWxsLCBhc3luY1ZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udHJvbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBmaW5hbCBGb3JtR3JvdXAgZm9yIHRoZSBvYmplY3QsIGluY2x1ZGluZyBhbGwgdmFsaWRhdG9yc1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkICoqbm90KiogYmUgb3ZlcnJpZGRlbiwgYnV0IGluc3RlYWQgYGdldEZvcm1Db25maWdgLFxuICAgICAqIGBnZXRGb3JtR3JvdXBWYWxpZGF0b3JzYCwgYGdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9yc2AgbWlnaHQgYmUuXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Hcm91cChtb2RlbDogTGl0ZXJhbCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWcgPSB0aGlzLmdldEZvcm1Db25maWcobW9kZWwpO1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChmb3JtQ29uZmlnLCB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLmdldEZvcm1Hcm91cFZhbGlkYXRvcnMobW9kZWwpLFxuICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzOiB0aGlzLmdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9ycyhtb2RlbCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNpbmdsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIElmIGF2YWlsYWJsZSBpdCB3aWxsIGVtaXQgb2JqZWN0IGZyb20gY2FjaGUgaW1tZWRpYXRlbHksIHRoZW4gaXRcbiAgICAgKiB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrIGFuZCB0aGVuIHRoZSBvYnNlcnZhYmxlIHdpbGwgYmUgY29tcGxldGVkXG4gICAgICovXG4gICAgcHVibGljIGdldE9uZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUb25lPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUoaWQpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLm9uZVF1ZXJ5KTtcblxuICAgICAgICBjb25zdCBxdWVyeVJlZiA9IHRoaXMuYXBvbGxvLndhdGNoUXVlcnk8VG9uZSwgVm9uZT4oe1xuICAgICAgICAgICAgcXVlcnk6IHRoaXMub25lUXVlcnksXG4gICAgICAgICAgICB2YXJpYWJsZXM6IHRoaXMuZ2V0VmFyaWFibGVzRm9yT25lKGlkKSxcbiAgICAgICAgICAgIGZldGNoUG9saWN5OiAnY2FjaGUtYW5kLW5ldHdvcmsnLFxuICAgICAgICAgICAgbmV4dEZldGNoUG9saWN5OiAnY2FjaGUtb25seScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBxdWVyeVJlZi52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihyZXN1bHQgPT4gISFyZXN1bHQuZGF0YSksXG4gICAgICAgICAgICB0YWtlV2hpbGUocmVzdWx0ID0+IHJlc3VsdC5uZXR3b3JrU3RhdHVzICE9PSBOZXR3b3JrU3RhdHVzLnJlYWR5LCB0cnVlKSxcbiAgICAgICAgICAgIG1hcChyZXN1bHQgPT4gKHJlc3VsdC5kYXRhIGFzIExpdGVyYWwpW3RoaXMubmFtZV0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0c1xuICAgICAqXG4gICAgICogSXQgd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yayBhbmQgdGhlbiB0aGUgb2JzZXJ2YWJsZSB3aWxsIGJlIGNvbXBsZXRlZC5cbiAgICAgKiBObyBjYWNoZSBpcyBldmVyIHVzZWQsIHNvIGl0J3Mgc2xvdyBidXQgY29ycmVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QWxsKHF1ZXJ5VmFyaWFibGVzTWFuYWdlcjogTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPik6IE9ic2VydmFibGU8VGFsbD4ge1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAvLyBDb3B5IG1hbmFnZXIgdG8gcHJldmVudCB0byBhcHBseSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gZXh0ZXJuYWwgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyXG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPihxdWVyeVZhcmlhYmxlc01hbmFnZXIpO1xuICAgICAgICBtYW5hZ2VyLm1lcmdlKCdwYXJ0aWFsLXZhcmlhYmxlcycsIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5xdWVyeTxUYWxsLCBWYWxsPih7XG4gICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMuYWxsUXVlcnksXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUodGhpcy5tYXBBbGwoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29sbGVjdGlvbiBvZiBvYmplY3RzXG4gICAgICpcbiAgICAgKiBFdmVyeSB0aW1lIHRoZSBvYnNlcnZhYmxlIHZhcmlhYmxlcyBjaGFuZ2UsIGFuZCB0aGV5IGFyZSBub3QgdW5kZWZpbmVkLFxuICAgICAqIGl0IHdpbGwgcmV0dXJuIHJlc3VsdCBmcm9tIGNhY2hlLCB0aGVuIGl0IHdpbGwgKiphbHdheXMqKiBmZXRjaCBmcm9tIG5ldHdvcmsuXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCBzdWJzY3JpYmUgdG8gc3RhcnQgZ2V0dGluZyByZXN1bHRzIChhbmQgZmV0Y2ggZnJvbSBuZXR3b3JrKS5cbiAgICAgKlxuICAgICAqIFRoZSBvYnNlcnZhYmxlIHJlc3VsdCB3aWxsIG9ubHkgY29tcGxldGUgd2hlbiB1bnN1YnNjcmliaW5nLiBUaGF0IG1lYW5zIHlvdSAqKm11c3QqKiB1bnN1YnNjcmliZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hBbGwoXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzTWFuYWdlcjogTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPixcbiAgICAgICAgZmV0Y2hQb2xpY3k6IFdhdGNoUXVlcnlGZXRjaFBvbGljeSA9ICdjYWNoZS1hbmQtbmV0d29yaycsXG4gICAgKTogT2JzZXJ2YWJsZTxUYWxsPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgIHJldHVybiBxdWVyeVZhcmlhYmxlc01hbmFnZXIudmFyaWFibGVzLnBpcGUoXG4gICAgICAgICAgICAvLyBJZ25vcmUgdmVyeSBmYXN0IHZhcmlhYmxlIGNoYW5nZXNcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyMCksXG4gICAgICAgICAgICAvLyBXYWl0IGZvciB2YXJpYWJsZXMgdG8gYmUgZGVmaW5lZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBxdWVyeTogd2l0aCBhbmQgd2l0aG91dCB2YXJpYWJsZXNcbiAgICAgICAgICAgIC8vIE51bGwgaXMgYWNjZXB0ZWQgdmFsdWUgZm9yIFwibm8gdmFyaWFibGVzXCJcbiAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXMgPT4gdHlwZW9mIHZhcmlhYmxlcyAhPT0gJ3VuZGVmaW5lZCcpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBcHBseSBwYXJ0aWFsIHZhcmlhYmxlcyBmcm9tIHNlcnZpY2VcbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1hbmFnZXIgdG8gcHJldmVudCB0byBhcHBseSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gZXh0ZXJuYWwgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgICAgICAgICAgbWFuYWdlci5tZXJnZSgncGFydGlhbC12YXJpYWJsZXMnLCB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgICAgICAgICAud2F0Y2hRdWVyeTxUYWxsLCBWYWxsPih7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5hbGxRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogZmV0Y2hQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihyID0+ICEhci5kYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwQWxsKCksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9ucyBhbGxvdyB0byBxdWlja2x5IGNyZWF0ZSBvciB1cGRhdGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIE1hbmFnZXMgYSBcImNyZWF0aW9uIGlzIHBlbmRpbmdcIiBzdGF0dXMsIGFuZCB1cGRhdGUgd2hlbiBjcmVhdGlvbiBpcyByZWFkeS5cbiAgICAgKiBVc2VzIHJlZ3VsYXIgdXBkYXRlL3VwZGF0ZU5vdyBhbmQgY3JlYXRlIG1ldGhvZHMuXG4gICAgICogVXNlZCBtYWlubHkgd2hlbiBlZGl0aW5nIG11bHRpcGxlIG9iamVjdHMgaW4gc2FtZSBjb250cm9sbGVyIChsaWtlIGluIGVkaXRhYmxlIGFycmF5cylcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JVcGRhdGUoXG4gICAgICAgIG9iamVjdDogVmNyZWF0ZVsnaW5wdXQnXSB8IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPixcbiAgICAgICAgbm93OiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogT2JzZXJ2YWJsZTxUY3JlYXRlIHwgVHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuY3JlYXRlTXV0YXRpb24pO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLnVwZGF0ZU11dGF0aW9uKTtcblxuICAgICAgICAvLyBJZiBjcmVhdGlvbiBpcyBwZW5kaW5nLCBsaXN0ZW4gdG8gY3JlYXRpb24gb2JzZXJ2YWJsZSBhbmQgd2hlbiByZWFkeSwgZmlyZSB1cGRhdGVcbiAgICAgICAgY29uc3QgcGVuZGluZ0NyZWF0aW9uID0gdGhpcy5jcmVhdGluZ0NhY2hlLmdldChvYmplY3QpO1xuICAgICAgICBpZiAocGVuZGluZ0NyZWF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVuZGluZ0NyZWF0aW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9iamVjdCBoYXMgSWQsIGp1c3Qgc2F2ZSBpdFxuICAgICAgICBpZiAoJ2lkJyBpbiBvYmplY3QgJiYgb2JqZWN0LmlkKSB7XG4gICAgICAgICAgICBpZiAobm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlZCBtYWlubHkgZm9yIHRlc3RzLCBiZWNhdXNlIGxvZGFzaCBkZWJvdW5jZWQgdXNlZCBpbiB1cGRhdGUoKSBkb2VzIG5vdCB3b3JrIGZpbmUgd2l0aCBmYWtlQXN5bmMgYW5kIHRpY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5vdyhvYmplY3QgYXMgV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JqZWN0IHdhcyBub3Qgc2F2aW5nLCBhbmQgaGFzIG5vIElELCBjcmVhdGUgaXRcbiAgICAgICAgY29uc3QgY3JlYXRpb24gPSB0aGlzLmNyZWF0ZShvYmplY3QpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpbmdDYWNoZS5kZWxldGUob2JqZWN0KTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHN0b3JlcyBjcmVhdGluZyBvYnNlcnZhYmxlIGluIGEgY2FjaGUgcmVwbGF5YWJsZSB2ZXJzaW9uIG9mIHRoZSBvYnNlcnZhYmxlLFxuICAgICAgICAvLyBzbyBzZXZlcmFsIHVwZGF0ZSgpIGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNhbWUgY3JlYXRpb25cbiAgICAgICAgdGhpcy5jcmVhdGluZ0NhY2hlLnNldChvYmplY3QsIGNyZWF0aW9uLnBpcGUoc2hhcmVSZXBsYXkoKSkpO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IGluIERCIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGUob2JqZWN0OiBWY3JlYXRlWydpbnB1dCddKTogT2JzZXJ2YWJsZTxUY3JlYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5jcmVhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QpfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckNyZWF0aW9uKG9iamVjdCksXG4gICAgICAgICkgYXMgVmNyZWF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5tdXRhdGU8VGNyZWF0ZSwgVmNyZWF0ZT4oe1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB0aGlzLmNyZWF0ZU11dGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwb2xsby5jbGllbnQucmVGZXRjaE9ic2VydmFibGVRdWVyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld09iamVjdCA9IHRoaXMubWFwQ3JlYXRpb24ocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VXaXRoKG9iamVjdCwgbmV3T2JqZWN0LCBtZXJnZU92ZXJyaWRlQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0LCBhZnRlciBhIHNob3J0IGRlYm91bmNlXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIC8vIEtlZXAgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgaWQgPSBvYmplY3QuaWQ7XG4gICAgICAgIGxldCBkZWJvdW5jZWQgPSB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLmdldChpZCk7XG5cbiAgICAgICAgaWYgKCFkZWJvdW5jZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICAgICAgbGV0IHdhc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGVyID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgICAgIGNhbmNlbGxlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdhc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc291cmNlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgY2FuY2VsbGVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgyMDAwKSwgLy8gV2FpdCAyc2VjLlxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5vdyhvYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KCksIC8vIEFsbCBhdHRlbXB0cyB0byB1cGRhdGUgd2lsbCBzaGFyZSB0aGUgZXhhY3Qgc2FtZSBzaW5nbGUgcmVzdWx0IGZyb20gQVBJXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkZWJvdW5jZWQgPSB7XG4gICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgIGNhbmNlbGxlcixcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLnNldChpZCwgZGVib3VuY2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGlmeSBvdXIgZGVib3VuY2VkIHVwZGF0ZSBlYWNoIHRpbWUgd2UgYXNrIHRvIHVwZGF0ZVxuICAgICAgICBkZWJvdW5jZWQuc291cmNlLm5leHQoKTtcblxuICAgICAgICAvLyBSZXR1cm4gYW5kIG9ic2VydmFibGUgdGhhdCBpcyB1cGRhdGVkIHdoZW4gbXV0YXRpb24gaXMgZG9uZVxuICAgICAgICByZXR1cm4gZGVib3VuY2VkLnJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0IGltbWVkaWF0ZWx5IHdoZW4gc3Vic2NyaWJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlTm93KG9iamVjdDogV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTogT2JzZXJ2YWJsZTxUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvclVwZGF0ZShvYmplY3QpLFxuICAgICAgICApIGFzIFZ1cGRhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFR1cGRhdGUsIFZ1cGRhdGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy51cGRhdGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRSZXN1bHQgPSB0aGlzLm1hcFVwZGF0ZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZVdpdGgob2JqZWN0LCBtYXBwZWRSZXN1bHQsIG1lcmdlT3ZlcnJpZGVBcnJheSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBvYmplY3QgYnV0IHdpdGhvdXQgYXV0b21hdGljYWxseSBpbmplY3RpbmcgdmFsdWVzIGNvbWluZ1xuICAgICAqIGZyb20gYGdldERlZmF1bHRGb3JTZXJ2ZXIoKWAuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVBhcnRpYWxseShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcbiAgICAgICAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICAgICAgICBpbnB1dDogb21pdChyZWxhdGlvbnNUb0lkcyhvYmplY3QpLCAnaWQnKSxcbiAgICAgICAgfSBhcyBWdXBkYXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUdXBkYXRlLCBWdXBkYXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMudXBkYXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVXBkYXRlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBvYmplY3RzIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUob2JqZWN0czoge2lkOiBzdHJpbmd9W10pOiBPYnNlcnZhYmxlPFRkZWxldGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3RzKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5kZWxldGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgaWRzID0gb2JqZWN0cy5tYXAobyA9PiB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgcGVuZGluZyB1cGRhdGVcbiAgICAgICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IHRoaXMuZGVib3VuY2VkVXBkYXRlQ2FjaGUuZ2V0KG8uaWQpO1xuICAgICAgICAgICAgZGVib3VuY2VkPy5jYW5jZWxsZXIubmV4dCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gby5pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckRlbGV0ZShvYmplY3RzKSxcbiAgICAgICAgKSBhcyBWZGVsZXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUZGVsZXRlLCBWZGVsZXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMuZGVsZXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBEZWxldGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBtb2RlbCBhbmQgaXRlbXMgcmVsYXRlZCB0byB0aGUgbW9kZWwsIGlmIHRoZSBpZCBpcyBwcm92aWRlZCwgaW4gb3JkZXIgdG8gc2hvdyBhIGZvcm1cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXNvbHZlPFRvbmU+PiB7XG4gICAgICAgIC8vIExvYWQgbW9kZWwgaWYgaWQgaXMgZ2l2ZW5cbiAgICAgICAgbGV0IG9ic2VydmFibGU7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMuZ2V0T25lKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvZih0aGlzLmdldENvbnNvbGlkYXRlZEZvckNsaWVudCgpIGFzIFRvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcbiAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7bW9kZWw6IHJlc3VsdH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IHRoYXQgbWF0Y2ggdGhlIEdyYXBoUUwgaW5wdXQgdHlwZS5cbiAgICAgKiBJdCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIG1hbnVhbGx5IGZpbGxlZCBkYXRhIGFuZCBhZGQgdW5jb21wbGV0ZWQgZGF0YSAobGlrZSByZXF1aXJlZCBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGVtcHR5IHN0cmluZ3MpXG4gICAgICovXG4gICAgcHVibGljIGdldElucHV0KG9iamVjdDogTGl0ZXJhbCk6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgLy8gQ29udmVydCByZWxhdGlvbnMgdG8gdGhlaXIgSURzIGZvciBtdXRhdGlvblxuICAgICAgICBvYmplY3QgPSByZWxhdGlvbnNUb0lkcyhvYmplY3QpO1xuXG4gICAgICAgIC8vIFBpY2sgb25seSBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FuIGZpbmQgaW4gdGhlIGVtcHR5IG9iamVjdFxuICAgICAgICAvLyBJbiBvdGhlciB3b3JkcywgcHJldmVudCB0byBzZWxlY3QgZGF0YSB0aGF0IGhhcyB1bndhbnRlZCBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IGVtcHR5T2JqZWN0ID0gdGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHBpY2sob2JqZWN0LCBPYmplY3Qua2V5cyhlbXB0eU9iamVjdCkpO1xuXG4gICAgICAgIC8vIENvbXBsZXRlIGEgcG90ZW50aWFsbHkgdW5jb21wbGV0ZWQgb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgaW5wdXQgPSBkZWZhdWx0cyhpbnB1dCwgZW1wdHlPYmplY3QpO1xuXG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdW5pcXVlIHZhbGlkYXRvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb3VudChxdWVyeVZhcmlhYmxlc01hbmFnZXI6IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBtYWtlUGx1cmFsKHRoaXMubmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5TmFtZSA9ICdDb3VudCcgKyB1cHBlckNhc2VGaXJzdExldHRlcihwbHVyYWwpO1xuICAgICAgICBjb25zdCBmaWx0ZXJUeXBlID0gdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy5uYW1lKSArICdGaWx0ZXInO1xuXG4gICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCkpO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ3FsYFxuICAgICAgICAgICAgcXVlcnkgJHtxdWVyeU5hbWV9ICgkZmlsdGVyOiAke2ZpbHRlclR5cGV9KSB7XG4gICAgICAgICAgICBjb3VudDogJHtwbHVyYWx9IChmaWx0ZXI6ICRmaWx0ZXIsIHBhZ2luYXRpb246IHtwYWdlU2l6ZTogMCwgcGFnZUluZGV4OiAwfSkge1xuICAgICAgICAgICAgbGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5xdWVyeTx7Y291bnQ6IHtsZW5ndGg6IG51bWJlcn19LCBWYWxsPih7XG4gICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gcmVzdWx0LmRhdGEuY291bnQubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGVtcHR5IG9iamVjdCB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBzZXJ2ZXIgcGVyc3BlY3RpdmVcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWZ1bCB3aGVuIHNob3dpbmcgYSBmb3JtIGZvciBjcmVhdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0Rm9yU2VydmVyKCk6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBlbXB0eSBvYmplY3Qgd2l0aCBzb21lIGRlZmF1bHQgdmFsdWVzIGZyb20gZnJvbnRlbmQgcGVyc3BlY3RpdmVcbiAgICAgKlxuICAgICAqIFdoZXJlIGVtcHR5IG9iamVjdCBtdXN0IHJlc3BlY3QgZ3JhcGhxbCBYWFhJbnB1dCB0eXBlLCBtYXkgbmVlZCBzb21lIGRlZmF1bHQgdmFsdWVzIGZvciBvdGhlciBmaWVsZHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEZvckNsaWVudCgpOiBMaXRlcmFsIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgdGhlIGFycmF5IG9mIGZldGNoZWQgb2JqZWN0cyBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQWxsKCk6IE9wZXJhdG9yRnVuY3Rpb248RmV0Y2hSZXN1bHQ8dW5rbm93bj4sIFRhbGw+IHtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gbWFrZVBsdXJhbCh0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgYW55KVtwbHVyYWxdKTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IHRoZSBjcmVhdGVkIG9iamVjdCBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQ3JlYXRpb24ocmVzdWx0OiBGZXRjaFJlc3VsdCk6IFRjcmVhdGUge1xuICAgICAgICBjb25zdCBuYW1lID0gJ2NyZWF0ZScgKyB1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdC5kYXRhIGFzIGFueSlbbmFtZV07IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tY2xpZW50L2lzc3Vlcy81NjYyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgdXBkYXRlZCBvYmplY3Qgb3V0IG9mIHRoZSBlbnRpcmUgZmV0Y2hlZCBkYXRhXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcFVwZGF0ZShyZXN1bHQ6IEZldGNoUmVzdWx0KTogVHVwZGF0ZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAndXBkYXRlJyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0LmRhdGEgYXMgYW55KVtuYW1lXTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IGZsYWcgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwRGVsZXRlKHJlc3VsdDogRmV0Y2hSZXN1bHQpOiBUZGVsZXRlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICdkZWxldGUnICsgbWFrZVBsdXJhbCh1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQuZGF0YSBhcyBhbnkpW25hbWVdOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSUQsIGFuZCBpcyBuZWVkZWQgdG8gZ2V0IGFwcHJvcHJpYXRlIGFjY2VzcyByaWdodHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGFydGlhbFZhcmlhYmxlc0Zvck9uZSgpOiBQYXJ0aWFsPFZvbmU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgbXVsdGlwbGUgb2JqZWN0c1xuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElELCBidXQgaXQgY291bGQgYmUgc29tZXRoaW5nIGVsc2UgdG8gZnVydGhlciBmaWx0ZXIgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKTogUGFydGlhbDxWYWxsPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yQ3JlYXRpb24ob2JqZWN0OiBMaXRlcmFsKTogUGFydGlhbDxWY3JlYXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiB1cGRhdGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yVXBkYXRlKG9iamVjdDogTGl0ZXJhbCk6IFBhcnRpYWw8VnVwZGF0ZT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yRGVsZXRlKG9iamVjdHM6IExpdGVyYWxbXSk6IFBhcnRpYWw8VmRlbGV0ZT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhyb3cgZXhjZXB0aW9uIHRvIHByZXZlbnQgZXhlY3V0aW5nIHF1ZXJpZXMgd2l0aCBpbnZhbGlkIHZhcmlhYmxlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB0aHJvd0lmT2JzZXJ2YWJsZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IHVzZSBPYnNlcnZhYmxlIGFzIHZhcmlhYmxlcy4gSW5zdGVhZCB5b3Ugc2hvdWxkIHVzZSAuc3Vic2NyaWJlKCkgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGggYSByZWFsIHZhbHVlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSBnaXZlbiBJRCB3aXRoIGFkZGl0aW9uYWwgcGFydGlhbCB2YXJpYWJsZXMgaWYgdGhlcmUgaXMgYW55XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZXNGb3JPbmUoaWQ6IHN0cmluZyk6IFZvbmUge1xuICAgICAgICByZXR1cm4gbWVyZ2Uoe30sIHtpZDogaWR9LCB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JPbmUoKSkgYXMgVm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgbnVsbCBxdWVyaWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSB0aHJvd0lmTm90UXVlcnkocXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwpOiBhc3NlcnRzIHF1ZXJ5IHtcbiAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIHF1ZXJ5IGZvciB0aGlzIG1ldGhvZCB3YXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhpcyBzZXJ2aWNlIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|