techlify-inventory-common 18.1.0 → 18.3.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 (216) hide show
  1. package/esm2022/lib/inventory-common/category/category-form/category-form.component.mjs +12 -12
  2. package/esm2022/lib/inventory-common/category/category-form-button/category-form-button.component.mjs +5 -5
  3. package/esm2022/lib/inventory-common/category/category-list-page/category-list-page.component.mjs +22 -26
  4. package/esm2022/lib/inventory-common/category/category-routing.module.mjs +10 -5
  5. package/esm2022/lib/inventory-common/category/category-view/category-view.component.mjs +46 -0
  6. package/esm2022/lib/inventory-common/category/category.module.mjs +23 -24
  7. package/esm2022/lib/inventory-common/category/category.service.mjs +6 -6
  8. package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +32 -18
  9. package/esm2022/lib/inventory-common/inventory-common.module.mjs +13 -9
  10. package/esm2022/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.mjs +12 -10
  11. package/esm2022/lib/inventory-common/inventory-value-report.service.mjs +21 -0
  12. package/esm2022/lib/inventory-common/location/location-delete-button/location-delete-button.component.mjs +68 -0
  13. package/esm2022/lib/inventory-common/location/location-form/location-form.component.mjs +86 -0
  14. package/esm2022/lib/inventory-common/location/location-form-button/location-form-button.component.mjs +35 -0
  15. package/esm2022/lib/inventory-common/location/location-information/location-information.component.mjs +34 -0
  16. package/esm2022/lib/inventory-common/location/location-list/location-list.component.mjs +121 -0
  17. package/esm2022/lib/inventory-common/location/location-product-statistics/location-product-statistics.component.mjs +127 -0
  18. package/esm2022/lib/inventory-common/location/location-routing.module.mjs +29 -0
  19. package/esm2022/lib/inventory-common/location/location-view/location-view.component.mjs +53 -0
  20. package/esm2022/lib/inventory-common/location/location.module.mjs +22 -0
  21. package/esm2022/lib/inventory-common/location/location.service.mjs +23 -0
  22. package/esm2022/lib/inventory-common/low-stock-report.service.mjs +23 -0
  23. package/esm2022/lib/inventory-common/material.module.mjs +37 -37
  24. package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.mjs +4 -4
  25. package/esm2022/lib/inventory-common/measure/measure-delete/measure-delete.module.mjs +4 -4
  26. package/esm2022/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.mjs +14 -14
  27. package/esm2022/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.mjs +5 -5
  28. package/esm2022/lib/inventory-common/measure/measure-form/measure-form.module.mjs +6 -6
  29. package/esm2022/lib/inventory-common/measure/measure-routing.module.mjs +5 -5
  30. package/esm2022/lib/inventory-common/measure/measure.module.mjs +10 -10
  31. package/esm2022/lib/inventory-common/measure/measure.service.mjs +6 -6
  32. package/esm2022/lib/inventory-common/measure/measures-list/measures-list.component.mjs +12 -18
  33. package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.mjs +13 -11
  34. package/esm2022/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.module.mjs +10 -24
  35. package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs +5 -5
  36. package/esm2022/lib/inventory-common/product/product-batch-update-form/product-batch-update-form.component.mjs +56 -0
  37. package/esm2022/lib/inventory-common/product/product-delete-button/product-delete-button.component.mjs +6 -6
  38. package/esm2022/lib/inventory-common/product/product-form/product-form.component.mjs +43 -45
  39. package/esm2022/lib/inventory-common/product/product-form-button/product-form-button.component.mjs +5 -5
  40. package/esm2022/lib/inventory-common/product/product-form.service.mjs +4 -4
  41. package/esm2022/lib/inventory-common/product/product-import-page/product-import-page.component.mjs +32 -32
  42. package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +65 -87
  43. package/esm2022/lib/inventory-common/product/product-location/product-location-list/product-location-list.component.mjs +56 -0
  44. package/esm2022/lib/inventory-common/product/product-measure-form/product-measure-form.component.mjs +12 -12
  45. package/esm2022/lib/inventory-common/product/product-measures-list/product-measures-list.component.mjs +22 -28
  46. package/esm2022/lib/inventory-common/product/product-nav-bar/product-nav-bar.component.mjs +3 -3
  47. package/esm2022/lib/inventory-common/product/product-quick-search/product-quick-search.component.mjs +92 -0
  48. package/esm2022/lib/inventory-common/product/product-routing.module.mjs +17 -17
  49. package/esm2022/lib/inventory-common/product/product-statistics.service.mjs +23 -0
  50. package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.mjs +10 -16
  51. package/esm2022/lib/inventory-common/product/product-summary-chart/product-summary-chart.module.mjs +9 -20
  52. package/esm2022/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.mjs +6 -6
  53. package/esm2022/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.mjs +14 -14
  54. package/esm2022/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.mjs +6 -6
  55. package/esm2022/lib/inventory-common/product/product-tax/product-tax.module.mjs +9 -26
  56. package/esm2022/lib/inventory-common/product/product-tax/product-tax.service.mjs +6 -6
  57. package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +9 -7
  58. package/esm2022/lib/inventory-common/product/product.module.mjs +37 -26
  59. package/esm2022/lib/inventory-common/product/product.service.mjs +7 -7
  60. package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +15 -0
  61. package/esm2022/lib/inventory-common/product-batch.service.mjs +20 -0
  62. package/esm2022/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.mjs +168 -0
  63. package/esm2022/lib/inventory-common/reports/low-stock-report/low-stock-report.component.mjs +163 -0
  64. package/esm2022/lib/inventory-common/services/techlify-form-service.mjs +2 -2
  65. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.mjs +6 -6
  66. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.module.mjs +5 -5
  67. package/esm2022/lib/inventory-common/stock-issuances/stock-issuance.service.mjs +6 -6
  68. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.mjs +84 -56
  69. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.mjs +28 -12
  70. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-routing.module.mjs +5 -5
  71. package/esm2022/lib/inventory-common/stock-issuances/stock-issuances.module.mjs +14 -14
  72. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.mjs +14 -14
  73. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.mjs +5 -5
  74. package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.mjs +13 -13
  75. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.mjs +6 -6
  76. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.mjs +18 -18
  77. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.mjs +5 -5
  78. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form.module.mjs +12 -12
  79. package/esm2022/lib/inventory-common/stock-receipts/stock-receipt.service.mjs +6 -6
  80. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +82 -44
  81. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-routing.module.mjs +5 -5
  82. package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +24 -22
  83. package/esm2022/lib/inventory-common/stock-summary.service.mjs +5 -5
  84. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-form/stock-transfer-form.component.mjs +105 -0
  85. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-form-button/stock-transfer-form-button.component.mjs +38 -0
  86. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer-list/stock-transfer-list.component.mjs +77 -0
  87. package/esm2022/lib/inventory-common/stock-transfer/stock-transfer.service.mjs +18 -0
  88. package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.mjs +9 -9
  89. package/esm2022/lib/inventory-common/supplier/payee-selector/payee-selector.module.mjs +10 -24
  90. package/esm2022/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.mjs +64 -0
  91. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.mjs +43 -0
  92. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.component.mjs +24 -24
  93. package/esm2022/lib/inventory-common/supplier/supplier-form/supplier-form.service.mjs +4 -4
  94. package/esm2022/lib/inventory-common/supplier/supplier-information/supplier-information.component.mjs +16 -15
  95. package/esm2022/lib/inventory-common/supplier/supplier-routing.module.mjs +9 -16
  96. package/esm2022/lib/inventory-common/supplier/supplier-view/supplier-view.component.mjs +13 -14
  97. package/esm2022/lib/inventory-common/supplier/supplier.component.mjs +3 -3
  98. package/esm2022/lib/inventory-common/supplier/supplier.module.mjs +23 -15
  99. package/esm2022/lib/inventory-common/supplier/supplier.service.mjs +5 -5
  100. package/esm2022/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.mjs +6 -65
  101. package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.component.mjs +16 -18
  102. package/esm2022/lib/inventory-common/techlify-filter/techlify-filter.module.mjs +13 -9
  103. package/fesm2022/techlify-inventory-common-category.module-BsvJ6rVx.mjs +290 -0
  104. package/fesm2022/techlify-inventory-common-category.module-BsvJ6rVx.mjs.map +1 -0
  105. package/fesm2022/techlify-inventory-common-location.module-Cwx9mHKE.mjs +529 -0
  106. package/fesm2022/techlify-inventory-common-location.module-Cwx9mHKE.mjs.map +1 -0
  107. package/fesm2022/techlify-inventory-common-measure.module-C2v0-n_m.mjs +307 -0
  108. package/fesm2022/techlify-inventory-common-measure.module-C2v0-n_m.mjs.map +1 -0
  109. package/fesm2022/{techlify-inventory-common-stock-issuances.module-BQRRP-hW.mjs → techlify-inventory-common-stock-issuances.module-CPccetrp.mjs} +3 -5
  110. package/fesm2022/techlify-inventory-common-stock-issuances.module-CPccetrp.mjs.map +1 -0
  111. package/fesm2022/techlify-inventory-common-supplier.module-CYq-2pV1.mjs +464 -0
  112. package/fesm2022/techlify-inventory-common-supplier.module-CYq-2pV1.mjs.map +1 -0
  113. package/fesm2022/techlify-inventory-common-techlify-inventory-common-BMNkSTd6.mjs +3620 -0
  114. package/fesm2022/techlify-inventory-common-techlify-inventory-common-BMNkSTd6.mjs.map +1 -0
  115. package/fesm2022/techlify-inventory-common.mjs +1 -1
  116. package/lib/inventory-common/category/category-form/category-form.component.d.ts +4 -4
  117. package/lib/inventory-common/category/category-form-button/category-form-button.component.d.ts +2 -2
  118. package/lib/inventory-common/category/category-list-page/category-list-page.component.d.ts +4 -4
  119. package/lib/inventory-common/category/category-view/category-view.component.d.ts +16 -0
  120. package/lib/inventory-common/category/category.module.d.ts +12 -11
  121. package/lib/inventory-common/category/category.service.d.ts +1 -1
  122. package/lib/inventory-common/inventory-common.module.d.ts +2 -1
  123. package/lib/inventory-common/inventory-dashboard-page/inventory-dashboard-page.component.d.ts +1 -1
  124. package/lib/inventory-common/inventory-value-report.service.d.ts +9 -0
  125. package/lib/inventory-common/location/location-delete-button/location-delete-button.component.d.ts +28 -0
  126. package/lib/inventory-common/location/location-form/location-form.component.d.ts +19 -0
  127. package/lib/inventory-common/location/location-form-button/location-form-button.component.d.ts +13 -0
  128. package/lib/inventory-common/location/location-information/location-information.component.d.ts +10 -0
  129. package/lib/inventory-common/location/location-list/location-list.component.d.ts +20 -0
  130. package/lib/inventory-common/location/location-product-statistics/location-product-statistics.component.d.ts +21 -0
  131. package/lib/inventory-common/location/location-routing.module.d.ts +7 -0
  132. package/lib/inventory-common/location/location-view/location-view.component.d.ts +16 -0
  133. package/lib/inventory-common/location/location.module.d.ts +8 -0
  134. package/lib/inventory-common/location/location.service.d.ts +10 -0
  135. package/lib/inventory-common/low-stock-report.service.d.ts +10 -0
  136. package/lib/inventory-common/measure/measure-delete/measure-delete-button/measure-delete-button.component.d.ts +3 -3
  137. package/lib/inventory-common/measure/measure-form/measure-form/measure-form.component.d.ts +4 -4
  138. package/lib/inventory-common/measure/measure-form/measure-form-button/measure-form-button.component.d.ts +2 -2
  139. package/lib/inventory-common/measure/measure.service.d.ts +1 -1
  140. package/lib/inventory-common/measure/measures-list/measures-list.component.d.ts +5 -5
  141. package/lib/inventory-common/product/low-stock-products-widget/low-stock-products-widget.component.d.ts +3 -3
  142. package/lib/inventory-common/product/product-basic-info/product-basic-info.component.d.ts +2 -2
  143. package/lib/inventory-common/product/product-batch-update-form/product-batch-update-form.component.d.ts +18 -0
  144. package/lib/inventory-common/product/product-delete-button/product-delete-button.component.d.ts +4 -4
  145. package/lib/inventory-common/product/product-form/product-form.component.d.ts +6 -6
  146. package/lib/inventory-common/product/product-form-button/product-form-button.component.d.ts +3 -3
  147. package/lib/inventory-common/product/product-import-page/product-import-page.component.d.ts +2 -2
  148. package/lib/inventory-common/product/product-list/product-list.component.d.ts +15 -24
  149. package/lib/inventory-common/product/product-location/product-location-list/product-location-list.component.d.ts +15 -0
  150. package/lib/inventory-common/product/product-measure-form/product-measure-form.component.d.ts +6 -6
  151. package/lib/inventory-common/product/product-measures-list/product-measures-list.component.d.ts +7 -7
  152. package/lib/inventory-common/product/product-quick-search/product-quick-search.component.d.ts +15 -0
  153. package/lib/inventory-common/product/product-statistics.service.d.ts +9 -0
  154. package/lib/inventory-common/product/product-summary-chart/product-summary-chart.component.d.ts +1 -1
  155. package/lib/inventory-common/product/product-tax/product-tax-delete-button/product-tax-delete-button.component.d.ts +4 -4
  156. package/lib/inventory-common/product/product-tax/product-tax-form-button/product-tax-form-button.component.d.ts +5 -5
  157. package/lib/inventory-common/product/product-tax/product-tax-list/product-tax-list.component.d.ts +2 -2
  158. package/lib/inventory-common/product/product-tax/product-tax.service.d.ts +1 -1
  159. package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +4 -4
  160. package/lib/inventory-common/product/product.module.d.ts +16 -13
  161. package/lib/inventory-common/product/product.service.d.ts +2 -2
  162. package/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.d.ts +6 -0
  163. package/lib/inventory-common/product-batch.service.d.ts +8 -0
  164. package/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.d.ts +26 -0
  165. package/lib/inventory-common/reports/low-stock-report/low-stock-report.component.d.ts +26 -0
  166. package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.d.ts +4 -4
  167. package/lib/inventory-common/stock-issuances/stock-issuance.service.d.ts +1 -1
  168. package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.d.ts +16 -8
  169. package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.d.ts +3 -1
  170. package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.d.ts +4 -4
  171. package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.d.ts +2 -2
  172. package/lib/inventory-common/stock-receipts/stock-receipt-delete-button/stock-receipt-delete-button.component.d.ts +4 -4
  173. package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.d.ts +4 -4
  174. package/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form-button/stock-receipt-form-button.component.d.ts +2 -2
  175. package/lib/inventory-common/stock-receipts/stock-receipt.service.d.ts +1 -1
  176. package/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.d.ts +12 -4
  177. package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +2 -1
  178. package/lib/inventory-common/stock-summary.service.d.ts +1 -1
  179. package/lib/inventory-common/stock-transfer/stock-transfer-form/stock-transfer-form.component.d.ts +19 -0
  180. package/lib/inventory-common/stock-transfer/stock-transfer-form-button/stock-transfer-form-button.component.d.ts +14 -0
  181. package/lib/inventory-common/stock-transfer/stock-transfer-list/stock-transfer-list.component.d.ts +17 -0
  182. package/lib/inventory-common/stock-transfer/stock-transfer.service.d.ts +7 -0
  183. package/lib/inventory-common/supplier/payee-selector/payee-selector/payee-selector.component.d.ts +3 -3
  184. package/lib/inventory-common/supplier/supplier-delete-button/supplier-delete-button.component.d.ts +18 -0
  185. package/lib/inventory-common/supplier/supplier-form/supplier-form-button/supplier-form-button.component.d.ts +13 -0
  186. package/lib/inventory-common/supplier/supplier-form/supplier-form.component.d.ts +6 -6
  187. package/lib/inventory-common/supplier/supplier-information/supplier-information.component.d.ts +4 -4
  188. package/lib/inventory-common/supplier/supplier-view/supplier-view.component.d.ts +4 -4
  189. package/lib/inventory-common/supplier/supplier.component.d.ts +2 -2
  190. package/lib/inventory-common/supplier/supplier.module.d.ts +3 -1
  191. package/lib/inventory-common/supplier/supplier.service.d.ts +1 -1
  192. package/lib/inventory-common/supplier/suppliers-list/suppliers-list.component.d.ts +0 -8
  193. package/lib/inventory-common/techlify-filter/techlify-filter.component.d.ts +4 -4
  194. package/lib/inventory-common/techlify-filter/techlify-filter.module.d.ts +2 -1
  195. package/package.json +1 -1
  196. package/fesm2022/techlify-inventory-common-category.module-CNm2bEsx.mjs +0 -257
  197. package/fesm2022/techlify-inventory-common-category.module-CNm2bEsx.mjs.map +0 -1
  198. package/fesm2022/techlify-inventory-common-measure.module-BEaRHh5Z.mjs +0 -313
  199. package/fesm2022/techlify-inventory-common-measure.module-BEaRHh5Z.mjs.map +0 -1
  200. package/fesm2022/techlify-inventory-common-product.module-BV9Cy88x.mjs +0 -1168
  201. package/fesm2022/techlify-inventory-common-product.module-BV9Cy88x.mjs.map +0 -1
  202. package/fesm2022/techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs +0 -436
  203. package/fesm2022/techlify-inventory-common-stock-issuances-list.module-Dt6gx-ji.mjs.map +0 -1
  204. package/fesm2022/techlify-inventory-common-stock-issuances.module-BQRRP-hW.mjs.map +0 -1
  205. package/fesm2022/techlify-inventory-common-stock-receipt-form.module-DND0GNlf.mjs +0 -302
  206. package/fesm2022/techlify-inventory-common-stock-receipt-form.module-DND0GNlf.mjs.map +0 -1
  207. package/fesm2022/techlify-inventory-common-stock-receipts.module-BvYaKITT.mjs +0 -253
  208. package/fesm2022/techlify-inventory-common-stock-receipts.module-BvYaKITT.mjs.map +0 -1
  209. package/fesm2022/techlify-inventory-common-supplier-form.component-DVBnhiyH.mjs +0 -177
  210. package/fesm2022/techlify-inventory-common-supplier-form.component-DVBnhiyH.mjs.map +0 -1
  211. package/fesm2022/techlify-inventory-common-supplier.module-Bwa7gx14.mjs +0 -608
  212. package/fesm2022/techlify-inventory-common-supplier.module-Bwa7gx14.mjs.map +0 -1
  213. package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs +0 -14
  214. package/fesm2022/techlify-inventory-common-techlify-form-service-CiVfwYTS.mjs.map +0 -1
  215. package/fesm2022/techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs +0 -495
  216. package/fesm2022/techlify-inventory-common-techlify-inventory-common-GFYF7JCA.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import { Component, EventEmitter, Input, Output } from "@angular/core";
2
- import { debounceTime, distinctUntilChanged } from "rxjs";
3
- import moment from "moment";
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { debounceTime, distinctUntilChanged } from 'rxjs';
3
+ import moment from 'moment';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "ngx-techlify-core";
6
6
  import * as i2 from "@angular/router";
@@ -14,6 +14,7 @@ import * as i9 from "@angular/material/input";
14
14
  import * as i10 from "@angular/material/core";
15
15
  import * as i11 from "@angular/material/select";
16
16
  import * as i12 from "@angular/material/button-toggle";
17
+ import * as i13 from "ngx-permissions";
17
18
  export class TechlifyFilterComponent {
18
19
  requestHelperService;
19
20
  activatedRoute;
@@ -59,20 +60,18 @@ export class TechlifyFilterComponent {
59
60
  fixed_asset_ids: { multiple: true },
60
61
  });
61
62
  // listen for route change
62
- this.activatedRoute.queryParams
63
- .pipe(debounceTime(800), distinctUntilChanged())
64
- .subscribe((val) => {
63
+ this.activatedRoute.queryParams.pipe(debounceTime(800), distinctUntilChanged()).subscribe((val) => {
65
64
  this.filterUpdated.emit(this.filterForm.value);
66
65
  });
67
66
  }
68
67
  resetField(field) {
69
- this.filterForm.get(field)?.setValue("");
68
+ this.filterForm.get(field)?.setValue('');
70
69
  }
71
70
  onDurationChange(timelineValue) {
72
71
  let { date_to, date_from } = timelineValue;
73
72
  this.filterForm.patchValue({
74
- date_from: date_from ? moment(date_from).format("YYYY-MM-DD") : "",
75
- date_to: date_to ? moment(date_to).format("YYYY-MM-DD") : "",
73
+ date_from: date_from ? moment(date_from).format('YYYY-MM-DD') : '',
74
+ date_to: date_to ? moment(date_to).format('YYYY-MM-DD') : '',
76
75
  }, { emitEvent: false });
77
76
  }
78
77
  /**
@@ -83,8 +82,8 @@ export class TechlifyFilterComponent {
83
82
  onExpiryDurationChange(timelineValue) {
84
83
  let { date_to, date_from } = timelineValue;
85
84
  this.filterForm.patchValue({
86
- expiry_date_from: date_from ? moment(date_from).format("YYYY-MM-DD") : "",
87
- expiry_date_to: date_to ? moment(date_to).format("YYYY-MM-DD") : "",
85
+ expiry_date_from: date_from ? moment(date_from).format('YYYY-MM-DD') : '',
86
+ expiry_date_to: date_to ? moment(date_to).format('YYYY-MM-DD') : '',
88
87
  });
89
88
  }
90
89
  /**
@@ -95,19 +94,18 @@ export class TechlifyFilterComponent {
95
94
  */
96
95
  getFilterConfig(attribute, field) {
97
96
  if (!this.filterConfig)
98
- return "";
97
+ return '';
99
98
  // Check if the field and attribute exist in the filter config, return the value or an empty string
100
- return this.filterConfig[field] &&
101
- this.filterConfig[field][attribute] !== undefined
99
+ return this.filterConfig[field] && this.filterConfig[field][attribute] !== undefined
102
100
  ? this.filterConfig[field][attribute]
103
- : "";
101
+ : '';
104
102
  }
105
103
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TechlifyFilterComponent, deps: [{ token: i1.RequestHelperService }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
106
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TechlifyFilterComponent, selector: "app-techlify-filter", inputs: { filterForm: "filterForm", filterConfig: "filterConfig" }, outputs: { filterUpdated: "filterUpdated" }, ngImport: i0, template: "<form\n [formGroup]=\"filterForm\"\n fxLayout\n fxLayoutAlign=\"start center\"\n fxLayoutGap=\"10px\"\n>\n <mat-form-field\n *ngIf=\"filterForm.get('search')\"\n [appearance]=\"getFilterConfig('appearance', 'search')\"\n >\n <mat-label>Search</mat-label>\n <input\n formControlName=\"search\"\n matInput\n [placeholder]=\"getFilterConfig('placeholder', 'search')\"\n />\n <button\n *ngIf=\"filterForm.value?.search\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('search')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter\n *ngIf=\"filterForm?.get('duration')\"\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'duration')\"\n [appearance]=\"getFilterConfig('appearance', 'duration')\"\n formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"\n ></app-timeline-filter>\n\n <mat-form-field *ngIf=\"filterForm.get('payment_method_ids')\">\n <mat-label>Payment Method</mat-label>\n <app-searchable-selector\n formControlName=\"payment_method_ids\"\n apiUrl=\"api/payment-methods\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_method_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_method_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('payment_account_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['accountingcommon_account.read']\">\n <mat-label>{{\n getFilterConfig(\"label\", \"payment_account_ids\") || \"Payment Account\"\n }}</mat-label>\n <app-searchable-selector\n formControlName=\"payment_account_ids\"\n [apiUrl]=\"\n getFilterConfig('apiUrl', 'payment_account_ids') || 'api/accounts'\n \"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('invoice_status_ids')\">\n <mat-label>Invoice Status</mat-label>\n <app-searchable-selector\n formControlName=\"invoice_status_ids\"\n apiUrl=\"api/invoice-statuses\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.invoice_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('invoice_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('customer_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['customer_read']\">\n <mat-label>Customer</mat-label>\n <app-searchable-selector\n formControlName=\"customer_ids\"\n titleField=\"name\"\n apiUrl=\"api/customers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.customer_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('customer_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n filterForm.get('project_ids') &&\n getFilterConfig('disabled', 'project_ids') === false\n \"\n >\n <mat-form-field *ngxPermissionsOnly=\"['project.read']\">\n <mat-label>Project</mat-label>\n <app-searchable-selector\n formControlName=\"project_ids\"\n apiUrl=\"api/projects\"\n titleField=\"project_name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.project_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('project_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('product_ids')\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_ids\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.product_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('product_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('measure_ids')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector\n formControlName=\"measure_ids\"\n apiUrl=\"api/product-measures\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.measure_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('measure_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngxPermissionsOnly=\"['supplier.read']\">\n <mat-form-field\n *ngIf=\"filterForm.get('supplier_ids')\"\n [appearance]=\"getFilterConfig('appearance', 'supplier_ids')\"\n >\n <mat-label>Supplier</mat-label>\n <app-searchable-selector\n formControlName=\"supplier_ids\"\n titleField=\"company_name\"\n apiUrl=\"api/suppliers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.supplier_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('supplier_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'expiry_duration')\"\n *ngIf=\"filterForm?.get('expiry_duration')\"\n formControlName=\"expiry_duration\"\n (selectionChange)=\"onExpiryDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.expiry_date_from\"\n [dateTo]=\"filterForm.value?.expiry_date_to\"\n ></app-timeline-filter>\n\n <mat-form-field\n *ngIf=\"filterForm.get('cost_category_ids')\"\n style=\"width: 150px\"\n >\n <mat-label>Cost Category</mat-label>\n <app-searchable-selector\n formControlName=\"cost_category_ids\"\n apiUrl=\"api/cost-code-categories\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.cost_category_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('cost_category_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('milestone_ids')\" style=\"width: 150px\">\n <mat-label>Milestone</mat-label>\n <app-searchable-selector\n formControlName=\"milestone_ids\"\n apiUrl=\"api/milestones\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.milestone_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('milestone_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('team_member_ids')\">\n <mat-label>Assignee</mat-label>\n <app-searchable-selector\n apiUrl=\"api/persons\"\n formControlName=\"team_member_ids\"\n titleField=\"name\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.team_member_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('team_member_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-types\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_document_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_document_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-document-types\"\n [multiple]=\"true\"\n [enableSearch]=\"\n getFilterConfig('enableSearch', 'fixed_asset_document_type_ids')\n \"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_document_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_document_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div *ngIf=\"filterForm.get('fixed_asset_document_status')\">\n <small\n class=\"mr-2 text-secondary\"\n *ngIf=\"getFilterConfig('showLabel', 'fixed_asset_document_status')\"\n >\n Status\n </small>\n <mat-button-toggle-group\n formControlName=\"fixed_asset_document_status\"\n [multiple]=\"false\"\n >\n <mat-button-toggle value=\"all\">All</mat-button-toggle>\n <mat-button-toggle value=\"active\">Active</mat-button-toggle>\n <mat-button-toggle value=\"expired\">Expired</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field *ngIf=\"filterForm.get('asset_account_ids')\">\n <mat-label>Asset Account</mat-label>\n <app-searchable-selector\n formControlName=\"asset_account_ids\"\n apiUrl=\"api/accounts\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.asset_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('asset_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_expense_account_ids')\">\n <mat-label>Depreciation Expense Account</mat-label>\n <app-searchable-selector\n [multiple]=\"true\"\n apiUrl=\"api/accounts\"\n formControlName=\"depreciation_expense_account_ids\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.depreciation_expense_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('depreciation_expense_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_method_ids')\">\n <mat-label>Depreciation Method</mat-label>\n <app-searchable-selector\n formControlName=\"depreciation_method_ids\"\n apiUrl=\"api/accounting-plus/depreciation-methods\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n (click)=\"resetField('depreciation_method_ids')\"\n *ngIf=\"filterForm.value?.depreciation_method_ids\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field\n *ngIf=\"filterForm.get('task_status_ids')\"\n style=\"width: 150px\"\n >\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/task-statuses\"\n formControlName=\"task_status_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.task_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('task_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('service_center_ids')\">\n <mat-label>Service Center</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/service-centers\"\n formControlName=\"service_center_ids\"\n titleField=\"name\"\n [enableSearch]=\"false\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.service_center_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('service_center_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_maintenance_status_ids')\">\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/fixed-asset-maintenance-statuses\"\n formControlName=\"fixed_asset_maintenance_status_ids\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_maintenance_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_maintenance_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('group_by')\">\n <mat-label>Group By</mat-label>\n <mat-select formControlName=\"group_by\">\n <mat-option value=\"week\">Week</mat-option>\n <mat-option value=\"month\">Month</mat-option>\n <mat-option value=\"year\">Year</mat-option>\n </mat-select>\n </mat-form-field>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "component", type: i1.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i1.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i12.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }], preserveWhitespaces: true });
104
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TechlifyFilterComponent, selector: "app-techlify-filter", inputs: { filterForm: "filterForm", filterConfig: "filterConfig" }, outputs: { filterUpdated: "filterUpdated" }, ngImport: i0, template: "<form [formGroup]=\"filterForm\" fxLayout fxLayoutAlign=\"start center\" fxLayoutGap=\"10px\">\n <mat-form-field *ngIf=\"filterForm.get('search')\" [appearance]=\"getFilterConfig('appearance', 'search')\">\n <mat-label>Search</mat-label>\n <input formControlName=\"search\" matInput [placeholder]=\"getFilterConfig('placeholder', 'search')\" />\n <button *ngIf=\"filterForm.value?.search\" mat-icon-button matSuffix (click)=\"resetField('search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter\n *ngIf=\"filterForm?.get('duration')\"\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'duration')\"\n [appearance]=\"getFilterConfig('appearance', 'duration')\"\n formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"\n ></app-timeline-filter>\n\n <mat-form-field *ngIf=\"filterForm.get('payment_method_ids')\">\n <mat-label>Payment Method</mat-label>\n <app-searchable-selector\n formControlName=\"payment_method_ids\"\n apiUrl=\"api/payment-methods\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_method_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_method_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('payment_account_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['accountingcommon_account.read']\">\n <mat-label>{{ getFilterConfig('label', 'payment_account_ids') || 'Payment Account' }}</mat-label>\n <app-searchable-selector\n formControlName=\"payment_account_ids\"\n [apiUrl]=\"getFilterConfig('apiUrl', 'payment_account_ids') || 'api/accounts'\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('invoice_status_ids')\">\n <mat-label>Invoice Status</mat-label>\n <app-searchable-selector\n formControlName=\"invoice_status_ids\"\n apiUrl=\"api/invoice-statuses\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.invoice_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('invoice_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('customer_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['customer_read']\">\n <mat-label>Customer</mat-label>\n <app-searchable-selector\n formControlName=\"customer_ids\"\n titleField=\"name\"\n apiUrl=\"api/customers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.customer_ids\" mat-icon-button matSuffix (click)=\"resetField('customer_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"filterForm.get('project_ids') && getFilterConfig('disabled', 'project_ids') === false\">\n <mat-form-field *ngxPermissionsOnly=\"['project.read']\">\n <mat-label>Project</mat-label>\n <app-searchable-selector\n formControlName=\"project_ids\"\n apiUrl=\"api/projects\"\n titleField=\"project_name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.project_ids\" mat-icon-button matSuffix (click)=\"resetField('project_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('product_ids')\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_ids\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.product_ids\" mat-icon-button matSuffix (click)=\"resetField('product_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('measure_ids')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector\n formControlName=\"measure_ids\"\n apiUrl=\"api/product-measures\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.measure_ids\" mat-icon-button matSuffix (click)=\"resetField('measure_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngxPermissionsOnly=\"['supplier.read']\">\n <mat-form-field *ngIf=\"filterForm.get('supplier_ids')\" [appearance]=\"getFilterConfig('appearance', 'supplier_ids')\">\n <mat-label>Supplier</mat-label>\n <app-searchable-selector\n formControlName=\"supplier_ids\"\n titleField=\"company_name\"\n apiUrl=\"api/suppliers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.supplier_ids\" mat-icon-button matSuffix (click)=\"resetField('supplier_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'expiry_duration')\"\n *ngIf=\"filterForm?.get('expiry_duration')\"\n formControlName=\"expiry_duration\"\n (selectionChange)=\"onExpiryDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.expiry_date_from\"\n [dateTo]=\"filterForm.value?.expiry_date_to\"\n ></app-timeline-filter>\n\n <mat-form-field *ngIf=\"filterForm.get('cost_category_ids')\" style=\"width: 150px\">\n <mat-label>Cost Category</mat-label>\n <app-searchable-selector\n formControlName=\"cost_category_ids\"\n apiUrl=\"api/cost-code-categories\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.cost_category_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('cost_category_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('milestone_ids')\" style=\"width: 150px\">\n <mat-label>Milestone</mat-label>\n <app-searchable-selector\n formControlName=\"milestone_ids\"\n apiUrl=\"api/milestones\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.milestone_ids\" mat-icon-button matSuffix (click)=\"resetField('milestone_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('team_member_ids')\">\n <mat-label>Assignee</mat-label>\n <app-searchable-selector apiUrl=\"api/persons\" formControlName=\"team_member_ids\" titleField=\"name\" [multiple]=\"true\">\n </app-searchable-selector>\n <button *ngIf=\"filterForm.value?.team_member_ids\" mat-icon-button matSuffix (click)=\"resetField('team_member_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-types\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_document_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_document_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-document-types\"\n [multiple]=\"true\"\n [enableSearch]=\"getFilterConfig('enableSearch', 'fixed_asset_document_type_ids')\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_document_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_document_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div *ngIf=\"filterForm.get('fixed_asset_document_status')\">\n <small class=\"mr-2 text-secondary\" *ngIf=\"getFilterConfig('showLabel', 'fixed_asset_document_status')\">\n Status\n </small>\n <mat-button-toggle-group formControlName=\"fixed_asset_document_status\" [multiple]=\"false\">\n <mat-button-toggle value=\"all\">All</mat-button-toggle>\n <mat-button-toggle value=\"active\">Active</mat-button-toggle>\n <mat-button-toggle value=\"expired\">Expired</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field *ngIf=\"filterForm.get('asset_account_ids')\">\n <mat-label>Asset Account</mat-label>\n <app-searchable-selector\n formControlName=\"asset_account_ids\"\n apiUrl=\"api/accounts\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.asset_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('asset_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_expense_account_ids')\">\n <mat-label>Depreciation Expense Account</mat-label>\n <app-searchable-selector\n [multiple]=\"true\"\n apiUrl=\"api/accounts\"\n formControlName=\"depreciation_expense_account_ids\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.depreciation_expense_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('depreciation_expense_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_method_ids')\">\n <mat-label>Depreciation Method</mat-label>\n <app-searchable-selector\n formControlName=\"depreciation_method_ids\"\n apiUrl=\"api/accounting-plus/depreciation-methods\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n (click)=\"resetField('depreciation_method_ids')\"\n *ngIf=\"filterForm.value?.depreciation_method_ids\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('task_status_ids')\" style=\"width: 150px\">\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/task-statuses\"\n formControlName=\"task_status_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button *ngIf=\"filterForm.value?.task_status_ids\" mat-icon-button matSuffix (click)=\"resetField('task_status_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('service_center_ids')\">\n <mat-label>Service Center</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/service-centers\"\n formControlName=\"service_center_ids\"\n titleField=\"name\"\n [enableSearch]=\"false\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.service_center_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('service_center_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_maintenance_status_ids')\">\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/fixed-asset-maintenance-statuses\"\n formControlName=\"fixed_asset_maintenance_status_ids\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_maintenance_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_maintenance_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('group_by')\">\n <mat-label>Group By</mat-label>\n <mat-select formControlName=\"group_by\">\n <mat-option value=\"week\">Week</mat-option>\n <mat-option value=\"month\">Month</mat-option>\n <mat-option value=\"year\">Year</mat-option>\n </mat-select>\n </mat-form-field>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "component", type: i1.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i1.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i12.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i12.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: i13.NgxPermissionsDirective, selector: "[ngxPermissionsOnly],[ngxPermissionsExcept]", inputs: ["ngxPermissionsOnly", "ngxPermissionsOnlyThen", "ngxPermissionsOnlyElse", "ngxPermissionsExcept", "ngxPermissionsExceptElse", "ngxPermissionsExceptThen", "ngxPermissionsThen", "ngxPermissionsElse", "ngxPermissionsOnlyAuthorisedStrategy", "ngxPermissionsOnlyUnauthorisedStrategy", "ngxPermissionsExceptUnauthorisedStrategy", "ngxPermissionsExceptAuthorisedStrategy", "ngxPermissionsUnauthorisedStrategy", "ngxPermissionsAuthorisedStrategy"], outputs: ["permissionsAuthorized", "permissionsUnauthorized"] }], preserveWhitespaces: true });
107
105
  }
108
106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TechlifyFilterComponent, decorators: [{
109
107
  type: Component,
110
- args: [{ selector: "app-techlify-filter", template: "<form\n [formGroup]=\"filterForm\"\n fxLayout\n fxLayoutAlign=\"start center\"\n fxLayoutGap=\"10px\"\n>\n <mat-form-field\n *ngIf=\"filterForm.get('search')\"\n [appearance]=\"getFilterConfig('appearance', 'search')\"\n >\n <mat-label>Search</mat-label>\n <input\n formControlName=\"search\"\n matInput\n [placeholder]=\"getFilterConfig('placeholder', 'search')\"\n />\n <button\n *ngIf=\"filterForm.value?.search\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('search')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter\n *ngIf=\"filterForm?.get('duration')\"\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'duration')\"\n [appearance]=\"getFilterConfig('appearance', 'duration')\"\n formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"\n ></app-timeline-filter>\n\n <mat-form-field *ngIf=\"filterForm.get('payment_method_ids')\">\n <mat-label>Payment Method</mat-label>\n <app-searchable-selector\n formControlName=\"payment_method_ids\"\n apiUrl=\"api/payment-methods\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_method_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_method_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('payment_account_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['accountingcommon_account.read']\">\n <mat-label>{{\n getFilterConfig(\"label\", \"payment_account_ids\") || \"Payment Account\"\n }}</mat-label>\n <app-searchable-selector\n formControlName=\"payment_account_ids\"\n [apiUrl]=\"\n getFilterConfig('apiUrl', 'payment_account_ids') || 'api/accounts'\n \"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('invoice_status_ids')\">\n <mat-label>Invoice Status</mat-label>\n <app-searchable-selector\n formControlName=\"invoice_status_ids\"\n apiUrl=\"api/invoice-statuses\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.invoice_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('invoice_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('customer_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['customer_read']\">\n <mat-label>Customer</mat-label>\n <app-searchable-selector\n formControlName=\"customer_ids\"\n titleField=\"name\"\n apiUrl=\"api/customers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.customer_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('customer_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n filterForm.get('project_ids') &&\n getFilterConfig('disabled', 'project_ids') === false\n \"\n >\n <mat-form-field *ngxPermissionsOnly=\"['project.read']\">\n <mat-label>Project</mat-label>\n <app-searchable-selector\n formControlName=\"project_ids\"\n apiUrl=\"api/projects\"\n titleField=\"project_name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.project_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('project_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('product_ids')\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_ids\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.product_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('product_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('measure_ids')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector\n formControlName=\"measure_ids\"\n apiUrl=\"api/product-measures\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.measure_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('measure_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngxPermissionsOnly=\"['supplier.read']\">\n <mat-form-field\n *ngIf=\"filterForm.get('supplier_ids')\"\n [appearance]=\"getFilterConfig('appearance', 'supplier_ids')\"\n >\n <mat-label>Supplier</mat-label>\n <app-searchable-selector\n formControlName=\"supplier_ids\"\n titleField=\"company_name\"\n apiUrl=\"api/suppliers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.supplier_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('supplier_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'expiry_duration')\"\n *ngIf=\"filterForm?.get('expiry_duration')\"\n formControlName=\"expiry_duration\"\n (selectionChange)=\"onExpiryDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.expiry_date_from\"\n [dateTo]=\"filterForm.value?.expiry_date_to\"\n ></app-timeline-filter>\n\n <mat-form-field\n *ngIf=\"filterForm.get('cost_category_ids')\"\n style=\"width: 150px\"\n >\n <mat-label>Cost Category</mat-label>\n <app-searchable-selector\n formControlName=\"cost_category_ids\"\n apiUrl=\"api/cost-code-categories\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.cost_category_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('cost_category_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('milestone_ids')\" style=\"width: 150px\">\n <mat-label>Milestone</mat-label>\n <app-searchable-selector\n formControlName=\"milestone_ids\"\n apiUrl=\"api/milestones\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.milestone_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('milestone_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('team_member_ids')\">\n <mat-label>Assignee</mat-label>\n <app-searchable-selector\n apiUrl=\"api/persons\"\n formControlName=\"team_member_ids\"\n titleField=\"name\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.team_member_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('team_member_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-types\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_document_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_document_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-document-types\"\n [multiple]=\"true\"\n [enableSearch]=\"\n getFilterConfig('enableSearch', 'fixed_asset_document_type_ids')\n \"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_document_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_document_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div *ngIf=\"filterForm.get('fixed_asset_document_status')\">\n <small\n class=\"mr-2 text-secondary\"\n *ngIf=\"getFilterConfig('showLabel', 'fixed_asset_document_status')\"\n >\n Status\n </small>\n <mat-button-toggle-group\n formControlName=\"fixed_asset_document_status\"\n [multiple]=\"false\"\n >\n <mat-button-toggle value=\"all\">All</mat-button-toggle>\n <mat-button-toggle value=\"active\">Active</mat-button-toggle>\n <mat-button-toggle value=\"expired\">Expired</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field *ngIf=\"filterForm.get('asset_account_ids')\">\n <mat-label>Asset Account</mat-label>\n <app-searchable-selector\n formControlName=\"asset_account_ids\"\n apiUrl=\"api/accounts\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.asset_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('asset_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_expense_account_ids')\">\n <mat-label>Depreciation Expense Account</mat-label>\n <app-searchable-selector\n [multiple]=\"true\"\n apiUrl=\"api/accounts\"\n formControlName=\"depreciation_expense_account_ids\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.depreciation_expense_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('depreciation_expense_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_method_ids')\">\n <mat-label>Depreciation Method</mat-label>\n <app-searchable-selector\n formControlName=\"depreciation_method_ids\"\n apiUrl=\"api/accounting-plus/depreciation-methods\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n (click)=\"resetField('depreciation_method_ids')\"\n *ngIf=\"filterForm.value?.depreciation_method_ids\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field\n *ngIf=\"filterForm.get('task_status_ids')\"\n style=\"width: 150px\"\n >\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/task-statuses\"\n formControlName=\"task_status_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.task_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('task_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('service_center_ids')\">\n <mat-label>Service Center</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/service-centers\"\n formControlName=\"service_center_ids\"\n titleField=\"name\"\n [enableSearch]=\"false\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.service_center_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('service_center_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_maintenance_status_ids')\">\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/fixed-asset-maintenance-statuses\"\n formControlName=\"fixed_asset_maintenance_status_ids\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_maintenance_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_maintenance_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('group_by')\">\n <mat-label>Group By</mat-label>\n <mat-select formControlName=\"group_by\">\n <mat-option value=\"week\">Week</mat-option>\n <mat-option value=\"month\">Month</mat-option>\n <mat-option value=\"year\">Year</mat-option>\n </mat-select>\n </mat-form-field>\n</form>\n" }]
108
+ args: [{ selector: 'app-techlify-filter', template: "<form [formGroup]=\"filterForm\" fxLayout fxLayoutAlign=\"start center\" fxLayoutGap=\"10px\">\n <mat-form-field *ngIf=\"filterForm.get('search')\" [appearance]=\"getFilterConfig('appearance', 'search')\">\n <mat-label>Search</mat-label>\n <input formControlName=\"search\" matInput [placeholder]=\"getFilterConfig('placeholder', 'search')\" />\n <button *ngIf=\"filterForm.value?.search\" mat-icon-button matSuffix (click)=\"resetField('search')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <app-timeline-filter\n *ngIf=\"filterForm?.get('duration')\"\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'duration')\"\n [appearance]=\"getFilterConfig('appearance', 'duration')\"\n formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"\n ></app-timeline-filter>\n\n <mat-form-field *ngIf=\"filterForm.get('payment_method_ids')\">\n <mat-label>Payment Method</mat-label>\n <app-searchable-selector\n formControlName=\"payment_method_ids\"\n apiUrl=\"api/payment-methods\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_method_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_method_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('payment_account_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['accountingcommon_account.read']\">\n <mat-label>{{ getFilterConfig('label', 'payment_account_ids') || 'Payment Account' }}</mat-label>\n <app-searchable-selector\n formControlName=\"payment_account_ids\"\n [apiUrl]=\"getFilterConfig('apiUrl', 'payment_account_ids') || 'api/accounts'\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.payment_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('payment_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('invoice_status_ids')\">\n <mat-label>Invoice Status</mat-label>\n <app-searchable-selector\n formControlName=\"invoice_status_ids\"\n apiUrl=\"api/invoice-statuses\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.invoice_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('invoice_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngIf=\"filterForm.get('customer_ids')\">\n <mat-form-field *ngxPermissionsOnly=\"['customer_read']\">\n <mat-label>Customer</mat-label>\n <app-searchable-selector\n formControlName=\"customer_ids\"\n titleField=\"name\"\n apiUrl=\"api/customers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.customer_ids\" mat-icon-button matSuffix (click)=\"resetField('customer_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"filterForm.get('project_ids') && getFilterConfig('disabled', 'project_ids') === false\">\n <mat-form-field *ngxPermissionsOnly=\"['project.read']\">\n <mat-label>Project</mat-label>\n <app-searchable-selector\n formControlName=\"project_ids\"\n apiUrl=\"api/projects\"\n titleField=\"project_name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.project_ids\" mat-icon-button matSuffix (click)=\"resetField('project_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <mat-form-field *ngIf=\"filterForm.get('product_ids')\">\n <mat-label>Product</mat-label>\n <app-searchable-selector\n formControlName=\"product_ids\"\n apiUrl=\"api/products\"\n titleField=\"name\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.product_ids\" mat-icon-button matSuffix (click)=\"resetField('product_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('measure_ids')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector\n formControlName=\"measure_ids\"\n apiUrl=\"api/product-measures\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.measure_ids\" mat-icon-button matSuffix (click)=\"resetField('measure_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <ng-container *ngxPermissionsOnly=\"['supplier.read']\">\n <mat-form-field *ngIf=\"filterForm.get('supplier_ids')\" [appearance]=\"getFilterConfig('appearance', 'supplier_ids')\">\n <mat-label>Supplier</mat-label>\n <app-searchable-selector\n formControlName=\"supplier_ids\"\n titleField=\"company_name\"\n apiUrl=\"api/suppliers\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.supplier_ids\" mat-icon-button matSuffix (click)=\"resetField('supplier_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ng-container>\n\n <app-timeline-filter\n appearance=\"fill\"\n [labelText]=\"getFilterConfig('label', 'expiry_duration')\"\n *ngIf=\"filterForm?.get('expiry_duration')\"\n formControlName=\"expiry_duration\"\n (selectionChange)=\"onExpiryDurationChange($event)\"\n [showClearButton]=\"true\"\n [dateFrom]=\"filterForm.value?.expiry_date_from\"\n [dateTo]=\"filterForm.value?.expiry_date_to\"\n ></app-timeline-filter>\n\n <mat-form-field *ngIf=\"filterForm.get('cost_category_ids')\" style=\"width: 150px\">\n <mat-label>Cost Category</mat-label>\n <app-searchable-selector\n formControlName=\"cost_category_ids\"\n apiUrl=\"api/cost-code-categories\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.cost_category_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('cost_category_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('milestone_ids')\" style=\"width: 150px\">\n <mat-label>Milestone</mat-label>\n <app-searchable-selector\n formControlName=\"milestone_ids\"\n apiUrl=\"api/milestones\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button *ngIf=\"filterForm.value?.milestone_ids\" mat-icon-button matSuffix (click)=\"resetField('milestone_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('team_member_ids')\">\n <mat-label>Assignee</mat-label>\n <app-searchable-selector apiUrl=\"api/persons\" formControlName=\"team_member_ids\" titleField=\"name\" [multiple]=\"true\">\n </app-searchable-selector>\n <button *ngIf=\"filterForm.value?.team_member_ids\" mat-icon-button matSuffix (click)=\"resetField('team_member_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-types\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_document_type_ids')\">\n <mat-label>Type</mat-label>\n <app-searchable-selector\n formControlName=\"fixed_asset_document_type_ids\"\n apiUrl=\"api/accounting-plus/fixed-asset-document-types\"\n [multiple]=\"true\"\n [enableSearch]=\"getFilterConfig('enableSearch', 'fixed_asset_document_type_ids')\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_document_type_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_document_type_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <div *ngIf=\"filterForm.get('fixed_asset_document_status')\">\n <small class=\"mr-2 text-secondary\" *ngIf=\"getFilterConfig('showLabel', 'fixed_asset_document_status')\">\n Status\n </small>\n <mat-button-toggle-group formControlName=\"fixed_asset_document_status\" [multiple]=\"false\">\n <mat-button-toggle value=\"all\">All</mat-button-toggle>\n <mat-button-toggle value=\"active\">Active</mat-button-toggle>\n <mat-button-toggle value=\"expired\">Expired</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field *ngIf=\"filterForm.get('asset_account_ids')\">\n <mat-label>Asset Account</mat-label>\n <app-searchable-selector\n formControlName=\"asset_account_ids\"\n apiUrl=\"api/accounts\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.asset_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('asset_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_expense_account_ids')\">\n <mat-label>Depreciation Expense Account</mat-label>\n <app-searchable-selector\n [multiple]=\"true\"\n apiUrl=\"api/accounts\"\n formControlName=\"depreciation_expense_account_ids\"\n ></app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.depreciation_expense_account_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('depreciation_expense_account_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('depreciation_method_ids')\">\n <mat-label>Depreciation Method</mat-label>\n <app-searchable-selector\n formControlName=\"depreciation_method_ids\"\n apiUrl=\"api/accounting-plus/depreciation-methods\"\n [multiple]=\"true\"\n ></app-searchable-selector>\n <button\n (click)=\"resetField('depreciation_method_ids')\"\n *ngIf=\"filterForm.value?.depreciation_method_ids\"\n mat-icon-button\n matSuffix\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('task_status_ids')\" style=\"width: 150px\">\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/task-statuses\"\n formControlName=\"task_status_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button *ngIf=\"filterForm.value?.task_status_ids\" mat-icon-button matSuffix (click)=\"resetField('task_status_ids')\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('service_center_ids')\">\n <mat-label>Service Center</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/service-centers\"\n formControlName=\"service_center_ids\"\n titleField=\"name\"\n [enableSearch]=\"false\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.service_center_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('service_center_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('fixed_asset_maintenance_status_ids')\">\n <mat-label>Status</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/fixed-asset-maintenance-statuses\"\n formControlName=\"fixed_asset_maintenance_status_ids\"\n [multiple]=\"true\"\n [enableSearch]=\"false\"\n >\n </app-searchable-selector>\n <button\n *ngIf=\"filterForm.value?.fixed_asset_maintenance_status_ids\"\n mat-icon-button\n matSuffix\n (click)=\"resetField('fixed_asset_maintenance_status_ids')\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"filterForm.get('group_by')\">\n <mat-label>Group By</mat-label>\n <mat-select formControlName=\"group_by\">\n <mat-option value=\"week\">Week</mat-option>\n <mat-option value=\"month\">Month</mat-option>\n <mat-option value=\"year\">Year</mat-option>\n </mat-select>\n </mat-form-field>\n</form>\n" }]
111
109
  }], ctorParameters: () => [{ type: i1.RequestHelperService }, { type: i2.ActivatedRoute }], propDecorators: { filterForm: [{
112
110
  type: Input
113
111
  }], filterConfig: [{
@@ -115,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
115
113
  }], filterUpdated: [{
116
114
  type: Output
117
115
  }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3RlY2hsaWZ5LWZpbHRlci90ZWNobGlmeS1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vdGVjaGxpZnktZmlsdGVyL3RlY2hsaWZ5LWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSS9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU81QixNQUFNLE9BQU8sdUJBQXVCO0lBTXhCO0lBQ0E7SUFORCxVQUFVLENBQWE7SUFDdkIsWUFBWSxDQUFNO0lBQ2pCLGFBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVoRSxZQUNVLG9CQUEwQyxFQUMxQyxjQUE4QjtRQUQ5Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUNyQyxDQUFDO0lBRUosUUFBUTtRQUNOLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDckMsSUFBSSxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ25CLE1BQU0sTUFBTSxHQUFRLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLG9C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bnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBSZXF1ZXN0SGVscGVyU2VydmljZSwgVGltZWxpbmVWYWx1ZSB9IGZyb20gXCJuZ3gtdGVjaGxpZnktY29yZVwiO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXBwLXRlY2hsaWZ5LWZpbHRlclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3RlY2hsaWZ5LWZpbHRlci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGVjaGxpZnktZmlsdGVyLmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBUZWNobGlmeUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZpbHRlckZvcm0hOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZpbHRlckNvbmZpZzogYW55O1xuICBAT3V0cHV0KCkgZmlsdGVyVXBkYXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXF1ZXN0SGVscGVyU2VydmljZTogUmVxdWVzdEhlbHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGxpc3RlbiBmb3IgZmlsdGVyIGNoYW5nZXNcbiAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXM6IGFueSA9IHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UuY29udmVydFRvRm9ybURhdGEodmFsdWUpO1xuICAgICAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZVF1ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlIGZvcm0gd2l0aCBxdWVyeSBwYXJhbXNcbiAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXModGhpcy5maWx0ZXJGb3JtLCB7XG4gICAgICBkdXJhdGlvbjogeyBudW1iZXI6IHRydWUgfSxcbiAgICAgIGV4cGlyeV9kdXJhdGlvbjogeyBudW1iZXI6IHRydWUgfSxcbiAgICAgIHBheW1lbnRfbWV0aG9kX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgcGF5bWVudF9hY2NvdW50X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgcHJvamVjdF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGludm9pY2Vfc3RhdHVzX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgY3VzdG9tZXJfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBjb3N0X2NhdGVnb3J5X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgdGVhbV9tZW1iZXJfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICB0YXNrX3N0YXR1c19pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGFzc2V0X2FjY291bnRfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBkZXByZWNpYXRpb25fbWV0aG9kX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgZGVwcmVjaWF0aW9uX2V4cGVuc2VfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGZpeGVkX2Fzc2V0X3R5cGVfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBmaXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgc2VydmljZV9jZW50ZXJfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBmaXhlZF9hc3NldF9tYWludGVuYW5jZV9zdGF0dXNfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBtaWxlc3RvbmVfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBwcm9kdWN0X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgc3VwcGxpZXJfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBtZWFzdXJlX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgdHlwZV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGZpeGVkX2Fzc2V0X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgIH0pO1xuXG4gICAgLy8gbGlzdGVuIGZvciByb3V0ZSBjaGFuZ2VcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoODAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyVXBkYXRlZC5lbWl0KHRoaXMuZmlsdGVyRm9ybS52YWx1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlc2V0RmllbGQoZmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoZmllbGQpPy5zZXRWYWx1ZShcIlwiKTtcbiAgfVxuXG4gIG9uRHVyYXRpb25DaGFuZ2UodGltZWxpbmVWYWx1ZTogVGltZWxpbmVWYWx1ZSkge1xuICAgIGxldCB7IGRhdGVfdG8sIGRhdGVfZnJvbSB9ID0gdGltZWxpbmVWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgZGF0ZV9mcm9tOiBkYXRlX2Zyb20gPyBtb21lbnQoZGF0ZV9mcm9tKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIDogXCJcIixcbiAgICAgICAgZGF0ZV90bzogZGF0ZV90byA/IG1vbWVudChkYXRlX3RvKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIDogXCJcIixcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGV4cGlyeSBkYXRlIGZyb20gYW5kIGRhdGUgdG8gb24gdmFsdWUgY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZWxpbmVWYWx1ZVxuICAgKi9cbiAgb25FeHBpcnlEdXJhdGlvbkNoYW5nZSh0aW1lbGluZVZhbHVlOiBUaW1lbGluZVZhbHVlKSB7XG4gICAgbGV0IHsgZGF0ZV90bywgZGF0ZV9mcm9tIH0gPSB0aW1lbGluZVZhbHVlO1xuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGV4cGlyeV9kYXRlX2Zyb206IGRhdGVfZnJvbSA/IG1vbWVudChkYXRlX2Zyb20pLmZvcm1hdChcIllZWVktTU0tRERcIikgOiBcIlwiLFxuICAgICAgZXhwaXJ5X2RhdGVfdG86IGRhdGVfdG8gPyBtb21lbnQoZGF0ZV90bykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSA6IFwiXCIsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHJpYnV0ZVxuICAgKiBAcGFyYW0gZmllbGRcbiAgICovXG4gIGdldEZpbHRlckNvbmZpZyhhdHRyaWJ1dGU6IHN0cmluZywgZmllbGQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5maWx0ZXJDb25maWcpIHJldHVybiBcIlwiO1xuICAgIC8vIENoZWNrIGlmIHRoZSBmaWVsZCBhbmQgYXR0cmlidXRlIGV4aXN0IGluIHRoZSBmaWx0ZXIgY29uZmlnLCByZXR1cm4gdGhlIHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiB0aGlzLmZpbHRlckNvbmZpZ1tmaWVsZF0gJiZcbiAgICAgIHRoaXMuZmlsdGVyQ29uZmlnW2ZpZWxkXVthdHRyaWJ1dGVdICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5maWx0ZXJDb25maWdbZmllbGRdW2F0dHJpYnV0ZV1cbiAgICAgIDogXCJcIjtcbiAgfVxufVxuIiwiPGZvcm1cbiAgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCJcbiAgZnhMYXlvdXRcbiAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiXG4gIGZ4TGF5b3V0R2FwPVwiMTBweFwiXG4+XG4gIDxtYXQtZm9ybS1maWVsZFxuICAgICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ3NlYXJjaCcpXCJcbiAgICBbYXBwZWFyYW5jZV09XCJnZXRGaWx0ZXJDb25maWcoJ2FwcGVhcmFuY2UnLCAnc2VhcmNoJylcIlxuICA+XG4gICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFwiXG4gICAgICBtYXRJbnB1dFxuICAgICAgW3BsYWNlaG9sZGVyXT1cImdldEZpbHRlckNvbmZpZygncGxhY2Vob2xkZXInLCAnc2VhcmNoJylcIlxuICAgIC8+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5zZWFyY2hcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdzZWFyY2gnKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8YXBwLXRpbWVsaW5lLWZpbHRlclxuICAgICpuZ0lmPVwiZmlsdGVyRm9ybT8uZ2V0KCdkdXJhdGlvbicpXCJcbiAgICBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgW2xhYmVsVGV4dF09XCJnZXRGaWx0ZXJDb25maWcoJ2xhYmVsJywgJ2R1cmF0aW9uJylcIlxuICAgIFthcHBlYXJhbmNlXT1cImdldEZpbHRlckNvbmZpZygnYXBwZWFyYW5jZScsICdkdXJhdGlvbicpXCJcbiAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkR1cmF0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgW2RhdGVGcm9tXT1cImZpbHRlckZvcm0udmFsdWU/LmRhdGVfZnJvbVwiXG4gICAgW2RhdGVUb109XCJmaWx0ZXJGb3JtLnZhbHVlPy5kYXRlX3RvXCJcbiAgPjwvYXBwLXRpbWVsaW5lLWZpbHRlcj5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgncGF5bWVudF9tZXRob2RfaWRzJylcIj5cbiAgICA8bWF0LWxhYmVsPlBheW1lbnQgTWV0aG9kPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50X21ldGhvZF9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL3BheW1lbnQtbWV0aG9kc1wiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICBbZW5hYmxlU2VhcmNoXT1cImZhbHNlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnBheW1lbnRfbWV0aG9kX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ3BheW1lbnRfbWV0aG9kX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgncGF5bWVudF9hY2NvdW50X2lkcycpXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ3hQZXJtaXNzaW9uc09ubHk9XCJbJ2FjY291bnRpbmdjb21tb25fYWNjb3VudC5yZWFkJ11cIj5cbiAgICAgIDxtYXQtbGFiZWw+e3tcbiAgICAgICAgZ2V0RmlsdGVyQ29uZmlnKFwibGFiZWxcIiwgXCJwYXltZW50X2FjY291bnRfaWRzXCIpIHx8IFwiUGF5bWVudCBBY2NvdW50XCJcbiAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudF9hY2NvdW50X2lkc1wiXG4gICAgICAgIFthcGlVcmxdPVwiXG4gICAgICAgICAgZ2V0RmlsdGVyQ29uZmlnKCdhcGlVcmwnLCAncGF5bWVudF9hY2NvdW50X2lkcycpIHx8ICdhcGkvYWNjb3VudHMnXG4gICAgICAgIFwiXG4gICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnBheW1lbnRfYWNjb3VudF9pZHNcIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgbWF0U3VmZml4XG4gICAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdwYXltZW50X2FjY291bnRfaWRzJylcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ2ludm9pY2Vfc3RhdHVzX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5JbnZvaWNlIFN0YXR1czwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW52b2ljZV9zdGF0dXNfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9pbnZvaWNlLXN0YXR1c2VzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/Lmludm9pY2Vfc3RhdHVzX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2ludm9pY2Vfc3RhdHVzX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnY3VzdG9tZXJfaWRzJylcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5neFBlcm1pc3Npb25zT25seT1cIlsnY3VzdG9tZXJfcmVhZCddXCI+XG4gICAgICA8bWF0LWxhYmVsPkN1c3RvbWVyPC9tYXQtbGFiZWw+XG4gICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3VzdG9tZXJfaWRzXCJcbiAgICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgICBhcGlVcmw9XCJhcGkvY3VzdG9tZXJzXCJcbiAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uY3VzdG9tZXJfaWRzXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgnY3VzdG9tZXJfaWRzJylcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0lmPVwiXG4gICAgICBmaWx0ZXJGb3JtLmdldCgncHJvamVjdF9pZHMnKSAmJlxuICAgICAgZ2V0RmlsdGVyQ29uZmlnKCdkaXNhYmxlZCcsICdwcm9qZWN0X2lkcycpID09PSBmYWxzZVxuICAgIFwiXG4gID5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5neFBlcm1pc3Npb25zT25seT1cIlsncHJvamVjdC5yZWFkJ11cIj5cbiAgICAgIDxtYXQtbGFiZWw+UHJvamVjdDwvbWF0LWxhYmVsPlxuICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2plY3RfaWRzXCJcbiAgICAgICAgYXBpVXJsPVwiYXBpL3Byb2plY3RzXCJcbiAgICAgICAgdGl0bGVGaWVsZD1cInByb2plY3RfbmFtZVwiXG4gICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnByb2plY3RfaWRzXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgncHJvamVjdF9pZHMnKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgncHJvZHVjdF9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+UHJvZHVjdDwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdF9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL3Byb2R1Y3RzXCJcbiAgICAgIHRpdGxlRmllbGQ9XCJuYW1lXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnByb2R1Y3RfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgncHJvZHVjdF9pZHMnKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnbWVhc3VyZV9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+TWVhc3VyZTwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWVhc3VyZV9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtbWVhc3VyZXNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8ubWVhc3VyZV9pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdtZWFzdXJlX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxuZy1jb250YWluZXIgKm5neFBlcm1pc3Npb25zT25seT1cIlsnc3VwcGxpZXIucmVhZCddXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdzdXBwbGllcl9pZHMnKVwiXG4gICAgICBbYXBwZWFyYW5jZV09XCJnZXRGaWx0ZXJDb25maWcoJ2FwcGVhcmFuY2UnLCAnc3VwcGxpZXJfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtbGFiZWw+U3VwcGxpZXI8L21hdC1sYWJlbD5cbiAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdXBwbGllcl9pZHNcIlxuICAgICAgICB0aXRsZUZpZWxkPVwiY29tcGFueV9uYW1lXCJcbiAgICAgICAgYXBpVXJsPVwiYXBpL3N1cHBsaWVyc1wiXG4gICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnN1cHBsaWVyX2lkc1wiXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ3N1cHBsaWVyX2lkcycpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxhcHAtdGltZWxpbmUtZmlsdGVyXG4gICAgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgIFtsYWJlbFRleHRdPVwiZ2V0RmlsdGVyQ29uZmlnKCdsYWJlbCcsICdleHBpcnlfZHVyYXRpb24nKVwiXG4gICAgKm5nSWY9XCJmaWx0ZXJGb3JtPy5nZXQoJ2V4cGlyeV9kdXJhdGlvbicpXCJcbiAgICBmb3JtQ29udHJvbE5hbWU9XCJleHBpcnlfZHVyYXRpb25cIlxuICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25FeHBpcnlEdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICBbc2hvd0NsZWFyQnV0dG9uXT1cInRydWVcIlxuICAgIFtkYXRlRnJvbV09XCJmaWx0ZXJGb3JtLnZhbHVlPy5leHBpcnlfZGF0ZV9mcm9tXCJcbiAgICBbZGF0ZVRvXT1cImZpbHRlckZvcm0udmFsdWU/LmV4cGlyeV9kYXRlX3RvXCJcbiAgPjwvYXBwLXRpbWVsaW5lLWZpbHRlcj5cblxuICA8bWF0LWZvcm0tZmllbGRcbiAgICAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdjb3N0X2NhdGVnb3J5X2lkcycpXCJcbiAgICBzdHlsZT1cIndpZHRoOiAxNTBweFwiXG4gID5cbiAgICA8bWF0LWxhYmVsPkNvc3QgQ2F0ZWdvcnk8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvc3RfY2F0ZWdvcnlfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9jb3N0LWNvZGUtY2F0ZWdvcmllc1wiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5jb3N0X2NhdGVnb3J5X2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2Nvc3RfY2F0ZWdvcnlfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ21pbGVzdG9uZV9pZHMnKVwiIHN0eWxlPVwid2lkdGg6IDE1MHB4XCI+XG4gICAgPG1hdC1sYWJlbD5NaWxlc3RvbmU8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1pbGVzdG9uZV9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL21pbGVzdG9uZXNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8ubWlsZXN0b25lX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ21pbGVzdG9uZV9pZHMnKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgndGVhbV9tZW1iZXJfaWRzJylcIj5cbiAgICA8bWF0LWxhYmVsPkFzc2lnbmVlPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBhcGlVcmw9XCJhcGkvcGVyc29uc1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0ZWFtX21lbWJlcl9pZHNcIlxuICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID5cbiAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8udGVhbV9tZW1iZXJfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgndGVhbV9tZW1iZXJfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ2ZpeGVkX2Fzc2V0X3R5cGVfaWRzJylcIj5cbiAgICA8bWF0LWxhYmVsPlR5cGU8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeGVkX2Fzc2V0X3R5cGVfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9hY2NvdW50aW5nLXBsdXMvZml4ZWQtYXNzZXQtdHlwZXNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uZml4ZWRfYXNzZXRfdHlwZV9pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdmaXhlZF9hc3NldF90eXBlX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdmaXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5UeXBlPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkc1wiXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudGluZy1wbHVzL2ZpeGVkLWFzc2V0LWRvY3VtZW50LXR5cGVzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgIFtlbmFibGVTZWFyY2hdPVwiXG4gICAgICAgIGdldEZpbHRlckNvbmZpZygnZW5hYmxlU2VhcmNoJywgJ2ZpeGVkX2Fzc2V0X2RvY3VtZW50X3R5cGVfaWRzJylcbiAgICAgIFwiXG4gICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5maXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2ZpeGVkX2Fzc2V0X2RvY3VtZW50X3R5cGVfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPGRpdiAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdmaXhlZF9hc3NldF9kb2N1bWVudF9zdGF0dXMnKVwiPlxuICAgIDxzbWFsbFxuICAgICAgY2xhc3M9XCJtci0yIHRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICpuZ0lmPVwiZ2V0RmlsdGVyQ29uZmlnKCdzaG93TGFiZWwnLCAnZml4ZWRfYXNzZXRfZG9jdW1lbnRfc3RhdHVzJylcIlxuICAgID5cbiAgICAgIFN0YXR1c1xuICAgIDwvc21hbGw+XG4gICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXhlZF9hc3NldF9kb2N1bWVudF9zdGF0dXNcIlxuICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcbiAgICA+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJhbGxcIj5BbGw8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiYWN0aXZlXCI+QWN0aXZlPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImV4cGlyZWRcIj5FeHBpcmVkPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICA8L2Rpdj5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnYXNzZXRfYWNjb3VudF9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+QXNzZXQgQWNjb3VudDwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXNzZXRfYWNjb3VudF9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL2FjY291bnRzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LmFzc2V0X2FjY291bnRfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgnYXNzZXRfYWNjb3VudF9pZHMnKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnZGVwcmVjaWF0aW9uX2V4cGVuc2VfYWNjb3VudF9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+RGVwcmVjaWF0aW9uIEV4cGVuc2UgQWNjb3VudDwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgYXBpVXJsPVwiYXBpL2FjY291bnRzXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlcHJlY2lhdGlvbl9leHBlbnNlX2FjY291bnRfaWRzXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LmRlcHJlY2lhdGlvbl9leHBlbnNlX2FjY291bnRfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgnZGVwcmVjaWF0aW9uX2V4cGVuc2VfYWNjb3VudF9pZHMnKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnZGVwcmVjaWF0aW9uX21ldGhvZF9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+RGVwcmVjaWF0aW9uIE1ldGhvZDwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVwcmVjaWF0aW9uX21ldGhvZF9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL2FjY291bnRpbmctcGx1cy9kZXByZWNpYXRpb24tbWV0aG9kc1wiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2RlcHJlY2lhdGlvbl9tZXRob2RfaWRzJylcIlxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5kZXByZWNpYXRpb25fbWV0aG9kX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkXG4gICAgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgndGFza19zdGF0dXNfaWRzJylcIlxuICAgIHN0eWxlPVwid2lkdGg6IDE1MHB4XCJcbiAgPlxuICAgIDxtYXQtbGFiZWw+U3RhdHVzPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBhcGlVcmw9XCJhcGkvdGFzay1zdGF0dXNlc1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YXNrX3N0YXR1c19pZHNcIlxuICAgICAgdGl0bGVGaWVsZD1cInRpdGxlXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgIFtlbmFibGVTZWFyY2hdPVwiZmFsc2VcIlxuICAgID5cbiAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8udGFza19zdGF0dXNfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgndGFza19zdGF0dXNfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ3NlcnZpY2VfY2VudGVyX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5TZXJ2aWNlIENlbnRlcjwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgYXBpVXJsPVwiYXBpL2FjY291bnRpbmctcGx1cy9zZXJ2aWNlLWNlbnRlcnNcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VydmljZV9jZW50ZXJfaWRzXCJcbiAgICAgIHRpdGxlRmllbGQ9XCJuYW1lXCJcbiAgICAgIFtlbmFibGVTZWFyY2hdPVwiZmFsc2VcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID5cbiAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uc2VydmljZV9jZW50ZXJfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgnc2VydmljZV9jZW50ZXJfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ2ZpeGVkX2Fzc2V0X21haW50ZW5hbmNlX3N0YXR1c19pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+U3RhdHVzPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudGluZy1wbHVzL2ZpeGVkLWFzc2V0LW1haW50ZW5hbmNlLXN0YXR1c2VzXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeGVkX2Fzc2V0X21haW50ZW5hbmNlX3N0YXR1c19pZHNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgW2VuYWJsZVNlYXJjaF09XCJmYWxzZVwiXG4gICAgPlxuICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5maXhlZF9hc3NldF9tYWludGVuYW5jZV9zdGF0dXNfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgnZml4ZWRfYXNzZXRfbWFpbnRlbmFuY2Vfc3RhdHVzX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdncm91cF9ieScpXCI+XG4gICAgPG1hdC1sYWJlbD5Hcm91cCBCeTwvbWF0LWxhYmVsPlxuICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImdyb3VwX2J5XCI+XG4gICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIndlZWtcIj5XZWVrPC9tYXQtb3B0aW9uPlxuICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJtb250aFwiPk1vbnRoPC9tYXQtb3B0aW9uPlxuICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJ5ZWFyXCI+WWVhcjwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Zvcm0+XG4iXX0=
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3RlY2hsaWZ5LWZpbHRlci90ZWNobGlmeS1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vdGVjaGxpZnktZmlsdGVyL3RlY2hsaWZ5LWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSS9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFPNUIsTUFBTSxPQUFPLHVCQUF1QjtJQUtkO0lBQW9EO0lBSi9ELFVBQVUsQ0FBYTtJQUN2QixZQUFZLENBQU07SUFDakIsYUFBYSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRWhFLFlBQW9CLG9CQUEwQyxFQUFVLGNBQThCO1FBQWxGLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFBRyxDQUFDO0lBRTFHLFFBQVE7UUFDTiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1lBQ3JDLElBQUksRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUNuQixNQUFNLE1BQU0sR0FBUSxJQUFJLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxv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dXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZXF1ZXN0SGVscGVyU2VydmljZSwgVGltZWxpbmVWYWx1ZSB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRlY2hsaWZ5LWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZWNobGlmeS1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90ZWNobGlmeS1maWx0ZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGVjaGxpZnlGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBmaWx0ZXJGb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmaWx0ZXJDb25maWc6IGFueTtcbiAgQE91dHB1dCgpIGZpbHRlclVwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVxdWVzdEhlbHBlclNlcnZpY2U6IFJlcXVlc3RIZWxwZXJTZXJ2aWNlLCBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBsaXN0ZW4gZm9yIGZpbHRlciBjaGFuZ2VzXG4gICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zOiBhbnkgPSB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHZhbHVlKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVRdWVyeVBhcmFtcyhwYXJhbXMpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZSBmb3JtIHdpdGggcXVlcnkgcGFyYW1zXG4gICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVGb3JtV2l0aFF1ZXJ5UGFyYW1zKHRoaXMuZmlsdGVyRm9ybSwge1xuICAgICAgZHVyYXRpb246IHsgbnVtYmVyOiB0cnVlIH0sXG4gICAgICBleHBpcnlfZHVyYXRpb246IHsgbnVtYmVyOiB0cnVlIH0sXG4gICAgICBwYXltZW50X21ldGhvZF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIHBheW1lbnRfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIHByb2plY3RfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBpbnZvaWNlX3N0YXR1c19pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGN1c3RvbWVyX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgY29zdF9jYXRlZ29yeV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIHRlYW1fbWVtYmVyX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgdGFza19zdGF0dXNfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBhc3NldF9hY2NvdW50X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgZGVwcmVjaWF0aW9uX21ldGhvZF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGRlcHJlY2lhdGlvbl9leHBlbnNlX2FjY291bnRfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBmaXhlZF9hc3NldF90eXBlX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgZml4ZWRfYXNzZXRfZG9jdW1lbnRfdHlwZV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIHNlcnZpY2VfY2VudGVyX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgZml4ZWRfYXNzZXRfbWFpbnRlbmFuY2Vfc3RhdHVzX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgbWlsZXN0b25lX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgcHJvZHVjdF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIHN1cHBsaWVyX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgbWVhc3VyZV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIHR5cGVfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBmaXhlZF9hc3NldF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIC8vIGxpc3RlbiBmb3Igcm91dGUgY2hhbmdlXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGRlYm91bmNlVGltZSg4MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XG4gICAgICB0aGlzLmZpbHRlclVwZGF0ZWQuZW1pdCh0aGlzLmZpbHRlckZvcm0udmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRGaWVsZChmaWVsZDogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldChmaWVsZCk/LnNldFZhbHVlKCcnKTtcbiAgfVxuXG4gIG9uRHVyYXRpb25DaGFuZ2UodGltZWxpbmVWYWx1ZTogVGltZWxpbmVWYWx1ZSkge1xuICAgIGxldCB7IGRhdGVfdG8sIGRhdGVfZnJvbSB9ID0gdGltZWxpbmVWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgZGF0ZV9mcm9tOiBkYXRlX2Zyb20gPyBtb21lbnQoZGF0ZV9mcm9tKS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6ICcnLFxuICAgICAgICBkYXRlX3RvOiBkYXRlX3RvID8gbW9tZW50KGRhdGVfdG8pLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogJycsXG4gICAgICB9LFxuICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBleHBpcnkgZGF0ZSBmcm9tIGFuZCBkYXRlIHRvIG9uIHZhbHVlIGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVsaW5lVmFsdWVcbiAgICovXG4gIG9uRXhwaXJ5RHVyYXRpb25DaGFuZ2UodGltZWxpbmVWYWx1ZTogVGltZWxpbmVWYWx1ZSkge1xuICAgIGxldCB7IGRhdGVfdG8sIGRhdGVfZnJvbSB9ID0gdGltZWxpbmVWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBleHBpcnlfZGF0ZV9mcm9tOiBkYXRlX2Zyb20gPyBtb21lbnQoZGF0ZV9mcm9tKS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6ICcnLFxuICAgICAgZXhwaXJ5X2RhdGVfdG86IGRhdGVfdG8gPyBtb21lbnQoZGF0ZV90bykuZm9ybWF0KCdZWVlZLU1NLUREJykgOiAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gYXR0cmlidXRlXG4gICAqIEBwYXJhbSBmaWVsZFxuICAgKi9cbiAgZ2V0RmlsdGVyQ29uZmlnKGF0dHJpYnV0ZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckNvbmZpZykgcmV0dXJuICcnO1xuICAgIC8vIENoZWNrIGlmIHRoZSBmaWVsZCBhbmQgYXR0cmlidXRlIGV4aXN0IGluIHRoZSBmaWx0ZXIgY29uZmlnLCByZXR1cm4gdGhlIHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiB0aGlzLmZpbHRlckNvbmZpZ1tmaWVsZF0gJiYgdGhpcy5maWx0ZXJDb25maWdbZmllbGRdW2F0dHJpYnV0ZV0gIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLmZpbHRlckNvbmZpZ1tmaWVsZF1bYXR0cmlidXRlXVxuICAgICAgOiAnJztcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgZnhMYXlvdXQgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGZ4TGF5b3V0R2FwPVwiMTBweFwiPlxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnc2VhcmNoJylcIiBbYXBwZWFyYW5jZV09XCJnZXRGaWx0ZXJDb25maWcoJ2FwcGVhcmFuY2UnLCAnc2VhcmNoJylcIj5cbiAgICA8bWF0LWxhYmVsPlNlYXJjaDwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIiBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwiZ2V0RmlsdGVyQ29uZmlnKCdwbGFjZWhvbGRlcicsICdzZWFyY2gnKVwiIC8+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnNlYXJjaFwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cInJlc2V0RmllbGQoJ3NlYXJjaCcpXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxhcHAtdGltZWxpbmUtZmlsdGVyXG4gICAgKm5nSWY9XCJmaWx0ZXJGb3JtPy5nZXQoJ2R1cmF0aW9uJylcIlxuICAgIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICBbbGFiZWxUZXh0XT1cImdldEZpbHRlckNvbmZpZygnbGFiZWwnLCAnZHVyYXRpb24nKVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiZ2V0RmlsdGVyQ29uZmlnKCdhcHBlYXJhbmNlJywgJ2R1cmF0aW9uJylcIlxuICAgIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9uXCJcbiAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRHVyYXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgW3Nob3dDbGVhckJ1dHRvbl09XCJ0cnVlXCJcbiAgICBbZGF0ZUZyb21dPVwiZmlsdGVyRm9ybS52YWx1ZT8uZGF0ZV9mcm9tXCJcbiAgICBbZGF0ZVRvXT1cImZpbHRlckZvcm0udmFsdWU/LmRhdGVfdG9cIlxuICA+PC9hcHAtdGltZWxpbmUtZmlsdGVyPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdwYXltZW50X21ldGhvZF9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+UGF5bWVudCBNZXRob2Q8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRfbWV0aG9kX2lkc1wiXG4gICAgICBhcGlVcmw9XCJhcGkvcGF5bWVudC1tZXRob2RzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgIFtlbmFibGVTZWFyY2hdPVwiZmFsc2VcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8ucGF5bWVudF9tZXRob2RfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgncGF5bWVudF9tZXRob2RfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdwYXltZW50X2FjY291bnRfaWRzJylcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5neFBlcm1pc3Npb25zT25seT1cIlsnYWNjb3VudGluZ2NvbW1vbl9hY2NvdW50LnJlYWQnXVwiPlxuICAgICAgPG1hdC1sYWJlbD57eyBnZXRGaWx0ZXJDb25maWcoJ2xhYmVsJywgJ3BheW1lbnRfYWNjb3VudF9pZHMnKSB8fCAnUGF5bWVudCBBY2NvdW50JyB9fTwvbWF0LWxhYmVsPlxuICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRfYWNjb3VudF9pZHNcIlxuICAgICAgICBbYXBpVXJsXT1cImdldEZpbHRlckNvbmZpZygnYXBpVXJsJywgJ3BheW1lbnRfYWNjb3VudF9pZHMnKSB8fCAnYXBpL2FjY291bnRzJ1wiXG4gICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LnBheW1lbnRfYWNjb3VudF9pZHNcIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgbWF0U3VmZml4XG4gICAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdwYXltZW50X2FjY291bnRfaWRzJylcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ2ludm9pY2Vfc3RhdHVzX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5JbnZvaWNlIFN0YXR1czwvbWF0LWxhYmVsPlxuICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW52b2ljZV9zdGF0dXNfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9pbnZvaWNlLXN0YXR1c2VzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/Lmludm9pY2Vfc3RhdHVzX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2ludm9pY2Vfc3RhdHVzX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnY3VzdG9tZXJfaWRzJylcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5neFBlcm1pc3Npb25zT25seT1cIlsnY3VzdG9tZXJfcmVhZCddXCI+XG4gICAgICA8bWF0LWxhYmVsPkN1c3RvbWVyPC9tYXQtbGFiZWw+XG4gICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY3VzdG9tZXJfaWRzXCJcbiAgICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgICBhcGlVcmw9XCJhcGkvY3VzdG9tZXJzXCJcbiAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8YnV0dG9uICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uY3VzdG9tZXJfaWRzXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwicmVzZXRGaWVsZCgnY3VzdG9tZXJfaWRzJylcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgncHJvamVjdF9pZHMnKSAmJiBnZXRGaWx0ZXJDb25maWcoJ2Rpc2FibGVkJywgJ3Byb2plY3RfaWRzJykgPT09IGZhbHNlXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ3hQZXJtaXNzaW9uc09ubHk9XCJbJ3Byb2plY3QucmVhZCddXCI+XG4gICAgICA8bWF0LWxhYmVsPlByb2plY3Q8L21hdC1sYWJlbD5cbiAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9qZWN0X2lkc1wiXG4gICAgICAgIGFwaVVybD1cImFwaS9wcm9qZWN0c1wiXG4gICAgICAgIHRpdGxlRmllbGQ9XCJwcm9qZWN0X25hbWVcIlxuICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5wcm9qZWN0X2lkc1wiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cInJlc2V0RmllbGQoJ3Byb2plY3RfaWRzJylcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdwcm9kdWN0X2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5Qcm9kdWN0PC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0X2lkc1wiXG4gICAgICBhcGlVcmw9XCJhcGkvcHJvZHVjdHNcIlxuICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5wcm9kdWN0X2lkc1wiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cInJlc2V0RmllbGQoJ3Byb2R1Y3RfaWRzJylcIj5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ21lYXN1cmVfaWRzJylcIj5cbiAgICA8bWF0LWxhYmVsPk1lYXN1cmU8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1lYXN1cmVfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9wcm9kdWN0LW1lYXN1cmVzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8ubWVhc3VyZV9pZHNcIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IChjbGljayk9XCJyZXNldEZpZWxkKCdtZWFzdXJlX2lkcycpXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxuZy1jb250YWluZXIgKm5neFBlcm1pc3Npb25zT25seT1cIlsnc3VwcGxpZXIucmVhZCddXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ3N1cHBsaWVyX2lkcycpXCIgW2FwcGVhcmFuY2VdPVwiZ2V0RmlsdGVyQ29uZmlnKCdhcHBlYXJhbmNlJywgJ3N1cHBsaWVyX2lkcycpXCI+XG4gICAgICA8bWF0LWxhYmVsPlN1cHBsaWVyPC9tYXQtbGFiZWw+XG4gICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3VwcGxpZXJfaWRzXCJcbiAgICAgICAgdGl0bGVGaWVsZD1cImNvbXBhbnlfbmFtZVwiXG4gICAgICAgIGFwaVVybD1cImFwaS9zdXBwbGllcnNcIlxuICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5zdXBwbGllcl9pZHNcIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IChjbGljayk9XCJyZXNldEZpZWxkKCdzdXBwbGllcl9pZHMnKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGFwcC10aW1lbGluZS1maWx0ZXJcbiAgICBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgW2xhYmVsVGV4dF09XCJnZXRGaWx0ZXJDb25maWcoJ2xhYmVsJywgJ2V4cGlyeV9kdXJhdGlvbicpXCJcbiAgICAqbmdJZj1cImZpbHRlckZvcm0/LmdldCgnZXhwaXJ5X2R1cmF0aW9uJylcIlxuICAgIGZvcm1Db250cm9sTmFtZT1cImV4cGlyeV9kdXJhdGlvblwiXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkV4cGlyeUR1cmF0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgW2RhdGVGcm9tXT1cImZpbHRlckZvcm0udmFsdWU/LmV4cGlyeV9kYXRlX2Zyb21cIlxuICAgIFtkYXRlVG9dPVwiZmlsdGVyRm9ybS52YWx1ZT8uZXhwaXJ5X2RhdGVfdG9cIlxuICA+PC9hcHAtdGltZWxpbmUtZmlsdGVyPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdjb3N0X2NhdGVnb3J5X2lkcycpXCIgc3R5bGU9XCJ3aWR0aDogMTUwcHhcIj5cbiAgICA8bWF0LWxhYmVsPkNvc3QgQ2F0ZWdvcnk8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvc3RfY2F0ZWdvcnlfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9jb3N0LWNvZGUtY2F0ZWdvcmllc1wiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5jb3N0X2NhdGVnb3J5X2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2Nvc3RfY2F0ZWdvcnlfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ21pbGVzdG9uZV9pZHMnKVwiIHN0eWxlPVwid2lkdGg6IDE1MHB4XCI+XG4gICAgPG1hdC1sYWJlbD5NaWxlc3RvbmU8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1pbGVzdG9uZV9pZHNcIlxuICAgICAgYXBpVXJsPVwiYXBpL21pbGVzdG9uZXNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5taWxlc3RvbmVfaWRzXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwicmVzZXRGaWVsZCgnbWlsZXN0b25lX2lkcycpXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCd0ZWFtX21lbWJlcl9pZHMnKVwiPlxuICAgIDxtYXQtbGFiZWw+QXNzaWduZWU8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3BlcnNvbnNcIiBmb3JtQ29udHJvbE5hbWU9XCJ0ZWFtX21lbWJlcl9pZHNcIiB0aXRsZUZpZWxkPVwibmFtZVwiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8udGVhbV9tZW1iZXJfaWRzXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwicmVzZXRGaWVsZCgndGVhbV9tZW1iZXJfaWRzJylcIj5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ2ZpeGVkX2Fzc2V0X3R5cGVfaWRzJylcIj5cbiAgICA8bWF0LWxhYmVsPlR5cGU8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeGVkX2Fzc2V0X3R5cGVfaWRzXCJcbiAgICAgIGFwaVVybD1cImFwaS9hY2NvdW50aW5nLXBsdXMvZml4ZWQtYXNzZXQtdHlwZXNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uZml4ZWRfYXNzZXRfdHlwZV9pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdmaXhlZF9hc3NldF90eXBlX2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdmaXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5UeXBlPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkc1wiXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudGluZy1wbHVzL2ZpeGVkLWFzc2V0LWRvY3VtZW50LXR5cGVzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgIFtlbmFibGVTZWFyY2hdPVwiZ2V0RmlsdGVyQ29uZmlnKCdlbmFibGVTZWFyY2gnLCAnZml4ZWRfYXNzZXRfZG9jdW1lbnRfdHlwZV9pZHMnKVwiXG4gICAgPjwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5maXhlZF9hc3NldF9kb2N1bWVudF90eXBlX2lkc1wiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIG1hdFN1ZmZpeFxuICAgICAgKGNsaWNrKT1cInJlc2V0RmllbGQoJ2ZpeGVkX2Fzc2V0X2RvY3VtZW50X3R5cGVfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPGRpdiAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdmaXhlZF9hc3NldF9kb2N1bWVudF9zdGF0dXMnKVwiPlxuICAgIDxzbWFsbCBjbGFzcz1cIm1yLTIgdGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cImdldEZpbHRlckNvbmZpZygnc2hvd0xhYmVsJywgJ2ZpeGVkX2Fzc2V0X2RvY3VtZW50X3N0YXR1cycpXCI+XG4gICAgICBTdGF0dXNcbiAgICA8L3NtYWxsPlxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBmb3JtQ29udHJvbE5hbWU9XCJmaXhlZF9hc3NldF9kb2N1bWVudF9zdGF0dXNcIiBbbXVsdGlwbGVdPVwiZmFsc2VcIj5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImFsbFwiPkFsbDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJhY3RpdmVcIj5BY3RpdmU8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiZXhwaXJlZFwiPkV4cGlyZWQ8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdhc3NldF9hY2NvdW50X2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5Bc3NldCBBY2NvdW50PC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJhc3NldF9hY2NvdW50X2lkc1wiXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudHNcIlxuICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uYXNzZXRfYWNjb3VudF9pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdhc3NldF9hY2NvdW50X2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdkZXByZWNpYXRpb25fZXhwZW5zZV9hY2NvdW50X2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5EZXByZWNpYXRpb24gRXhwZW5zZSBBY2NvdW50PC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudHNcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVwcmVjaWF0aW9uX2V4cGVuc2VfYWNjb3VudF9pZHNcIlxuICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZT8uZGVwcmVjaWF0aW9uX2V4cGVuc2VfYWNjb3VudF9pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdkZXByZWNpYXRpb25fZXhwZW5zZV9hY2NvdW50X2lkcycpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImZpbHRlckZvcm0uZ2V0KCdkZXByZWNpYXRpb25fbWV0aG9kX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5EZXByZWNpYXRpb24gTWV0aG9kPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXByZWNpYXRpb25fbWV0aG9kX2lkc1wiXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudGluZy1wbHVzL2RlcHJlY2lhdGlvbi1tZXRob2RzXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwicmVzZXRGaWVsZCgnZGVwcmVjaWF0aW9uX21ldGhvZF9pZHMnKVwiXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LmRlcHJlY2lhdGlvbl9tZXRob2RfaWRzXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgndGFza19zdGF0dXNfaWRzJylcIiBzdHlsZT1cIndpZHRoOiAxNTBweFwiPlxuICAgIDxtYXQtbGFiZWw+U3RhdHVzPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBhcGlVcmw9XCJhcGkvdGFzay1zdGF0dXNlc1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YXNrX3N0YXR1c19pZHNcIlxuICAgICAgdGl0bGVGaWVsZD1cInRpdGxlXCJcbiAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgIFtlbmFibGVTZWFyY2hdPVwiZmFsc2VcIlxuICAgID5cbiAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy50YXNrX3N0YXR1c19pZHNcIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IChjbGljayk9XCJyZXNldEZpZWxkKCd0YXNrX3N0YXR1c19pZHMnKVwiPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnc2VydmljZV9jZW50ZXJfaWRzJylcIj5cbiAgICA8bWF0LWxhYmVsPlNlcnZpY2UgQ2VudGVyPC9tYXQtbGFiZWw+XG4gICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICBhcGlVcmw9XCJhcGkvYWNjb3VudGluZy1wbHVzL3NlcnZpY2UtY2VudGVyc1wiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZXJ2aWNlX2NlbnRlcl9pZHNcIlxuICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgW2VuYWJsZVNlYXJjaF09XCJmYWxzZVwiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgPlxuICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlPy5zZXJ2aWNlX2NlbnRlcl9pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdzZXJ2aWNlX2NlbnRlcl9pZHMnKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJmaWx0ZXJGb3JtLmdldCgnZml4ZWRfYXNzZXRfbWFpbnRlbmFuY2Vfc3RhdHVzX2lkcycpXCI+XG4gICAgPG1hdC1sYWJlbD5TdGF0dXM8L21hdC1sYWJlbD5cbiAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3JcbiAgICAgIGFwaVVybD1cImFwaS9hY2NvdW50aW5nLXBsdXMvZml4ZWQtYXNzZXQtbWFpbnRlbmFuY2Utc3RhdHVzZXNcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZml4ZWRfYXNzZXRfbWFpbnRlbmFuY2Vfc3RhdHVzX2lkc1wiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICBbZW5hYmxlU2VhcmNoXT1cImZhbHNlXCJcbiAgICA+XG4gICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImZpbHRlckZvcm0udmFsdWU/LmZpeGVkX2Fzc2V0X21haW50ZW5hbmNlX3N0YXR1c19pZHNcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBtYXRTdWZmaXhcbiAgICAgIChjbGljayk9XCJyZXNldEZpZWxkKCdmaXhlZF9hc3NldF9tYWludGVuYW5jZV9zdGF0dXNfaWRzJylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZmlsdGVyRm9ybS5nZXQoJ2dyb3VwX2J5JylcIj5cbiAgICA8bWF0LWxhYmVsPkdyb3VwIEJ5PC9tYXQtbGFiZWw+XG4gICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBfYnlcIj5cbiAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwid2Vla1wiPldlZWs8L21hdC1vcHRpb24+XG4gICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm1vbnRoXCI+TW9udGg8L21hdC1vcHRpb24+XG4gICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInllYXJcIj5ZZWFyPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZm9ybT5cbiJdfQ==
@@ -1,9 +1,10 @@
1
- import { NgModule } from "@angular/core";
2
- import { CommonModule } from "@angular/common";
3
- import { TechlifyFilterComponent } from "./techlify-filter.component";
4
- import { ReactiveFormsModule } from "@angular/forms";
5
- import { FlexLayoutModule } from "@angular/flex-layout";
6
- import { MaterialModule, SearchableSelectorModule, TimelineFilterModule, } from "ngx-techlify-core";
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { TechlifyFilterComponent } from './techlify-filter.component';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import { FlexLayoutModule } from '@angular/flex-layout';
6
+ import { MaterialModule, SearchableSelectorModule, TimelineFilterModule } from 'ngx-techlify-core';
7
+ import { NgxPermissionsModule } from 'ngx-permissions';
7
8
  import * as i0 from "@angular/core";
8
9
  export class TechlifyFilterModule {
9
10
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TechlifyFilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -12,13 +13,15 @@ export class TechlifyFilterModule {
12
13
  FlexLayoutModule,
13
14
  SearchableSelectorModule,
14
15
  TimelineFilterModule,
15
- MaterialModule], exports: [TechlifyFilterComponent] });
16
+ MaterialModule,
17
+ NgxPermissionsModule], exports: [TechlifyFilterComponent] });
16
18
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TechlifyFilterModule, imports: [CommonModule,
17
19
  ReactiveFormsModule,
18
20
  FlexLayoutModule,
19
21
  SearchableSelectorModule,
20
22
  TimelineFilterModule,
21
- MaterialModule] });
23
+ MaterialModule,
24
+ NgxPermissionsModule] });
22
25
  }
23
26
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TechlifyFilterModule, decorators: [{
24
27
  type: NgModule,
@@ -31,8 +34,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31
34
  SearchableSelectorModule,
32
35
  TimelineFilterModule,
33
36
  MaterialModule,
37
+ NgxPermissionsModule,
34
38
  ],
35
39
  exports: [TechlifyFilterComponent],
36
40
  }]
37
41
  }] });
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZmlsdGVyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3RlY2hsaWZ5LWZpbHRlci90ZWNobGlmeS1maWx0ZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLG9CQUFvQixHQUNyQixNQUFNLG1CQUFtQixDQUFDOztBQWMzQixNQUFNLE9BQU8sb0JBQW9CO3dHQUFwQixvQkFBb0I7eUdBQXBCLG9CQUFvQixpQkFYaEIsdUJBQXVCLGFBRXBDLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsZ0JBQWdCO1lBQ2hCLHdCQUF3QjtZQUN4QixvQkFBb0I7WUFDcEIsY0FBYyxhQUVOLHVCQUF1Qjt5R0FFdEIsb0JBQW9CLFlBVDdCLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsZ0JBQWdCO1lBQ2hCLHdCQUF3QjtZQUN4QixvQkFBb0I7WUFDcEIsY0FBYzs7NEZBSUwsb0JBQW9CO2tCQVpoQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsd0JBQXdCO3dCQUN4QixvQkFBb0I7d0JBQ3BCLGNBQWM7cUJBQ2Y7b0JBQ0QsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUM7aUJBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgVGVjaGxpZnlGaWx0ZXJDb21wb25lbnQgfSBmcm9tIFwiLi90ZWNobGlmeS1maWx0ZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBGbGV4TGF5b3V0TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2ZsZXgtbGF5b3V0XCI7XG5pbXBvcnQge1xuICBNYXRlcmlhbE1vZHVsZSxcbiAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICBUaW1lbGluZUZpbHRlck1vZHVsZSxcbn0gZnJvbSBcIm5neC10ZWNobGlmeS1jb3JlXCI7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1RlY2hsaWZ5RmlsdGVyQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZsZXhMYXlvdXRNb2R1bGUsXG4gICAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICAgIFRpbWVsaW5lRmlsdGVyTW9kdWxlLFxuICAgIE1hdGVyaWFsTW9kdWxlLFxuICBdLFxuICBleHBvcnRzOiBbVGVjaGxpZnlGaWx0ZXJDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBUZWNobGlmeUZpbHRlck1vZHVsZSB7fVxuIl19
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZmlsdGVyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3RlY2hsaWZ5LWZpbHRlci90ZWNobGlmeS1maWx0ZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFldkQsTUFBTSxPQUFPLG9CQUFvQjt3R0FBcEIsb0JBQW9CO3lHQUFwQixvQkFBb0IsaUJBWmhCLHVCQUF1QixhQUVwQyxZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQix3QkFBd0I7WUFDeEIsb0JBQW9CO1lBQ3BCLGNBQWM7WUFDZCxvQkFBb0IsYUFFWix1QkFBdUI7eUdBRXRCLG9CQUFvQixZQVY3QixZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQix3QkFBd0I7WUFDeEIsb0JBQW9CO1lBQ3BCLGNBQWM7WUFDZCxvQkFBb0I7OzRGQUlYLG9CQUFvQjtrQkFiaEMsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDdkMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixnQkFBZ0I7d0JBQ2hCLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3dCQUNwQixjQUFjO3dCQUNkLG9CQUFvQjtxQkFDckI7b0JBQ0QsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUM7aUJBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUZWNobGlmeUZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4vdGVjaGxpZnktZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmxleExheW91dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2ZsZXgtbGF5b3V0JztcbmltcG9ydCB7IE1hdGVyaWFsTW9kdWxlLCBTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUsIFRpbWVsaW5lRmlsdGVyTW9kdWxlIH0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgTmd4UGVybWlzc2lvbnNNb2R1bGUgfSBmcm9tICduZ3gtcGVybWlzc2lvbnMnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtUZWNobGlmeUZpbHRlckNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGbGV4TGF5b3V0TW9kdWxlLFxuICAgIFNlYXJjaGFibGVTZWxlY3Rvck1vZHVsZSxcbiAgICBUaW1lbGluZUZpbHRlck1vZHVsZSxcbiAgICBNYXRlcmlhbE1vZHVsZSxcbiAgICBOZ3hQZXJtaXNzaW9uc01vZHVsZSxcbiAgXSxcbiAgZXhwb3J0czogW1RlY2hsaWZ5RmlsdGVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgVGVjaGxpZnlGaWx0ZXJNb2R1bGUge31cbiJdfQ==