@annalib/anna-core 0.0.3 → 0.0.4

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 (239) hide show
  1. package/annalib-anna-core.d.ts +5 -0
  2. package/esm2020/annalib-anna-core.mjs +5 -0
  3. package/esm2020/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +59 -0
  4. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
  5. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
  6. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
  7. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +15 -0
  8. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +21 -0
  9. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
  10. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +34 -0
  11. package/esm2020/lib/anna-core-shared-lib/index.mjs +2 -0
  12. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
  13. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
  14. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +3 -0
  15. package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +26 -0
  16. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +31 -0
  17. package/esm2020/lib/anna-core-shared-lib/public-api.mjs +25 -0
  18. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +180 -0
  19. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +536 -0
  20. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +52 -0
  21. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +133 -0
  22. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +185 -0
  23. package/esm2020/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +43 -0
  24. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +76 -0
  25. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +360 -0
  26. package/esm2020/lib/anna-dropdown-lib/index.mjs +2 -0
  27. package/esm2020/lib/anna-dropdown-lib/public-api.mjs +6 -0
  28. package/esm2020/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +86 -0
  29. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +991 -0
  30. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +125 -0
  31. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
  32. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -0
  33. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -0
  34. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
  35. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -0
  36. package/esm2020/lib/anna-generic-table-lib/index.mjs +2 -0
  37. package/esm2020/lib/anna-generic-table-lib/public-api.mjs +10 -0
  38. package/esm2020/public-api.mjs +7 -0
  39. package/esm2020/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +59 -0
  40. package/esm2020/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +5 -0
  41. package/esm2020/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -0
  42. package/esm2020/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -0
  43. package/esm2020/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
  44. package/esm2020/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +15 -0
  45. package/esm2020/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +21 -0
  46. package/esm2020/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -0
  47. package/esm2020/src/lib/anna-core-shared-lib/constants/shared.constant.mjs +34 -0
  48. package/esm2020/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
  49. package/esm2020/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
  50. package/esm2020/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +3 -0
  51. package/esm2020/src/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +26 -0
  52. package/esm2020/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +31 -0
  53. package/esm2020/src/lib/anna-core-shared-lib/public-api.mjs +25 -0
  54. package/esm2020/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +180 -0
  55. package/esm2020/src/lib/anna-core-shared-lib/services/anna-filter.service.mjs +536 -0
  56. package/esm2020/src/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +52 -0
  57. package/esm2020/src/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +133 -0
  58. package/esm2020/src/lib/anna-core-shared-lib/services/anna-sort.service.mjs +185 -0
  59. package/esm2020/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +43 -0
  60. package/esm2020/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +5 -0
  61. package/esm2020/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +76 -0
  62. package/esm2020/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +360 -0
  63. package/esm2020/src/lib/anna-dropdown-lib/public-api.mjs +6 -0
  64. package/esm2020/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +86 -0
  65. package/esm2020/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +5 -0
  66. package/esm2020/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +991 -0
  67. package/esm2020/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +125 -0
  68. package/esm2020/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
  69. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -0
  70. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -0
  71. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
  72. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -0
  73. package/esm2020/src/lib/anna-generic-table-lib/public-api.mjs +10 -0
  74. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +1294 -0
  75. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +1 -0
  76. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +474 -0
  77. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +1 -0
  78. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +1887 -0
  79. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +1 -0
  80. package/fesm2015/annalib-anna-core.mjs +3629 -0
  81. package/fesm2015/annalib-anna-core.mjs.map +1 -0
  82. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +1294 -0
  83. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +1 -0
  84. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +472 -0
  85. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +1 -0
  86. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +1886 -0
  87. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +1 -0
  88. package/fesm2020/annalib-anna-core.mjs +3626 -0
  89. package/fesm2020/annalib-anna-core.mjs.map +1 -0
  90. package/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +14 -0
  91. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -0
  92. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -0
  93. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -0
  94. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -0
  95. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +11 -0
  96. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -0
  97. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +32 -0
  98. package/lib/anna-core-shared-lib/index.d.ts +1 -0
  99. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
  100. package/{src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.ts → lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts} +9 -21
  101. package/{src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.ts → lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts} +17 -27
  102. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +21 -0
  103. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -0
  104. package/{src/lib/anna-core-shared-lib/public-api.ts → lib/anna-core-shared-lib/public-api.d.ts} +0 -11
  105. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +25 -0
  106. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +68 -0
  107. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +14 -0
  108. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -0
  109. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +23 -0
  110. package/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +11 -0
  111. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +29 -0
  112. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +67 -0
  113. package/lib/anna-dropdown-lib/index.d.ts +1 -0
  114. package/{src/lib/anna-dropdown-lib/public-api.ts → lib/anna-dropdown-lib/public-api.d.ts} +1 -4
  115. package/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +21 -0
  116. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +171 -0
  117. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +27 -0
  118. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -0
  119. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -0
  120. package/{src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.ts → lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts} +0 -0
  121. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -0
  122. package/{src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.ts → lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts} +0 -0
  123. package/lib/anna-generic-table-lib/index.d.ts +1 -0
  124. package/{src/lib/anna-generic-table-lib/public-api.ts → lib/anna-generic-table-lib/public-api.d.ts} +0 -5
  125. package/package.json +61 -17
  126. package/{src/public-api.ts → public-api.d.ts} +0 -5
  127. package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +14 -0
  128. package/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.d.ts +5 -0
  129. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -0
  130. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -0
  131. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -0
  132. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -0
  133. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +11 -0
  134. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -0
  135. package/src/lib/anna-core-shared-lib/constants/shared.constant.d.ts +32 -0
  136. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
  137. package/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +95 -0
  138. package/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +70 -0
  139. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +21 -0
  140. package/src/lib/anna-core-shared-lib/package.json +10 -0
  141. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -0
  142. package/src/lib/anna-core-shared-lib/public-api.d.ts +18 -0
  143. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +25 -0
  144. package/src/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +68 -0
  145. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +14 -0
  146. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -0
  147. package/src/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +23 -0
  148. package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +11 -0
  149. package/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.d.ts +5 -0
  150. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +29 -0
  151. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +67 -0
  152. package/src/lib/anna-dropdown-lib/package.json +10 -0
  153. package/src/lib/anna-dropdown-lib/public-api.d.ts +3 -0
  154. package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +21 -0
  155. package/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.d.ts +5 -0
  156. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +171 -0
  157. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +27 -0
  158. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -0
  159. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -0
  160. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -0
  161. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -0
  162. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -0
  163. package/src/lib/anna-generic-table-lib/package.json +10 -0
  164. package/src/lib/anna-generic-table-lib/public-api.d.ts +6 -0
  165. package/.browserslistrc +0 -16
  166. package/karma.conf.js +0 -44
  167. package/ng-package.json +0 -10
  168. package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.ts +0 -42
  169. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.html +0 -22
  170. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.scss +0 -0
  171. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.spec.ts +0 -25
  172. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.ts +0 -15
  173. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.html +0 -20
  174. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.scss +0 -0
  175. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.spec.ts +0 -25
  176. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.ts +0 -15
  177. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.html +0 -3
  178. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.scss +0 -16
  179. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.spec.ts +0 -24
  180. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.ts +0 -20
  181. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.html +0 -23
  182. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.scss +0 -0
  183. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.spec.ts +0 -25
  184. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.ts +0 -15
  185. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.html +0 -15
  186. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.scss +0 -0
  187. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.spec.ts +0 -25
  188. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.ts +0 -19
  189. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.html +0 -14
  190. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.scss +0 -0
  191. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.spec.ts +0 -25
  192. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.ts +0 -15
  193. package/src/lib/anna-core-shared-lib/constants/shared.constant.ts +0 -34
  194. package/src/lib/anna-core-shared-lib/index.ts +0 -1
  195. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.ts +0 -10
  196. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.ts +0 -36
  197. package/src/lib/anna-core-shared-lib/ng-package.json +0 -5
  198. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.ts +0 -26
  199. package/src/lib/anna-core-shared-lib/scss/_colors.scss +0 -107
  200. package/src/lib/anna-core-shared-lib/scss/_filters.scss +0 -486
  201. package/src/lib/anna-core-shared-lib/scss/_fonts.scss +0 -86
  202. package/src/lib/anna-core-shared-lib/scss/_sort.scss +0 -81
  203. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.ts +0 -197
  204. package/src/lib/anna-core-shared-lib/services/anna-filter.service.ts +0 -616
  205. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.ts +0 -50
  206. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.ts +0 -170
  207. package/src/lib/anna-core-shared-lib/services/anna-sort.service.ts +0 -200
  208. package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.ts +0 -31
  209. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.html +0 -29
  210. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.scss +0 -122
  211. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.spec.ts +0 -24
  212. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.ts +0 -76
  213. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.html +0 -129
  214. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.scss +0 -275
  215. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.spec.ts +0 -24
  216. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.ts +0 -410
  217. package/src/lib/anna-dropdown-lib/index.ts +0 -1
  218. package/src/lib/anna-dropdown-lib/ng-package.json +0 -5
  219. package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.ts +0 -56
  220. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.html +0 -848
  221. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.scss +0 -488
  222. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.spec.ts +0 -25
  223. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.ts +0 -1100
  224. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.html +0 -47
  225. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.scss +0 -1
  226. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.spec.ts +0 -24
  227. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.ts +0 -126
  228. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.html +0 -13
  229. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.scss +0 -88
  230. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.spec.ts +0 -25
  231. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.ts +0 -460
  232. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.ts +0 -237
  233. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.ts +0 -204
  234. package/src/lib/anna-generic-table-lib/index.ts +0 -1
  235. package/src/lib/anna-generic-table-lib/ng-package.json +0 -5
  236. package/src/test.ts +0 -27
  237. package/tsconfig.lib.json +0 -16
  238. package/tsconfig.lib.prod.json +0 -10
  239. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,536 @@
1
+ import { Injectable } from "@angular/core";
2
+ // Third party import statements
3
+ import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from "lodash-es";
4
+ import moment from "moment";
5
+ // User defined import statements
6
+ import { AllSelectedStatus, tooltipModelForColumnLevelFiltering } from "../models/anna-tooltip.model";
7
+ import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./anna-date-time-format.service";
10
+ export class AnnaFilterService {
11
+ constructor(dateTimeFormatService) {
12
+ this.dateTimeFormatService = dateTimeFormatService;
13
+ this.tooltipMap = new Map();
14
+ this.tooltipSelectedMap = new Map();
15
+ this.appliedFiltersArray = [];
16
+ this.percentTranslateFunction = (data) => {
17
+ const val = data.toFixed(1) + "%";
18
+ return val;
19
+ };
20
+ this.currencyTranslateFunction = (data) => {
21
+ if (data >= 1000) {
22
+ const val = (data / 1000).toFixed(1) + "k";
23
+ return "$" + val;
24
+ }
25
+ else if (data != Math.floor(data)) {
26
+ return data.toFixed(1).toString();
27
+ }
28
+ return "$" + data;
29
+ };
30
+ this.normalTranslateFunction = (data) => {
31
+ if (data >= 1000) {
32
+ const val = (data / 1000).toFixed(1) + "k";
33
+ return val;
34
+ }
35
+ else if (data != Math.floor(data)) {
36
+ return data.toFixed(1).toString();
37
+ }
38
+ return data.toString();
39
+ };
40
+ console.log("AnnaFilterService service created.");
41
+ const sliderArr = [
42
+ "rcvPreempt",
43
+ "osPreempt",
44
+ "rcvUnderDly",
45
+ "postedAudPercent",
46
+ "booked",
47
+ "spots",
48
+ "grp",
49
+ "cpp",
50
+ "imps",
51
+ "cpm",
52
+ "osUnderDly",
53
+ "totalWeeks",
54
+ "WeekNumber",
55
+ "Rate",
56
+ "OrderedRatingsOrImpressions",
57
+ "PostedRatingsOrImpressions", ,
58
+ "postedAudPercent",
59
+ "postedAdu",
60
+ "scheduledAdu",
61
+ "audienceDeficit",
62
+ "offeredMGs",
63
+ "outstandingPE",
64
+ "offeredADUs",
65
+ "udDeficitValue",
66
+ "bookedValue",
67
+ "bookedSpots",
68
+ "userChanges"
69
+ ];
70
+ const calendarArr = ["period", "AirDate", "flightStartDate", "flightEndDate", "date", "startDate", "endDate"];
71
+ const timeArr = ["StartTimeForFilter", "EndTimeForFilter",
72
+ "start_time_for_filter", "end_time_for_filter", "startEndTimeMulti"];
73
+ this.sliderSet = new Set(sliderArr);
74
+ this.calendarSet = new Set(calendarArr);
75
+ this.timeSet = new Set(timeArr);
76
+ }
77
+ returnMaxAndMinValue(data, key, isMin) {
78
+ data = data.filter((obj) => !["", "-", null].includes(obj[key]));
79
+ const values = data.map((x) => x[key]);
80
+ let valueToReturn = isMin ? min(values) : max(values);
81
+ return valueToReturn;
82
+ }
83
+ returnMinAndMaxDate(data, key) {
84
+ data = data.filter((obj) => !["", "-", null].includes(obj[key]));
85
+ let DateArr = data.map((obj) => moment(obj[key]));
86
+ let minDate = moment.min(DateArr);
87
+ let maxDate = moment.max(DateArr);
88
+ return [minDate, maxDate];
89
+ }
90
+ isTooltipActive(header) {
91
+ let set = new Set(this.appliedFiltersArray);
92
+ return (set.has(header[0])) || (set.has(header[1]));
93
+ }
94
+ clearColumnFilter() {
95
+ this.tooltipSelectedMap.delete(this.selectedRadio);
96
+ if (this.tooltipMap.has(this.selectedRadio)) {
97
+ this.tooltipMap.delete(this.selectedRadio);
98
+ }
99
+ if (this.selectedRadio === "postedAdu") {
100
+ this.subRadioButton = "required";
101
+ this.tooltipSelectedMap.delete("isAudRequired");
102
+ }
103
+ let appliedFilterSet = new Set(this.appliedFiltersArray);
104
+ appliedFilterSet.delete(this.selectedRadio);
105
+ this.appliedFiltersArray = [...appliedFilterSet];
106
+ }
107
+ populateSliderTooltip(completeData, filteredData) {
108
+ let minValue;
109
+ let maxValue;
110
+ if (this.appliedFiltersArray.length > 0 &&
111
+ this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
112
+ let subsetData;
113
+ let subfilterApplied = false;
114
+ //applying all filterexcept the current filter
115
+ if (this.selectedRadio === "postedAdu" && this.tooltipSelectedMap.has("isAudRequired")) {
116
+ this.tooltipSelectedMap.delete("isAudRequired");
117
+ subfilterApplied = true;
118
+ }
119
+ subsetData = this.filterData(completeData, this.selectedRadio);
120
+ //need to find min and max value for
121
+ minValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, true);
122
+ maxValue = this.returnMaxAndMinValue(subsetData, this.selectedRadio, false);
123
+ if (this.selectedRadio === "postedAdu" && subfilterApplied) {
124
+ this.tooltipSelectedMap.set("isAudRequired", [false]);
125
+ }
126
+ }
127
+ else {
128
+ minValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, true);
129
+ maxValue = this.returnMaxAndMinValue(filteredData, this.selectedRadio, false);
130
+ }
131
+ this.ngxSliderObj = this.setOptionValues(minValue, maxValue);
132
+ if (this.translateFunc === "normal") {
133
+ this.ngxSliderObj.translate = this.normalTranslateFunction;
134
+ }
135
+ else if (this.translateFunc === "percent") {
136
+ this.ngxSliderObj.translate = this.percentTranslateFunction;
137
+ }
138
+ else if (this.translateFunc === "currency") {
139
+ this.ngxSliderObj.translate = this.currencyTranslateFunction;
140
+ }
141
+ return this.ngxSliderObj;
142
+ }
143
+ setOptionValues(minValue, maxValue) {
144
+ return {
145
+ floor: minValue,
146
+ ceil: maxValue
147
+ };
148
+ }
149
+ populateTooltip(selectedColumnName, completeData, filteredData) {
150
+ let tooltipData;
151
+ if (this.appliedFiltersArray.length === 0) {
152
+ tooltipData = this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
153
+ tooltipData.forEach((item) => (item.isHidden = false));
154
+ }
155
+ else if (selectedColumnName === this.appliedFiltersArray[this.appliedFiltersArray.length - 1]) {
156
+ let subsetData = this.filterData(completeData, selectedColumnName); //filter the data without applying the latest filter
157
+ tooltipData = this.showHideFilterCheckbox(subsetData, selectedColumnName);
158
+ }
159
+ else {
160
+ //if it is not the latest filter
161
+ //then filtered Data will be used
162
+ //create the option data
163
+ if (!this.tooltipMap.has(selectedColumnName)) {
164
+ this.populateTooltipDataBasedOnSelectedRadio([selectedColumnName], completeData);
165
+ }
166
+ tooltipData = this.showHideFilterCheckbox(filteredData, selectedColumnName);
167
+ }
168
+ return tooltipData;
169
+ }
170
+ populateTooltipDataBasedOnSelectedRadio(value, originalData) {
171
+ //if the initial tooltip data is already present fetch from the map
172
+ if (this.tooltipMap.has(value[0])) {
173
+ return this.tooltipMap.get(value[0]);
174
+ }
175
+ else {
176
+ //get the unique values from the column and save it in the map
177
+ this.selectedRadio = value[0];
178
+ const data = sortBy(originalData.map((u) => u[this.selectedRadio])).filter(n => n !== null); //sorting the data in alphabetical order
179
+ const dataSet = new Set(data); //created a set from the data
180
+ const toolTipdata = [...dataSet].map((x) => new tooltipModelForColumnLevelFiltering(x));
181
+ this.tooltipMap.set(value[0], toolTipdata); //setting the key value pair in the tooltipMap
182
+ this.tooltipSelectedMap.set(value[0], map(toolTipdata, "data")); //setting the key value pair in tooltipSelectedMap
183
+ return toolTipdata;
184
+ }
185
+ }
186
+ showHideFilterCheckbox(arr, selectedColumnName) {
187
+ let currentSubsetData = uniq(arr.map((u) => u[selectedColumnName]));
188
+ //get the initial tooltip Data
189
+ let tooltipData = this.tooltipMap.get(selectedColumnName);
190
+ //show or hide the value
191
+ tooltipData.forEach((value) => {
192
+ //if the element is not present then hide the element
193
+ let elementToFindIndex = currentSubsetData.findIndex((n) => n === value.data);
194
+ if (elementToFindIndex === -1) {
195
+ value.isHidden = true;
196
+ }
197
+ else {
198
+ //show the element
199
+ value.isHidden = false;
200
+ }
201
+ });
202
+ return tooltipData;
203
+ }
204
+ isAllOptionsSelected() {
205
+ let allSelected;
206
+ let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
207
+ let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
208
+ if (selectedOptionsCount === 0) {
209
+ allSelected = AllSelectedStatus.none;
210
+ }
211
+ else if (selectedOptionsCount > 0 && selectedOptionsCount < totalOptionsCount) {
212
+ allSelected = AllSelectedStatus.fewSelected;
213
+ }
214
+ else {
215
+ allSelected = AllSelectedStatus.allSelected;
216
+ }
217
+ return allSelected;
218
+ }
219
+ populateDatePickerTooltipWithData(completeData, filteredData) {
220
+ let enabledDates;
221
+ //some filter is applied and the latest filter is the date filter
222
+ if (this.appliedFiltersArray.length > 0 &&
223
+ this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === this.selectedRadio) {
224
+ let subsetData;
225
+ //applying all filterexcept thec current filter
226
+ if (this.selectedRadio === "period") {
227
+ subsetData = this.filterData(completeData, "period");
228
+ let minStartDate = this.returnMinAndMaxDate(subsetData, "startDate");
229
+ let maxEndDate = this.returnMinAndMaxDate(subsetData, "endDate");
230
+ enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
231
+ }
232
+ else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
233
+ this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
234
+ subsetData = this.filterData(completeData, this.selectedRadio);
235
+ let minAndMaxDate = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
236
+ enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
237
+ }
238
+ else {
239
+ subsetData = this.filterData(completeData, this.selectedRadio);
240
+ //need to find min and max date for start and end date
241
+ //enabledDates is an arr of minDate and maxDate
242
+ enabledDates = this.returnMinAndMaxDate(subsetData, this.selectedRadio);
243
+ }
244
+ }
245
+ else {
246
+ if (this.selectedRadio === "period") {
247
+ let minStartDate = this.returnMinAndMaxDate(filteredData, "startDate");
248
+ let maxEndDate = this.returnMinAndMaxDate(filteredData, "endDate");
249
+ enabledDates = { minStartDate: minStartDate[0], maxEndDate: maxEndDate[1] };
250
+ }
251
+ else if (this.selectedRadio === "AirDate" || this.selectedRadio === "flightStartDate" ||
252
+ this.selectedRadio === "flightEndDate" || this.selectedRadio == "date") {
253
+ let minAndMaxDate = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
254
+ enabledDates = { minStartDate: minAndMaxDate[0], maxEndDate: minAndMaxDate[1] };
255
+ }
256
+ else {
257
+ //need to find min and max date for start and end date.
258
+ // enabledDates is an arr of minDate and maxDate
259
+ enabledDates = this.returnMinAndMaxDate(filteredData, this.selectedRadio);
260
+ }
261
+ }
262
+ return enabledDates;
263
+ }
264
+ findUniqueDatesWithData(data) {
265
+ let uniqueDates = uniq(data.map((u) => u["date"]));
266
+ let uniqueDatesInNgbDateFormat = [];
267
+ uniqueDates.forEach((date) => {
268
+ uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(moment(date, "MM/DD/YY").format("MM/DD/YYYY")));
269
+ });
270
+ return uniqueDatesInNgbDateFormat;
271
+ }
272
+ isCheckboxSelected(selectedData) {
273
+ selectedData.isSelected = !selectedData.isSelected;
274
+ let allSelected = this.isAllOptionsSelected();
275
+ return allSelected;
276
+ }
277
+ allOptionsClicked(status) {
278
+ let header = this.selectedRadio;
279
+ if (status === 1) {
280
+ this.tooltipMap.get(header).forEach((item) => {
281
+ if (!item.isHidden) {
282
+ item.isSelected = true;
283
+ }
284
+ });
285
+ this.tooltipSelectedMap.set(header, this.tooltipMap
286
+ .get(header)
287
+ .filter((x) => x.isSelected)
288
+ .map((x) => x.data));
289
+ }
290
+ else {
291
+ this.tooltipMap.get(header).forEach((item) => {
292
+ if (!item.isHidden) {
293
+ item.isSelected = false;
294
+ }
295
+ });
296
+ this.tooltipSelectedMap.delete(header);
297
+ }
298
+ }
299
+ reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
300
+ let isFiltered = true;
301
+ isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
302
+ this.removeOrChangeLatestFilterIndex(isFiltered);
303
+ }
304
+ checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
305
+ if (this.selectedRadio == "user" && !this.tooltipMap.has("user")) {
306
+ isFiltered = cloneDeep(isHierarchialUserFiltered);
307
+ }
308
+ else if (this.selectedRadio == "StartTimeForFilter" || this.selectedRadio == "EndTimeForFilter"
309
+ || this.selectedRadio == "start_time_for_filter" || this.selectedRadio == "end_time_for_filter" || this.selectedRadio == "startEndTimeMulti") {
310
+ isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
311
+ }
312
+ else if (this.selectedRadio == "startEndTime" || this.selectedRadio == "TimeBand") {
313
+ isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) || !this.includeZeroTime || !this.includeMultiTime;
314
+ }
315
+ else if (this.sliderSet.has(this.selectedRadio)) {
316
+ isFiltered = !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
317
+ if (this.selectedRadio == "postedAdu" && this.subRadioButton == "notRequired") {
318
+ isFiltered = true;
319
+ }
320
+ if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
321
+ this.tooltipSelectedMap.delete(this.selectedRadio);
322
+ }
323
+ }
324
+ else if (this.selectedRadio == "startDate" ||
325
+ this.selectedRadio == "endDate" ||
326
+ this.selectedRadio == "period" ||
327
+ this.selectedRadio == "AirDate" ||
328
+ this.selectedRadio === "flightStartDate" ||
329
+ this.selectedRadio === "flightEndDate" ||
330
+ this.selectedRadio == "date") {
331
+ isFiltered =
332
+ !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) &&
333
+ !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
334
+ if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
335
+ this.tooltipSelectedMap.delete(this.selectedRadio);
336
+ }
337
+ }
338
+ else {
339
+ let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
340
+ let selectedOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden && x.isSelected).length;
341
+ isFiltered = selectedOptionsCount > 0 && selectedOptionsCount != totalOptionsCount ? true : false;
342
+ }
343
+ return isFiltered;
344
+ }
345
+ removeOrChangeLatestFilterIndex(isFiltered) {
346
+ let set = new Set(this.appliedFiltersArray);
347
+ if (isFiltered && !set.has(this.selectedRadio)) {
348
+ set.add(this.selectedRadio);
349
+ }
350
+ else if (isFiltered && set.has(this.selectedRadio)) {
351
+ set.delete(this.selectedRadio);
352
+ set.add(this.selectedRadio);
353
+ }
354
+ else {
355
+ set.delete(this.selectedRadio);
356
+ }
357
+ this.appliedFiltersArray = [...set];
358
+ }
359
+ filterData(originalData, keyToSkip) {
360
+ let filteredData = originalData;
361
+ this.tooltipSelectedMap.forEach((value, key) => {
362
+ if (key != keyToSkip) {
363
+ if (this.sliderSet.has(key)) {
364
+ filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
365
+ }
366
+ else if (key === "startDate" || key === "endDate") {
367
+ filteredData = filteredData.filter((obj) => this.returnOrdersInTheRange(obj, value, key));
368
+ }
369
+ else if (key === "period" || key === "AirDate" || key === "flightStartDate" || key === "flightEndDate" || key == "date") {
370
+ filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
371
+ }
372
+ else if (key === "StartTimeForFilter" || key === "EndTimeForFilter"
373
+ || key === "start_time_for_filter" || key === "end_time_for_filter") {
374
+ filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
375
+ }
376
+ else if (key === "startEndTimeMulti") {
377
+ filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
378
+ }
379
+ else if (key === "startEndTime" || key === "TimeBand") {
380
+ let filteredMulti = [];
381
+ let filteredZero = [];
382
+ let filteredTimeRange = [];
383
+ if (this.includeTimeRange) {
384
+ filteredTimeRange = filteredData.filter((obj) => this.returnDataForTimeRange(obj, value));
385
+ }
386
+ if (this.includeMultiTime) {
387
+ filteredMulti = filteredData.filter((obj) => obj[key][0] == "<multi>");
388
+ }
389
+ if (this.includeZeroTime) {
390
+ filteredZero = filteredData.filter((obj) => obj[key][0] == "0");
391
+ }
392
+ filteredData = [...filteredMulti, ...filteredZero, ...filteredTimeRange];
393
+ }
394
+ else if (value.length > 0) {
395
+ filteredData = filteredData.filter((u) => value.includes(u[key]));
396
+ }
397
+ }
398
+ });
399
+ return filteredData;
400
+ }
401
+ returnOrdersInTheRange(order, range, key) {
402
+ let isDateBetweenTheSelectedRange = moment(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
403
+ let isDateSameAsTheMinSelectedDate = moment(order[key]).isSame(range.minSelectedDate);
404
+ let isDateSameAsTheMaxSelectedDate = moment(order[key]).isSame(range.maxSelectedDate);
405
+ return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
406
+ }
407
+ returnDataForTimeRange(obj, selectedData) {
408
+ let format = "HH:mm:ss";
409
+ let selectedStartDate = moment(selectedData.startTime, format);
410
+ let selectedEndDate = moment(selectedData.endTime, format);
411
+ let startTime = moment(obj.startTime, format);
412
+ let endTime = moment(obj.endTime, format);
413
+ let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
414
+ let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
415
+ let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
416
+ let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
417
+ return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
418
+ (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
419
+ (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
420
+ (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
421
+ }
422
+ returnDataForFromAndToTimeRange(obj, selectedData, key) {
423
+ let format = "HH:mm:ss";
424
+ let selectedFromTime = moment(selectedData.fromTime, format);
425
+ let selectedToTime = moment(selectedData.toTime, format);
426
+ let objTime = obj[key];
427
+ if (["", "-", null].includes(objTime)) {
428
+ return false;
429
+ }
430
+ if (this.includeMultiTime && obj[key] == "<multi>") {
431
+ return true;
432
+ }
433
+ if (!this.includeMultiTime && obj[key] == "<multi>") {
434
+ return false;
435
+ }
436
+ if (this.includeZeroTime && obj[key] == "0") {
437
+ return true;
438
+ }
439
+ if (!this.includeZeroTime && obj[key] == "0") {
440
+ return false;
441
+ }
442
+ if (!this.includeTimeRange) {
443
+ return false;
444
+ }
445
+ objTime = this.dateTimeFormatService.formatToTwelveHrs(objTime, true);
446
+ objTime = this.dateTimeFormatService.convertTotwentyFourHrsFormat(objTime[0] + ":" + objTime[1] + " " + objTime[2], true);
447
+ objTime = objTime[0] + ":" + objTime[1] + ":00";
448
+ objTime = moment(objTime, format);
449
+ let isObjTimeSameAsSelectedFromTime = objTime.isSame(selectedFromTime);
450
+ let isObjTimeSameAsSelectedToTime = objTime.isSame(selectedToTime);
451
+ let isObjTimeBetweenSelectedFromTimeAndToTime = objTime.isBetween(selectedFromTime, selectedToTime);
452
+ return (isObjTimeSameAsSelectedFromTime ||
453
+ isObjTimeSameAsSelectedToTime ||
454
+ isObjTimeBetweenSelectedFromTimeAndToTime);
455
+ }
456
+ returnDataForStartAndEndTimeRange(obj, selectedData, key) {
457
+ let format = "HH:mm:ss";
458
+ let selectedFromTime = moment(selectedData.fromTime, format);
459
+ let selectedToTime = moment(selectedData.toTime, format);
460
+ let objTime = obj[key];
461
+ if (this.includeMultiTime && obj[key][0] == "<multi>") {
462
+ return true;
463
+ }
464
+ if (!this.includeMultiTime && obj[key][0] == "<multi>") {
465
+ return false;
466
+ }
467
+ if (this.includeZeroTime && obj[key][0] == "0") {
468
+ return true;
469
+ }
470
+ if (!this.includeZeroTime && obj[key][0] == "0") {
471
+ return false;
472
+ }
473
+ if (!this.includeTimeRange) {
474
+ return false;
475
+ }
476
+ let startTime = moment(obj[key][1], format);
477
+ let endTime = moment(obj[key][2], format);
478
+ let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
479
+ let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
480
+ let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
481
+ let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
482
+ return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
483
+ (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
484
+ (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
485
+ (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
486
+ }
487
+ getDataInTheDateRange(obj, value, key) {
488
+ let parsingFormat;
489
+ if (key === "period") {
490
+ parsingFormat = "YYYY-MM-DD";
491
+ let startDateIsBetweenSelDate = moment(obj.startDate, parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
492
+ let endDateIsBetweenSelDate = moment(obj.endDate, parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
493
+ let startDateIsSameAsSelStartDate = moment(obj.startDate, parsingFormat).isSame(value.minSelectedDate);
494
+ let endDateIsSameAsSelEndDate = moment(obj.endDate, parsingFormat).isSame(value.maxSelectedDate);
495
+ return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
496
+ (endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
497
+ }
498
+ else if (key === "AirDate" || key === "flightStartDate" || key === "flightEndDate") {
499
+ parsingFormat = "MM/DD/YYYY";
500
+ let dateIsBetweenSelDate = moment(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
501
+ let dateIsSameAsSelStartDate = moment(obj[key], parsingFormat).isSame(value.minSelectedDate);
502
+ let dateIsSameAsSelEndDate = moment(obj[key], parsingFormat).isSame(value.maxSelectedDate);
503
+ return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
504
+ }
505
+ else {
506
+ }
507
+ }
508
+ initializeTimeFilterData(clonedData, key = "startEndTime") {
509
+ let startTimeArr = map(clonedData, "startTime");
510
+ let endTimeArr = map(clonedData, "endTime");
511
+ startTimeArr.sort((a, b) => {
512
+ return this.dateTimeFormatService.sortByTimeAscending(a, b);
513
+ });
514
+ endTimeArr.sort((a, b) => {
515
+ return this.dateTimeFormatService.sortByTimeDescending(a, b);
516
+ });
517
+ let initialStartEndTime = {
518
+ startTime: startTimeArr[0],
519
+ endTime: endTimeArr[0],
520
+ };
521
+ this.initialValueMap.set(key, initialStartEndTime);
522
+ }
523
+ returnColumnFilterStatus(data, headername) {
524
+ return uniq(data.map((u) => u[headername])).length > 1 ? false : true;
525
+ }
526
+ }
527
+ AnnaFilterService.bufferSize = 20;
528
+ AnnaFilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }], target: i0.ɵɵFactoryTarget.Injectable });
529
+ AnnaFilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, providedIn: 'root' });
530
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaFilterService, decorators: [{
531
+ type: Injectable,
532
+ args: [{
533
+ providedIn: 'root'
534
+ }]
535
+ }], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }]; } });
536
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDOzs7QUFLekYsTUFBTSxPQUFPLGlCQUFpQjtJQXdCNUIsWUFBb0IscUJBQWdEO1FBQWhELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBMkI7UUF0QnBFLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBMkhuQyw2QkFBd0IsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO1lBQ2xELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBRUYsOEJBQXlCLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtZQUNuRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQ2hCLE1BQU0sR0FB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RUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksbUJBQW1CLEdBQUc7WUFDdEIsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDMUIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxJQUFXLEVBQUUsVUFBMkI7UUFDL0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RSxDQUFDOztBQWhrQmEsNEJBQVUsR0FBRyxFQUFHLENBQUE7OEdBdEJuQixpQkFBaUI7a0hBQWpCLGlCQUFpQixjQUZoQixNQUFNOzJGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci1zbGlkZXIvbmd4LXNsaWRlcic7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgbWluLCBtYXgsIG1hcCwgc29ydEJ5LCB1bmlxLCBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5cclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzIFxyXG5pbXBvcnQgeyBBbGxTZWxlY3RlZFN0YXR1cywgdG9vbHRpcE1vZGVsRm9yQ29sdW1uTGV2ZWxGaWx0ZXJpbmcgfSBmcm9tIFwiLi4vbW9kZWxzL2FubmEtdG9vbHRpcC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLCBOZ2JEYXRlVHlwZSB9IGZyb20gJy4vYW5uYS1kYXRlLXRpbWUtZm9ybWF0LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYUZpbHRlclNlcnZpY2Uge1xyXG5cclxuICB0b29sdGlwTWFwID0gbmV3IE1hcCgpO1xyXG4gIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICBpbml0aWFsVmFsdWVNYXA6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgdHJhbnNsYXRlRnVuYzogc3RyaW5nO1xyXG4gIHNlbGVjdGVkUmFkaW86IHN0cmluZztcclxuICBzdWJSYWRpb0J1dHRvbjogc3RyaW5nO1xyXG5cclxuICBjYWxlbmRhclNldDogU2V0PHN0cmluZz47XHJcbiAgc2xpZGVyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICB0aW1lU2V0OiBTZXQ8c3RyaW5nPjtcclxuXHJcbiAgaW5jbHVkZU11bHRpVGltZTogYm9vbGVhbjtcclxuICBpbmNsdWRlWmVyb1RpbWU6IGJvb2xlYW47XHJcbiAgaW5jbHVkZVRpbWVSYW5nZTogYm9vbGVhbjtcclxuXHJcbiAgYXBwbGllZEZpbHRlcnNBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnksIG1heFNlbGVjdGVkRGF0ZTogYW55IH07XHJcbiAgc2xpZGVyRGF0YTogeyBtaW46IGFueSwgbWF4OiBhbnkgfTtcclxuICBuZ3hTbGlkZXJPYmo6IE9wdGlvbnM7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgYnVmZmVyU2l6ZSA9IDIwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJBbm5hRmlsdGVyU2VydmljZSBzZXJ2aWNlIGNyZWF0ZWQuXCIpXHJcbiAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgIFwicmN2UHJlZW1wdFwiLFxyXG4gICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICBcInJjdlVuZGVyRGx5XCIsXHJcbiAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICBcImJvb2tlZFwiLFxyXG4gICAgICBcInNwb3RzXCIsXHJcbiAgICAgIFwiZ3JwXCIsXHJcbiAgICAgIFwiY3BwXCIsXHJcbiAgICAgIFwiaW1wc1wiLFxyXG4gICAgICBcImNwbVwiLFxyXG4gICAgICBcIm9zVW5kZXJEbHlcIixcclxuICAgICAgXCJ0b3RhbFdlZWtzXCIsXHJcbiAgICAgIFwiV2Vla051bWJlclwiLFxyXG4gICAgICBcIlJhdGVcIixcclxuICAgICAgXCJPcmRlcmVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIixcclxuICAgICAgXCJQb3N0ZWRSYXRpbmdzT3JJbXByZXNzaW9uc1wiLCAsXHJcbiAgICAgIFwicG9zdGVkQXVkUGVyY2VudFwiLFxyXG4gICAgICBcInBvc3RlZEFkdVwiLFxyXG4gICAgICBcInNjaGVkdWxlZEFkdVwiLFxyXG4gICAgICBcImF1ZGllbmNlRGVmaWNpdFwiLFxyXG4gICAgICBcIm9mZmVyZWRNR3NcIixcclxuICAgICAgXCJvdXRzdGFuZGluZ1BFXCIsXHJcbiAgICAgIFwib2ZmZXJlZEFEVXNcIixcclxuICAgICAgXCJ1ZERlZmljaXRWYWx1ZVwiLFxyXG4gICAgICBcImJvb2tlZFZhbHVlXCIsXHJcbiAgICAgIFwiYm9va2VkU3BvdHNcIixcclxuICAgICAgXCJ1c2VyQ2hhbmdlc1wiXHJcbiAgICBdO1xyXG4gICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXCJwZXJpb2RcIiwgXCJBaXJEYXRlXCIsIFwiZmxpZ2h0U3RhcnREYXRlXCIsIFwiZmxpZ2h0RW5kRGF0ZVwiLFwiZGF0ZVwiLCBcInN0YXJ0RGF0ZVwiLCBcImVuZERhdGVcIl07XHJcbiAgICBjb25zdCB0aW1lQXJyID0gW1wiU3RhcnRUaW1lRm9yRmlsdGVyXCIsIFwiRW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLCBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiwgXCJzdGFydEVuZFRpbWVNdWx0aVwiXTtcclxuICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcclxuICB9XHJcblxyXG4gIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBtb21lbnQob2JqW2tleV0pKTtcclxuICAgIGxldCBtaW5EYXRlID0gbW9tZW50Lm1pbihEYXRlQXJyKTtcclxuICAgIGxldCBtYXhEYXRlID0gbW9tZW50Lm1heChEYXRlQXJyKTtcclxuICAgIHJldHVybiBbbWluRGF0ZSwgbWF4RGF0ZV07XHJcbiAgfVxyXG5cclxuICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICByZXR1cm4gKHNldC5oYXMoaGVhZGVyWzBdKSkgfHwgKHNldC5oYXMoaGVhZGVyWzFdKSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNvbHVtbkZpbHRlcigpIHtcclxuICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInBvc3RlZEFkdVwiKSB7XHJcbiAgICAgIHRoaXMuc3ViUmFkaW9CdXR0b24gPSBcInJlcXVpcmVkXCI7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZShcImlzQXVkUmVxdWlyZWRcIik7XHJcbiAgICB9XHJcbiAgICBsZXQgYXBwbGllZEZpbHRlclNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICBhcHBsaWVkRmlsdGVyU2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLmFwcGxpZWRGaWx0ZXJTZXRdO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVTbGlkZXJUb29sdGlwKGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCBtaW5WYWx1ZTtcclxuICAgIGxldCBtYXhWYWx1ZTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCA+IDAgJiZcclxuICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5W3RoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggLSAxXSA9PT0gdGhpcy5zZWxlY3RlZFJhZGlvXHJcbiAgICApIHtcclxuICAgICAgbGV0IHN1YnNldERhdGE7XHJcbiAgICAgIGxldCBzdWJmaWx0ZXJBcHBsaWVkID0gZmFsc2U7XHJcbiAgICAgIC8vYXBwbHlpbmcgYWxsIGZpbHRlcmV4Y2VwdCB0aGUgY3VycmVudCBmaWx0ZXJcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwb3N0ZWRBZHVcIiAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoXCJpc0F1ZFJlcXVpcmVkXCIpKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKFwiaXNBdWRSZXF1aXJlZFwiKTtcclxuICAgICAgICBzdWJmaWx0ZXJBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgLy9uZWVkIHRvIGZpbmQgbWluIGFuZCBtYXggdmFsdWUgZm9yXHJcbiAgICAgIG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShzdWJzZXREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCBmYWxzZSk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicG9zdGVkQWR1XCIgJiYgc3ViZmlsdGVyQXBwbGllZCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLnNldChcImlzQXVkUmVxdWlyZWRcIiwgW2ZhbHNlXSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShmaWx0ZXJlZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgdHJ1ZSk7XHJcbiAgICAgIG1heFZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShmaWx0ZXJlZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uZ3hTbGlkZXJPYmogPSB0aGlzLnNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZSwgbWF4VmFsdWUpO1xyXG4gICAgaWYgKHRoaXMudHJhbnNsYXRlRnVuYyA9PT0gXCJub3JtYWxcIikge1xyXG4gICAgICB0aGlzLm5neFNsaWRlck9iai50cmFuc2xhdGUgPSB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zbGF0ZUZ1bmMgPT09IFwicGVyY2VudFwiKSB7XHJcbiAgICAgIHRoaXMubmd4U2xpZGVyT2JqLnRyYW5zbGF0ZSA9IHRoaXMucGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnRyYW5zbGF0ZUZ1bmMgPT09IFwiY3VycmVuY3lcIikge1xyXG4gICAgICB0aGlzLm5neFNsaWRlck9iai50cmFuc2xhdGUgPSB0aGlzLmN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5uZ3hTbGlkZXJPYmo7XHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25WYWx1ZXMobWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZmxvb3I6IG1pblZhbHVlLFxyXG4gICAgICBjZWlsOiBtYXhWYWx1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgY29uc3QgdmFsID0gZGF0YS50b0ZpeGVkKDEpICsgXCIlXCI7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH07XHJcblxyXG4gIGN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgIGlmIChkYXRhID49IDEwMDApIHtcclxuICAgICAgY29uc3QgdmFsID0gKGRhdGEgLyAxMDAwKS50b0ZpeGVkKDEpICsgXCJrXCI7XHJcbiAgICAgIHJldHVybiBcIiRcIiArIHZhbDtcclxuICAgIH0gZWxzZSBpZiAoZGF0YSAhPSBNYXRoLmZsb29yKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybiBkYXRhLnRvRml4ZWQoMSkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBcIiRcIiArIGRhdGE7XHJcbiAgfTtcclxuXHJcbiAgbm9ybWFsVHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgIGlmIChkYXRhID49IDEwMDApIHtcclxuICAgICAgY29uc3QgdmFsID0gKGRhdGEgLyAxMDAwKS50b0ZpeGVkKDEpICsgXCJrXCI7XHJcbiAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xyXG4gIH07XHJcblxyXG4gIHBvcHVsYXRlVG9vbHRpcChzZWxlY3RlZENvbHVtbk5hbWU6IHN0cmluZywgY29tcGxldGVEYXRhOiBhbnlbXSwgZmlsdGVyZWREYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IHRvb2x0aXBEYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRvb2x0aXBEYXRhID0gdGhpcy5wb3B1bGF0ZVRvb2x0aXBEYXRhQmFzZWRPblNlbGVjdGVkUmFkaW8oW3NlbGVjdGVkQ29sdW1uTmFtZV0sIGNvbXBsZXRlRGF0YSk7XHJcbiAgICAgIHRvb2x0aXBEYXRhLmZvckVhY2goKGl0ZW06IHsgaXNIaWRkZW46IGJvb2xlYW4gfSkgPT4gKGl0ZW0uaXNIaWRkZW4gPSBmYWxzZSkpO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZENvbHVtbk5hbWUgPT09IHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheVt0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoIC0gMV0pIHtcclxuICAgICAgbGV0IHN1YnNldERhdGEgPSB0aGlzLmZpbHRlckRhdGEoY29tcGxldGVEYXRhLCBzZWxlY3RlZENvbHVtbk5hbWUpOyAvL2ZpbHRlciB0aGUgZGF0YSB3aXRob3V0IGFwcGx5aW5nIHRoZSBsYXRlc3QgZmlsdGVyXHJcbiAgICAgIHRvb2x0aXBEYXRhID0gdGhpcy5zaG93SGlkZUZpbHRlckNoZWNrYm94KHN1YnNldERhdGEsIHNlbGVjdGVkQ29sdW1uTmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2lmIGl0IGlzIG5vdCB0aGUgbGF0ZXN0IGZpbHRlclxyXG4gICAgICAvL3RoZW4gZmlsdGVyZWQgRGF0YSB3aWxsIGJlIHVzZWRcclxuICAgICAgLy9jcmVhdGUgdGhlIG9wdGlvbiBkYXRhXHJcbiAgICAgIGlmICghdGhpcy50b29sdGlwTWFwLmhhcyhzZWxlY3RlZENvbHVtbk5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5wb3B1bGF0ZVRvb2x0aXBEYXRhQmFzZWRPblNlbGVjdGVkUmFkaW8oW3NlbGVjdGVkQ29sdW1uTmFtZV0sIGNvbXBsZXRlRGF0YSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRvb2x0aXBEYXRhID0gdGhpcy5zaG93SGlkZUZpbHRlckNoZWNrYm94KGZpbHRlcmVkRGF0YSwgc2VsZWN0ZWRDb2x1bW5OYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0b29sdGlwRGF0YTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlVG9vbHRpcERhdGFCYXNlZE9uU2VsZWN0ZWRSYWRpbyh2YWx1ZTogc3RyaW5nW10sIG9yaWdpbmFsRGF0YTogYW55KSB7XHJcbiAgICAvL2lmIHRoZSBpbml0aWFsIHRvb2x0aXAgZGF0YSBpcyBhbHJlYWR5IHByZXNlbnQgZmV0Y2ggZnJvbSB0aGUgbWFwXHJcbiAgICBpZiAodGhpcy50b29sdGlwTWFwLmhhcyh2YWx1ZVswXSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudG9vbHRpcE1hcC5nZXQodmFsdWVbMF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9nZXQgdGhlIHVuaXF1ZSB2YWx1ZXMgZnJvbSB0aGUgY29sdW1uIGFuZCBzYXZlIGl0IGluIHRoZSBtYXBcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID0gdmFsdWVbMF07XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBzb3J0Qnkob3JpZ2luYWxEYXRhLm1hcCgodTogYW55KSA9PiB1W3RoaXMuc2VsZWN0ZWRSYWRpb10pKS5maWx0ZXIobiA9PiBuICE9PSBudWxsKTsgLy9zb3J0aW5nIHRoZSBkYXRhIGluIGFscGhhYmV0aWNhbCBvcmRlclxyXG4gICAgICBjb25zdCBkYXRhU2V0ID0gbmV3IFNldChkYXRhKTsgLy9jcmVhdGVkIGEgc2V0IGZyb20gdGhlIGRhdGFcclxuICAgICAgY29uc3QgdG9vbFRpcGRhdGEgPSBbLi4uZGF0YVNldF0ubWFwKCh4KSA9PiBuZXcgdG9vbHRpcE1vZGVsRm9yQ29sdW1uTGV2ZWxGaWx0ZXJpbmcoeCkpO1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuc2V0KHZhbHVlWzBdLCB0b29sVGlwZGF0YSk7IC8vc2V0dGluZyB0aGUga2V5IHZhbHVlIHBhaXIgaW4gdGhlIHRvb2x0aXBNYXBcclxuICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuc2V0KHZhbHVlWzBdLCBtYXAodG9vbFRpcGRhdGEsIFwiZGF0YVwiKSk7IC8vc2V0dGluZyB0aGUga2V5IHZhbHVlIHBhaXIgaW4gdG9vbHRpcFNlbGVjdGVkTWFwXHJcbiAgICAgIHJldHVybiB0b29sVGlwZGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dIaWRlRmlsdGVyQ2hlY2tib3goYXJyOiBhbnlbXSwgc2VsZWN0ZWRDb2x1bW5OYW1lOiBzdHJpbmcpIHtcclxuICAgIGxldCBjdXJyZW50U3Vic2V0RGF0YSA9IHVuaXEoYXJyLm1hcCgodSkgPT4gdVtzZWxlY3RlZENvbHVtbk5hbWVdKSk7XHJcblxyXG4gICAgLy9nZXQgdGhlIGluaXRpYWwgdG9vbHRpcCBEYXRhXHJcbiAgICBsZXQgdG9vbHRpcERhdGEgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHNlbGVjdGVkQ29sdW1uTmFtZSk7XHJcblxyXG4gICAgLy9zaG93IG9yIGhpZGUgdGhlIHZhbHVlXHJcbiAgICB0b29sdGlwRGF0YS5mb3JFYWNoKCh2YWx1ZTogeyBkYXRhOiBzdHJpbmcgfCBudW1iZXI7IGlzSGlkZGVuOiBib29sZWFuOyB9KSA9PiB7XHJcbiAgICAgIC8vaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgdGhlbiBoaWRlIHRoZSBlbGVtZW50XHJcbiAgICAgIGxldCBlbGVtZW50VG9GaW5kSW5kZXggPSBjdXJyZW50U3Vic2V0RGF0YS5maW5kSW5kZXgoKG46IHN0cmluZyB8IG51bWJlcikgPT4gbiA9PT0gdmFsdWUuZGF0YSk7XHJcbiAgICAgIGlmIChlbGVtZW50VG9GaW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdmFsdWUuaXNIaWRkZW4gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vc2hvdyB0aGUgZWxlbWVudFxyXG4gICAgICAgIHZhbHVlLmlzSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0b29sdGlwRGF0YTtcclxuICB9XHJcblxyXG4gIGlzQWxsT3B0aW9uc1NlbGVjdGVkKCkge1xyXG4gICAgbGV0IGFsbFNlbGVjdGVkO1xyXG4gICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgbGV0IHNlbGVjdGVkT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgIGlmIChzZWxlY3RlZE9wdGlvbnNDb3VudCA9PT0gMCkge1xyXG4gICAgICBhbGxTZWxlY3RlZCA9IEFsbFNlbGVjdGVkU3RhdHVzLm5vbmU7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkT3B0aW9uc0NvdW50ID4gMCAmJiBzZWxlY3RlZE9wdGlvbnNDb3VudCA8IHRvdGFsT3B0aW9uc0NvdW50KSB7XHJcbiAgICAgIGFsbFNlbGVjdGVkID0gQWxsU2VsZWN0ZWRTdGF0dXMuZmV3U2VsZWN0ZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbGxTZWxlY3RlZCA9IEFsbFNlbGVjdGVkU3RhdHVzLmFsbFNlbGVjdGVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgcG9wdWxhdGVEYXRlUGlja2VyVG9vbHRpcFdpdGhEYXRhKGNvbXBsZXRlRGF0YTogYW55W10sIGZpbHRlcmVkRGF0YTogYW55W10pIHtcclxuICAgIGxldCBlbmFibGVkRGF0ZXM7XHJcbiAgICAvL3NvbWUgZmlsdGVyIGlzIGFwcGxpZWQgYW5kIHRoZSBsYXRlc3QgZmlsdGVyIGlzIHRoZSBkYXRlIGZpbHRlclxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXlbdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5Lmxlbmd0aCAtIDFdID09PSB0aGlzLnNlbGVjdGVkUmFkaW9cclxuICAgICkge1xyXG4gICAgICBsZXQgc3Vic2V0RGF0YTtcclxuICAgICAgLy9hcHBseWluZyBhbGwgZmlsdGVyZXhjZXB0IHRoZWMgY3VycmVudCAgZmlsdGVyXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgXCJwZXJpb2RcIik7XHJcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCBcImVuZERhdGVcIik7XHJcbiAgICAgICAgZW5hYmxlZERhdGVzID0geyBtaW5TdGFydERhdGU6IG1pblN0YXJ0RGF0ZVswXSwgbWF4RW5kRGF0ZTogbWF4RW5kRGF0ZVsxXSB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJBaXJEYXRlXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodEVuZERhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJkYXRlXCIpIHtcclxuICAgICAgICBzdWJzZXREYXRhID0gdGhpcy5maWx0ZXJEYXRhKGNvbXBsZXRlRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICBsZXQgbWluQW5kTWF4RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShzdWJzZXREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGVuYWJsZWREYXRlcyA9IHsgbWluU3RhcnREYXRlOiBtaW5BbmRNYXhEYXRlWzBdLCBtYXhFbmREYXRlOiBtaW5BbmRNYXhEYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3Vic2V0RGF0YSA9IHRoaXMuZmlsdGVyRGF0YShjb21wbGV0ZURhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgLy9uZWVkIHRvIGZpbmQgbWluIGFuZCBtYXggZGF0ZSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRlXHJcbiAgICAgICAgLy9lbmFibGVkRGF0ZXMgaXMgYW4gYXJyIG9mIG1pbkRhdGUgYW5kIG1heERhdGVcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoc3Vic2V0RGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgIGxldCBtaW5TdGFydERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShmaWx0ZXJlZERhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluU3RhcnREYXRlWzBdLCBtYXhFbmREYXRlOiBtYXhFbmREYXRlWzFdIH07XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkFpckRhdGVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIikge1xyXG4gICAgICAgIGxldCBtaW5BbmRNYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKGZpbHRlcmVkRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB7IG1pblN0YXJ0RGF0ZTogbWluQW5kTWF4RGF0ZVswXSwgbWF4RW5kRGF0ZTogbWluQW5kTWF4RGF0ZVsxXSB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vbmVlZCB0byBmaW5kIG1pbiBhbmQgbWF4IGRhdGUgZm9yIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cclxuICAgICAgICAvLyBlbmFibGVkRGF0ZXMgaXMgYW4gYXJyIG9mIG1pbkRhdGUgYW5kIG1heERhdGVcclxuICAgICAgICBlbmFibGVkRGF0ZXMgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUoZmlsdGVyZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW5hYmxlZERhdGVzO1xyXG4gIH1cclxuXHJcbiAgZmluZFVuaXF1ZURhdGVzV2l0aERhdGEoZGF0YTogYW55W10pIHtcclxuICAgIGxldCB1bmlxdWVEYXRlcyA9IHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbXCJkYXRlXCJdKSk7XHJcbiAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcclxuICAgIHVuaXF1ZURhdGVzLmZvckVhY2goKGRhdGUpID0+IHtcclxuICAgICAgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQucHVzaChcclxuICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlU3RhbmRhcmRGb3JtYXQobW9tZW50KGRhdGUsIFwiTU0vREQvWVlcIikuZm9ybWF0KFwiTU0vREQvWVlZWVwiKSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgaXNDaGVja2JveFNlbGVjdGVkKHNlbGVjdGVkRGF0YTogYW55KSB7XHJcbiAgICBzZWxlY3RlZERhdGEuaXNTZWxlY3RlZCA9ICFzZWxlY3RlZERhdGEuaXNTZWxlY3RlZDtcclxuICAgIGxldCBhbGxTZWxlY3RlZCA9IHRoaXMuaXNBbGxPcHRpb25zU2VsZWN0ZWQoKTtcclxuICAgIHJldHVybiBhbGxTZWxlY3RlZDtcclxuICB9XHJcblxyXG4gIGFsbE9wdGlvbnNDbGlja2VkKHN0YXR1czogbnVtYmVyKSB7XHJcbiAgICBsZXQgaGVhZGVyID0gdGhpcy5zZWxlY3RlZFJhZGlvO1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gMSkge1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuZ2V0KGhlYWRlcikuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFpdGVtLmlzSGlkZGVuKSB7XHJcbiAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLnNldChcclxuICAgICAgICBoZWFkZXIsXHJcbiAgICAgICAgdGhpcy50b29sdGlwTWFwXHJcbiAgICAgICAgICAuZ2V0KGhlYWRlcilcclxuICAgICAgICAgIC5maWx0ZXIoKHg6IGFueSkgPT4geC5pc1NlbGVjdGVkKVxyXG4gICAgICAgICAgLm1hcCgoeDogYW55KSA9PiB4LmRhdGEpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvb2x0aXBNYXAuZ2V0KGhlYWRlcikuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFpdGVtLmlzSGlkZGVuKSB7XHJcbiAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUoaGVhZGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlT3JkZXJBcHBsaWVkRmlsdGVyc0FycmF5KGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkLCBkYXRlKTtcclxuICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkOiBib29sZWFuLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkOiBib29sZWFuLCBkYXRlPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09IFwidXNlclwiICYmICF0aGlzLnRvb2x0aXBNYXAuaGFzKFwidXNlclwiKSkge1xyXG4gICAgICBpc0ZpbHRlcmVkID0gY2xvbmVEZWVwKGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJFbmRUaW1lRm9yRmlsdGVyXCJcclxuICAgICAgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RW5kVGltZU11bHRpXCIpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKFxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICkgfHwgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8ICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydEVuZFRpbWVcIiB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPSAhaXNFcXVhbCh0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykpIHx8ICF0aGlzLmluY2x1ZGVaZXJvVGltZSB8fCAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgaXNGaWx0ZXJlZCA9ICFpc0VxdWFsKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSkgJiYgIWlzRXF1YWwodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMuc2xpZGVyRGF0YSk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwb3N0ZWRBZHVcIiAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09IFwibm90UmVxdWlyZWRcIikge1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmREYXRlXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwicGVyaW9kXCIgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImRhdGVcIlxyXG4gICAgKSB7XHJcbiAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICFpc0VxdWFsKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSkgJiZcclxuICAgICAgICAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5mbGlnaHREYXRlUmFuZ2UpO1xyXG4gICAgICBpZiAoIWlzRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuICYmIHguaXNTZWxlY3RlZCkubGVuZ3RoO1xyXG4gICAgICBpc0ZpbHRlcmVkID0gc2VsZWN0ZWRPcHRpb25zQ291bnQgPiAwICYmIHNlbGVjdGVkT3B0aW9uc0NvdW50ICE9IHRvdGFsT3B0aW9uc0NvdW50ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgfVxyXG5cclxuICByZW1vdmVPckNoYW5nZUxhdGVzdEZpbHRlckluZGV4KGlzRmlsdGVyZWQ6IGJvb2xlYW4pIHtcclxuICAgIGxldCBzZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcblxyXG4gICAgaWYgKGlzRmlsdGVyZWQgJiYgIXNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICB9IGVsc2UgaWYgKGlzRmlsdGVyZWQgJiYgc2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgIHNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgc2V0LmFkZCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLnNldF07XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJEYXRhKG9yaWdpbmFsRGF0YTogYW55W10sIGtleVRvU2tpcDogc3RyaW5nKSB7XHJcbiAgICBsZXQgZmlsdGVyZWREYXRhID0gb3JpZ2luYWxEYXRhO1xyXG5cclxuICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgaWYgKGtleSAhPSBrZXlUb1NraXApIHtcclxuICAgICAgICBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJzdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZW5kRGF0ZVwiKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuT3JkZXJzSW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIiB8fCBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8IGtleSA9PSBcImRhdGVcIikge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmdldERhdGFJblRoZURhdGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8IGtleSA9PT0gXCJFbmRUaW1lRm9yRmlsdGVyXCJcclxuICAgICAgICAgIHx8IGtleSA9PT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fCBrZXkgPT09IFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCIpIHtcclxuICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgbGV0IGZpbHRlcmVkTXVsdGkgPSBbXTtcclxuICAgICAgICAgIGxldCBmaWx0ZXJlZFplcm8gPSBbXTtcclxuICAgICAgICAgIGxldCBmaWx0ZXJlZFRpbWVSYW5nZSA9IFtdO1xyXG4gICAgICAgICAgaWYgKHRoaXMuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZFRpbWVSYW5nZSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yVGltZVJhbmdlKG9iaiwgdmFsdWUpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pbmNsdWRlTXVsdGlUaW1lKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkTXVsdGkgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pbmNsdWRlWmVyb1RpbWUpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWRaZXJvID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XVswXSA9PSBcIjBcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gWy4uLmZpbHRlcmVkTXVsdGksIC4uLmZpbHRlcmVkWmVybywgLi4uZmlsdGVyZWRUaW1lUmFuZ2VdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XHJcbiAgfVxyXG5cclxuICByZXR1cm5PcmRlcnNJblRoZVJhbmdlKG9yZGVyOiBhbnksIHJhbmdlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBtb21lbnQob3JkZXJba2V5XSkuaXNCZXR3ZWVuKHJhbmdlLm1pblNlbGVjdGVkRGF0ZSwgcmFuZ2UubWF4U2VsZWN0ZWREYXRlKTtcclxuICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgPSBtb21lbnQob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICBsZXQgaXNEYXRlU2FtZUFzVGhlTWF4U2VsZWN0ZWREYXRlID0gbW9tZW50KG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgcmV0dXJuIGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlIHx8IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSB8fCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGU7XHJcbiAgfVxyXG5cclxuICByZXR1cm5EYXRhRm9yVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSkge1xyXG4gICAgbGV0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIGxldCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IG1vbWVudChzZWxlY3RlZERhdGEuc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IHNlbGVjdGVkRW5kRGF0ZSA9IG1vbWVudChzZWxlY3RlZERhdGEuZW5kVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBzdGFydFRpbWUgPSBtb21lbnQob2JqLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBlbmRUaW1lID0gbW9tZW50KG9iai5lbmRUaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgIGxldCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZFN0YXJ0RGF0ZSk7XHJcbiAgICBsZXQgaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBzdGFydFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkU3RhcnREYXRlLCBzZWxlY3RlZEVuZERhdGUpO1xyXG4gICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gZW5kVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG4gICAgbGV0IHNlbGVjdGVkRnJvbVRpbWUgPSBtb21lbnQoc2VsZWN0ZWREYXRhLmZyb21UaW1lLCBmb3JtYXQpO1xyXG4gICAgbGV0IHNlbGVjdGVkVG9UaW1lID0gbW9tZW50KHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgb2JqVGltZSA9IG9ialtrZXldO1xyXG4gICAgaWYgKFtcIlwiLCBcIi1cIiwgbnVsbF0uaW5jbHVkZXMob2JqVGltZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5jbHVkZU11bHRpVGltZSAmJiBvYmpba2V5XSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pbmNsdWRlTXVsdGlUaW1lICYmIG9ialtrZXldID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmluY2x1ZGVaZXJvVGltZSAmJiBvYmpba2V5XSA9PSBcIjBcIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pbmNsdWRlWmVyb1RpbWUgJiYgb2JqW2tleV0gPT0gXCIwXCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmluY2x1ZGVUaW1lUmFuZ2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9ialRpbWUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyhvYmpUaW1lLCB0cnVlKTtcclxuXHJcbiAgICBvYmpUaW1lID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgb2JqVGltZVswXSArIFwiOlwiICsgb2JqVGltZVsxXSArIFwiIFwiICsgb2JqVGltZVsyXSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICAgIG9ialRpbWUgPSBvYmpUaW1lWzBdICsgXCI6XCIgKyBvYmpUaW1lWzFdICsgXCI6MDBcIjtcclxuXHJcbiAgICBvYmpUaW1lID0gbW9tZW50KG9ialRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgPSBvYmpUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IG9ialRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgIGxldCBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZSA9IG9ialRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lIHx8XHJcbiAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XHJcbiAgICAgIGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBmb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcbiAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IG1vbWVudChzZWxlY3RlZERhdGEuZnJvbVRpbWUsIGZvcm1hdCk7XHJcbiAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBtb21lbnQoc2VsZWN0ZWREYXRhLnRvVGltZSwgZm9ybWF0KTtcclxuICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcblxyXG4gICAgaWYgKHRoaXMuaW5jbHVkZU11bHRpVGltZSAmJiBvYmpba2V5XVswXSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pbmNsdWRlTXVsdGlUaW1lICYmIG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmluY2x1ZGVaZXJvVGltZSAmJiBvYmpba2V5XVswXSA9PSBcIjBcIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pbmNsdWRlWmVyb1RpbWUgJiYgb2JqW2tleV1bMF0gPT0gXCIwXCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmluY2x1ZGVUaW1lUmFuZ2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzdGFydFRpbWUgPSBtb21lbnQob2JqW2tleV1bMV0sIGZvcm1hdCk7XHJcbiAgICBsZXQgZW5kVGltZSA9IG1vbWVudChvYmpba2V5XVsyXSwgZm9ybWF0KTtcclxuXHJcbiAgICBsZXQgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICBsZXQgaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBzdGFydFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuICAgIGxldCBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUgPSBlbmRUaW1lLmlzU2FtZShzZWxlY3RlZFRvVGltZSk7XHJcbiAgICBsZXQgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gZW5kVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcclxuICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldERhdGFJblRoZURhdGVSYW5nZShvYmo6IGFueSwgdmFsdWU6IGFueSwga2V5OiBhbnkpIHtcclxuICAgIGxldCBwYXJzaW5nRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBpZiAoa2V5ID09PSBcInBlcmlvZFwiKSB7XHJcbiAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIllZWVktTU0tRERcIjtcclxuICAgICAgbGV0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBtb21lbnQob2JqLnN0YXJ0RGF0ZSwgcGFyc2luZ0Zvcm1hdCkuaXNCZXR3ZWVuKFxyXG4gICAgICAgIHZhbHVlLm1pblNlbGVjdGVkRGF0ZSxcclxuICAgICAgICB2YWx1ZS5tYXhTZWxlY3RlZERhdGVcclxuICAgICAgKTtcclxuICAgICAgbGV0IGVuZERhdGVJc0JldHdlZW5TZWxEYXRlID0gbW9tZW50KG9iai5lbmREYXRlLCBwYXJzaW5nRm9ybWF0KS5pc0JldHdlZW4oXHJcbiAgICAgICAgdmFsdWUubWluU2VsZWN0ZWREYXRlLFxyXG4gICAgICAgIHZhbHVlLm1heFNlbGVjdGVkRGF0ZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IHN0YXJ0RGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gbW9tZW50KG9iai5zdGFydERhdGUsIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICBsZXQgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IG1vbWVudChvYmouZW5kRGF0ZSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1heFNlbGVjdGVkRGF0ZSk7XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIChzdGFydERhdGVJc0JldHdlZW5TZWxEYXRlIHx8IHN0YXJ0RGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlKSAmJlxyXG4gICAgICAgIChlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiQWlyRGF0ZVwiIHx8IGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fCBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiKSB7XHJcbiAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIk1NL0REL1lZWVlcIjtcclxuICAgICAgbGV0IGRhdGVJc0JldHdlZW5TZWxEYXRlID0gbW9tZW50KG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc0JldHdlZW4odmFsdWUubWluU2VsZWN0ZWREYXRlLCB2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgbGV0IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSA9IG1vbWVudChvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNTYW1lKHZhbHVlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gbW9tZW50KG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgIHJldHVybiBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgaW5pdGlhbGl6ZVRpbWVGaWx0ZXJEYXRhKGNsb25lZERhdGE6IGFueVtdLCBrZXkgPSBcInN0YXJ0RW5kVGltZVwiKSB7XHJcbiAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsIFwic3RhcnRUaW1lXCIpO1xyXG4gICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJlbmRUaW1lXCIpO1xyXG4gIFxyXG4gICAgc3RhcnRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgIH0pO1xyXG4gIFxyXG4gICAgZW5kVGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBsZXQgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICBlbmRUaW1lOiBlbmRUaW1lQXJyWzBdLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIGluaXRpYWxTdGFydEVuZFRpbWUpO1xyXG4gIH0gXHJcblxyXG4gIHJldHVybkNvbHVtbkZpbHRlclN0YXR1cyhkYXRhOiBhbnlbXSwgaGVhZGVybmFtZTogc3RyaW5nIHwgbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJuYW1lXSkpLmxlbmd0aCA+IDEgPyBmYWxzZSA6IHRydWU7XHJcbiAgfSBcclxuXHJcbn1cclxuIl19