@ecodev/natural 41.3.0 → 42.0.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.
Files changed (348) hide show
  1. package/ecodev-natural.d.ts +1 -9
  2. package/esm2020/ecodev-natural.mjs +5 -0
  3. package/esm2020/lib/classes/abstract-controller.mjs +30 -0
  4. package/esm2020/lib/classes/abstract-detail.mjs +152 -0
  5. package/esm2020/lib/classes/abstract-editable-list.mjs +96 -0
  6. package/esm2020/lib/classes/abstract-list.mjs +406 -0
  7. package/esm2020/lib/classes/abstract-navigable-list.mjs +126 -0
  8. package/{esm2015/lib/classes/apollo-utils.js → esm2020/lib/classes/apollo-utils.mjs} +0 -0
  9. package/esm2020/lib/classes/data-source.mjs +76 -0
  10. package/{esm2015/lib/classes/query-variable-manager-utils.js → esm2020/lib/classes/query-variable-manager-utils.mjs} +0 -0
  11. package/esm2020/lib/classes/query-variable-manager.mjs +161 -0
  12. package/{esm2015/lib/classes/rxjs.js → esm2020/lib/classes/rxjs.mjs} +0 -0
  13. package/{esm2015/lib/classes/tld.js → esm2020/lib/classes/tld.mjs} +0 -0
  14. package/{esm2015/lib/classes/utility.js → esm2020/lib/classes/utility.mjs} +0 -0
  15. package/esm2020/lib/classes/validators.mjs +179 -0
  16. package/esm2020/lib/directives/http-prefix.directive.mjs +50 -0
  17. package/esm2020/lib/modules/alert/alert.module.mjs +20 -0
  18. package/esm2020/lib/modules/alert/alert.service.mjs +55 -0
  19. package/esm2020/lib/modules/alert/confirm.component.mjs +20 -0
  20. package/{esm2015/lib/modules/alert/public-api.js → esm2020/lib/modules/alert/public-api.mjs} +0 -0
  21. package/esm2020/lib/modules/avatar/avatar.module.mjs +19 -0
  22. package/esm2020/lib/modules/avatar/component/avatar.component.mjs +187 -0
  23. package/{esm2015/lib/modules/avatar/public-api.js → esm2020/lib/modules/avatar/public-api.mjs} +0 -0
  24. package/esm2020/lib/modules/avatar/service/avatar.service.mjs +66 -0
  25. package/esm2020/lib/modules/avatar/sources/gravatar.mjs +29 -0
  26. package/{esm2015/lib/modules/avatar/sources/image.js → esm2020/lib/modules/avatar/sources/image.mjs} +0 -0
  27. package/{esm2015/lib/modules/avatar/sources/initials.js → esm2020/lib/modules/avatar/sources/initials.mjs} +0 -0
  28. package/{esm2015/lib/modules/avatar/sources/source.js → esm2020/lib/modules/avatar/sources/source.mjs} +1 -1
  29. package/esm2020/lib/modules/columns-picker/columns-picker-column.directive.mjs +43 -0
  30. package/esm2020/lib/modules/columns-picker/columns-picker.component.mjs +84 -0
  31. package/esm2020/lib/modules/columns-picker/columns-picker.module.mjs +47 -0
  32. package/{esm2015/lib/modules/columns-picker/public-api.js → esm2020/lib/modules/columns-picker/public-api.mjs} +0 -0
  33. package/esm2020/lib/modules/common/common-module.mjs +54 -0
  34. package/esm2020/lib/modules/common/directives/linkable-tab.directive.mjs +79 -0
  35. package/esm2020/lib/modules/common/directives/reactive-asterisk.directive.mjs +33 -0
  36. package/esm2020/lib/modules/common/directives/src-density.directive.mjs +62 -0
  37. package/esm2020/lib/modules/common/pipes/capitalize.pipe.mjs +18 -0
  38. package/esm2020/lib/modules/common/pipes/ellipsis.pipe.mjs +14 -0
  39. package/esm2020/lib/modules/common/pipes/enum.pipe.mjs +25 -0
  40. package/esm2020/lib/modules/common/pipes/swiss-date.pipe.mjs +20 -0
  41. package/{esm2015/lib/modules/common/public-api.js → esm2020/lib/modules/common/public-api.mjs} +0 -0
  42. package/esm2020/lib/modules/common/services/memory-storage.mjs +112 -0
  43. package/esm2020/lib/modules/common/services/seo.service.mjs +114 -0
  44. package/esm2020/lib/modules/detail-header/detail-header.component.mjs +76 -0
  45. package/esm2020/lib/modules/detail-header/detail-header.module.mjs +21 -0
  46. package/{esm2015/lib/modules/detail-header/public-api.js → esm2020/lib/modules/detail-header/public-api.mjs} +0 -0
  47. package/esm2020/lib/modules/dialog-trigger/dialog-trigger.component.mjs +69 -0
  48. package/esm2020/lib/modules/dialog-trigger/dialog-trigger.module.mjs +19 -0
  49. package/{esm2015/lib/modules/dialog-trigger/public-api.js → esm2020/lib/modules/dialog-trigger/public-api.mjs} +0 -0
  50. package/esm2020/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +98 -0
  51. package/esm2020/lib/modules/dropdown-components/natural-dropdown-components.module.mjs +92 -0
  52. package/{esm2015/lib/modules/dropdown-components/public-api.js → esm2020/lib/modules/dropdown-components/public-api.mjs} +0 -0
  53. package/esm2020/lib/modules/dropdown-components/type-date/type-date.component.mjs +133 -0
  54. package/esm2020/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +137 -0
  55. package/esm2020/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +69 -0
  56. package/esm2020/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +38 -0
  57. package/esm2020/lib/modules/dropdown-components/type-number/type-number.component.mjs +104 -0
  58. package/esm2020/lib/modules/dropdown-components/type-select/type-select.component.mjs +169 -0
  59. package/esm2020/lib/modules/dropdown-components/type-text/type-text.component.mjs +57 -0
  60. package/{esm2015/lib/modules/dropdown-components/types.js → esm2020/lib/modules/dropdown-components/types.mjs} +0 -0
  61. package/{esm2015/lib/modules/dropdown-components/utils.js → esm2020/lib/modules/dropdown-components/utils.mjs} +0 -0
  62. package/esm2020/lib/modules/file/abstract-file.mjs +231 -0
  63. package/esm2020/lib/modules/file/component/file.component.mjs +143 -0
  64. package/esm2020/lib/modules/file/file-drop.directive.mjs +110 -0
  65. package/esm2020/lib/modules/file/file-select.directive.mjs +28 -0
  66. package/esm2020/lib/modules/file/file.module.mjs +24 -0
  67. package/esm2020/lib/modules/file/file.service.mjs +48 -0
  68. package/{esm2015/lib/modules/file/public-api.js → esm2020/lib/modules/file/public-api.mjs} +0 -0
  69. package/{esm2015/lib/modules/file/types.js → esm2020/lib/modules/file/types.mjs} +0 -0
  70. package/{esm2015/lib/modules/file/utils.js → esm2020/lib/modules/file/utils.mjs} +3 -4
  71. package/esm2020/lib/modules/fixed-button/fixed-button.component.mjs +27 -0
  72. package/esm2020/lib/modules/fixed-button/fixed-button.module.mjs +21 -0
  73. package/{esm2015/lib/modules/fixed-button/public-api.js → esm2020/lib/modules/fixed-button/public-api.mjs} +0 -0
  74. package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +36 -0
  75. package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.module.mjs +20 -0
  76. package/{esm2015/lib/modules/fixed-button-detail/public-api.js → esm2020/lib/modules/fixed-button-detail/public-api.mjs} +0 -0
  77. package/{esm2015/lib/modules/hierarchic-selector/classes/flat-node.js → esm2020/lib/modules/hierarchic-selector/classes/flat-node.mjs} +1 -1
  78. package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs} +0 -0
  79. package/{esm2015/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.js → esm2020/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs} +0 -0
  80. package/{esm2015/lib/modules/hierarchic-selector/classes/model-node.js → esm2020/lib/modules/hierarchic-selector/classes/model-node.mjs} +1 -1
  81. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +364 -0
  82. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +258 -0
  83. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +31 -0
  84. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +23 -0
  85. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector.module.mjs +81 -0
  86. package/{esm2015/lib/modules/hierarchic-selector/public-api.js → esm2020/lib/modules/hierarchic-selector/public-api.mjs} +0 -0
  87. package/esm2020/lib/modules/icon/icon.component.mjs +92 -0
  88. package/esm2020/lib/modules/icon/icon.module.mjs +30 -0
  89. package/{esm2015/lib/modules/icon/public-api.js → esm2020/lib/modules/icon/public-api.mjs} +0 -0
  90. package/esm2020/lib/modules/matomo/matomo-module.module.mjs +12 -0
  91. package/esm2020/lib/modules/matomo/matomo.service.mjs +105 -0
  92. package/{esm2015/lib/modules/matomo/public-api.js → esm2020/lib/modules/matomo/public-api.mjs} +0 -0
  93. package/esm2020/lib/modules/panels/abstract-panel.mjs +56 -0
  94. 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
  95. package/esm2020/lib/modules/panels/panels.component.mjs +26 -0
  96. package/esm2020/lib/modules/panels/panels.module.mjs +33 -0
  97. package/esm2020/lib/modules/panels/panels.service.mjs +325 -0
  98. package/{esm2015/lib/modules/panels/panels.urlmatcher.js → esm2020/lib/modules/panels/panels.urlmatcher.mjs} +0 -0
  99. package/{esm2015/lib/modules/panels/public-api.js → esm2020/lib/modules/panels/public-api.mjs} +0 -0
  100. package/{esm2015/lib/modules/panels/types.js → esm2020/lib/modules/panels/types.mjs} +0 -0
  101. package/{esm2015/lib/modules/relations/public-api.js → esm2020/lib/modules/relations/public-api.mjs} +0 -0
  102. package/esm2020/lib/modules/relations/relations.component.mjs +198 -0
  103. package/esm2020/lib/modules/relations/relations.module.mjs +58 -0
  104. package/{esm2015/lib/modules/search/classes/graphql-doctrine.js → esm2020/lib/modules/search/classes/graphql-doctrine.mjs} +0 -0
  105. package/{esm2015/lib/modules/search/classes/graphql-doctrine.types.js → esm2020/lib/modules/search/classes/graphql-doctrine.types.mjs} +0 -0
  106. package/{esm2015/lib/modules/search/classes/transformers.js → esm2020/lib/modules/search/classes/transformers.mjs} +0 -0
  107. package/{esm2015/lib/modules/search/classes/url.js → esm2020/lib/modules/search/classes/url.mjs} +0 -0
  108. package/{esm2015/lib/modules/search/classes/utils.js → esm2020/lib/modules/search/classes/utils.mjs} +0 -0
  109. package/{esm2015/lib/modules/search/dropdown-container/dropdown-container-animations.js → esm2020/lib/modules/search/dropdown-container/dropdown-container-animations.mjs} +0 -0
  110. package/esm2020/lib/modules/search/dropdown-container/dropdown-container.component.mjs +88 -0
  111. package/{esm2015/lib/modules/search/dropdown-container/dropdown-ref.js → esm2020/lib/modules/search/dropdown-container/dropdown-ref.mjs} +1 -1
  112. package/esm2020/lib/modules/search/dropdown-container/dropdown.service.mjs +93 -0
  113. package/esm2020/lib/modules/search/facet-selector/facet-selector.component.mjs +50 -0
  114. package/esm2020/lib/modules/search/group/group.component.mjs +45 -0
  115. package/esm2020/lib/modules/search/input/input.component.mjs +328 -0
  116. package/{esm2015/lib/modules/search/public-api.js → esm2020/lib/modules/search/public-api.mjs} +0 -0
  117. package/esm2020/lib/modules/search/search/search.component.mjs +78 -0
  118. package/esm2020/lib/modules/search/search.module.mjs +84 -0
  119. package/{esm2015/lib/modules/search/types/dropdown-component.js → esm2020/lib/modules/search/types/dropdown-component.mjs} +0 -0
  120. package/{esm2015/lib/modules/search/types/facet.js → esm2020/lib/modules/search/types/facet.mjs} +0 -0
  121. package/{esm2015/lib/modules/search/types/values.js → esm2020/lib/modules/search/types/values.mjs} +0 -0
  122. package/esm2020/lib/modules/select/abstract-select.component.mjs +186 -0
  123. package/{esm2015/lib/modules/select/public-api.js → esm2020/lib/modules/select/public-api.mjs} +0 -0
  124. package/esm2020/lib/modules/select/select/select.component.mjs +208 -0
  125. package/esm2020/lib/modules/select/select-enum/select-enum.component.mjs +42 -0
  126. package/esm2020/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +128 -0
  127. package/esm2020/lib/modules/select/select.module.mjs +68 -0
  128. package/{esm2015/lib/modules/sidenav/public-api.js → esm2020/lib/modules/sidenav/public-api.mjs} +0 -0
  129. package/esm2020/lib/modules/sidenav/sidenav/sidenav.component.mjs +15 -0
  130. package/esm2020/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +87 -0
  131. package/esm2020/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +12 -0
  132. package/esm2020/lib/modules/sidenav/sidenav-stack.service.mjs +52 -0
  133. package/esm2020/lib/modules/sidenav/sidenav.module.mjs +25 -0
  134. package/esm2020/lib/modules/sidenav/sidenav.service.mjs +195 -0
  135. package/{esm2015/lib/modules/stamp/public-api.js → esm2020/lib/modules/stamp/public-api.mjs} +0 -0
  136. package/esm2020/lib/modules/stamp/stamp-module.module.mjs +18 -0
  137. package/esm2020/lib/modules/stamp/stamp.component.mjs +14 -0
  138. package/{esm2015/lib/modules/table-button/public-api.js → esm2020/lib/modules/table-button/public-api.mjs} +0 -0
  139. package/esm2020/lib/modules/table-button/table-button.component.mjs +48 -0
  140. package/esm2020/lib/modules/table-button/table-button.module.mjs +21 -0
  141. package/esm2020/lib/services/abstract-model.service.mjs +509 -0
  142. package/esm2020/lib/services/enum.service.mjs +67 -0
  143. package/esm2020/lib/services/link-mutation.service.mjs +153 -0
  144. package/esm2020/lib/services/persistence.service.mjs +113 -0
  145. package/esm2020/lib/services/swiss-parsing-date-adapter.service.mjs +55 -0
  146. package/{esm2015/lib/types/types.js → esm2020/lib/types/types.mjs} +0 -0
  147. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  148. package/fesm2015/{ecodev-natural.js → ecodev-natural.mjs} +2791 -2361
  149. package/fesm2015/ecodev-natural.mjs.map +1 -0
  150. package/fesm2020/ecodev-natural.mjs +10506 -0
  151. package/fesm2020/ecodev-natural.mjs.map +1 -0
  152. package/lib/classes/abstract-controller.d.ts +3 -0
  153. package/lib/classes/abstract-detail.d.ts +3 -0
  154. package/lib/classes/abstract-editable-list.d.ts +3 -0
  155. package/lib/classes/abstract-list.d.ts +3 -0
  156. package/lib/classes/abstract-navigable-list.d.ts +3 -0
  157. package/lib/directives/http-prefix.directive.d.ts +3 -0
  158. package/lib/modules/alert/alert.module.d.ts +9 -0
  159. package/lib/modules/alert/alert.service.d.ts +3 -0
  160. package/lib/modules/alert/confirm.component.d.ts +3 -0
  161. package/lib/modules/avatar/avatar.module.d.ts +6 -0
  162. package/lib/modules/avatar/component/avatar.component.d.ts +3 -0
  163. package/lib/modules/avatar/service/avatar.service.d.ts +3 -0
  164. package/lib/modules/columns-picker/columns-picker-column.directive.d.ts +3 -0
  165. package/lib/modules/columns-picker/columns-picker.component.d.ts +3 -0
  166. package/lib/modules/columns-picker/columns-picker.module.d.ts +13 -0
  167. package/lib/modules/common/common-module.d.ts +16 -0
  168. package/lib/modules/common/directives/linkable-tab.directive.d.ts +3 -0
  169. package/lib/modules/common/directives/reactive-asterisk.directive.d.ts +3 -0
  170. package/lib/modules/common/directives/src-density.directive.d.ts +3 -0
  171. package/lib/modules/common/pipes/capitalize.pipe.d.ts +3 -0
  172. package/lib/modules/common/pipes/ellipsis.pipe.d.ts +3 -0
  173. package/lib/modules/common/pipes/enum.pipe.d.ts +3 -0
  174. package/lib/modules/common/pipes/swiss-date.pipe.d.ts +3 -0
  175. package/lib/modules/common/services/memory-storage.d.ts +3 -0
  176. package/lib/modules/common/services/seo.service.d.ts +3 -0
  177. package/lib/modules/detail-header/detail-header.component.d.ts +3 -0
  178. package/lib/modules/detail-header/detail-header.module.d.ts +9 -0
  179. package/lib/modules/dialog-trigger/dialog-trigger.component.d.ts +3 -0
  180. package/lib/modules/dialog-trigger/dialog-trigger.module.d.ts +7 -0
  181. package/lib/modules/dropdown-components/abstract-association-select-component.directive.d.ts +3 -0
  182. package/lib/modules/dropdown-components/natural-dropdown-components.module.d.ts +22 -0
  183. package/lib/modules/dropdown-components/type-date/type-date.component.d.ts +3 -0
  184. package/lib/modules/dropdown-components/type-date-range/type-date-range.component.d.ts +3 -0
  185. package/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.d.ts +3 -0
  186. package/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.d.ts +3 -0
  187. package/lib/modules/dropdown-components/type-number/type-number.component.d.ts +3 -0
  188. package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +3 -0
  189. package/lib/modules/dropdown-components/type-text/type-text.component.d.ts +3 -0
  190. package/lib/modules/file/abstract-file.d.ts +3 -0
  191. package/lib/modules/file/component/file.component.d.ts +3 -0
  192. package/lib/modules/file/file-drop.directive.d.ts +3 -0
  193. package/lib/modules/file/file-select.directive.d.ts +3 -0
  194. package/lib/modules/file/file.module.d.ts +11 -0
  195. package/lib/modules/file/file.service.d.ts +3 -0
  196. package/lib/modules/fixed-button/fixed-button.component.d.ts +3 -0
  197. package/lib/modules/fixed-button/fixed-button.module.d.ts +9 -0
  198. package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +3 -0
  199. package/lib/modules/fixed-button-detail/fixed-button-detail.module.d.ts +8 -0
  200. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -0
  201. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.d.ts +3 -0
  202. package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.d.ts +3 -0
  203. package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.d.ts +3 -0
  204. package/lib/modules/hierarchic-selector/hierarchic-selector.module.d.ts +21 -0
  205. package/lib/modules/icon/icon.component.d.ts +3 -0
  206. package/lib/modules/icon/icon.module.d.ts +7 -0
  207. package/lib/modules/matomo/matomo-module.module.d.ts +4 -0
  208. package/lib/modules/matomo/matomo.service.d.ts +3 -0
  209. package/lib/modules/panels/abstract-panel.d.ts +3 -0
  210. package/lib/modules/panels/panels.component.d.ts +3 -0
  211. package/lib/modules/panels/panels.module.d.ts +8 -0
  212. package/lib/modules/panels/panels.service.d.ts +3 -0
  213. package/lib/modules/relations/relations.component.d.ts +3 -0
  214. package/lib/modules/relations/relations.module.d.ts +15 -0
  215. package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +3 -0
  216. package/lib/modules/search/dropdown-container/dropdown-ref.d.ts +1 -1
  217. package/lib/modules/search/dropdown-container/dropdown.service.d.ts +3 -0
  218. package/lib/modules/search/facet-selector/facet-selector.component.d.ts +3 -0
  219. package/lib/modules/search/group/group.component.d.ts +3 -0
  220. package/lib/modules/search/input/input.component.d.ts +3 -0
  221. package/lib/modules/search/search/search.component.d.ts +3 -0
  222. package/lib/modules/search/search.module.d.ts +19 -0
  223. package/lib/modules/select/abstract-select.component.d.ts +4 -1
  224. package/lib/modules/select/select/select.component.d.ts +3 -0
  225. package/lib/modules/select/select-enum/select-enum.component.d.ts +3 -0
  226. package/lib/modules/select/select-hierarchic/select-hierarchic.component.d.ts +3 -0
  227. package/lib/modules/select/select.module.d.ts +19 -0
  228. package/lib/modules/sidenav/sidenav/sidenav.component.d.ts +3 -0
  229. package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +3 -0
  230. package/lib/modules/sidenav/sidenav-content/sidenav-content.component.d.ts +3 -0
  231. package/lib/modules/sidenav/sidenav-stack.service.d.ts +4 -1
  232. package/lib/modules/sidenav/sidenav.module.d.ts +11 -0
  233. package/lib/modules/sidenav/sidenav.service.d.ts +3 -0
  234. package/lib/modules/stamp/stamp-module.module.d.ts +6 -0
  235. package/lib/modules/stamp/stamp.component.d.ts +3 -0
  236. package/lib/modules/table-button/table-button.component.d.ts +3 -0
  237. package/lib/modules/table-button/table-button.module.d.ts +9 -0
  238. package/lib/services/enum.service.d.ts +3 -0
  239. package/lib/services/link-mutation.service.d.ts +3 -0
  240. package/lib/services/persistence.service.d.ts +3 -0
  241. package/lib/services/swiss-parsing-date-adapter.service.d.ts +4 -1
  242. package/package.json +25 -12
  243. package/src/lib/modules/alert/_alert.theme.scss +1 -1
  244. package/src/lib/modules/file/component/_file.theme.scss +1 -1
  245. package/src/lib/modules/icon/_icon.theme.scss +1 -1
  246. package/src/lib/modules/search/dropdown-container/_dropdown-container.theme.scss +1 -1
  247. package/src/lib/modules/table-button/_table-button.theme.scss +1 -1
  248. package/src/lib/styles/_table.scss +1 -1
  249. package/theming/_natural.theme.scss +1 -1
  250. package/bundles/ecodev-natural.umd.js +0 -11318
  251. package/bundles/ecodev-natural.umd.js.map +0 -1
  252. package/ecodev-natural.metadata.json +0 -1
  253. package/esm2015/ecodev-natural.js +0 -14
  254. package/esm2015/lib/classes/abstract-controller.js +0 -29
  255. package/esm2015/lib/classes/abstract-detail.js +0 -157
  256. package/esm2015/lib/classes/abstract-editable-list.js +0 -97
  257. package/esm2015/lib/classes/abstract-list.js +0 -409
  258. package/esm2015/lib/classes/abstract-navigable-list.js +0 -126
  259. package/esm2015/lib/classes/data-source.js +0 -76
  260. package/esm2015/lib/classes/query-variable-manager.js +0 -161
  261. package/esm2015/lib/classes/validators.js +0 -176
  262. package/esm2015/lib/directives/http-prefix.directive.js +0 -46
  263. package/esm2015/lib/modules/alert/alert.module.js +0 -15
  264. package/esm2015/lib/modules/alert/alert.service.js +0 -59
  265. package/esm2015/lib/modules/alert/confirm.component.js +0 -17
  266. package/esm2015/lib/modules/avatar/avatar.module.js +0 -14
  267. package/esm2015/lib/modules/avatar/component/avatar.component.js +0 -158
  268. package/esm2015/lib/modules/avatar/service/avatar.service.js +0 -65
  269. package/esm2015/lib/modules/avatar/sources/gravatar.js +0 -29
  270. package/esm2015/lib/modules/columns-picker/columns-picker-column.directive.js +0 -41
  271. package/esm2015/lib/modules/columns-picker/columns-picker.component.js +0 -82
  272. package/esm2015/lib/modules/columns-picker/columns-picker.module.js +0 -28
  273. package/esm2015/lib/modules/common/common-module.js +0 -35
  274. package/esm2015/lib/modules/common/directives/linkable-tab.directive.js +0 -82
  275. package/esm2015/lib/modules/common/directives/reactive-asterisk.directive.js +0 -31
  276. package/esm2015/lib/modules/common/directives/src-density.directive.js +0 -63
  277. package/esm2015/lib/modules/common/pipes/capitalize.pipe.js +0 -14
  278. package/esm2015/lib/modules/common/pipes/ellipsis.pipe.js +0 -10
  279. package/esm2015/lib/modules/common/pipes/enum.pipe.js +0 -24
  280. package/esm2015/lib/modules/common/pipes/swiss-date.pipe.js +0 -16
  281. package/esm2015/lib/modules/common/services/memory-storage.js +0 -110
  282. package/esm2015/lib/modules/common/services/seo.service.js +0 -120
  283. package/esm2015/lib/modules/detail-header/detail-header.component.js +0 -63
  284. package/esm2015/lib/modules/detail-header/detail-header.module.js +0 -16
  285. package/esm2015/lib/modules/dialog-trigger/dialog-trigger.component.js +0 -68
  286. package/esm2015/lib/modules/dialog-trigger/dialog-trigger.module.js +0 -14
  287. package/esm2015/lib/modules/dropdown-components/abstract-association-select-component.directive.js +0 -96
  288. package/esm2015/lib/modules/dropdown-components/natural-dropdown-components.module.js +0 -51
  289. package/esm2015/lib/modules/dropdown-components/type-date/type-date.component.js +0 -123
  290. package/esm2015/lib/modules/dropdown-components/type-date-range/type-date-range.component.js +0 -128
  291. package/esm2015/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.js +0 -63
  292. package/esm2015/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.js +0 -31
  293. package/esm2015/lib/modules/dropdown-components/type-number/type-number.component.js +0 -99
  294. package/esm2015/lib/modules/dropdown-components/type-select/type-select.component.js +0 -161
  295. package/esm2015/lib/modules/dropdown-components/type-text/type-text.component.js +0 -53
  296. package/esm2015/lib/modules/file/abstract-file.js +0 -223
  297. package/esm2015/lib/modules/file/component/file.component.js +0 -133
  298. package/esm2015/lib/modules/file/file-drop.directive.js +0 -99
  299. package/esm2015/lib/modules/file/file-select.directive.js +0 -25
  300. package/esm2015/lib/modules/file/file.module.js +0 -19
  301. package/esm2015/lib/modules/file/file.service.js +0 -47
  302. package/esm2015/lib/modules/fixed-button/fixed-button.component.js +0 -23
  303. package/esm2015/lib/modules/fixed-button/fixed-button.module.js +0 -16
  304. package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.component.js +0 -31
  305. package/esm2015/lib/modules/fixed-button-detail/fixed-button-detail.module.js +0 -15
  306. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.js +0 -351
  307. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.js +0 -258
  308. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.js +0 -28
  309. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.js +0 -23
  310. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector.module.js +0 -46
  311. package/esm2015/lib/modules/icon/icon.component.js +0 -78
  312. package/esm2015/lib/modules/icon/icon.module.js +0 -25
  313. package/esm2015/lib/modules/matomo/matomo-module.module.js +0 -7
  314. package/esm2015/lib/modules/matomo/matomo.service.js +0 -106
  315. package/esm2015/lib/modules/panels/abstract-panel.js +0 -50
  316. package/esm2015/lib/modules/panels/panels.component.js +0 -26
  317. package/esm2015/lib/modules/panels/panels.module.js +0 -28
  318. package/esm2015/lib/modules/panels/panels.service.js +0 -331
  319. package/esm2015/lib/modules/relations/relations.component.js +0 -181
  320. package/esm2015/lib/modules/relations/relations.module.js +0 -33
  321. package/esm2015/lib/modules/search/dropdown-container/dropdown-container.component.js +0 -87
  322. package/esm2015/lib/modules/search/dropdown-container/dropdown.service.js +0 -95
  323. package/esm2015/lib/modules/search/facet-selector/facet-selector.component.js +0 -47
  324. package/esm2015/lib/modules/search/group/group.component.js +0 -39
  325. package/esm2015/lib/modules/search/input/input.component.js +0 -316
  326. package/esm2015/lib/modules/search/search/search.component.js +0 -71
  327. package/esm2015/lib/modules/search/search.module.js +0 -52
  328. package/esm2015/lib/modules/select/abstract-select.component.js +0 -176
  329. package/esm2015/lib/modules/select/select/select.component.js +0 -190
  330. package/esm2015/lib/modules/select/select-enum/select-enum.component.js +0 -34
  331. package/esm2015/lib/modules/select/select-hierarchic/select-hierarchic.component.js +0 -120
  332. package/esm2015/lib/modules/select/select.module.js +0 -39
  333. package/esm2015/lib/modules/sidenav/sidenav/sidenav.component.js +0 -12
  334. package/esm2015/lib/modules/sidenav/sidenav-container/sidenav-container.component.js +0 -79
  335. package/esm2015/lib/modules/sidenav/sidenav-content/sidenav-content.component.js +0 -13
  336. package/esm2015/lib/modules/sidenav/sidenav-stack.service.js +0 -50
  337. package/esm2015/lib/modules/sidenav/sidenav.module.js +0 -20
  338. package/esm2015/lib/modules/sidenav/sidenav.service.js +0 -199
  339. package/esm2015/lib/modules/stamp/stamp-module.module.js +0 -13
  340. package/esm2015/lib/modules/stamp/stamp.component.js +0 -13
  341. package/esm2015/lib/modules/table-button/table-button.component.js +0 -38
  342. package/esm2015/lib/modules/table-button/table-button.module.js +0 -16
  343. package/esm2015/lib/services/abstract-model.service.js +0 -509
  344. package/esm2015/lib/services/enum.service.js +0 -68
  345. package/esm2015/lib/services/link-mutation.service.js +0 -155
  346. package/esm2015/lib/services/persistence.service.js +0 -114
  347. package/esm2015/lib/services/swiss-parsing-date-adapter.service.js +0 -55
  348. package/fesm2015/ecodev-natural.js.map +0 -1
@@ -1,509 +0,0 @@
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 === null || debounced === void 0 ? void 0 : 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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T0FJRztJQUNPLDRCQUE0QixDQUFDLE9BQWtCO1FBQ3JELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ08saUJBQWlCLENBQUMsS0FBVTtRQUNsQyxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCw4R0FBOEcsQ0FDakgsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsRUFBVTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxFQUFFLEVBQUUsRUFBRSxFQUFDLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQVMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsS0FBMEI7UUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztTQUNuRztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBvbGxvLCBncWx9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7RmV0Y2hSZXN1bHQsIE5ldHdvcmtTdGF0dXMsIFdhdGNoUXVlcnlGZXRjaFBvbGljeX0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtEb2N1bWVudE5vZGV9IGZyb20gJ2dyYXBocWwnO1xuXG5pbXBvcnQge2RlZmF1bHRzLCBtZXJnZSwgbWVyZ2VXaXRoLCBvbWl0LCBwaWNrfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtFTVBUWSwgT2JzZXJ2YWJsZSwgb2YsIE9wZXJhdG9yRnVuY3Rpb24sIFJlcGxheVN1YmplY3QsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVdoaWxlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7bWFrZVBsdXJhbCwgbWVyZ2VPdmVycmlkZUFycmF5LCByZWxhdGlvbnNUb0lkcywgdXBwZXJDYXNlRmlyc3RMZXR0ZXJ9IGZyb20gJy4uL2NsYXNzZXMvdXRpbGl0eSc7XG5pbXBvcnQge1BhZ2luYXRlZERhdGF9IGZyb20gJy4uL2NsYXNzZXMvZGF0YS1zb3VyY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1WYWxpZGF0b3JzIHtcbiAgICBba2V5OiBzdHJpbmddOiBWYWxpZGF0b3JGbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Bc3luY1ZhbGlkYXRvcnMge1xuICAgIFtrZXk6IHN0cmluZ106IEFzeW5jVmFsaWRhdG9yRm5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZXNXaXRoSW5wdXQge1xuICAgIGlucHV0OiBMaXRlcmFsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db250cm9scyB7XG4gICAgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZTxUT25lPiB7XG4gICAgbW9kZWw6IFRPbmU7XG59XG5cbmV4cG9ydCB0eXBlIFdpdGhJZDxUPiA9IHtpZDogc3RyaW5nfSAmIFQ7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgVG9uZSxcbiAgICBWb25lIGV4dGVuZHMge2lkOiBzdHJpbmd9LFxuICAgIFRhbGwgZXh0ZW5kcyBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgIFZhbGwgZXh0ZW5kcyBRdWVyeVZhcmlhYmxlcyxcbiAgICBUY3JlYXRlLFxuICAgIFZjcmVhdGUgZXh0ZW5kcyBWYXJpYWJsZXNXaXRoSW5wdXQsXG4gICAgVHVwZGF0ZSxcbiAgICBWdXBkYXRlIGV4dGVuZHMge2lkOiBzdHJpbmc7IGlucHV0OiBMaXRlcmFsfSxcbiAgICBUZGVsZXRlLFxuICAgIFZkZWxldGUgZXh0ZW5kcyB7aWRzOiBzdHJpbmdbXX0sXG4+IHtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlYm91bmNlZFVwZGF0ZUNhY2hlID0gbmV3IE1hcDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IFN1YmplY3Q8dm9pZD47XG4gICAgICAgICAgICBjYW5jZWxsZXI6IFN1YmplY3Q8dm9pZD47XG4gICAgICAgICAgICByZXN1bHQ6IE9ic2VydmFibGU8VHVwZGF0ZT47XG4gICAgICAgIH1cbiAgICA+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgY3JlYXRpb24gbXV0YXRpb25zIHRoYXQgYXJlIHBlbmRpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0aW5nQ2FjaGUgPSBuZXcgTWFwPFZjcmVhdGVbJ2lucHV0J10gfCBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4sIE9ic2VydmFibGU8VGNyZWF0ZT4+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwb2xsbzogQXBvbGxvLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25lUXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhbGxRdWVyeTogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNyZWF0ZU11dGF0aW9uOiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdXBkYXRlTXV0YXRpb246IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBkZWxldGVNdXRhdGlvbjogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgZ2V0Q29uc29saWRhdGVkRm9yQ2xpZW50KCk6IExpdGVyYWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmdldERlZmF1bHRGb3JTZXJ2ZXIoKSwgdGhpcy5nZXREZWZhdWx0Rm9yQ2xpZW50KCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCBmaWVsZHMgdmFsaWRhdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBGb3JtVmFsaWRhdG9ycyB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgYXN5bmMgZmllbGRzIHZhbGlkYXRvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybUFzeW5jVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBGb3JtQXN5bmNWYWxpZGF0b3JzIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZ3JvdXBlZCBmaWVsZHMgdmFsaWRhdG9ycyAobGlrZSBwYXNzd29yZCArIGNvbmZpcm0gcGFzc3dvcmQpXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Hcm91cFZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFzeW5jIGdyb3VwIGZpZWxkcyB2YWxpZGF0b3JzIChsaWtlIHVuaXF1ZSBjb25zdHJhaW50IG9uIG11bHRpcGxlIGNvbHVtbnMpXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBBc3luY1ZhbGlkYXRvckZuW10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1Db25maWcobW9kZWw6IExpdGVyYWwpOiBGb3JtQ29udHJvbHMge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldENvbnNvbGlkYXRlZEZvckNsaWVudCgpO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy5nZXRGb3JtVmFsaWRhdG9ycyhtb2RlbCk7XG4gICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IHRoaXMuZ2V0Rm9ybUFzeW5jVmFsaWRhdG9ycyhtb2RlbCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzOiBGb3JtQ29udHJvbHMgPSB7fTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWQgPSBtb2RlbC5wZXJtaXNzaW9ucyA/ICFtb2RlbC5wZXJtaXNzaW9ucy51cGRhdGUgOiBmYWxzZTtcblxuICAgICAgICBpZiAobW9kZWwuaWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xzWydpZCddID0gbmV3IEZvcm1Db250cm9sKHt2YWx1ZTogbW9kZWwuaWQsIGRpc2FibGVkOiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25maWd1cmUgZm9ybSBmb3IgZWFjaCBmaWVsZCBvZiBtb2RlbFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleV0gIT09IHVuZGVmaW5lZCA/IG1vZGVsW2tleV0gOiB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHR5cGVvZiB2YWxpZGF0b3JzW2tleV0gIT09ICd1bmRlZmluZWQnID8gdmFsaWRhdG9yc1trZXldIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gdHlwZW9mIGFzeW5jVmFsaWRhdG9yc1trZXldICE9PSAndW5kZWZpbmVkJyA/IGFzeW5jVmFsaWRhdG9yc1trZXldIDogbnVsbDtcblxuICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlndXJlIGZvcm0gZm9yIGV4dHJhIHZhbGlkYXRvcnMgdGhhdCBhcmUgbm90IG9uIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsaWRhdG9ycykpIHtcbiAgICAgICAgICAgIGlmICghY29udHJvbHNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1vZGVsW2tleV0gPyBtb2RlbFtrZXldIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb250cm9sc1trZXldID0gbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSwgdmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycykpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sc1trZXldICYmIGFzeW5jVmFsaWRhdG9yc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XS5zZXRBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzW2tleV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUsIG51bGwsIGFzeW5jVmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIGZpbmFsIEZvcm1Hcm91cCBmb3IgdGhlIG9iamVjdCwgaW5jbHVkaW5nIGFsbCB2YWxpZGF0b3JzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgKipub3QqKiBiZSBvdmVycmlkZGVuLCBidXQgaW5zdGVhZCBgZ2V0Rm9ybUNvbmZpZ2AsXG4gICAgICogYGdldEZvcm1Hcm91cFZhbGlkYXRvcnNgLCBgZ2V0Rm9ybUdyb3VwQXN5bmNWYWxpZGF0b3JzYCBtaWdodCBiZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybUdyb3VwKG1vZGVsOiBMaXRlcmFsKTogRm9ybUdyb3VwIHtcbiAgICAgICAgY29uc3QgZm9ybUNvbmZpZyA9IHRoaXMuZ2V0Rm9ybUNvbmZpZyhtb2RlbCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGZvcm1Db25maWcsIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IHRoaXMuZ2V0Rm9ybUdyb3VwVmFsaWRhdG9ycyhtb2RlbCksXG4gICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnM6IHRoaXMuZ2V0Rm9ybUdyb3VwQXN5bmNWYWxpZGF0b3JzKG1vZGVsKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc2luZ2xlIG9iamVjdFxuICAgICAqXG4gICAgICogSWYgYXZhaWxhYmxlIGl0IHdpbGwgZW1pdCBvYmplY3QgZnJvbSBjYWNoZSBpbW1lZGlhdGVseSwgdGhlbiBpdFxuICAgICAqIHdpbGwgKiphbHdheXMqKiBmZXRjaCBmcm9tIG5ldHdvcmsgYW5kIHRoZW4gdGhlIG9ic2VydmFibGUgd2lsbCBiZSBjb21wbGV0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T25lKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRvbmU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShpZCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMub25lUXVlcnkpO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5UmVmID0gdGhpcy5hcG9sbG8ud2F0Y2hRdWVyeTxUb25lLCBWb25lPih7XG4gICAgICAgICAgICBxdWVyeTogdGhpcy5vbmVRdWVyeSxcbiAgICAgICAgICAgIHZhcmlhYmxlczogdGhpcy5nZXRWYXJpYWJsZXNGb3JPbmUoaWQpLFxuICAgICAgICAgICAgZmV0Y2hQb2xpY3k6ICdjYWNoZS1hbmQtbmV0d29yaycsXG4gICAgICAgICAgICBuZXh0RmV0Y2hQb2xpY3k6ICdjYWNoZS1vbmx5JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5UmVmLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhKSxcbiAgICAgICAgICAgIHRha2VXaGlsZShyZXN1bHQgPT4gcmVzdWx0Lm5ldHdvcmtTdGF0dXMgIT09IE5ldHdvcmtTdGF0dXMucmVhZHksIHRydWUpLFxuICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgTGl0ZXJhbClbdGhpcy5uYW1lXSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29sbGVjdGlvbiBvZiBvYmplY3RzXG4gICAgICpcbiAgICAgKiBJdCB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrIGFuZCB0aGVuIHRoZSBvYnNlcnZhYmxlIHdpbGwgYmUgY29tcGxldGVkLlxuICAgICAqIE5vIGNhY2hlIGlzIGV2ZXIgdXNlZCwgc28gaXQncyBzbG93IGJ1dCBjb3JyZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGwocXVlcnlWYXJpYWJsZXNNYW5hZ2VyOiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KTogT2JzZXJ2YWJsZTxUYWxsPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLnF1ZXJ5PFRhbGwsIFZhbGw+KHtcbiAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5hbGxRdWVyeSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IG1hbmFnZXIudmFyaWFibGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0aGlzLm1hcEFsbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHNcbiAgICAgKlxuICAgICAqIEV2ZXJ5IHRpbWUgdGhlIG9ic2VydmFibGUgdmFyaWFibGVzIGNoYW5nZSwgYW5kIHRoZXkgYXJlIG5vdCB1bmRlZmluZWQsXG4gICAgICogaXQgd2lsbCByZXR1cm4gcmVzdWx0IGZyb20gY2FjaGUsIHRoZW4gaXQgd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yay5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHN1YnNjcmliZSB0byBzdGFydCBnZXR0aW5nIHJlc3VsdHMgKGFuZCBmZXRjaCBmcm9tIG5ldHdvcmspLlxuICAgICAqXG4gICAgICogVGhlIG9ic2VydmFibGUgcmVzdWx0IHdpbGwgb25seSBjb21wbGV0ZSB3aGVuIHVuc3Vic2NyaWJpbmcuIFRoYXQgbWVhbnMgeW91ICoqbXVzdCoqIHVuc3Vic2NyaWJlLlxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaEFsbChcbiAgICAgICAgcXVlcnlWYXJpYWJsZXNNYW5hZ2VyOiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+LFxuICAgICAgICBmZXRjaFBvbGljeTogV2F0Y2hRdWVyeUZldGNoUG9saWN5ID0gJ2NhY2hlLWFuZC1uZXR3b3JrJyxcbiAgICApOiBPYnNlcnZhYmxlPFRhbGw+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5hbGxRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5VmFyaWFibGVzTWFuYWdlci52YXJpYWJsZXMucGlwZShcbiAgICAgICAgICAgIC8vIElnbm9yZSB2ZXJ5IGZhc3QgdmFyaWFibGUgY2hhbmdlc1xuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDIwKSxcbiAgICAgICAgICAgIC8vIFdhaXQgZm9yIHZhcmlhYmxlcyB0byBiZSBkZWZpbmVkIHRvIHByZXZlbnQgZHVwbGljYXRlIHF1ZXJ5OiB3aXRoIGFuZCB3aXRob3V0IHZhcmlhYmxlc1xuICAgICAgICAgICAgLy8gTnVsbCBpcyBhY2NlcHRlZCB2YWx1ZSBmb3IgXCJubyB2YXJpYWJsZXNcIlxuICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlcyA9PiB0eXBlb2YgdmFyaWFibGVzICE9PSAndW5kZWZpbmVkJyksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEFwcGx5IHBhcnRpYWwgdmFyaWFibGVzIGZyb20gc2VydmljZVxuICAgICAgICAgICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4ocXVlcnlWYXJpYWJsZXNNYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICBtYW5hZ2VyLm1lcmdlKCdwYXJ0aWFsLXZhcmlhYmxlcycsIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAgICAgICAgIC53YXRjaFF1ZXJ5PFRhbGwsIFZhbGw+KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLmFsbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiBmZXRjaFBvbGljeSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHIgPT4gISFyLmRhdGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBBbGwoKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb25zIGFsbG93IHRvIHF1aWNrbHkgY3JlYXRlIG9yIHVwZGF0ZSBvYmplY3RzLlxuICAgICAqXG4gICAgICogTWFuYWdlcyBhIFwiY3JlYXRpb24gaXMgcGVuZGluZ1wiIHN0YXR1cywgYW5kIHVwZGF0ZSB3aGVuIGNyZWF0aW9uIGlzIHJlYWR5LlxuICAgICAqIFVzZXMgcmVndWxhciB1cGRhdGUvdXBkYXRlTm93IGFuZCBjcmVhdGUgbWV0aG9kcy5cbiAgICAgKiBVc2VkIG1haW5seSB3aGVuIGVkaXRpbmcgbXVsdGlwbGUgb2JqZWN0cyBpbiBzYW1lIGNvbnRyb2xsZXIgKGxpa2UgaW4gZWRpdGFibGUgYXJyYXlzKVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVPclVwZGF0ZShcbiAgICAgICAgb2JqZWN0OiBWY3JlYXRlWydpbnB1dCddIHwgV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+LFxuICAgICAgICBub3c6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiBPYnNlcnZhYmxlPFRjcmVhdGUgfCBUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5jcmVhdGVNdXRhdGlvbik7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIC8vIElmIGNyZWF0aW9uIGlzIHBlbmRpbmcsIGxpc3RlbiB0byBjcmVhdGlvbiBvYnNlcnZhYmxlIGFuZCB3aGVuIHJlYWR5LCBmaXJlIHVwZGF0ZVxuICAgICAgICBjb25zdCBwZW5kaW5nQ3JlYXRpb24gPSB0aGlzLmNyZWF0aW5nQ2FjaGUuZ2V0KG9iamVjdCk7XG4gICAgICAgIGlmIChwZW5kaW5nQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBwZW5kaW5nQ3JlYXRpb24ucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUob2JqZWN0IGFzIFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JqZWN0IGhhcyBJZCwganVzdCBzYXZlIGl0XG4gICAgICAgIGlmICgnaWQnIGluIG9iamVjdCAmJiBvYmplY3QuaWQpIHtcbiAgICAgICAgICAgIGlmIChub3cpIHtcbiAgICAgICAgICAgICAgICAvLyB1c2VkIG1haW5seSBmb3IgdGVzdHMsIGJlY2F1c2UgbG9kYXNoIGRlYm91bmNlZCB1c2VkIGluIHVwZGF0ZSgpIGRvZXMgbm90IHdvcmsgZmluZSB3aXRoIGZha2VBc3luYyBhbmQgdGljaygpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlTm93KG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUob2JqZWN0IGFzIFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvYmplY3Qgd2FzIG5vdCBzYXZpbmcsIGFuZCBoYXMgbm8gSUQsIGNyZWF0ZSBpdFxuICAgICAgICBjb25zdCBjcmVhdGlvbiA9IHRoaXMuY3JlYXRlKG9iamVjdCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGluZ0NhY2hlLmRlbGV0ZShvYmplY3QpOyAvLyByZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gc3RvcmVzIGNyZWF0aW5nIG9ic2VydmFibGUgaW4gYSBjYWNoZSByZXBsYXlhYmxlIHZlcnNpb24gb2YgdGhlIG9ic2VydmFibGUsXG4gICAgICAgIC8vIHNvIHNldmVyYWwgdXBkYXRlKCkgY2FuIHN1YnNjcmliZSB0byB0aGUgc2FtZSBjcmVhdGlvblxuICAgICAgICB0aGlzLmNyZWF0aW5nQ2FjaGUuc2V0KG9iamVjdCwgY3JlYXRpb24ucGlwZShzaGFyZVJlcGxheSgpKSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBvYmplY3QgaW4gREIgYW5kIHRoZW4gcmVmZXRjaCB0aGUgbGlzdCBvZiBvYmplY3RzXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZShvYmplY3Q6IFZjcmVhdGVbJ2lucHV0J10pOiBPYnNlcnZhYmxlPFRjcmVhdGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3QpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmNyZWF0ZU11dGF0aW9uKTtcblxuICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSBtZXJnZShcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge2lucHV0OiB0aGlzLmdldElucHV0KG9iamVjdCl9LFxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQ3JlYXRpb24ob2JqZWN0KSxcbiAgICAgICAgKSBhcyBWY3JlYXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUY3JlYXRlLCBWY3JlYXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMuY3JlYXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0gdGhpcy5tYXBDcmVhdGlvbihyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZVdpdGgob2JqZWN0LCBuZXdPYmplY3QsIG1lcmdlT3ZlcnJpZGVBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3T2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBvYmplY3QsIGFmdGVyIGEgc2hvcnQgZGVib3VuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlKG9iamVjdDogV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTogT2JzZXJ2YWJsZTxUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgLy8gS2VlcCBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgZGVib3VuY2VkIHVwZGF0ZSBmdW5jdGlvblxuICAgICAgICBjb25zdCBpZCA9IG9iamVjdC5pZDtcbiAgICAgICAgbGV0IGRlYm91bmNlZCA9IHRoaXMuZGVib3VuY2VkVXBkYXRlQ2FjaGUuZ2V0KGlkKTtcblxuICAgICAgICBpZiAoIWRlYm91bmNlZCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gICAgICAgICAgICBsZXQgd2FzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBjYW5jZWxsZXIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgY2FuY2VsbGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2FzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICBjYW5jZWxsZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgZGVib3VuY2VkIHVwZGF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc291cmNlLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDIwMDApLCAvLyBXYWl0IDJzZWMuXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVib3VuY2VkVXBkYXRlQ2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlTm93KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkoKSwgLy8gQWxsIGF0dGVtcHRzIHRvIHVwZGF0ZSB3aWxsIHNoYXJlIHRoZSBleGFjdCBzYW1lIHNpbmdsZSByZXN1bHQgZnJvbSBBUElcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGRlYm91bmNlZCA9IHtcbiAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgY2FuY2VsbGVyLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZGVib3VuY2VkVXBkYXRlQ2FjaGUuc2V0KGlkLCBkZWJvdW5jZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aWZ5IG91ciBkZWJvdW5jZWQgdXBkYXRlIGVhY2ggdGltZSB3ZSBhc2sgdG8gdXBkYXRlXG4gICAgICAgIGRlYm91bmNlZC5zb3VyY2UubmV4dCgpO1xuXG4gICAgICAgIC8vIFJldHVybiBhbmQgb2JzZXJ2YWJsZSB0aGF0IGlzIHVwZGF0ZWQgd2hlbiBtdXRhdGlvbiBpcyBkb25lXG4gICAgICAgIHJldHVybiBkZWJvdW5jZWQucmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBvYmplY3QgaW1tZWRpYXRlbHkgd2hlbiBzdWJzY3JpYmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVOb3cob2JqZWN0OiBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pOiBPYnNlcnZhYmxlPFR1cGRhdGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3QpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLnVwZGF0ZU11dGF0aW9uKTtcblxuICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSBtZXJnZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogb2JqZWN0LmlkLFxuICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLmdldElucHV0KG9iamVjdCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yVXBkYXRlKG9iamVjdCksXG4gICAgICAgICkgYXMgVnVwZGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5tdXRhdGU8VHVwZGF0ZSwgVnVwZGF0ZT4oe1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB0aGlzLnVwZGF0ZU11dGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwb2xsby5jbGllbnQucmVGZXRjaE9ic2VydmFibGVRdWVyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlc3VsdCA9IHRoaXMubWFwVXBkYXRlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlV2l0aChvYmplY3QsIG1hcHBlZFJlc3VsdCwgbWVyZ2VPdmVycmlkZUFycmF5KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIG9iamVjdCBidXQgd2l0aG91dCBhdXRvbWF0aWNhbGx5IGluamVjdGluZyB2YWx1ZXMgY29taW5nXG4gICAgICogZnJvbSBgZ2V0RGVmYXVsdEZvclNlcnZlcigpYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUGFydGlhbGx5KG9iamVjdDogV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTogT2JzZXJ2YWJsZTxUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0ge1xuICAgICAgICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgICAgICAgIGlucHV0OiBvbWl0KHJlbGF0aW9uc1RvSWRzKG9iamVjdCksICdpZCcpLFxuICAgICAgICB9IGFzIFZ1cGRhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFR1cGRhdGUsIFZ1cGRhdGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy51cGRhdGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBVcGRhdGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIG9iamVjdHMgYW5kIHRoZW4gcmVmZXRjaCB0aGUgbGlzdCBvZiBvYmplY3RzXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZShvYmplY3RzOiB7aWQ6IHN0cmluZ31bXSk6IE9ic2VydmFibGU8VGRlbGV0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdHMpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmRlbGV0ZU11dGF0aW9uKTtcblxuICAgICAgICBjb25zdCBpZHMgPSBvYmplY3RzLm1hcChvID0+IHtcbiAgICAgICAgICAgIC8vIENhbmNlbCBwZW5kaW5nIHVwZGF0ZVxuICAgICAgICAgICAgY29uc3QgZGVib3VuY2VkID0gdGhpcy5kZWJvdW5jZWRVcGRhdGVDYWNoZS5nZXQoby5pZCk7XG4gICAgICAgICAgICBkZWJvdW5jZWQ/LmNhbmNlbGxlci5uZXh0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiBvLmlkO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRzOiBpZHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yRGVsZXRlKG9iamVjdHMpLFxuICAgICAgICApIGFzIFZkZWxldGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFRkZWxldGUsIFZkZWxldGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy5kZWxldGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcERlbGV0ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIG1vZGVsIGFuZCBpdGVtcyByZWxhdGVkIHRvIHRoZSBtb2RlbCwgaWYgdGhlIGlkIGlzIHByb3ZpZGVkLCBpbiBvcmRlciB0byBzaG93IGEgZm9ybVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlc29sdmU8VG9uZT4+IHtcbiAgICAgICAgLy8gTG9hZCBtb2RlbCBpZiBpZCBpcyBnaXZlblxuICAgICAgICBsZXQgb2JzZXJ2YWJsZTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlID0gdGhpcy5nZXRPbmUoaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IG9mKHRoaXMuZ2V0Q29uc29saWRhdGVkRm9yQ2xpZW50KCkgYXMgVG9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZS5waXBlKFxuICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHttb2RlbDogcmVzdWx0fTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QgdGhhdCBtYXRjaCB0aGUgR3JhcGhRTCBpbnB1dCB0eXBlLlxuICAgICAqIEl0IGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggbWFudWFsbHkgZmlsbGVkIGRhdGEgYW5kIGFkZCB1bmNvbXBsZXRlZCBkYXRhIChsaWtlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgZW1wdHkgc3RyaW5ncylcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5wdXQob2JqZWN0OiBMaXRlcmFsKTogVmNyZWF0ZVsnaW5wdXQnXSB8IFZ1cGRhdGVbJ2lucHV0J10ge1xuICAgICAgICAvLyBDb252ZXJ0IHJlbGF0aW9ucyB0byB0aGVpciBJRHMgZm9yIG11dGF0aW9uXG4gICAgICAgIG9iamVjdCA9IHJlbGF0aW9uc1RvSWRzKG9iamVjdCk7XG5cbiAgICAgICAgLy8gUGljayBvbmx5IGF0dHJpYnV0ZXMgdGhhdCB3ZSBjYW4gZmluZCBpbiB0aGUgZW1wdHkgb2JqZWN0XG4gICAgICAgIC8vIEluIG90aGVyIHdvcmRzLCBwcmV2ZW50IHRvIHNlbGVjdCBkYXRhIHRoYXQgaGFzIHVud2FudGVkIGF0dHJpYnV0ZXNcbiAgICAgICAgY29uc3QgZW1wdHlPYmplY3QgPSB0aGlzLmdldERlZmF1bHRGb3JTZXJ2ZXIoKTtcbiAgICAgICAgbGV0IGlucHV0ID0gcGljayhvYmplY3QsIE9iamVjdC5rZXlzKGVtcHR5T2JqZWN0KSk7XG5cbiAgICAgICAgLy8gQ29tcGxldGUgYSBwb3RlbnRpYWxseSB1bmNvbXBsZXRlZCBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgICAgICBpbnB1dCA9IGRlZmF1bHRzKGlucHV0LCBlbXB0eU9iamVjdCk7XG5cbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSB1bmlxdWUgdmFsaWRhdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvdW50KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcjogTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHBsdXJhbCA9IG1ha2VQbHVyYWwodGhpcy5uYW1lKTtcbiAgICAgICAgY29uc3QgcXVlcnlOYW1lID0gJ0NvdW50JyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHBsdXJhbCk7XG4gICAgICAgIGNvbnN0IGZpbHRlclR5cGUgPSB1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpICsgJ0ZpbHRlcic7XG5cbiAgICAgICAgLy8gQ29weSBtYW5hZ2VyIHRvIHByZXZlbnQgdG8gYXBwbHkgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGV4dGVybmFsIFF1ZXJ5VmFyaWFibGVzTWFuYWdlclxuICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4ocXVlcnlWYXJpYWJsZXNNYW5hZ2VyKTtcbiAgICAgICAgbWFuYWdlci5tZXJnZSgncGFydGlhbC12YXJpYWJsZXMnLCB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKSk7XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBncWxgXG4gICAgICAgICAgICBxdWVyeSAke3F1ZXJ5TmFtZX0gKCRmaWx0ZXI6ICR7ZmlsdGVyVHlwZX0pIHtcbiAgICAgICAgICAgIGNvdW50OiAke3BsdXJhbH0gKGZpbHRlcjogJGZpbHRlciwgcGFnaW5hdGlvbjoge3BhZ2VTaXplOiAwLCBwYWdlSW5kZXg6IDB9KSB7XG4gICAgICAgICAgICBsZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLnF1ZXJ5PHtjb3VudDoge2xlbmd0aDogbnVtYmVyfX0sIFZhbGw+KHtcbiAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUobWFwKHJlc3VsdCA9PiByZXN1bHQuZGF0YS5jb3VudC5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gZW1wdHkgb2JqZWN0IHdpdGggc29tZSBkZWZhdWx0IHZhbHVlcyBmcm9tIHNlcnZlciBwZXJzcGVjdGl2ZVxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZnVsIHdoZW4gc2hvd2luZyBhIGZvcm0gZm9yIGNyZWF0aW9uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRGb3JTZXJ2ZXIoKTogVmNyZWF0ZVsnaW5wdXQnXSB8IFZ1cGRhdGVbJ2lucHV0J10ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGVtcHR5IG9iamVjdCB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBmcm9udGVuZCBwZXJzcGVjdGl2ZVxuICAgICAqXG4gICAgICogV2hlcmUgZW1wdHkgb2JqZWN0IG11c3QgcmVzcGVjdCBncmFwaHFsIFhYWElucHV0IHR5cGUsIG1heSBuZWVkIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZm9yIG90aGVyIGZpZWxkc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0Rm9yQ2xpZW50KCk6IExpdGVyYWwge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgYXJyYXkgb2YgZmV0Y2hlZCBvYmplY3RzIG91dCBvZiB0aGUgZW50aXJlIGZldGNoZWQgZGF0YVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBBbGwoKTogT3BlcmF0b3JGdW5jdGlvbjxGZXRjaFJlc3VsdDx1bmtub3duPiwgVGFsbD4ge1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBtYWtlUGx1cmFsKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiBtYXAocmVzdWx0ID0+IChyZXN1bHQuZGF0YSBhcyBhbnkpW3BsdXJhbF0pOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgdGhlIGNyZWF0ZWQgb2JqZWN0IG91dCBvZiB0aGUgZW50aXJlIGZldGNoZWQgZGF0YVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBDcmVhdGlvbihyZXN1bHQ6IEZldGNoUmVzdWx0KTogVGNyZWF0ZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAnY3JlYXRlJyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0LmRhdGEgYXMgYW55KVtuYW1lXTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IHRoZSB1cGRhdGVkIG9iamVjdCBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwVXBkYXRlKHJlc3VsdDogRmV0Y2hSZXN1bHQpOiBUdXBkYXRlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICd1cGRhdGUnICsgdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy5uYW1lKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQuZGF0YSBhcyBhbnkpW25hbWVdOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgZmxhZyB3aGVuIGRlbGV0aW5nIGFuIG9iamVjdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBEZWxldGUocmVzdWx0OiBGZXRjaFJlc3VsdCk6IFRkZWxldGUge1xuICAgICAgICBjb25zdCBuYW1lID0gJ2RlbGV0ZScgKyBtYWtlUGx1cmFsKHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSkpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdC5kYXRhIGFzIGFueSlbbmFtZV07IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tY2xpZW50L2lzc3Vlcy81NjYyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhZGRpdGlvbmFsIHZhcmlhYmxlcyB0byBiZSB1c2VkIHdoZW4gZ2V0dGluZyBhIHNpbmdsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRCwgYW5kIGlzIG5lZWRlZCB0byBnZXQgYXBwcm9wcmlhdGUgYWNjZXNzIHJpZ2h0c1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yT25lKCk6IFBhcnRpYWw8Vm9uZT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhZGRpdGlvbmFsIHZhcmlhYmxlcyB0byBiZSB1c2VkIHdoZW4gZ2V0dGluZyBtdWx0aXBsZSBvYmplY3RzXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSUQsIGJ1dCBpdCBjb3VsZCBiZSBzb21ldGhpbmcgZWxzZSB0byBmdXJ0aGVyIGZpbHRlciB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpOiBQYXJ0aWFsPFZhbGw+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JDcmVhdGlvbihvYmplY3Q6IExpdGVyYWwpOiBQYXJ0aWFsPFZjcmVhdGU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIHVwZGF0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JVcGRhdGUob2JqZWN0OiBMaXRlcmFsKTogUGFydGlhbDxWdXBkYXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGRlbGV0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JEZWxldGUob2JqZWN0czogTGl0ZXJhbFtdKTogUGFydGlhbDxWZGVsZXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgcXVlcmllcyB3aXRoIGludmFsaWQgdmFyaWFibGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHRocm93SWZPYnNlcnZhYmxlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIE9ic2VydmFibGUgYXMgdmFyaWFibGVzLiBJbnN0ZWFkIHlvdSBzaG91bGQgdXNlIC5zdWJzY3JpYmUoKSB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aCBhIHJlYWwgdmFsdWUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIGdpdmVuIElEIHdpdGggYWRkaXRpb25hbCBwYXJ0aWFsIHZhcmlhYmxlcyBpZiB0aGVyZSBpcyBhbnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhYmxlc0Zvck9uZShpZDogc3RyaW5nKTogVm9uZSB7XG4gICAgICAgIHJldHVybiBtZXJnZSh7fSwge2lkOiBpZH0sIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0Zvck9uZSgpKSBhcyBWb25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRocm93IGV4Y2VwdGlvbiB0byBwcmV2ZW50IGV4ZWN1dGluZyBudWxsIHF1ZXJpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIHRocm93SWZOb3RRdWVyeShxdWVyeTogRG9jdW1lbnROb2RlIHwgbnVsbCk6IGFzc2VydHMgcXVlcnkge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyYXBoUUwgcXVlcnkgZm9yIHRoaXMgbWV0aG9kIHdhcyBub3QgY29uZmlndXJlZCBpbiB0aGlzIHNlcnZpY2UgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==