@snabcentr/client-ui 4.6.6 → 5.1.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 (469) hide show
  1. package/fesm2022/snabcentr-client-ui.mjs +3362 -4046
  2. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  3. package/package.json +35 -36
  4. package/release_notes.tmp +2 -14
  5. package/styles/taiga/variables.less +16 -17
  6. package/styles/tailwind/tailwind.scss +0 -8
  7. package/types/snabcentr-client-ui.d.ts +5704 -0
  8. package/accordion/index.d.ts +0 -3
  9. package/accordion/sc-accordion-content.directive.d.ts +0 -9
  10. package/accordion/sc-accordion.component.d.ts +0 -56
  11. package/accordion/sc-accordion.module.d.ts +0 -15
  12. package/auth/enums/auth-method.d.ts +0 -13
  13. package/auth/index.d.ts +0 -8
  14. package/auth/interfaces/index.d.ts +0 -2
  15. package/auth/interfaces/sc-bank-account-form-group.d.ts +0 -11
  16. package/auth/interfaces/sc-contact-form-group.d.ts +0 -10
  17. package/auth/sc-auth.module.d.ts +0 -27
  18. package/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.d.ts +0 -55
  19. package/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.d.ts +0 -45
  20. package/auth/sc-sign-in-form/sc-sign-in-form.component.d.ts +0 -53
  21. package/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.d.ts +0 -113
  22. package/auth/sign-up-form/sc-sign-up-form.component.d.ts +0 -166
  23. package/banner/index.d.ts +0 -2
  24. package/banner/sc-banner.component.d.ts +0 -79
  25. package/banner/sc-banner.module.d.ts +0 -17
  26. package/brands-list/index.d.ts +0 -2
  27. package/brands-list/sc-brands-list.component.d.ts +0 -15
  28. package/brands-list/sc-brands-list.module.d.ts +0 -12
  29. package/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.d.ts +0 -98
  30. package/cart/add-or-editing-cart-item-dialog/index.d.ts +0 -2
  31. package/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.d.ts +0 -49
  32. package/cart/index.d.ts +0 -2
  33. package/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.d.ts +0 -62
  34. package/catalog/catalog-filters/collapsible/sc-catalog-filter-collapsible.component.d.ts +0 -47
  35. package/catalog/catalog-filters/index.d.ts +0 -4
  36. package/catalog/catalog-filters/sc-catalog-filters.component.d.ts +0 -180
  37. package/catalog/catalog-filters/tokens/sc-catalog-products-filters.d.ts +0 -7
  38. package/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.d.ts +0 -5
  39. package/catalog/category-card/sc-category-card.component.d.ts +0 -76
  40. package/catalog/cost-with-discount/cost-with-discount.component.d.ts +0 -23
  41. package/catalog/download-price-list/sc-download-price-list.component.d.ts +0 -38
  42. package/catalog/hover-image-carousel/sc-hover-image-carousel.component.d.ts +0 -48
  43. package/catalog/index.d.ts +0 -15
  44. package/catalog/input-quantity/sc-input-quantity.component.d.ts +0 -82
  45. package/catalog/notify-when-in-stock-dialog/index.d.ts +0 -2
  46. package/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.d.ts +0 -90
  47. package/catalog/notify-when-in-stock-dialog/sc-product-in-all-warehouses.pipe.d.ts +0 -22
  48. package/catalog/price-card/sc-price-card.component.d.ts +0 -18
  49. package/catalog/price-card-inline/sc-price-card-inline.component.d.ts +0 -10
  50. package/catalog/price-history/sc-price-history.component.d.ts +0 -88
  51. package/catalog/price-list-pagination/sc-price-list-pagination.component.d.ts +0 -40
  52. package/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.d.ts +0 -47
  53. package/catalog/sc-catalog.module.d.ts +0 -29
  54. package/catalog/sc-favorite-button/sc-favorite-button.component.d.ts +0 -25
  55. package/catalog/seo-tags/sc-seo-tags.component.d.ts +0 -20
  56. package/configurators/index.d.ts +0 -3
  57. package/configurators/models/index.d.ts +0 -3
  58. package/configurators/models/sandwich/sc-i-configurator-search-product-sandwich.d.ts +0 -22
  59. package/configurators/models/sandwich/sc-i-sandwich-settings.d.ts +0 -18
  60. package/configurators/models/sandwich_m2/sc-i-sandwich-m2-settings.d.ts +0 -18
  61. package/configurators/sandwich/index.d.ts +0 -3
  62. package/configurators/sandwich/sandwich-skeleton/sc-sandwich-skeleton.component.d.ts +0 -8
  63. package/configurators/sandwich/sc-i-new-cart-item-sandwich.d.ts +0 -14
  64. package/configurators/sandwich/sc-sandwich.component.d.ts +0 -182
  65. package/configurators/sandwich_m2/index.d.ts +0 -4
  66. package/configurators/sandwich_m2/sandwich-m2-skeleton/sc-sandwich-m2-skeleton.component.d.ts +0 -8
  67. package/configurators/sandwich_m2/sc-i-new-cart-item-sandwich-m2.d.ts +0 -23
  68. package/configurators/sandwich_m2/sc-sandwich-m2-item-submit-state.d.ts +0 -13
  69. package/configurators/sandwich_m2/sc-sandwich-m2.component.d.ts +0 -267
  70. package/contacts/add-contact-dialog/sc-add-contact-dialog.component.d.ts +0 -49
  71. package/contacts/contacts-accordion/sc-contacts-accordion.component.d.ts +0 -23
  72. package/contacts/index.d.ts +0 -7
  73. package/contacts/manager-card/sc-manager-card.component.d.ts +0 -22
  74. package/contacts/manager-card-push/sc-manager-card-push.component.d.ts +0 -18
  75. package/contacts/new-contact-form/sc-new-contact-form.component.d.ts +0 -28
  76. package/contacts/sc-contacts.module.d.ts +0 -27
  77. package/contacts/tokens/index.d.ts +0 -2
  78. package/contacts/tokens/sc-manager-qr-handler.token.d.ts +0 -6
  79. package/contacts/tokens/sc-show-help-notification-in-phone-input.token.d.ts +0 -5
  80. package/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.d.ts +0 -49
  81. package/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.d.ts +0 -158
  82. package/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.d.ts +0 -62
  83. package/contragents/contragents-accordion/sc-contragents-accordion.component.d.ts +0 -49
  84. package/contragents/index.d.ts +0 -7
  85. package/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.d.ts +0 -64
  86. package/contragents/new-contragent-form/sc-new-contragent-form.component.d.ts +0 -119
  87. package/contragents/sc-contragents.module.d.ts +0 -26
  88. package/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.d.ts +0 -141
  89. package/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.d.ts +0 -50
  90. package/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.d.ts +0 -49
  91. package/delivery-address/index.d.ts +0 -4
  92. package/delivery-address/sc-delivery-address.module.d.ts +0 -25
  93. package/dialogs/index.d.ts +0 -1
  94. package/dialogs/sc-resource-preview/sc-resource-preview.component.d.ts +0 -42
  95. package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +0 -136
  96. package/directives/index.d.ts +0 -9
  97. package/directives/links/index.d.ts +0 -4
  98. package/directives/links/sc-email-link.directive.d.ts +0 -25
  99. package/directives/links/sc-link-location.d.ts +0 -5
  100. package/directives/links/sc-links.d.ts +0 -7
  101. package/directives/links/sc-tel-link.directive.d.ts +0 -40
  102. package/directives/next-input-focus/sc-next-input-focus.directive.d.ts +0 -27
  103. package/directives/next-input-focus/sc-next-input-focus.module.d.ts +0 -10
  104. package/directives/print/sc-print.directive.d.ts +0 -21
  105. package/directives/sc-date-value-transformer.directive.d.ts +0 -8
  106. package/directives/sc-focus-first-invalid-field.directive.d.ts +0 -30
  107. package/directives/select-on-focusin/sc-select-on-focusin.directive.d.ts +0 -14
  108. package/directives/terminal-link/sc-terminal-link.directive.d.ts +0 -34
  109. package/error-handler/consts/error-change-handler.providers.d.ts +0 -6
  110. package/error-handler/error-block-status/error-block-status.component.d.ts +0 -45
  111. package/error-handler/index.d.ts +0 -4
  112. package/error-handler/interfaces/i-block-error.d.ts +0 -17
  113. package/error-handler/sc-error-handler.component.d.ts +0 -40
  114. package/esm2022/accordion/index.mjs +0 -4
  115. package/esm2022/accordion/sc-accordion-content.directive.mjs +0 -17
  116. package/esm2022/accordion/sc-accordion.component.mjs +0 -92
  117. package/esm2022/accordion/sc-accordion.module.mjs +0 -26
  118. package/esm2022/auth/enums/auth-method.mjs +0 -15
  119. package/esm2022/auth/index.mjs +0 -9
  120. package/esm2022/auth/interfaces/index.mjs +0 -3
  121. package/esm2022/auth/interfaces/sc-bank-account-form-group.mjs +0 -2
  122. package/esm2022/auth/interfaces/sc-contact-form-group.mjs +0 -2
  123. package/esm2022/auth/sc-auth.module.mjs +0 -103
  124. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.mjs +0 -100
  125. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.mjs +0 -81
  126. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form.component.mjs +0 -89
  127. package/esm2022/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.mjs +0 -203
  128. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +0 -334
  129. package/esm2022/banner/index.mjs +0 -3
  130. package/esm2022/banner/sc-banner.component.mjs +0 -131
  131. package/esm2022/banner/sc-banner.module.mjs +0 -29
  132. package/esm2022/brands-list/index.mjs +0 -3
  133. package/esm2022/brands-list/sc-brands-list.component.mjs +0 -24
  134. package/esm2022/brands-list/sc-brands-list.module.mjs +0 -22
  135. package/esm2022/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.mjs +0 -229
  136. package/esm2022/cart/add-or-editing-cart-item-dialog/index.mjs +0 -3
  137. package/esm2022/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.mjs +0 -75
  138. package/esm2022/cart/index.mjs +0 -3
  139. package/esm2022/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.mjs +0 -110
  140. package/esm2022/catalog/catalog-filters/collapsible/sc-catalog-filter-collapsible.component.mjs +0 -59
  141. package/esm2022/catalog/catalog-filters/index.mjs +0 -5
  142. package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +0 -402
  143. package/esm2022/catalog/catalog-filters/tokens/sc-catalog-products-filters.mjs +0 -10
  144. package/esm2022/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.mjs +0 -6
  145. package/esm2022/catalog/category-card/sc-category-card.component.mjs +0 -102
  146. package/esm2022/catalog/cost-with-discount/cost-with-discount.component.mjs +0 -39
  147. package/esm2022/catalog/download-price-list/sc-download-price-list.component.mjs +0 -56
  148. package/esm2022/catalog/hover-image-carousel/sc-hover-image-carousel.component.mjs +0 -76
  149. package/esm2022/catalog/index.mjs +0 -16
  150. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +0 -189
  151. package/esm2022/catalog/notify-when-in-stock-dialog/index.mjs +0 -3
  152. package/esm2022/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.mjs +0 -173
  153. package/esm2022/catalog/notify-when-in-stock-dialog/sc-product-in-all-warehouses.pipe.mjs +0 -35
  154. package/esm2022/catalog/price-card/sc-price-card.component.mjs +0 -73
  155. package/esm2022/catalog/price-card-inline/sc-price-card-inline.component.mjs +0 -56
  156. package/esm2022/catalog/price-history/sc-price-history.component.mjs +0 -140
  157. package/esm2022/catalog/price-list-pagination/sc-price-list-pagination.component.mjs +0 -65
  158. package/esm2022/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +0 -61
  159. package/esm2022/catalog/sc-catalog.module.mjs +0 -126
  160. package/esm2022/catalog/sc-favorite-button/sc-favorite-button.component.mjs +0 -42
  161. package/esm2022/catalog/seo-tags/sc-seo-tags.component.mjs +0 -25
  162. package/esm2022/configurators/index.mjs +0 -4
  163. package/esm2022/configurators/models/index.mjs +0 -4
  164. package/esm2022/configurators/models/sandwich/sc-i-configurator-search-product-sandwich.mjs +0 -2
  165. package/esm2022/configurators/models/sandwich/sc-i-sandwich-settings.mjs +0 -2
  166. package/esm2022/configurators/models/sandwich_m2/sc-i-sandwich-m2-settings.mjs +0 -2
  167. package/esm2022/configurators/sandwich/index.mjs +0 -4
  168. package/esm2022/configurators/sandwich/sandwich-skeleton/sc-sandwich-skeleton.component.mjs +0 -14
  169. package/esm2022/configurators/sandwich/sc-i-new-cart-item-sandwich.mjs +0 -2
  170. package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +0 -382
  171. package/esm2022/configurators/sandwich_m2/index.mjs +0 -5
  172. package/esm2022/configurators/sandwich_m2/sandwich-m2-skeleton/sc-sandwich-m2-skeleton.component.mjs +0 -14
  173. package/esm2022/configurators/sandwich_m2/sc-i-new-cart-item-sandwich-m2.mjs +0 -2
  174. package/esm2022/configurators/sandwich_m2/sc-sandwich-m2-item-submit-state.mjs +0 -5
  175. package/esm2022/configurators/sandwich_m2/sc-sandwich-m2.component.mjs +0 -561
  176. package/esm2022/contacts/add-contact-dialog/sc-add-contact-dialog.component.mjs +0 -91
  177. package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +0 -37
  178. package/esm2022/contacts/index.mjs +0 -8
  179. package/esm2022/contacts/manager-card/sc-manager-card.component.mjs +0 -58
  180. package/esm2022/contacts/manager-card-push/sc-manager-card-push.component.mjs +0 -28
  181. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +0 -37
  182. package/esm2022/contacts/sc-contacts.module.mjs +0 -89
  183. package/esm2022/contacts/tokens/index.mjs +0 -3
  184. package/esm2022/contacts/tokens/sc-manager-qr-handler.token.mjs +0 -25
  185. package/esm2022/contacts/tokens/sc-show-help-notification-in-phone-input.token.mjs +0 -9
  186. package/esm2022/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.mjs +0 -81
  187. package/esm2022/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.mjs +0 -266
  188. package/esm2022/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.mjs +0 -74
  189. package/esm2022/contragents/contragents-accordion/sc-contragents-accordion.component.mjs +0 -68
  190. package/esm2022/contragents/index.mjs +0 -8
  191. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +0 -72
  192. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +0 -224
  193. package/esm2022/contragents/sc-contragents.module.mjs +0 -115
  194. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +0 -248
  195. package/esm2022/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.mjs +0 -60
  196. package/esm2022/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.mjs +0 -68
  197. package/esm2022/delivery-address/index.mjs +0 -5
  198. package/esm2022/delivery-address/sc-delivery-address.module.mjs +0 -96
  199. package/esm2022/dialogs/index.mjs +0 -2
  200. package/esm2022/dialogs/sc-resource-preview/sc-resource-preview.component.mjs +0 -73
  201. package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +0 -170
  202. package/esm2022/directives/index.mjs +0 -10
  203. package/esm2022/directives/links/index.mjs +0 -5
  204. package/esm2022/directives/links/sc-email-link.directive.mjs +0 -49
  205. package/esm2022/directives/links/sc-link-location.mjs +0 -2
  206. package/esm2022/directives/links/sc-links.mjs +0 -8
  207. package/esm2022/directives/links/sc-tel-link.directive.mjs +0 -79
  208. package/esm2022/directives/next-input-focus/sc-next-input-focus.directive.mjs +0 -70
  209. package/esm2022/directives/next-input-focus/sc-next-input-focus.module.mjs +0 -19
  210. package/esm2022/directives/print/sc-print.directive.mjs +0 -36
  211. package/esm2022/directives/sc-date-value-transformer.directive.mjs +0 -30
  212. package/esm2022/directives/sc-focus-first-invalid-field.directive.mjs +0 -85
  213. package/esm2022/directives/select-on-focusin/sc-select-on-focusin.directive.mjs +0 -31
  214. package/esm2022/directives/terminal-link/sc-terminal-link.directive.mjs +0 -69
  215. package/esm2022/error-handler/consts/error-change-handler.providers.mjs +0 -10
  216. package/esm2022/error-handler/error-block-status/error-block-status.component.mjs +0 -88
  217. package/esm2022/error-handler/index.mjs +0 -5
  218. package/esm2022/error-handler/interfaces/i-block-error.mjs +0 -2
  219. package/esm2022/error-handler/sc-error-handler.component.mjs +0 -58
  220. package/esm2022/feedback/feedback-form/sc-feedback-form.component.mjs +0 -344
  221. package/esm2022/feedback/gratitude/sc-gratitude.component.mjs +0 -32
  222. package/esm2022/feedback/index.mjs +0 -4
  223. package/esm2022/feedback/interfaces/index.mjs +0 -2
  224. package/esm2022/feedback/interfaces/sc-feedback-form-config.mjs +0 -2
  225. package/esm2022/files/directives/index.mjs +0 -3
  226. package/esm2022/files/directives/tree-top.directive.mjs +0 -63
  227. package/esm2022/files/directives/tree.directive.mjs +0 -47
  228. package/esm2022/files/file-tree-item/file-tree-item.component.mjs +0 -18
  229. package/esm2022/files/files-and-documents/files-and-documents.component.mjs +0 -61
  230. package/esm2022/files/files-and-documents.module.mjs +0 -28
  231. package/esm2022/files/index.mjs +0 -6
  232. package/esm2022/files/interfaces/tree-node.mjs +0 -2
  233. package/esm2022/files/services/index.mjs +0 -3
  234. package/esm2022/files/services/tree-icon.service.mjs +0 -49
  235. package/esm2022/files/services/tree-loader.service.mjs +0 -62
  236. package/esm2022/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +0 -156
  237. package/esm2022/form-fields/form-fields.module.mjs +0 -66
  238. package/esm2022/form-fields/index.mjs +0 -4
  239. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +0 -174
  240. package/esm2022/icons/index.mjs +0 -2
  241. package/esm2022/icons/sc-client-ui-icons-name.mjs +0 -99
  242. package/esm2022/loader/index.mjs +0 -2
  243. package/esm2022/loader/sc-i-loader.mjs +0 -2
  244. package/esm2022/masks/index.mjs +0 -8
  245. package/esm2022/masks/sc-account-number-mask.mjs +0 -7
  246. package/esm2022/masks/sc-bic-mask.mjs +0 -7
  247. package/esm2022/masks/sc-correspondent-account-mask.mjs +0 -7
  248. package/esm2022/masks/sc-inn-mask.mjs +0 -13
  249. package/esm2022/masks/sc-kpp-mask.mjs +0 -7
  250. package/esm2022/masks/sc-okpo-mask.mjs +0 -13
  251. package/esm2022/masks/sc-phone-verification-code-mask.mjs +0 -7
  252. package/esm2022/methods/index.mjs +0 -2
  253. package/esm2022/methods/sc-get-current-route.mjs +0 -14
  254. package/esm2022/models/i-sc-image.mjs +0 -2
  255. package/esm2022/models/index.mjs +0 -2
  256. package/esm2022/news/index.mjs +0 -4
  257. package/esm2022/news/news-card/sc-news-card.component.mjs +0 -34
  258. package/esm2022/news/news-card-skeleton/sc-news-card-skeleton.component.mjs +0 -31
  259. package/esm2022/news/sc-news.module.mjs +0 -26
  260. package/esm2022/noindex-wrapper/directives/index.mjs +0 -2
  261. package/esm2022/noindex-wrapper/directives/sc-noindex.directive.mjs +0 -58
  262. package/esm2022/noindex-wrapper/index.mjs +0 -3
  263. package/esm2022/noindex-wrapper/sc-noindex-wrapper.component.mjs +0 -18
  264. package/esm2022/order/directives/index.mjs +0 -3
  265. package/esm2022/order/directives/sc-order-accessor.directive.mjs +0 -28
  266. package/esm2022/order/directives/sc-order-options.mjs +0 -11
  267. package/esm2022/order/draft/sc-draft.component.mjs +0 -118
  268. package/esm2022/order/index.mjs +0 -10
  269. package/esm2022/order/models/sc-i-cart-items-by-direction.mjs +0 -22
  270. package/esm2022/order/order-item/sc-order-item.component.mjs +0 -108
  271. package/esm2022/order/order-items-list/sc-order-items-list.component.mjs +0 -208
  272. package/esm2022/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.mjs +0 -75
  273. package/esm2022/order/order-items-list-by-stock/sc-order-items-list-by-stock.component.mjs +0 -75
  274. package/esm2022/order/sc-order.module.mjs +0 -52
  275. package/esm2022/order/sc-payment-status/sc-payment-status.component.mjs +0 -35
  276. package/esm2022/pages/frequently-asked-questions/sc-frequently-asked-questions.component.mjs +0 -49
  277. package/esm2022/pages/frequently-asked-questions/sc-page-size-options.mjs +0 -8
  278. package/esm2022/pages/frequently-asked-questions-group-selector/sc-frequently-asked-questions-group-selector.component.mjs +0 -59
  279. package/esm2022/pages/frequently-asked-questions-with-groups/sc-frequently-asked-questions-with-groups.component.mjs +0 -107
  280. package/esm2022/pages/index.mjs +0 -7
  281. package/esm2022/pages/personal-data-processing-policy/sc-personal-data-processing-policy.component.mjs +0 -46
  282. package/esm2022/pages/privacy-policy/sc-privacy-policy.component.mjs +0 -30
  283. package/esm2022/pages/public-offer/sc-public-offer.component.mjs +0 -50
  284. package/esm2022/pipes/index.mjs +0 -3
  285. package/esm2022/pipes/sc-format-date.mjs +0 -33
  286. package/esm2022/pipes/sc-phone-format.mjs +0 -44
  287. package/esm2022/profile/index.mjs +0 -3
  288. package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +0 -174
  289. package/esm2022/profile/sc-profile.module.mjs +0 -73
  290. package/esm2022/providers/cleanup-recaptcha-artifacts.mjs +0 -30
  291. package/esm2022/providers/date-value-transformer/index.mjs +0 -4
  292. package/esm2022/providers/date-value-transformer/sc-date-value-transformer-types.mjs +0 -2
  293. package/esm2022/providers/date-value-transformer/sc-date-value-transformer-with-end-time.mjs +0 -26
  294. package/esm2022/providers/date-value-transformer/sc-date-value-transformer-with-start-time.mjs +0 -37
  295. package/esm2022/providers/index.mjs +0 -17
  296. package/esm2022/providers/sc-allow-select-terminated.mjs +0 -8
  297. package/esm2022/providers/sc-banner-duration.mjs +0 -8
  298. package/esm2022/providers/sc-country-ids.mjs +0 -8
  299. package/esm2022/providers/sc-date-formatter.mjs +0 -15
  300. package/esm2022/providers/sc-date-value-transformer.mjs +0 -12
  301. package/esm2022/providers/sc-debounce-time-default.mjs +0 -9
  302. package/esm2022/providers/sc-dialog-service.providers.mjs +0 -6
  303. package/esm2022/providers/sc-help-notification-close.mjs +0 -9
  304. package/esm2022/providers/sc-help-notification-limit.mjs +0 -8
  305. package/esm2022/providers/sc-hidden-print-elements.token.mjs +0 -10
  306. package/esm2022/providers/sc-max-files-in-form-input.mjs +0 -8
  307. package/esm2022/providers/sc-notify-when-in-stock-required-fields.mjs +0 -8
  308. package/esm2022/providers/sc-page-size-options.mjs +0 -8
  309. package/esm2022/providers/sc-user-providers.mjs +0 -38
  310. package/esm2022/providers/sc-verification-code-timeout.mjs +0 -8
  311. package/esm2022/public-api.mjs +0 -35
  312. package/esm2022/qrcode/index.mjs +0 -3
  313. package/esm2022/qrcode/qrcode-dialog/sc-qrcode-dialog.component.mjs +0 -58
  314. package/esm2022/qrcode/sc-qrcode.module.mjs +0 -25
  315. package/esm2022/samples/index.mjs +0 -5
  316. package/esm2022/samples/interfaces/index.mjs +0 -3
  317. package/esm2022/samples/interfaces/sc-i-preview-sample.mjs +0 -2
  318. package/esm2022/samples/interfaces/sc-preview-mosquito-config.mjs +0 -2
  319. package/esm2022/samples/preview-sample/sc-preview-sample.component.mjs +0 -42
  320. package/esm2022/samples/sc-preview-samples-mosquito/sc-preview-samples-mosquito.component.mjs +0 -63
  321. package/esm2022/samples/sc-sample.module.mjs +0 -66
  322. package/esm2022/services/index.mjs +0 -3
  323. package/esm2022/services/print.service.mjs +0 -49
  324. package/esm2022/services/sc-help-notification.service.mjs +0 -100
  325. package/esm2022/share-button/index.mjs +0 -3
  326. package/esm2022/share-button/sc-share-button.component.mjs +0 -35
  327. package/esm2022/share-button/sc-share-button.module.mjs +0 -22
  328. package/esm2022/snabcentr-client-ui.mjs +0 -5
  329. package/esm2022/user/index.mjs +0 -6
  330. package/esm2022/user/reset-user-password/sc-reset-user-password.component.mjs +0 -74
  331. package/esm2022/user/sc-user.module.mjs +0 -86
  332. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +0 -121
  333. package/esm2022/user/user-managers/sc-user-managers.component.mjs +0 -40
  334. package/esm2022/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.mjs +0 -105
  335. package/esm2022/validators/index.mjs +0 -7
  336. package/esm2022/validators/sc-at-least-one-required-validator.mjs +0 -25
  337. package/esm2022/validators/sc-bic-validator.mjs +0 -10
  338. package/esm2022/validators/sc-correspondent-account-validator.mjs +0 -10
  339. package/esm2022/validators/sc-password-confirm-matching-validator.mjs +0 -17
  340. package/esm2022/validators/sc-phone-validator.mjs +0 -14
  341. package/esm2022/validators/step-validator.mjs +0 -18
  342. package/esm2022/verification/index.mjs +0 -3
  343. package/esm2022/verification/sc-verification.module.mjs +0 -86
  344. package/esm2022/verification/verification-phone-check-form/sc-verification-phone-check-form.component.mjs +0 -259
  345. package/feedback/feedback-form/sc-feedback-form.component.d.ts +0 -163
  346. package/feedback/gratitude/sc-gratitude.component.d.ts +0 -20
  347. package/feedback/index.d.ts +0 -3
  348. package/feedback/interfaces/index.d.ts +0 -1
  349. package/feedback/interfaces/sc-feedback-form-config.d.ts +0 -23
  350. package/files/directives/index.d.ts +0 -2
  351. package/files/directives/tree-top.directive.d.ts +0 -33
  352. package/files/directives/tree.directive.d.ts +0 -35
  353. package/files/file-tree-item/file-tree-item.component.d.ts +0 -9
  354. package/files/files-and-documents/files-and-documents.component.d.ts +0 -27
  355. package/files/files-and-documents.module.d.ts +0 -17
  356. package/files/index.d.ts +0 -5
  357. package/files/interfaces/tree-node.d.ts +0 -29
  358. package/files/services/index.d.ts +0 -2
  359. package/files/services/tree-icon.service.d.ts +0 -23
  360. package/files/services/tree-loader.service.d.ts +0 -43
  361. package/form-fields/addresses-selection-field/sc-addresses-selection-field.component.d.ts +0 -78
  362. package/form-fields/form-fields.module.d.ts +0 -18
  363. package/form-fields/index.d.ts +0 -3
  364. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +0 -73
  365. package/icons/index.d.ts +0 -1
  366. package/icons/sc-client-ui-icons-name.d.ts +0 -4
  367. package/index.d.ts +0 -5
  368. package/loader/index.d.ts +0 -1
  369. package/loader/sc-i-loader.d.ts +0 -9
  370. package/masks/index.d.ts +0 -7
  371. package/masks/sc-account-number-mask.d.ts +0 -5
  372. package/masks/sc-bic-mask.d.ts +0 -5
  373. package/masks/sc-correspondent-account-mask.d.ts +0 -5
  374. package/masks/sc-inn-mask.d.ts +0 -9
  375. package/masks/sc-kpp-mask.d.ts +0 -5
  376. package/masks/sc-okpo-mask.d.ts +0 -9
  377. package/masks/sc-phone-verification-code-mask.d.ts +0 -5
  378. package/methods/index.d.ts +0 -1
  379. package/methods/sc-get-current-route.d.ts +0 -8
  380. package/models/i-sc-image.d.ts +0 -17
  381. package/models/index.d.ts +0 -1
  382. package/news/index.d.ts +0 -3
  383. package/news/news-card/sc-news-card.component.d.ts +0 -22
  384. package/news/news-card-skeleton/sc-news-card-skeleton.component.d.ts +0 -16
  385. package/news/sc-news.module.d.ts +0 -16
  386. package/noindex-wrapper/directives/index.d.ts +0 -1
  387. package/noindex-wrapper/directives/sc-noindex.directive.d.ts +0 -29
  388. package/noindex-wrapper/index.d.ts +0 -2
  389. package/noindex-wrapper/sc-noindex-wrapper.component.d.ts +0 -9
  390. package/order/directives/index.d.ts +0 -2
  391. package/order/directives/sc-order-accessor.directive.d.ts +0 -13
  392. package/order/directives/sc-order-options.d.ts +0 -14
  393. package/order/draft/sc-draft.component.d.ts +0 -63
  394. package/order/index.d.ts +0 -9
  395. package/order/models/sc-i-cart-items-by-direction.d.ts +0 -25
  396. package/order/order-item/sc-order-item.component.d.ts +0 -39
  397. package/order/order-items-list/sc-order-items-list.component.d.ts +0 -109
  398. package/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.d.ts +0 -58
  399. package/order/order-items-list-by-stock/sc-order-items-list-by-stock.component.d.ts +0 -55
  400. package/order/sc-order.module.d.ts +0 -18
  401. package/order/sc-payment-status/sc-payment-status.component.d.ts +0 -25
  402. package/pages/frequently-asked-questions/sc-frequently-asked-questions.component.d.ts +0 -22
  403. package/pages/frequently-asked-questions/sc-page-size-options.d.ts +0 -5
  404. package/pages/frequently-asked-questions-group-selector/sc-frequently-asked-questions-group-selector.component.d.ts +0 -28
  405. package/pages/frequently-asked-questions-with-groups/sc-frequently-asked-questions-with-groups.component.d.ts +0 -79
  406. package/pages/index.d.ts +0 -6
  407. package/pages/personal-data-processing-policy/sc-personal-data-processing-policy.component.d.ts +0 -17
  408. package/pages/privacy-policy/sc-privacy-policy.component.d.ts +0 -17
  409. package/pages/public-offer/sc-public-offer.component.d.ts +0 -22
  410. package/pipes/index.d.ts +0 -2
  411. package/pipes/sc-format-date.d.ts +0 -20
  412. package/pipes/sc-phone-format.d.ts +0 -21
  413. package/profile/index.d.ts +0 -2
  414. package/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.d.ts +0 -126
  415. package/profile/sc-profile.module.d.ts +0 -23
  416. package/providers/cleanup-recaptcha-artifacts.d.ts +0 -7
  417. package/providers/date-value-transformer/index.d.ts +0 -3
  418. package/providers/date-value-transformer/sc-date-value-transformer-types.d.ts +0 -9
  419. package/providers/date-value-transformer/sc-date-value-transformer-with-end-time.d.ts +0 -16
  420. package/providers/date-value-transformer/sc-date-value-transformer-with-start-time.d.ts +0 -22
  421. package/providers/index.d.ts +0 -16
  422. package/providers/sc-allow-select-terminated.d.ts +0 -5
  423. package/providers/sc-banner-duration.d.ts +0 -5
  424. package/providers/sc-country-ids.d.ts +0 -5
  425. package/providers/sc-date-formatter.d.ts +0 -6
  426. package/providers/sc-date-value-transformer.d.ts +0 -5
  427. package/providers/sc-debounce-time-default.d.ts +0 -5
  428. package/providers/sc-dialog-service.providers.d.ts +0 -45
  429. package/providers/sc-help-notification-close.d.ts +0 -6
  430. package/providers/sc-help-notification-limit.d.ts +0 -5
  431. package/providers/sc-hidden-print-elements.token.d.ts +0 -6
  432. package/providers/sc-max-files-in-form-input.d.ts +0 -5
  433. package/providers/sc-notify-when-in-stock-required-fields.d.ts +0 -5
  434. package/providers/sc-page-size-options.d.ts +0 -5
  435. package/providers/sc-user-providers.d.ts +0 -21
  436. package/providers/sc-verification-code-timeout.d.ts +0 -5
  437. package/public-api.d.ts +0 -34
  438. package/qrcode/index.d.ts +0 -2
  439. package/qrcode/qrcode-dialog/sc-qrcode-dialog.component.d.ts +0 -37
  440. package/qrcode/sc-qrcode.module.d.ts +0 -14
  441. package/samples/index.d.ts +0 -4
  442. package/samples/interfaces/index.d.ts +0 -2
  443. package/samples/interfaces/sc-i-preview-sample.d.ts +0 -56
  444. package/samples/interfaces/sc-preview-mosquito-config.d.ts +0 -62
  445. package/samples/preview-sample/sc-preview-sample.component.d.ts +0 -30
  446. package/samples/sc-preview-samples-mosquito/sc-preview-samples-mosquito.component.d.ts +0 -50
  447. package/samples/sc-sample.module.d.ts +0 -19
  448. package/services/index.d.ts +0 -2
  449. package/services/print.service.d.ts +0 -31
  450. package/services/sc-help-notification.service.d.ts +0 -70
  451. package/share-button/index.d.ts +0 -2
  452. package/share-button/sc-share-button.component.d.ts +0 -22
  453. package/share-button/sc-share-button.module.d.ts +0 -12
  454. package/user/index.d.ts +0 -5
  455. package/user/reset-user-password/sc-reset-user-password.component.d.ts +0 -46
  456. package/user/sc-user.module.d.ts +0 -24
  457. package/user/update-user-info-dialog/sc-update-user-info-dialog.component.d.ts +0 -63
  458. package/user/user-managers/sc-user-managers.component.d.ts +0 -23
  459. package/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.d.ts +0 -53
  460. package/validators/index.d.ts +0 -6
  461. package/validators/sc-at-least-one-required-validator.d.ts +0 -10
  462. package/validators/sc-bic-validator.d.ts +0 -8
  463. package/validators/sc-correspondent-account-validator.d.ts +0 -8
  464. package/validators/sc-password-confirm-matching-validator.d.ts +0 -8
  465. package/validators/sc-phone-validator.d.ts +0 -5
  466. package/validators/step-validator.d.ts +0 -8
  467. package/verification/index.d.ts +0 -2
  468. package/verification/sc-verification.module.d.ts +0 -21
  469. package/verification/verification-phone-check-form/sc-verification-phone-check-form.component.d.ts +0 -145
@@ -1,402 +0,0 @@
1
- /* eslint-disable class-methods-use-this */
2
- import { ChangeDetectionStrategy, Component, DestroyRef, inject, input, output } from '@angular/core';
3
- import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
4
- import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
5
- import { SC_CATEGORY_INFO, ScCatalogFilterService, ScIdOrSlugPipe, } from '@snabcentr/client-core';
6
- import { tuiIsPresent } from '@taiga-ui/cdk';
7
- import { TuiButton, TuiLabel, TuiNumberFormat, TuiTextfield } from '@taiga-ui/core';
8
- import { TuiCheckbox, TuiInputNumber, TuiRange } from '@taiga-ui/kit';
9
- import { isNil } from 'lodash-es';
10
- import { catchError, debounceTime, EMPTY, filter, map, merge, share, Subscription, switchMap, tap } from 'rxjs';
11
- import { ScSelectOnFocusinDirective } from '../../directives/select-on-focusin/sc-select-on-focusin.directive';
12
- import { ScCatalogFilterCollapsibleComponent } from './collapsible/sc-catalog-filter-collapsible.component';
13
- import { SC_CATALOG_PRODUCTS_FILTERS } from './tokens/sc-catalog-products-filters';
14
- import { SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY } from './tokens/sc-catalog-show-products-recursively';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "@angular/forms";
17
- import * as i2 from "@taiga-ui/core/components/label";
18
- import * as i3 from "@taiga-ui/core";
19
- import * as i4 from "@taiga-ui/kit";
20
- /**
21
- * Компонент вывода фильтров каталога.
22
- */
23
- export class ScCatalogFiltersComponent {
24
- /**
25
- * Инициализирует экземпляр класса {@link ScCatalogFiltersComponent}.
26
- */
27
- constructor() {
28
- /**
29
- * Подписки синхронизации контролов формы (range slider, single-select checkbox).
30
- */
31
- this.formSyncs = new Subscription();
32
- /**
33
- * Сервис для работы с фильтрами каталога.
34
- */
35
- this.catalogFilterService = inject(ScCatalogFilterService);
36
- /**
37
- * Пайп, возвращающий идентификатор или символьное обозначение (slug) исходя из настроек окружения.
38
- */
39
- this.idOrSlugPipe = inject(ScIdOrSlugPipe);
40
- /**
41
- * Subject для хранения фильтров продуктов.
42
- */
43
- this.catalogProductsFilters$ = inject(SC_CATALOG_PRODUCTS_FILTERS);
44
- /**
45
- * Признак необходимости отображать фильтры для вложенных категорий.
46
- */
47
- this.isRecursively = inject(SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY);
48
- /**
49
- * Показывать ли кнопку «Показать результаты».
50
- */
51
- this.showResultsButton = input(false);
52
- /**
53
- * Событие нажатия на кнопку сброса всех фильтров.
54
- */
55
- this.resetFilters = output();
56
- /**
57
- * Событие нажатия на кнопку показа результатов.
58
- */
59
- this.showResults = output();
60
- /**
61
- * FormGroup для фильтров.
62
- */
63
- this.form = new FormGroup({});
64
- /**
65
- * {@link Observable} фильтров категории.
66
- */
67
- this.filters = toSignal(inject(SC_CATEGORY_INFO).pipe(catchError(() => EMPTY), filter(tuiIsPresent), switchMap((category) => this.catalogFilterService.getFilters$(this.idOrSlugPipe.transform(category), this.isRecursively)), filter(tuiIsPresent), map((filters) => filters
68
- .filter((item) => item.type !== 'range' || item.min !== item.max)
69
- .map((item) => (item.type === 'checkbox' ? { ...item, values: [...item.values].sort((a, b) => a.label.localeCompare(b.label)) } : item))), tap((filters) => {
70
- this.updateFormControls(filters);
71
- }), share()));
72
- inject(DestroyRef).onDestroy(() => {
73
- this.formSyncs.unsubscribe();
74
- });
75
- this.form.valueChanges.pipe(debounceTime(0), takeUntilDestroyed()).subscribe((filters) => {
76
- this.catalogProductsFilters$.next(this.buildPropertyFilters(filters));
77
- });
78
- }
79
- /**
80
- * Обновляет состав контролов формы на основе переданных фильтров.
81
- *
82
- * @param filters Массив фильтров для создания контролов.
83
- */
84
- updateFormControls(filters) {
85
- this.formSyncs.unsubscribe();
86
- this.formSyncs = new Subscription();
87
- Object.keys(this.form.controls).forEach((key) => {
88
- this.form.removeControl(key, { emitEvent: false });
89
- });
90
- filters.forEach((item) => {
91
- switch (item.type) {
92
- case 'checkbox': {
93
- const checkboxControl = this.createCheckboxFormControl(item);
94
- this.form.addControl(item.id, checkboxControl, { emitEvent: false });
95
- // Single-select для !isMultiple: при выборе одного остальные снимаются.
96
- if (!item.isMultiple && item.values.length > 1) {
97
- this.formSyncs.add(this.syncSingleSelectCheckbox(checkboxControl));
98
- }
99
- break;
100
- }
101
- case 'range': {
102
- const rangeControl = this.createRangeFormControl(item);
103
- this.form.addControl(item.id, rangeControl, { emitEvent: false });
104
- this.formSyncs.add(this.syncRangeFromToAndSlider(rangeControl));
105
- break;
106
- }
107
- case 'toggle':
108
- this.form.addControl(item.id, this.createToggleFormControl(item), { emitEvent: false });
109
- break;
110
- default:
111
- break;
112
- }
113
- });
114
- }
115
- /**
116
- * Преобразует значения формы в объект фильтров свойств.
117
- *
118
- * @param value Значения формы.
119
- * @returns Объект фильтров свойств.
120
- */
121
- buildPropertyFilters(value) {
122
- const result = {};
123
- this.filters()?.forEach((filterItem) => {
124
- const controlValue = value[filterItem.id];
125
- if (isNil(controlValue)) {
126
- return;
127
- }
128
- switch (filterItem.type) {
129
- case 'checkbox':
130
- this.processCheckboxFilter(result, filterItem, controlValue);
131
- break;
132
- case 'range':
133
- this.processRangeFilter(result, filterItem.id, controlValue);
134
- break;
135
- case 'toggle':
136
- this.processToggleFilter(result, filterItem.id, controlValue);
137
- break;
138
- default:
139
- break;
140
- }
141
- });
142
- return result;
143
- }
144
- /**
145
- * Создаёт FormGroup для checkbox: на каждый {@code value.id} — булевый контрол.
146
- *
147
- * Единый формат и для одного, и для множества значений: шаблон рендерит их одинаково.
148
- * Различие в API-выводе для одиночного значения (boolean вместо массива) обрабатывается в {@link processCheckboxFilter}.
149
- *
150
- * @param checkboxFilter Фильтр типа checkbox.
151
- */
152
- createCheckboxFormControl(checkboxFilter) {
153
- const isSelected = (id) => checkboxFilter.selectedValues?.includes(id) ?? false;
154
- const controls = {};
155
- checkboxFilter.values.forEach((value) => {
156
- controls[value.id] = new FormControl(isSelected(value.id), { nonNullable: true });
157
- });
158
- return new FormGroup(controls);
159
- }
160
- /**
161
- * Создаёт {@link FormGroup} для range: {@code from}, {@code to}, {@code slider} (кортеж для {@link TuiRange}).
162
- *
163
- * @param rangeFilter Фильтр типа range.
164
- */
165
- createRangeFormControl(rangeFilter) {
166
- const fromValue = Number(rangeFilter.selectedMin ?? rangeFilter.min);
167
- const toValue = Number(rangeFilter.selectedMax ?? rangeFilter.max);
168
- return new FormGroup({
169
- from: new FormControl(fromValue, { nonNullable: true }),
170
- to: new FormControl(toValue, { nonNullable: true }),
171
- slider: new FormControl([fromValue, toValue], { nonNullable: true }),
172
- });
173
- }
174
- /**
175
- * Реализует single-select поведение для FormGroup с булевыми контролами:
176
- * при появлении нового true остальные контролы группы сбрасываются в false.
177
- *
178
- * Сохраняет последнее «стабильное» состояние и сравнивает следующее значение с ним —
179
- * новый true (отсутствовал в prev) считается выбранным, остальные сбрасываются через setValue.
180
- *
181
- * @param group FormGroup checkbox-фильтра (id → boolean).
182
- */
183
- syncSingleSelectCheckbox(group) {
184
- let previousState = group.getRawValue();
185
- return group.valueChanges.subscribe((value) => {
186
- const current = value;
187
- const newlyChecked = Object.entries(current).find(([id, isChecked]) => {
188
- // eslint-disable-next-line security/detect-object-injection
189
- return isChecked && !previousState[id];
190
- })?.[0];
191
- if (!newlyChecked) {
192
- previousState = { ...current };
193
- return;
194
- }
195
- const next = {};
196
- Object.keys(group.controls).forEach((id) => {
197
- // eslint-disable-next-line security/detect-object-injection
198
- next[id] = id === newlyChecked;
199
- });
200
- previousState = next;
201
- group.setValue(next);
202
- });
203
- }
204
- /**
205
- * Связывает поля «от»/«до» с контролом слайдера.
206
- *
207
- * @param group FormGroup range-фильтра.
208
- */
209
- syncRangeFromToAndSlider(group) {
210
- const from = group.get('from');
211
- const to = group.get('to');
212
- const slider = group.get('slider');
213
- if (!from || !to || !slider) {
214
- return new Subscription();
215
- }
216
- const sub = new Subscription();
217
- // Инпуты → слайдер; если «от» > «до», поднимаем «до» до «от».
218
- const applySliderFromInputs = () => {
219
- const low = Number(from.value);
220
- let high = Number(to.value);
221
- if (low > high) {
222
- high = low;
223
- to.setValue(high, { emitEvent: false });
224
- }
225
- const currentPair = slider.value;
226
- if (currentPair[0] !== low || currentPair[1] !== high) {
227
- slider.setValue([low, high], { emitEvent: false });
228
- slider.markAsDirty();
229
- }
230
- };
231
- sub.add(merge(from.valueChanges, to.valueChanges).subscribe(applySliderFromInputs));
232
- sub.add(slider.valueChanges.subscribe((value) => {
233
- const [low, high] = value;
234
- if (from.value !== low) {
235
- from.setValue(low, { emitEvent: false });
236
- from.markAsDirty();
237
- }
238
- if (to.value !== high) {
239
- to.setValue(high, { emitEvent: false });
240
- to.markAsDirty();
241
- }
242
- }));
243
- // Совпасть с полями при первом показе (уже совпадает при создании, но на всякий случай).
244
- applySliderFromInputs();
245
- return sub;
246
- }
247
- /**
248
- * Создает FormControl для toggle.
249
- *
250
- * @param toggleFilter Фильтр типа toggle.
251
- */
252
- createToggleFormControl(toggleFilter) {
253
- return new FormControl(toggleFilter.selectedValue ?? false, { nonNullable: true });
254
- }
255
- /**
256
- * Обрабатывает checkbox: FormGroup → string[] выбранных id; для единственного значения — boolean (как toggle).
257
- *
258
- * @param result Объект результата для заполнения.
259
- * @param checkboxFilter Метафильтр checkbox.
260
- * @param controlValue Значение контрола формы (запись id → boolean).
261
- */
262
- processCheckboxFilter(result, checkboxFilter, controlValue) {
263
- const selectedIds = Object.entries(controlValue)
264
- .filter(([, isSelected]) => isSelected)
265
- .map(([id]) => id);
266
- if (selectedIds.length === 0) {
267
- return;
268
- }
269
- // eslint-disable-next-line security/detect-object-injection, no-param-reassign
270
- result[checkboxFilter.id] = selectedIds;
271
- }
272
- /**
273
- * Обрабатывает range фильтр.
274
- *
275
- * @param result Объект результата для заполнения.
276
- * @param filterId Идентификатор фильтра.
277
- * @param range Значение контрола формы (объект с границами).
278
- * @param range.from Начальное значение диапазона.
279
- * @param range.to Конечное значение диапазона.
280
- */
281
- processRangeFilter(result, filterId, range) {
282
- // eslint-disable-next-line security/detect-object-injection, no-param-reassign
283
- result[filterId] = {
284
- from: String(range.from),
285
- to: String(range.to),
286
- };
287
- }
288
- /**
289
- * Обрабатывает toggle фильтр.
290
- *
291
- * @param result Объект результата для заполнения.
292
- * @param filterId Идентификатор фильтра.
293
- * @param controlValue Значение контрола формы.
294
- */
295
- processToggleFilter(result, filterId, controlValue) {
296
- if (controlValue) {
297
- // eslint-disable-next-line security/detect-object-injection, no-param-reassign
298
- result[filterId] = controlValue;
299
- }
300
- }
301
- /**
302
- * Сбрасывает поле «от» диапазона к минимальному значению фильтра.
303
- *
304
- * @param filterId Идентификатор фильтра.
305
- * @param min Минимальное значение диапазона.
306
- */
307
- resetRangeFrom(filterId, min) {
308
- this.form.get(filterId)?.get('from')?.reset(+min);
309
- }
310
- /**
311
- * Сбрасывает поле «до» диапазона к максимальному значению фильтра.
312
- *
313
- * @param filterId Идентификатор фильтра.
314
- * @param max Максимальное значение диапазона.
315
- */
316
- resetRangeTo(filterId, max) {
317
- this.form.get(filterId)?.get('to')?.reset(+max);
318
- }
319
- /**
320
- * Сбрасывает все чекбоксы группы в `false`.
321
- *
322
- * @param filterId Идентификатор фильтра (ключ FormGroup в форме).
323
- */
324
- resetCheckboxGroup(filterId) {
325
- const group = this.form.get(filterId);
326
- if (!group) {
327
- return;
328
- }
329
- const resetValue = {};
330
- Object.keys(group.controls).forEach((id) => {
331
- // eslint-disable-next-line security/detect-object-injection
332
- resetValue[id] = false;
333
- });
334
- group.reset(resetValue);
335
- }
336
- /**
337
- * Сбрасывает все фильтры и оповещает родителя о нажатии кнопки сброса.
338
- */
339
- onResetFiltersClick() {
340
- this.resetAllFilters();
341
- this.resetFilters.emit();
342
- }
343
- /**
344
- * Оповещает родителя о нажатии кнопки показа результатов.
345
- */
346
- onShowResultsClick() {
347
- this.showResults.emit();
348
- }
349
- /**
350
- * Сбрасывает все фильтры к исходным значениям.
351
- */
352
- resetAllFilters() {
353
- this.filters()?.forEach((filterItem) => {
354
- const control = this.form.get(filterItem.id);
355
- if (!control) {
356
- return;
357
- }
358
- switch (filterItem.type) {
359
- case 'checkbox': {
360
- const group = control;
361
- const resetValue = {};
362
- Object.keys(group.controls).forEach((id) => {
363
- // eslint-disable-next-line security/detect-object-injection
364
- resetValue[id] = false;
365
- });
366
- group.reset(resetValue);
367
- break;
368
- }
369
- case 'toggle':
370
- control.reset(false);
371
- break;
372
- case 'range': {
373
- const group = control;
374
- const min = +filterItem.min;
375
- const max = +filterItem.max;
376
- group.reset({ from: min, to: max, slider: [min, max] });
377
- break;
378
- }
379
- default:
380
- break;
381
- }
382
- });
383
- }
384
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
385
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { showResultsButton: { classPropertyName: "showResultsButton", publicName: "showResultsButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetFilters: "resetFilters", showResults: "showResults" }, ngImport: i0, template: "@if (filters()?.length) {\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col pb-1\"\n >\n @for (filter of filters(); track filter.id; let isFirst = $first) {\n @if (!isFirst) {\n <hr class=\"my-3 w-full h-px\" />\n }\n\n <div class=\"flex flex-col gap-2\">\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0433\u0440\u0443\u043F\u043F\u044B. \u0414\u043B\u044F toggle \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435\u0442: \u043C\u0435\u0442\u043A\u0430 \u0438\u0434\u0451\u0442 \u043F\u0440\u044F\u043C\u043E \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C checkbox. -->\n @if (filter.type !== 'toggle') {\n <label class=\"text-body-s-bold\">{{ filter.label }}</label>\n }\n\n <!-- Checkbox: FormGroup(value.id \u2192 boolean) \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.\n \u0420\u0430\u0437\u0432\u0438\u043B\u043A\u0430 \u043E\u0434\u043D\u043E/\u043C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u0432 TS (\u0441\u043C. processCheckboxFilter).\n ng-template \u0432\u043D\u0443\u0442\u0440\u0438 formGroupName: \u0438\u043D\u0430\u0447\u0435 reactive forms \u043D\u0435 \u043D\u0430\u0439\u0434\u0451\u0442 ControlContainer \u043F\u0440\u0438 \u043F\u0440\u043E\u0435\u043A\u0446\u0438\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442. -->\n @if (filter.type === 'checkbox') {\n <div\n class=\"flex flex-col gap-2\"\n [formGroupName]=\"filter.id\"\n >\n <sc-catalog-filter-collapsible\n [itemsCount]=\"filter.values.length\"\n [showReset]=\"form.get(filter.id)?.dirty ?? false\"\n (resetGroup)=\"resetCheckboxGroup(filter.id)\"\n >\n <ng-template>\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n </ng-template>\n </sc-catalog-filter-collapsible>\n </div>\n\n <!-- Toggle: \u043E\u0434\u0438\u043D boolean \u043D\u0430 \u043A\u043E\u0440\u043D\u0435 \u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u0434\u043F\u0438\u0441\u044C = filter.label -->\n } @else if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s-bold\">{{ filter.label }}</span>\n </label>\n\n <!-- Range: FormGroup(from, to, slider) \u0441 \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -->\n } @else if (filter.type === 'range') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-3\"\n >\n <div class=\"flex gap-3 px-1\">\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u041E\u0442\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"from\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('from')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeFrom(filter.id, filter.min)\"\n ></button>\n }\n </tui-textfield>\n </label>\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u0414\u043E\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"to\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('to')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeTo(filter.id, filter.max)\"\n ></button>\n }\n </tui-textfield>\n </label>\n </div>\n\n <tui-range\n size=\"m\"\n formControlName=\"slider\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n [style.--tui-thickness.rem]=\"0.25\"\n />\n </div>\n }\n </div>\n }\n <button\n tuiButton\n appearance=\"secondary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onResetFiltersClick()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n @if (showResultsButton()) {\n <button\n tuiButton\n appearance=\"primary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onShowResultsClick()\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\n </button>\n }\n </form>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber], input[tuiTextfield], input[tuiInputSlider]" }, { kind: "component", type: ScCatalogFilterCollapsibleComponent, selector: "sc-catalog-filter-collapsible", inputs: ["itemsCount", "showReset"], outputs: ["resetGroup"] }, { kind: "directive", type: TuiNumberFormat, selector: "[tuiNumberFormat]", inputs: ["tuiNumberFormat"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: i4.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "component", type: TuiRange, selector: "tui-range", inputs: ["min", "max", "step", "size", "segments", "keySteps", "focusable", "margin", "limit"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
386
- }
387
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, decorators: [{
388
- type: Component,
389
- args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
390
- ReactiveFormsModule,
391
- TuiTextfield,
392
- ScSelectOnFocusinDirective,
393
- ScCatalogFilterCollapsibleComponent,
394
- TuiLabel,
395
- TuiNumberFormat,
396
- TuiCheckbox,
397
- TuiInputNumber,
398
- TuiRange,
399
- TuiButton,
400
- ], template: "@if (filters()?.length) {\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col pb-1\"\n >\n @for (filter of filters(); track filter.id; let isFirst = $first) {\n @if (!isFirst) {\n <hr class=\"my-3 w-full h-px\" />\n }\n\n <div class=\"flex flex-col gap-2\">\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0433\u0440\u0443\u043F\u043F\u044B. \u0414\u043B\u044F toggle \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435\u0442: \u043C\u0435\u0442\u043A\u0430 \u0438\u0434\u0451\u0442 \u043F\u0440\u044F\u043C\u043E \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C checkbox. -->\n @if (filter.type !== 'toggle') {\n <label class=\"text-body-s-bold\">{{ filter.label }}</label>\n }\n\n <!-- Checkbox: FormGroup(value.id \u2192 boolean) \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.\n \u0420\u0430\u0437\u0432\u0438\u043B\u043A\u0430 \u043E\u0434\u043D\u043E/\u043C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u0432 TS (\u0441\u043C. processCheckboxFilter).\n ng-template \u0432\u043D\u0443\u0442\u0440\u0438 formGroupName: \u0438\u043D\u0430\u0447\u0435 reactive forms \u043D\u0435 \u043D\u0430\u0439\u0434\u0451\u0442 ControlContainer \u043F\u0440\u0438 \u043F\u0440\u043E\u0435\u043A\u0446\u0438\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442. -->\n @if (filter.type === 'checkbox') {\n <div\n class=\"flex flex-col gap-2\"\n [formGroupName]=\"filter.id\"\n >\n <sc-catalog-filter-collapsible\n [itemsCount]=\"filter.values.length\"\n [showReset]=\"form.get(filter.id)?.dirty ?? false\"\n (resetGroup)=\"resetCheckboxGroup(filter.id)\"\n >\n <ng-template>\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n </ng-template>\n </sc-catalog-filter-collapsible>\n </div>\n\n <!-- Toggle: \u043E\u0434\u0438\u043D boolean \u043D\u0430 \u043A\u043E\u0440\u043D\u0435 \u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u0434\u043F\u0438\u0441\u044C = filter.label -->\n } @else if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s-bold\">{{ filter.label }}</span>\n </label>\n\n <!-- Range: FormGroup(from, to, slider) \u0441 \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -->\n } @else if (filter.type === 'range') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-3\"\n >\n <div class=\"flex gap-3 px-1\">\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u041E\u0442\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"from\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('from')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeFrom(filter.id, filter.min)\"\n ></button>\n }\n </tui-textfield>\n </label>\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u0414\u043E\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"to\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('to')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeTo(filter.id, filter.max)\"\n ></button>\n }\n </tui-textfield>\n </label>\n </div>\n\n <tui-range\n size=\"m\"\n formControlName=\"slider\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n [style.--tui-thickness.rem]=\"0.25\"\n />\n </div>\n }\n </div>\n }\n <button\n tuiButton\n appearance=\"secondary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onResetFiltersClick()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n @if (showResultsButton()) {\n <button\n tuiButton\n appearance=\"primary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onShowResultsClick()\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\n </button>\n }\n </form>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"] }]
401
- }], ctorParameters: () => [] });
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9jYXRhbG9nL2NhdGFsb2ctZmlsdGVycy9zYy1jYXRhbG9nLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFFM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUNILGdCQUFnQixFQUVoQixzQkFBc0IsRUFFdEIsY0FBYyxHQUlqQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNB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Q3hELE1BQU07Z0JBQ1YsQ0FBQztnQkFDRDtvQkFDSSxNQUFNO1lBQ2QsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0F2YlEseUJBQXlCO21HQUF6Qix5QkFBeUIsNlRDaER0QyxxNlFBeUpBLGlKRHJIUSxtQkFBbUIsdW1EQUVuQiwwQkFBMEIsZ01BQzFCLG1DQUFtQyx3SUFFbkMsZUFBZSwyRkFDZixXQUFXLDZPQUVYLFFBQVEsc0pBQ1IsU0FBUzs7NEZBR0oseUJBQXlCO2tCQW5CckMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ0wsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLDBCQUEwQjt3QkFDMUIsbUNBQW1DO3dCQUNuQyxRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxjQUFjO3dCQUNkLFFBQVE7d0JBQ1IsU0FBUztxQkFDWiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cblxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgU0NfQ0FURUdPUllfSU5GTyxcbiAgICBTY0NhdGFsb2dGaWx0ZXIsXG4gICAgU2NDYXRhbG9nRmlsdGVyU2VydmljZSxcbiAgICBTY0lDaGVja2JveEZpbHRlcixcbiAgICBTY0lkT3JTbHVnUGlwZSxcbiAgICBTY1Byb3BlcnR5RmlsdGVycyxcbiAgICBTY1JhbmdlRmlsdGVyLFxuICAgIFNjVG9nZ2xlRmlsdGVyLFxufSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUlzUHJlc2VudCB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVHVpQnV0dG9uLCBUdWlMYWJlbCwgVHVpTnVtYmVyRm9ybWF0LCBUdWlUZXh0ZmllbGQgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBUdWlDaGVja2JveCwgVHVpSW5wdXROdW1iZXIsIFR1aVJhbmdlIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIEVNUFRZLCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIHNoYXJlLCBTdWJzY3JpcHRpb24sIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zZWxlY3Qtb24tZm9jdXNpbi9zYy1zZWxlY3Qtb24tZm9jdXNpbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2NDYXRhbG9nRmlsdGVyQ29sbGFwc2libGVDb21wb25lbnQgfSBmcm9tICcuL2NvbGxhcHNpYmxlL3NjLWNhdGFsb2ctZmlsdGVyLWNvbGxhcHNpYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMgfSBmcm9tICcuL3Rva2Vucy9zYy1jYXRhbG9nLXByb2R1Y3RzLWZpbHRlcnMnO1xuaW1wb3J0IHsgU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZIH0gZnJvbSAnLi90b2tlbnMvc2MtY2F0YWxvZy1zaG93LXByb2R1Y3RzLXJlY3Vyc2l2ZWx5JztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0LLRi9Cy0L7QtNCwINGE0LjQu9GM0YLRgNC+0LIg0LrQsNGC0LDQu9C+0LPQsC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLWNhdGFsb2ctZmlsdGVycycsXG4gICAgc3R5bGVVcmw6ICcuL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuc2NzcycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBUdWlUZXh0ZmllbGQsXG4gICAgICAgIFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlLFxuICAgICAgICBTY0NhdGFsb2dGaWx0ZXJDb2xsYXBzaWJsZUNvbXBvbmVudCxcbiAgICAgICAgVHVpTGFiZWwsXG4gICAgICAgIFR1aU51bWJlckZvcm1hdCxcbiAgICAgICAgVHVpQ2hlY2tib3gsXG4gICAgICAgIFR1aUlucHV0TnVtYmVyLFxuICAgICAgICBUdWlSYW5nZSxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNjQ2F0YWxvZ0ZpbHRlcnNDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqINCf0L7QtNC/0LjRgdC60Lgg0YHQuNC90YXRgNC+0L3QuNC30LDRhtC40Lgg0LrQvtC90YLRgNC+0LvQvtCyINGE0L7RgNC80YsgKHJhbmdlIHNsaWRlciwgc2luZ2xlLXNlbGVjdCBjaGVja2JveCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtU3luY3MgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDRhNC40LvRjNGC0YDQsNC80Lgg0LrQsNGC0LDQu9C+0LPQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2dGaWx0ZXJTZXJ2aWNlOiBTY0NhdGFsb2dGaWx0ZXJTZXJ2aWNlID0gaW5qZWN0KFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0J/QsNC50L8sINCy0L7Qt9Cy0YDQsNGJ0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQuNC70Lgg0YHQuNC80LLQvtC70YzQvdC+0LUg0L7QsdC+0LfQvdCw0YfQtdC90LjQtSAoc2x1Zykg0LjRgdGF0L7QtNGPINC40Lcg0L3QsNGB0YLRgNC+0LXQuiDQvtC60YDRg9C20LXQvdC40Y8uXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpZE9yU2x1Z1BpcGU6IFNjSWRPclNsdWdQaXBlID0gaW5qZWN0KFNjSWRPclNsdWdQaXBlKTtcblxuICAgIC8qKlxuICAgICAqIFN1YmplY3Qg0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0YTQuNC70YzRgtGA0L7QsiDQv9GA0L7QtNGD0LrRgtC+0LIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJCA9IGluamVjdChTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0L3QtdC+0LHRhdC+0LTQuNC80L7RgdGC0Lgg0L7RgtC+0LHRgNCw0LbQsNGC0Ywg0YTQuNC70YzRgtGA0Ysg0LTQu9GPINCy0LvQvtC20LXQvdC90YvRhSDQutCw0YLQtdCz0L7RgNC40LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1JlY3Vyc2l2ZWx5ID0gaW5qZWN0KFNDX0NBVEFMT0dfU0hPV19QUk9EVUNUU19SRUNVUlNJVkVMWSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LrQsNC30YvQstCw0YLRjCDQu9C4INC60L3QvtC/0LrRgyDCq9Cf0L7QutCw0LfQsNGC0Ywg0YDQtdC30YPQu9GM0YLQsNGC0YvCuy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2hvd1Jlc3VsdHNCdXR0b24gPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINC60L3QvtC/0LrRgyDRgdCx0YDQvtGB0LAg0LLRgdC10YUg0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVzZXRGaWx0ZXJzID0gb3V0cHV0KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINC60L3QvtC/0LrRgyDQv9C+0LrQsNC30LAg0YDQtdC30YPQu9GM0YLQsNGC0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2hvd1Jlc3VsdHMgPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1Hcm91cCDQtNC70Y8g0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8XG4gICAgICAgIFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIHRoaXMuY3JlYXRlQ2hlY2tib3hGb3JtQ29udHJvbD4gfCBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmNyZWF0ZVJhbmdlRm9ybUNvbnRyb2w+IHwgUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5jcmVhdGVUb2dnbGVGb3JtQ29udHJvbD4+XG4gICAgPih7fSk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YTQuNC70YzRgtGA0L7QsiDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlcnMgPSB0b1NpZ25hbChcbiAgICAgICAgaW5qZWN0KFNDX0NBVEVHT1JZX0lORk8pLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IEVNUFRZKSxcbiAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChjYXRlZ29yeSkgPT4gdGhpcy5jYXRhbG9nRmlsdGVyU2VydmljZS5nZXRGaWx0ZXJzJCh0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0oY2F0ZWdvcnkpLCB0aGlzLmlzUmVjdXJzaXZlbHkpKSxcbiAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgbWFwKChmaWx0ZXJzKSA9PlxuICAgICAgICAgICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlICE9PSAncmFuZ2UnIHx8IGl0ZW0ubWluICE9PSBpdGVtLm1heClcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gKGl0ZW0udHlwZSA9PT0gJ2NoZWNrYm94JyA/IHsgLi4uaXRlbSwgdmFsdWVzOiBbLi4uaXRlbS52YWx1ZXNdLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSkgfSA6IGl0ZW0pKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRhcCgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xzKGZpbHRlcnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY0NhdGFsb2dGaWx0ZXJzQ29tcG9uZW50fS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3luY3MudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJC5uZXh0KHRoaXMuYnVpbGRQcm9wZXJ0eUZpbHRlcnMoZmlsdGVycykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0L3QvtCy0LvRj9C10YIg0YHQvtGB0YLQsNCyINC60L7QvdGC0YDQvtC70L7QsiDRhNC+0YDQvNGLINC90LAg0L7RgdC90L7QstC1INC/0LXRgNC10LTQsNC90L3Ri9GFINGE0LjQu9GM0YLRgNC+0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVycyDQnNCw0YHRgdC40LIg0YTQuNC70YzRgtGA0L7QsiDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDQutC+0L3RgtGA0L7Qu9C+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Db250cm9scyhmaWx0ZXJzOiBTY0NhdGFsb2dGaWx0ZXJbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1TeW5jcy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmZvcm1TeW5jcyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtLnJlbW92ZUNvbnRyb2woa2V5IGFzIG5ldmVyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpbHRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3hDb250cm9sID0gdGhpcy5jcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChpdGVtLmlkLCBjaGVja2JveENvbnRyb2wsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUtc2VsZWN0INC00LvRjyAhaXNNdWx0aXBsZTog0L/RgNC4INCy0YvQsdC+0YDQtSDQvtC00L3QvtCz0L4g0L7RgdGC0LDQu9GM0L3Ri9C1INGB0L3QuNC80LDRjtGC0YHRjy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzTXVsdGlwbGUgJiYgaXRlbS52YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtU3luY3MuYWRkKHRoaXMuc3luY1NpbmdsZVNlbGVjdENoZWNrYm94KGNoZWNrYm94Q29udHJvbCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyYW5nZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2VDb250cm9sID0gdGhpcy5jcmVhdGVSYW5nZUZvcm1Db250cm9sKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChpdGVtLmlkLCByYW5nZUNvbnRyb2wsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtU3luY3MuYWRkKHRoaXMuc3luY1JhbmdlRnJvbVRvQW5kU2xpZGVyKHJhbmdlQ29udHJvbCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVUb2dnbGVGb3JtQ29udHJvbChpdGVtKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQt9C90LDRh9C10L3QuNGPINGE0L7RgNC80Ysg0LIg0L7QsdGK0LXQutGCINGE0LjQu9GM0YLRgNC+0LIg0YHQstC+0LnRgdGC0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUg0JfQvdCw0YfQtdC90LjRjyDRhNC+0YDQvNGLLlxuICAgICAqIEByZXR1cm5zINCe0LHRitC10LrRgiDRhNC40LvRjNGC0YDQvtCyINGB0LLQvtC50YHRgtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBidWlsZFByb3BlcnR5RmlsdGVycyh2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBTY1Byb3BlcnR5RmlsdGVycyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMgPSB7fTtcblxuICAgICAgICB0aGlzLmZpbHRlcnMoKT8uZm9yRWFjaCgoZmlsdGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdmFsdWVbZmlsdGVySXRlbS5pZF07XG5cbiAgICAgICAgICAgIGlmIChpc05pbChjb250cm9sVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpbHRlckl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2hlY2tib3hGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLCBjb250cm9sVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyYW5nZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JhbmdlRmlsdGVyKHJlc3VsdCwgZmlsdGVySXRlbS5pZCwgY29udHJvbFZhbHVlIGFzIHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NUb2dnbGVGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLmlkLCBjb250cm9sVmFsdWUgYXMgYm9vbGVhbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDRkdGCIEZvcm1Hcm91cCDQtNC70Y8gY2hlY2tib3g6INC90LAg0LrQsNC20LTRi9C5IHtAY29kZSB2YWx1ZS5pZH0g4oCUINCx0YPQu9C10LLRi9C5INC60L7QvdGC0YDQvtC7LlxuICAgICAqXG4gICAgICog0JXQtNC40L3Ri9C5INGE0L7RgNC80LDRgiDQuCDQtNC70Y8g0L7QtNC90L7Qs9C+LCDQuCDQtNC70Y8g0LzQvdC+0LbQtdGB0YLQstCwINC30L3QsNGH0LXQvdC40Lk6INGI0LDQsdC70L7QvSDRgNC10L3QtNC10YDQuNGCINC40YUg0L7QtNC40L3QsNC60L7QstC+LlxuICAgICAqINCg0LDQt9C70LjRh9C40LUg0LIgQVBJLdCy0YvQstC+0LTQtSDQtNC70Y8g0L7QtNC40L3QvtGH0L3QvtCz0L4g0LfQvdCw0YfQtdC90LjRjyAoYm9vbGVhbiDQstC80LXRgdGC0L4g0LzQsNGB0YHQuNCy0LApINC+0LHRgNCw0LHQsNGC0YvQstCw0LXRgtGB0Y8g0LIge0BsaW5rIHByb2Nlc3NDaGVja2JveEZpbHRlcn0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tib3hGaWx0ZXIg0KTQuNC70YzRgtGAINGC0LjQv9CwIGNoZWNrYm94LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGNoZWNrYm94RmlsdGVyOiBTY0lDaGVja2JveEZpbHRlcik6IEZvcm1Hcm91cDxSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbDxib29sZWFuPj4+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IChpZDogc3RyaW5nKTogYm9vbGVhbiA9PiBjaGVja2JveEZpbHRlci5zZWxlY3RlZFZhbHVlcz8uaW5jbHVkZXMoaWQpID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBjb250cm9sczogUmVjb3JkPHN0cmluZywgRm9ybUNvbnRyb2w8Ym9vbGVhbj4+ID0ge307XG5cbiAgICAgICAgY2hlY2tib3hGaWx0ZXIudmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sc1t2YWx1ZS5pZF0gPSBuZXcgRm9ybUNvbnRyb2woaXNTZWxlY3RlZCh2YWx1ZS5pZCksIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0ZHRgiB7QGxpbmsgRm9ybUdyb3VwfSDQtNC70Y8gcmFuZ2U6IHtAY29kZSBmcm9tfSwge0Bjb2RlIHRvfSwge0Bjb2RlIHNsaWRlcn0gKNC60L7RgNGC0LXQtiDQtNC70Y8ge0BsaW5rIFR1aVJhbmdlfSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2VGaWx0ZXIg0KTQuNC70YzRgtGAINGC0LjQv9CwIHJhbmdlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVSYW5nZUZvcm1Db250cm9sKHJhbmdlRmlsdGVyOiBTY1JhbmdlRmlsdGVyKTogRm9ybUdyb3VwPHtcbiAgICAgICAgZnJvbTogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgICAgICAgdG86IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgICAgIHNsaWRlcjogRm9ybUNvbnRyb2w8W251bWJlciwgbnVtYmVyXT47XG4gICAgfT4ge1xuICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSBOdW1iZXIocmFuZ2VGaWx0ZXIuc2VsZWN0ZWRNaW4gPz8gcmFuZ2VGaWx0ZXIubWluKTtcbiAgICAgICAgY29uc3QgdG9WYWx1ZSA9IE51bWJlcihyYW5nZUZpbHRlci5zZWxlY3RlZE1heCA/PyByYW5nZUZpbHRlci5tYXgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICAgIGZyb206IG5ldyBGb3JtQ29udHJvbChmcm9tVmFsdWUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgICAgICAgICB0bzogbmV3IEZvcm1Db250cm9sKHRvVmFsdWUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgICAgICAgICBzbGlkZXI6IG5ldyBGb3JtQ29udHJvbDxbbnVtYmVyLCBudW1iZXJdPihbZnJvbVZhbHVlLCB0b1ZhbHVlXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KDQtdCw0LvQuNC30YPQtdGCIHNpbmdsZS1zZWxlY3Qg0L/QvtCy0LXQtNC10L3QuNC1INC00LvRjyBGb3JtR3JvdXAg0YEg0LHRg9C70LXQstGL0LzQuCDQutC+0L3RgtGA0L7Qu9Cw0LzQuDpcbiAgICAgKiDQv9GA0Lgg0L/QvtGP0LLQu9C10L3QuNC4INC90L7QstC+0LPQviB0cnVlINC+0YHRgtCw0LvRjNC90YvQtSDQutC+0L3RgtGA0L7Qu9GLINCz0YDRg9C/0L/RiyDRgdCx0YDQsNGB0YvQstCw0Y7RgtGB0Y8g0LIgZmFsc2UuXG4gICAgICpcbiAgICAgKiDQodC+0YXRgNCw0L3Rj9C10YIg0L/QvtGB0LvQtdC00L3QtdC1IMKr0YHRgtCw0LHQuNC70YzQvdC+0LXCuyDRgdC+0YHRgtC+0Y/QvdC40LUg0Lgg0YHRgNCw0LLQvdC40LLQsNC10YIg0YHQu9C10LTRg9GO0YnQtdC1INC30L3QsNGH0LXQvdC40LUg0YEg0L3QuNC8IOKAlFxuICAgICAqINC90L7QstGL0LkgdHJ1ZSAo0L7RgtGB0YPRgtGB0YLQstC+0LLQsNC7INCyIHByZXYpINGB0YfQuNGC0LDQtdGC0YHRjyDQstGL0LHRgNCw0L3QvdGL0LwsINC+0YHRgtCw0LvRjNC90YvQtSDRgdCx0YDQsNGB0YvQstCw0Y7RgtGB0Y8g0YfQtdGA0LXQtyBzZXRWYWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cCBGb3JtR3JvdXAgY2hlY2tib3gt0YTQuNC70YzRgtGA0LAgKGlkIOKGkiBib29sZWFuKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN5bmNTaW5nbGVTZWxlY3RDaGVja2JveChncm91cDogRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4pOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICBsZXQgcHJldmlvdXNTdGF0ZSA9IGdyb3VwLmdldFJhd1ZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgICAgICAgICBjb25zdCBuZXdseUNoZWNrZWQgPSBPYmplY3QuZW50cmllcyhjdXJyZW50KS5maW5kKChbaWQsIGlzQ2hlY2tlZF0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDaGVja2VkICYmICFwcmV2aW91c1N0YXRlW2lkXTtcbiAgICAgICAgICAgIH0pPy5bMF07XG5cbiAgICAgICAgICAgIGlmICghbmV3bHlDaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdGF0ZSA9IHsgLi4uY3VycmVudCB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXAuY29udHJvbHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbmV4dFtpZF0gPSBpZCA9PT0gbmV3bHlDaGVja2VkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmV2aW91c1N0YXRlID0gbmV4dDtcbiAgICAgICAgICAgIGdyb3VwLnNldFZhbHVlKG5leHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCy0Y/Qt9GL0LLQsNC10YIg0L/QvtC70Y8gwqvQvtGCwrsvwqvQtNC+wrsg0YEg0LrQvtC90YLRgNC+0LvQvtC8INGB0LvQsNC50LTQtdGA0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXAgRm9ybUdyb3VwIHJhbmdlLdGE0LjQu9GM0YLRgNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY1JhbmdlRnJvbVRvQW5kU2xpZGVyKGdyb3VwOiBGb3JtR3JvdXApOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICBjb25zdCBmcm9tID0gZ3JvdXAuZ2V0KCdmcm9tJyk7XG4gICAgICAgIGNvbnN0IHRvID0gZ3JvdXAuZ2V0KCd0bycpO1xuICAgICAgICBjb25zdCBzbGlkZXIgPSBncm91cC5nZXQoJ3NsaWRlcicpO1xuXG4gICAgICAgIGlmICghZnJvbSB8fCAhdG8gfHwgIXNsaWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICAvLyDQmNC90L/Rg9GC0Ysg4oaSINGB0LvQsNC50LTQtdGAOyDQtdGB0LvQuCDCq9C+0YLCuyA+IMKr0LTQvsK7LCDQv9C+0LTQvdC40LzQsNC10LwgwqvQtNC+wrsg0LTQviDCq9C+0YLCuy5cbiAgICAgICAgY29uc3QgYXBwbHlTbGlkZXJGcm9tSW5wdXRzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ID0gTnVtYmVyKGZyb20udmFsdWUpO1xuICAgICAgICAgICAgbGV0IGhpZ2ggPSBOdW1iZXIodG8udmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAobG93ID4gaGlnaCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBsb3c7XG4gICAgICAgICAgICAgICAgdG8uc2V0VmFsdWUoaGlnaCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFpciA9IHNsaWRlci52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhaXJbMF0gIT09IGxvdyB8fCBjdXJyZW50UGFpclsxXSAhPT0gaGlnaCkge1xuICAgICAgICAgICAgICAgIHNsaWRlci5zZXRWYWx1ZShbbG93LCBoaWdoXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHNsaWRlci5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN1Yi5hZGQobWVyZ2UoZnJvbS52YWx1ZUNoYW5nZXMsIHRvLnZhbHVlQ2hhbmdlcykuc3Vic2NyaWJlKGFwcGx5U2xpZGVyRnJvbUlucHV0cykpO1xuXG4gICAgICAgIHN1Yi5hZGQoXG4gICAgICAgICAgICBzbGlkZXIudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbG93LCBoaWdoXSA9IHZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAgICAgICAgICAgICBpZiAoZnJvbS52YWx1ZSAhPT0gbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb20uc2V0VmFsdWUobG93LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20ubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodG8udmFsdWUgIT09IGhpZ2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdG8uc2V0VmFsdWUoaGlnaCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB0by5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g0KHQvtCy0L/QsNGB0YLRjCDRgSDQv9C+0LvRj9C80Lgg0L/RgNC4INC/0LXRgNCy0L7QvCDQv9C+0LrQsNC30LUgKNGD0LbQtSDRgdC+0LLQv9Cw0LTQsNC10YIg0L/RgNC4INGB0L7Qt9C00LDQvdC40LgsINC90L4g0L3QsCDQstGB0Y/QutC40Lkg0YHQu9GD0YfQsNC5KS5cbiAgICAgICAgYXBwbHlTbGlkZXJGcm9tSW5wdXRzKCk7XG5cbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBGb3JtQ29udHJvbCDQtNC70Y8gdG9nZ2xlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvZ2dsZUZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgdG9nZ2xlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVUb2dnbGVGb3JtQ29udHJvbCh0b2dnbGVGaWx0ZXI6IFNjVG9nZ2xlRmlsdGVyKTogRm9ybUNvbnRyb2w8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Db250cm9sKHRvZ2dsZUZpbHRlci5zZWxlY3RlZFZhbHVlID8/IGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiBjaGVja2JveDogRm9ybUdyb3VwIOKGkiBzdHJpbmdbXSDQstGL0LHRgNCw0L3QvdGL0YUgaWQ7INC00LvRjyDQtdC00LjQvdGB0YLQstC10L3QvdC+0LPQviDQt9C90LDRh9C10L3QuNGPIOKAlCBib29sZWFuICjQutCw0LogdG9nZ2xlKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQg0J7QsdGK0LXQutGCINGA0LXQt9GD0LvRjNGC0LDRgtCwINC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjy5cbiAgICAgKiBAcGFyYW0gY2hlY2tib3hGaWx0ZXIg0JzQtdGC0LDRhNC40LvRjNGC0YAgY2hlY2tib3guXG4gICAgICogQHBhcmFtIGNvbnRyb2xWYWx1ZSDQl9C90LDRh9C10L3QuNC1INC60L7QvdGC0YDQvtC70LAg0YTQvtGA0LzRiyAo0LfQsNC/0LjRgdGMIGlkIOKGkiBib29sZWFuKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NDaGVja2JveEZpbHRlcihyZXN1bHQ6IFNjUHJvcGVydHlGaWx0ZXJzLCBjaGVja2JveEZpbHRlcjogU2NJQ2hlY2tib3hGaWx0ZXIsIGNvbnRyb2xWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBPYmplY3QuZW50cmllcyhjb250cm9sVmFsdWUpXG4gICAgICAgICAgICAuZmlsdGVyKChbLCBpc1NlbGVjdGVkXSkgPT4gaXNTZWxlY3RlZClcbiAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IGlkKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb24sIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJlc3VsdFtjaGVja2JveEZpbHRlci5pZF0gPSBzZWxlY3RlZElkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIgcmFuZ2Ug0YTQuNC70YzRgtGALlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCDQntCx0YrQtdC60YIg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPLlxuICAgICAqIEBwYXJhbSBmaWx0ZXJJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRhNC40LvRjNGC0YDQsC5cbiAgICAgKiBAcGFyYW0gcmFuZ2Ug0JfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINGE0L7RgNC80YsgKNC+0LHRitC10LrRgiDRgSDQs9GA0LDQvdC40YbQsNC80LgpLlxuICAgICAqIEBwYXJhbSByYW5nZS5mcm9tINCd0LDRh9Cw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INC00LjQsNC/0LDQt9C+0L3QsC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UudG8g0JrQvtC90LXRh9C90L7QtSDQt9C90LDRh9C10L3QuNC1INC00LjQsNC/0LDQt9C+0L3QsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NSYW5nZUZpbHRlcihyZXN1bHQ6IFNjUHJvcGVydHlGaWx0ZXJzLCBmaWx0ZXJJZDogc3RyaW5nLCByYW5nZTogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSk6IHZvaWQge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb24sIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJlc3VsdFtmaWx0ZXJJZF0gPSB7XG4gICAgICAgICAgICBmcm9tOiBTdHJpbmcocmFuZ2UuZnJvbSksXG4gICAgICAgICAgICB0bzogU3RyaW5nKHJhbmdlLnRvKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIgdG9nZ2xlINGE0LjQu9GM0YLRgC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQg0J7QsdGK0LXQutGCINGA0LXQt9GD0LvRjNGC0LDRgtCwINC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjy5cbiAgICAgKiBAcGFyYW0gZmlsdGVySWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YTQuNC70YzRgtGA0LAuXG4gICAgICogQHBhcmFtIGNvbnRyb2xWYWx1ZSDQl9C90LDRh9C10L3QuNC1INC60L7QvdGC0YDQvtC70LAg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NUb2dnbGVGaWx0ZXIocmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycywgZmlsdGVySWQ6IHN0cmluZywgY29udHJvbFZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChjb250cm9sVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIHJlc3VsdFtmaWx0ZXJJZF0gPSBjb250cm9sVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCx0YDQsNGB0YvQstCw0LXRgiDQv9C+0LvQtSDCq9C+0YLCuyDQtNC40LDQv9Cw0LfQvtC90LAg0Log0LzQuNC90LjQvNCw0LvRjNC90L7QvNGDINC30L3QsNGH0LXQvdC40Y4g0YTQuNC70YzRgtGA0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVySWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YTQuNC70YzRgtGA0LAuXG4gICAgICogQHBhcmFtIG1pbiDQnNC40L3QuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LTQuNCw0L/QsNC30L7QvdCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXNldFJhbmdlRnJvbShmaWx0ZXJJZDogc3RyaW5nLCBtaW46IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KGZpbHRlcklkKT8uZ2V0KCdmcm9tJyk/LnJlc2V0KCttaW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0LHRgNCw0YHRi9Cy0LDQtdGCINC/0L7Qu9C1IMKr0LTQvsK7INC00LjQsNC/0LDQt9C+0L3QsCDQuiDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LzRgyDQt9C90LDRh9C10L3QuNGOINGE0LjQu9GM0YLRgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwLlxuICAgICAqIEBwYXJhbSBtYXgg0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LTQuNCw0L/QsNC30L7QvdCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXNldFJhbmdlVG8oZmlsdGVySWQ6IHN0cmluZywgbWF4OiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWx0ZXJJZCk/LmdldCgndG8nKT8ucmVzZXQoK21heCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQsdGA0LDRgdGL0LLQsNC10YIg0LLRgdC1INGH0LXQutCx0L7QutGB0Ysg0LPRgNGD0L/Qv9GLINCyIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVySWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YTQuNC70YzRgtGA0LAgKNC60LvRjtGHIEZvcm1Hcm91cCDQsiDRhNC+0YDQvNC1KS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzZXRDaGVja2JveEdyb3VwKGZpbHRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmZvcm0uZ2V0KGZpbHRlcklkKSBhcyBGb3JtR3JvdXA8UmVjb3JkPHN0cmluZywgRm9ybUNvbnRyb2w8Ym9vbGVhbj4+PiB8IG51bGw7XG5cbiAgICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzZXRWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXAuY29udHJvbHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgIHJlc2V0VmFsdWVbaWRdID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBncm91cC5yZXNldChyZXNldFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCx0YDQsNGB0YvQstCw0LXRgiDQstGB0LUg0YTQuNC70YzRgtGA0Ysg0Lgg0L7Qv9C+0LLQtdGJ0LDQtdGCINGA0L7QtNC40YLQtdC70Y8g0L4g0L3QsNC20LDRgtC40Lgg0LrQvdC+0L/QutC4INGB0LHRgNC+0YHQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25SZXNldEZpbHRlcnNDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldEFsbEZpbHRlcnMoKTtcbiAgICAgICAgdGhpcy5yZXNldEZpbHRlcnMuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0L/QvtCy0LXRidCw0LXRgiDRgNC+0LTQuNGC0LXQu9GPINC+INC90LDQttCw0YLQuNC4INC60L3QvtC/0LrQuCDQv9C+0LrQsNC30LAg0YDQtdC30YPQu9GM0YLQsNGC0L7Qsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25TaG93UmVzdWx0c0NsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dSZXN1bHRzLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCx0YDQsNGB0YvQstCw0LXRgiDQstGB0LUg0YTQuNC70YzRgtGA0Ysg0Log0LjRgdGF0L7QtNC90YvQvCDQt9C90LDRh9C10L3QuNGP0LwuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNldEFsbEZpbHRlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVycygpPy5mb3JFYWNoKChmaWx0ZXJJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChmaWx0ZXJJdGVtLmlkKTtcblxuICAgICAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpbHRlckl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj47XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc2V0VmFsdWU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldFZhbHVlW2lkXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAucmVzZXQocmVzZXRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLnJlc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmFuZ2UnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9ICtmaWx0ZXJJdGVtLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4ID0gK2ZpbHRlckl0ZW0ubWF4O1xuICAgICAgICAgICAgICAgICAgICBncm91cC5yZXNldCh7IGZyb206IG1pbiwgdG86IG1heCwgc2xpZGVyOiBbbWluLCBtYXhdIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIkBpZiAoZmlsdGVycygpPy5sZW5ndGgpIHtcbiAgICA8Zm9ybVxuICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgcGItMVwiXG4gICAgPlxuICAgICAgICBAZm9yIChmaWx0ZXIgb2YgZmlsdGVycygpOyB0cmFjayBmaWx0ZXIuaWQ7IGxldCBpc0ZpcnN0ID0gJGZpcnN0KSB7XG4gICAgICAgICAgICBAaWYgKCFpc0ZpcnN0KSB7XG4gICAgICAgICAgICAgICAgPGhyIGNsYXNzPVwibXktMyB3LWZ1bGwgaC1weFwiIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPCEtLSDQl9Cw0LPQvtC70L7QstC+0Log0LPRgNGD0L/Qv9GLLiDQlNC70Y8gdG9nZ2xlINC/0L7QtNC/0LjRgdC4INC90LXRgjog0LzQtdGC0LrQsCDQuNC00ZHRgiDQv9GA0Y/QvNC+INGA0Y/QtNC+0Lwg0YEg0YHQsNC80LjQvCBjaGVja2JveC4gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChmaWx0ZXIudHlwZSAhPT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1ib2R5LXMtYm9sZFwiPnt7IGZpbHRlci5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveDogRm9ybUdyb3VwKHZhbHVlLmlkIOKGkiBib29sZWFuKSDQtNC70Y8g0LvRjtCx0L7Qs9C+INGH0LjRgdC70LAg0LfQvdCw0YfQtdC90LjQuS5cbiAgICAgICAgICAgICAgICAgICAgINCg0LDQt9Cy0LjQu9C60LAg0L7QtNC90L4v0LzQvdC+0LPQviDQt9C90LDRh9C10L3QuNC5INCy0YvQvdC10YHQtdC90LAg0LIgVFMgKNGB0LwuIHByb2Nlc3NDaGVja2JveEZpbHRlcikuXG4gICAgICAgICAgICAgICAgICAgICBuZy10ZW1wbGF0ZSDQstC90YPRgtGA0LggZm9ybUdyb3VwTmFtZTog0LjQvdCw0YfQtSByZWFjdGl2ZSBmb3JtcyDQvdC1INC90LDQudC00ZHRgiBDb250cm9sQ29udGFpbmVyINC/0YDQuCDQv9GA0L7QtdC60YbQuNC4INCyINC00L7Rh9C10YDQvdC40Lkg0LrQvtC80L/QvtC90LXQvdGCLiAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGZpbHRlci50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJmaWx0ZXIuaWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2MtY2F0YWxvZy1maWx0ZXItY29sbGFwc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNDb3VudF09XCJmaWx0ZXIudmFsdWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dSZXNldF09XCJmb3JtLmdldChmaWx0ZXIuaWQpPy5kaXJ0eSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc2V0R3JvdXApPVwicmVzZXRDaGVja2JveEdyb3VwKGZpbHRlci5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIGZpbHRlci52YWx1ZXM7IHRyYWNrIHZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInZhbHVlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtYm9keS1zXCI+e3sgdmFsdWUubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2MtY2F0YWxvZy1maWx0ZXItY29sbGFwc2libGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVG9nZ2xlOiDQvtC00LjQvSBib29sZWFuINC90LAg0LrQvtGA0L3QtSDRhNC+0YDQvNGLLCDQv9C+0LTQv9C40YHRjCA9IGZpbHRlci5sYWJlbCAtLT5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmlsdGVyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHktcy1ib2xkXCI+e3sgZmlsdGVyLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUmFuZ2U6IEZvcm1Hcm91cChmcm9tLCB0bywgc2xpZGVyKSDRgSDQtNCy0YPRgdGC0L7RgNC+0L3QvdC10Lkg0YHQuNC90YXRgNC+0L3QuNC30LDRhtC40LXQuSAtLT5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJmaWx0ZXIuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTMgcHgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbi13LTAgZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINCe0YJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS10ZXh0ZmllbGQgW3R1aVRleHRmaWVsZENsZWFuZXJdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjU2VsZWN0T25Gb2N1c2luXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmcm9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgcHJlY2lzaW9uOiAwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiK2ZpbHRlci5taW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiK2ZpbHRlci5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmb3JtLmdldChmaWx0ZXIuaWQpPy5nZXQoJ2Zyb20nKT8uZGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS54XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0UmFuZ2VGcm9tKGZpbHRlci5pZCwgZmlsdGVyLm1pbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWluLXctMCBmbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0JTQvlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXRleHRmaWVsZCBbdHVpVGV4dGZpZWxkQ2xlYW5lcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NTZWxlY3RPbkZvY3VzaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlJbnB1dE51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgcHJlY2lzaW9uOiAwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiK2ZpbHRlci5taW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiK2ZpbHRlci5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmb3JtLmdldChmaWx0ZXIuaWQpPy5nZXQoJ3RvJyk/LmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkueFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldFJhbmdlVG8oZmlsdGVyLmlkLCBmaWx0ZXIubWF4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNsaWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCIrZmlsdGVyLm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCIrZmlsdGVyLm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tdHVpLXRoaWNrbmVzcy5yZW1dPVwiMC4yNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVzZXRGaWx0ZXJzQ2xpY2soKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgINCh0LHRgNC+0YHQuNGC0Ywg0YTQuNC70YzRgtGA0YtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIEBpZiAoc2hvd1Jlc3VsdHNCdXR0b24oKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNob3dSZXN1bHRzQ2xpY2soKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0J/QvtC60LDQt9Cw0YLRjCDRgNC10LfRg9C70YzRgtCw0YLRi1xuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICA8L2Zvcm0+XG59XG4iXX0=
@@ -1,10 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- /**
4
- * Токен для инъекции {@link Subject} для хранения фильтров продуктов.
5
- */
6
- export const SC_CATALOG_PRODUCTS_FILTERS = new InjectionToken('SC_CATALOG_PRODUCTS_FILTERS$', {
7
- providedIn: 'root',
8
- factory: () => new Subject(),
9
- });
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1wcm9kdWN0cy1maWx0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3Rva2Vucy9zYy1jYXRhbG9nLXByb2R1Y3RzLWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9COztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxjQUFjLENBQTZCLDhCQUE4QixFQUFFO0lBQ3RILFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBcUI7Q0FDbEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNjUHJvcGVydHlGaWx0ZXJzIH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICog0KLQvtC60LXQvSDQtNC70Y8g0LjQvdGK0LXQutGG0LjQuCB7QGxpbmsgU3ViamVjdH0g0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0YTQuNC70YzRgtGA0L7QsiDQv9GA0L7QtNGD0LrRgtC+0LIuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48U3ViamVjdDxTY1Byb3BlcnR5RmlsdGVycz4+KCdTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMkJywge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiAoKSA9PiBuZXcgU3ViamVjdDxTY1Byb3BlcnR5RmlsdGVycz4oKSxcbn0pO1xuIl19
@@ -1,6 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- /**
3
- * Токен для инъекции признака необходимости отображать фильтры для вложенных категорий.
4
- */
5
- export const SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY = new InjectionToken('SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY');
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1zaG93LXByb2R1Y3RzLXJlY3Vyc2l2ZWx5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3Rva2Vucy9zYy1jYXRhbG9nLXNob3ctcHJvZHVjdHMtcmVjdXJzaXZlbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLElBQUksY0FBYyxDQUFVLHNDQUFzQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqINCi0L7QutC10L0g0LTQu9GPINC40L3RitC10LrRhtC40Lgg0L/RgNC40LfQvdCw0LrQsCDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNC40LvRjNGC0YDRiyDQtNC70Y8g0LLQu9C+0LbQtdC90L3Ri9GFINC60LDRgtC10LPQvtGA0LjQuS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNDX0NBVEFMT0dfU0hPV19QUk9EVUNUU19SRUNVUlNJVkVMWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZJyk7XG4iXX0=