ngx-sfc-common 0.0.0-watch

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 (219) hide show
  1. package/README.md +644 -0
  2. package/esm2020/lib/components/button/button-type.enum.mjs +9 -0
  3. package/esm2020/lib/components/button/button.component.mjs +44 -0
  4. package/esm2020/lib/components/checkmark/checkmark-type.enum.mjs +7 -0
  5. package/esm2020/lib/components/checkmark/checkmark.component.mjs +39 -0
  6. package/esm2020/lib/components/close/close.component.mjs +16 -0
  7. package/esm2020/lib/components/delimeter/delimeter.component.mjs +28 -0
  8. package/esm2020/lib/components/dots/dots.component.mjs +30 -0
  9. package/esm2020/lib/components/hamburger/default/hamburger.component.mjs +12 -0
  10. package/esm2020/lib/components/hamburger/hamburger-base.component.mjs +23 -0
  11. package/esm2020/lib/components/hamburger/menu/hamburger-menu.component.mjs +18 -0
  12. package/esm2020/lib/components/icon/icon.component.mjs +21 -0
  13. package/esm2020/lib/components/index.mjs +34 -0
  14. package/esm2020/lib/components/load-container/load-container.component.mjs +180 -0
  15. package/esm2020/lib/components/load-container/load-container.constants.mjs +5 -0
  16. package/esm2020/lib/components/load-container/load-container.enum.mjs +11 -0
  17. package/esm2020/lib/components/load-container/models/load-container.model.mjs +2 -0
  18. package/esm2020/lib/components/load-container/models/load-more-parameters.model.mjs +2 -0
  19. package/esm2020/lib/components/load-container/models/load-more-predicate-parameters.model.mjs +2 -0
  20. package/esm2020/lib/components/load-container/models/load-more.model.mjs +2 -0
  21. package/esm2020/lib/components/load-container/service/load-more.service.mjs +27 -0
  22. package/esm2020/lib/components/load-more-button/load-more-button.component.mjs +31 -0
  23. package/esm2020/lib/components/loader/bounce/bounce-loader.component.mjs +13 -0
  24. package/esm2020/lib/components/loader/circle/circle-loader-type.enum.mjs +6 -0
  25. package/esm2020/lib/components/loader/circle/circle-loader.component.mjs +20 -0
  26. package/esm2020/lib/components/loader/loader-base.component.mjs +51 -0
  27. package/esm2020/lib/components/loader/loader.constants.mjs +6 -0
  28. package/esm2020/lib/components/loader/loader.event.mjs +2 -0
  29. package/esm2020/lib/components/loader/service/loader.service.mjs +76 -0
  30. package/esm2020/lib/components/modal/directive/click/modal-open-on-click.directive.mjs +50 -0
  31. package/esm2020/lib/components/modal/directive/open/modal-open.directive.mjs +28 -0
  32. package/esm2020/lib/components/modal/footer/default/default-modal-footer.component.mjs +60 -0
  33. package/esm2020/lib/components/modal/footer/default/default-modal-footer.model.mjs +2 -0
  34. package/esm2020/lib/components/modal/header/default/default-modal-header.component.mjs +38 -0
  35. package/esm2020/lib/components/modal/header/default/default-modal-header.model.mjs +2 -0
  36. package/esm2020/lib/components/modal/modal-template.enum.mjs +7 -0
  37. package/esm2020/lib/components/modal/modal.component.mjs +103 -0
  38. package/esm2020/lib/components/modal/service/modal.event.mjs +2 -0
  39. package/esm2020/lib/components/modal/service/modal.service.mjs +31 -0
  40. package/esm2020/lib/components/pagination/models/pagination-view.model.mjs +2 -0
  41. package/esm2020/lib/components/pagination/pagination.component.mjs +104 -0
  42. package/esm2020/lib/components/pagination/pagination.constants.mjs +6 -0
  43. package/esm2020/lib/components/pagination/service/pagination.event.mjs +2 -0
  44. package/esm2020/lib/components/pagination/service/pagination.service.mjs +47 -0
  45. package/esm2020/lib/components/sorting/service/sorting.event.mjs +2 -0
  46. package/esm2020/lib/components/sorting/service/sorting.service.mjs +21 -0
  47. package/esm2020/lib/components/sorting/sorting.component.mjs +71 -0
  48. package/esm2020/lib/components/sorting/sorting.constants.mjs +6 -0
  49. package/esm2020/lib/components/sorting/sorting.model.mjs +2 -0
  50. package/esm2020/lib/components/template-content/template-content.component.mjs +31 -0
  51. package/esm2020/lib/components/toggle-switcher/toggle-switcher.component.mjs +38 -0
  52. package/esm2020/lib/components/toggle-switcher/toggle-switcher.model.mjs +2 -0
  53. package/esm2020/lib/components/tooltip/tooltip-type.enum.mjs +6 -0
  54. package/esm2020/lib/components/tooltip/tooltip.component.mjs +69 -0
  55. package/esm2020/lib/constants/common.constants.mjs +9 -0
  56. package/esm2020/lib/constants/date-time.constants.mjs +10 -0
  57. package/esm2020/lib/constants/file.constants.mjs +2 -0
  58. package/esm2020/lib/constants/index.mjs +4 -0
  59. package/esm2020/lib/constants/ui.constants.mjs +23 -0
  60. package/esm2020/lib/directives/click-outside/click-outside.directive.mjs +63 -0
  61. package/esm2020/lib/directives/click-outside/click-outside.event.mjs +2 -0
  62. package/esm2020/lib/directives/component-size/component-size.directive.mjs +59 -0
  63. package/esm2020/lib/directives/destroy-parent/destroy-parent.directive.mjs +27 -0
  64. package/esm2020/lib/directives/dom-changes/dom-changes.directive.mjs +32 -0
  65. package/esm2020/lib/directives/if/if.directive.mjs +26 -0
  66. package/esm2020/lib/directives/image-size/image-load.directive.mjs +41 -0
  67. package/esm2020/lib/directives/image-size/services/image-load.event.mjs +2 -0
  68. package/esm2020/lib/directives/image-size/services/image-load.service.mjs +22 -0
  69. package/esm2020/lib/directives/image-size/services/image-size.model.mjs +2 -0
  70. package/esm2020/lib/directives/index.mjs +14 -0
  71. package/esm2020/lib/directives/mouse-down/mouse-down.directive.mjs +37 -0
  72. package/esm2020/lib/directives/scroll-into-view/scroll-into-view.directive.mjs +39 -0
  73. package/esm2020/lib/directives/scroll-tracker/scroll-tracker.directive.mjs +39 -0
  74. package/esm2020/lib/directives/show-hide-element/show-hide-element.directive.mjs +42 -0
  75. package/esm2020/lib/directives/template-reference/template-reference.directive.mjs +23 -0
  76. package/esm2020/lib/directives/throw-element-on-hover/throw-element-on-hover.directive.mjs +38 -0
  77. package/esm2020/lib/enums/direction.enum.mjs +9 -0
  78. package/esm2020/lib/enums/index.mjs +9 -0
  79. package/esm2020/lib/enums/media.enum.mjs +13 -0
  80. package/esm2020/lib/enums/position.enum.mjs +12 -0
  81. package/esm2020/lib/enums/sequence.enum.mjs +9 -0
  82. package/esm2020/lib/enums/size.enum.mjs +11 -0
  83. package/esm2020/lib/enums/sorting-direction.enum.mjs +9 -0
  84. package/esm2020/lib/enums/theme.enum.mjs +9 -0
  85. package/esm2020/lib/enums/ui.enum.mjs +30 -0
  86. package/esm2020/lib/models/class.model.mjs +2 -0
  87. package/esm2020/lib/models/index.mjs +2 -0
  88. package/esm2020/lib/ngx-sfc-common.module.mjs +190 -0
  89. package/esm2020/lib/pipes/index.mjs +2 -0
  90. package/esm2020/lib/pipes/switch-multi-case/switch-multi-case.pipe.mjs +16 -0
  91. package/esm2020/lib/services/document-ref.service.mjs +71 -0
  92. package/esm2020/lib/services/index.mjs +4 -0
  93. package/esm2020/lib/services/resize.service.mjs +42 -0
  94. package/esm2020/lib/services/window-ref.service.mjs +70 -0
  95. package/esm2020/lib/utils/collections.utils.mjs +280 -0
  96. package/esm2020/lib/utils/common.utils.mjs +184 -0
  97. package/esm2020/lib/utils/date-time.utils.mjs +265 -0
  98. package/esm2020/lib/utils/file.utils.mjs +53 -0
  99. package/esm2020/lib/utils/index.mjs +7 -0
  100. package/esm2020/lib/utils/string.utils.mjs +31 -0
  101. package/esm2020/lib/utils/ui.utils.mjs +90 -0
  102. package/esm2020/ngx-sfc-common.mjs +5 -0
  103. package/esm2020/public-api.mjs +12 -0
  104. package/fesm2015/ngx-sfc-common.mjs +3097 -0
  105. package/fesm2015/ngx-sfc-common.mjs.map +1 -0
  106. package/fesm2020/ngx-sfc-common.mjs +3088 -0
  107. package/fesm2020/ngx-sfc-common.mjs.map +1 -0
  108. package/index.d.ts +5 -0
  109. package/lib/components/button/button-type.enum.d.ts +7 -0
  110. package/lib/components/button/button.component.d.ts +16 -0
  111. package/lib/components/checkmark/checkmark-type.enum.d.ts +5 -0
  112. package/lib/components/checkmark/checkmark.component.d.ts +11 -0
  113. package/lib/components/close/close.component.d.ts +6 -0
  114. package/lib/components/delimeter/delimeter.component.d.ts +9 -0
  115. package/lib/components/dots/dots.component.d.ts +9 -0
  116. package/lib/components/hamburger/default/hamburger.component.d.ts +6 -0
  117. package/lib/components/hamburger/hamburger-base.component.d.ts +7 -0
  118. package/lib/components/hamburger/menu/hamburger-menu.component.d.ts +7 -0
  119. package/lib/components/icon/icon.component.d.ts +9 -0
  120. package/lib/components/index.d.ts +44 -0
  121. package/lib/components/load-container/load-container.component.d.ts +50 -0
  122. package/lib/components/load-container/load-container.constants.d.ts +4 -0
  123. package/lib/components/load-container/load-container.enum.d.ts +8 -0
  124. package/lib/components/load-container/models/load-container.model.d.ts +14 -0
  125. package/lib/components/load-container/models/load-more-parameters.model.d.ts +5 -0
  126. package/lib/components/load-container/models/load-more-predicate-parameters.model.d.ts +3 -0
  127. package/lib/components/load-container/models/load-more.model.d.ts +5 -0
  128. package/lib/components/load-container/service/load-more.service.d.ts +12 -0
  129. package/lib/components/load-more-button/load-more-button.component.d.ts +12 -0
  130. package/lib/components/loader/bounce/bounce-loader.component.d.ts +6 -0
  131. package/lib/components/loader/circle/circle-loader-type.enum.d.ts +4 -0
  132. package/lib/components/loader/circle/circle-loader.component.d.ts +8 -0
  133. package/lib/components/loader/loader-base.component.d.ts +27 -0
  134. package/lib/components/loader/loader.constants.d.ts +5 -0
  135. package/lib/components/loader/loader.event.d.ts +4 -0
  136. package/lib/components/loader/service/loader.service.d.ts +33 -0
  137. package/lib/components/modal/directive/click/modal-open-on-click.directive.d.ts +17 -0
  138. package/lib/components/modal/directive/open/modal-open.directive.d.ts +13 -0
  139. package/lib/components/modal/footer/default/default-modal-footer.component.d.ts +19 -0
  140. package/lib/components/modal/footer/default/default-modal-footer.model.d.ts +8 -0
  141. package/lib/components/modal/header/default/default-modal-header.component.d.ts +16 -0
  142. package/lib/components/modal/header/default/default-modal-header.model.d.ts +6 -0
  143. package/lib/components/modal/modal-template.enum.d.ts +5 -0
  144. package/lib/components/modal/modal.component.d.ts +26 -0
  145. package/lib/components/modal/service/modal.event.d.ts +4 -0
  146. package/lib/components/modal/service/modal.service.d.ts +13 -0
  147. package/lib/components/pagination/models/pagination-view.model.d.ts +12 -0
  148. package/lib/components/pagination/pagination.component.d.ts +31 -0
  149. package/lib/components/pagination/pagination.constants.d.ts +5 -0
  150. package/lib/components/pagination/service/pagination.event.d.ts +6 -0
  151. package/lib/components/pagination/service/pagination.service.d.ts +25 -0
  152. package/lib/components/sorting/service/sorting.event.d.ts +5 -0
  153. package/lib/components/sorting/service/sorting.service.d.ts +9 -0
  154. package/lib/components/sorting/sorting.component.d.ts +22 -0
  155. package/lib/components/sorting/sorting.constants.d.ts +4 -0
  156. package/lib/components/sorting/sorting.model.d.ts +12 -0
  157. package/lib/components/template-content/template-content.component.d.ts +14 -0
  158. package/lib/components/toggle-switcher/toggle-switcher.component.d.ts +12 -0
  159. package/lib/components/toggle-switcher/toggle-switcher.model.d.ts +5 -0
  160. package/lib/components/tooltip/tooltip-type.enum.d.ts +4 -0
  161. package/lib/components/tooltip/tooltip.component.d.ts +22 -0
  162. package/lib/constants/common.constants.d.ts +8 -0
  163. package/lib/constants/date-time.constants.d.ts +9 -0
  164. package/lib/constants/file.constants.d.ts +1 -0
  165. package/lib/constants/index.d.ts +4 -0
  166. package/lib/constants/ui.constants.d.ts +22 -0
  167. package/lib/directives/click-outside/click-outside.directive.d.ts +23 -0
  168. package/lib/directives/click-outside/click-outside.event.d.ts +4 -0
  169. package/lib/directives/component-size/component-size.directive.d.ts +18 -0
  170. package/lib/directives/destroy-parent/destroy-parent.directive.d.ts +10 -0
  171. package/lib/directives/dom-changes/dom-changes.directive.d.ts +12 -0
  172. package/lib/directives/if/if.directive.d.ts +11 -0
  173. package/lib/directives/image-size/image-load.directive.d.ts +12 -0
  174. package/lib/directives/image-size/services/image-load.event.d.ts +5 -0
  175. package/lib/directives/image-size/services/image-load.service.d.ts +10 -0
  176. package/lib/directives/image-size/services/image-size.model.d.ts +4 -0
  177. package/lib/directives/index.d.ts +16 -0
  178. package/lib/directives/mouse-down/mouse-down.directive.d.ts +12 -0
  179. package/lib/directives/scroll-into-view/scroll-into-view.directive.d.ts +11 -0
  180. package/lib/directives/scroll-tracker/scroll-tracker.directive.d.ts +11 -0
  181. package/lib/directives/show-hide-element/show-hide-element.directive.d.ts +13 -0
  182. package/lib/directives/template-reference/template-reference.directive.d.ts +10 -0
  183. package/lib/directives/throw-element-on-hover/throw-element-on-hover.directive.d.ts +13 -0
  184. package/lib/enums/direction.enum.d.ts +7 -0
  185. package/lib/enums/index.d.ts +8 -0
  186. package/lib/enums/media.enum.d.ts +11 -0
  187. package/lib/enums/position.enum.d.ts +10 -0
  188. package/lib/enums/sequence.enum.d.ts +7 -0
  189. package/lib/enums/size.enum.d.ts +9 -0
  190. package/lib/enums/sorting-direction.enum.d.ts +7 -0
  191. package/lib/enums/theme.enum.d.ts +7 -0
  192. package/lib/enums/ui.enum.d.ts +27 -0
  193. package/lib/models/class.model.d.ts +3 -0
  194. package/lib/models/index.d.ts +1 -0
  195. package/lib/ngx-sfc-common.module.d.ts +43 -0
  196. package/lib/pipes/index.d.ts +1 -0
  197. package/lib/pipes/switch-multi-case/switch-multi-case.pipe.d.ts +7 -0
  198. package/lib/services/document-ref.service.d.ts +43 -0
  199. package/lib/services/index.d.ts +3 -0
  200. package/lib/services/resize.service.d.ts +32 -0
  201. package/lib/services/window-ref.service.d.ts +43 -0
  202. package/lib/utils/collections.utils.d.ts +156 -0
  203. package/lib/utils/common.utils.d.ts +78 -0
  204. package/lib/utils/date-time.utils.d.ts +164 -0
  205. package/lib/utils/file.utils.d.ts +25 -0
  206. package/lib/utils/index.d.ts +6 -0
  207. package/lib/utils/string.utils.d.ts +19 -0
  208. package/lib/utils/ui.utils.d.ts +58 -0
  209. package/package.json +56 -0
  210. package/public-api.d.ts +8 -0
  211. package/styles/_colors.scss +48 -0
  212. package/styles/_index.scss +4 -0
  213. package/styles/_mixins-delimeter.scss +21 -0
  214. package/styles/_mixins-scroll.scss +38 -0
  215. package/styles/_mixins.scss +46 -0
  216. package/styles/_variables.scss +12 -0
  217. package/styles/themes/_dark.scss +17 -0
  218. package/styles/themes/_default.scss +18 -0
  219. package/styles/themes/_yellow.scss +3 -0
@@ -0,0 +1,280 @@
1
+ import { CommonConstants } from "../constants";
2
+ import { SortingDirection } from "../enums";
3
+ import { isDefined } from "./common.utils";
4
+ import { isNullOrEmptyString } from "./string.utils";
5
+ /**
6
+ * Return true if collection not empty
7
+ * @param collection Array of items
8
+ * @returns True if collection not empty
9
+ */
10
+ export function any(collection) {
11
+ return isDefined(collection) && collection.length > 0;
12
+ }
13
+ /**
14
+ * Return true if collection has such value
15
+ * @param collection Array of items
16
+ * @param value Value to check
17
+ * @returns True if found value in collection
18
+ */
19
+ export function hasItem(collection, value) {
20
+ return any(collection)
21
+ && collection.findIndex(item => item === value) !== CommonConstants.NOT_FOUND_INDEX;
22
+ }
23
+ /**
24
+ * Return true if collection has such value by predicate function
25
+ * @param collection Array of items
26
+ * @param predicate Function to define check logic
27
+ * @returns True if found value in collection
28
+ */
29
+ export function hasItemBy(collection, predicate) {
30
+ return any(collection) && collection.findIndex(predicate) !== CommonConstants.NOT_FOUND_INDEX;
31
+ }
32
+ /**
33
+ * Return true if collection of objects has such value as object
34
+ * @param collection Array of objects
35
+ * @param property Property name
36
+ * @param value Value to check
37
+ * @returns True if found value in collection
38
+ */
39
+ export function hasObjectItem(collection, // TODO <-- Array<T>
40
+ property, value) {
41
+ return any(collection)
42
+ && collection.findIndex(item => item.hasOwnProperty(property)
43
+ && item[property] === value) !== CommonConstants.NOT_FOUND_INDEX;
44
+ }
45
+ /**
46
+ * Return value from collection by predicate function
47
+ * @param collection Array of items
48
+ * @param predicate Function to define search logic
49
+ * @returns Value from collection
50
+ */
51
+ export function firstOrDefault(collection, predicate) {
52
+ return any(collection) ? collection?.find(predicate) : undefined;
53
+ }
54
+ /**
55
+ * Return first item from collection
56
+ * @param collection Array of items
57
+ * @returns First value from collection
58
+ */
59
+ export function firstItem(collection) {
60
+ return any(collection) ? collection[0] : null;
61
+ }
62
+ /**
63
+ * Return last item from collection
64
+ * @param collection Array of items
65
+ * @returns Last value from collection
66
+ */
67
+ export function lastItem(collection) {
68
+ return any(collection) ? collection[collection.length - 1] : null;
69
+ }
70
+ /**
71
+ * Return True if all values match predicate function
72
+ * @param collection Array of objects
73
+ * @param predicate Function to define check logic
74
+ * @returns True if all values match predicate
75
+ */
76
+ export function all(collection, predicate) {
77
+ return any(collection) ? collection.filter(predicate).length == collection.length : false;
78
+ }
79
+ /**
80
+ * Return count by predicate
81
+ * @param collection Array of objects
82
+ * @param predicate Function to define check logic
83
+ * @returns Items count
84
+ */
85
+ export function count(collection, predicate) {
86
+ return collection.filter(predicate).length;
87
+ }
88
+ /**
89
+ * Return items from collection by predicate function
90
+ * @param collection Array of items
91
+ * @param predicate Function to define search logic
92
+ * @returns Values from collection
93
+ */
94
+ export function where(collection, predicate) {
95
+ return any(collection) ? collection.filter(predicate) : null;
96
+ }
97
+ /**
98
+ * Return sliced collection by page number and page size
99
+ * @param collection Array of items
100
+ * @param page Page number
101
+ * @param size Page size
102
+ * @returns Sliced collection
103
+ */
104
+ export function skip(collection, page, size) {
105
+ if (any(collection)) {
106
+ let start = (page - 1) * size;
107
+ return collection.slice(start, start + size);
108
+ }
109
+ return collection;
110
+ }
111
+ export function sort(collection, direction = SortingDirection.Ascending) {
112
+ if (any(collection)) {
113
+ return direction == SortingDirection.Ascending
114
+ ? collection.sort((a, b) => a - b)
115
+ : collection.sort((a, b) => b - a);
116
+ }
117
+ return collection;
118
+ }
119
+ /**
120
+ * Return sorted collection of objects by property
121
+ * @param collection Array of items
122
+ * @param property Property name
123
+ * @param direction Sorting direction
124
+ * @returns Sorted collection
125
+ */
126
+ export function sortBy(collection, property, direction) {
127
+ if (any(collection)) {
128
+ let _sortFunc = (a, b) => (t1, t2) => (a[property] > b[property] ? t1 : t2);
129
+ return direction == SortingDirection.Ascending
130
+ ? collection.sort((a, b) => _sortFunc(a, b)(1, -1))
131
+ : collection.sort((a, b) => _sortFunc(a, b)(-1, 1));
132
+ }
133
+ return collection;
134
+ }
135
+ /**
136
+ * Return sorted collection of objects by path
137
+ * @param collection Array of items
138
+ * @param path Path to property
139
+ * @param direction Sorting direction
140
+ * @returns Sorted collection
141
+ */
142
+ export function sortByPath(collection, path, direction) {
143
+ if (any(collection)) {
144
+ if (isNullOrEmptyString(path))
145
+ throw new Error('Collection utils | Sort By Path function --> Path is empty.');
146
+ const pathParts = path.split('.');
147
+ if (!any(pathParts))
148
+ throw new Error('Collection utils | Sort By Path function --> Path is incorrect.');
149
+ const partsLength = pathParts.length;
150
+ collection.sort((a, b) => {
151
+ var i = 0;
152
+ while (i < partsLength) {
153
+ a = a[pathParts[i]];
154
+ b = b[pathParts[i]];
155
+ i++;
156
+ }
157
+ return direction == SortingDirection.Ascending
158
+ ? a >= b ? 1 : -1
159
+ : a > b ? -1 : 1;
160
+ });
161
+ return collection;
162
+ }
163
+ return collection;
164
+ }
165
+ /**
166
+ * Return collection without matches
167
+ * @param collection Array of items
168
+ * @returns Collection without matches
169
+ */
170
+ export function distinct(collection) {
171
+ return any(collection)
172
+ ? collection.filter((value, index, self) => self.indexOf(value) === index)
173
+ : collection;
174
+ }
175
+ /**
176
+ * Return sum value from collection items by map function
177
+ * @param collection Array of items
178
+ * @param select Map function
179
+ * @returns Sum value of colection items
180
+ */
181
+ export function sum(collection, select) {
182
+ return any(collection)
183
+ ? collection
184
+ .map(select)
185
+ .reduce((a, b) => { return a + b; }, 0)
186
+ : 0;
187
+ }
188
+ /**
189
+ * Return max value from collection items by map function
190
+ * @param collection Array of items
191
+ * @param select Map function
192
+ * @returns Max value of collection items
193
+ */
194
+ export function max(collection, select) {
195
+ if (any(collection))
196
+ return Math.max(...collection.map(select));
197
+ throw new Error('Collection utils | Max function --> Collection is empty.');
198
+ }
199
+ /**
200
+ * Delete items from collection by predicate
201
+ * @param collection Array of items
202
+ * @param predicate Function to define remove logic
203
+ */
204
+ export function remove(collection, predicate) {
205
+ var i = collection.length;
206
+ while (i--) {
207
+ if (predicate(collection[i])) {
208
+ collection.splice(i, 1);
209
+ }
210
+ }
211
+ }
212
+ /**
213
+ * Add item to collection
214
+ * @param collection Array of items
215
+ * @param item New item
216
+ * @param predicate Function to define if allowed to add new item
217
+ * @returns True if successfully added
218
+ */
219
+ export function addItem(collection, item, predicate) {
220
+ if (!isDefined(collection))
221
+ collection = new Array();
222
+ if (isDefined(predicate) && predicate(item))
223
+ return false;
224
+ collection.push(item);
225
+ return true;
226
+ }
227
+ /**
228
+ * Delete item from collection
229
+ * @param collection Array of items
230
+ * @param item Item to delete
231
+ * @returns True if successfully removed
232
+ */
233
+ export function removeItem(collection, item) {
234
+ if (isDefined(item) && hasItem(collection, item)) {
235
+ collection.splice(collection.indexOf(item), 1);
236
+ return true;
237
+ }
238
+ return false;
239
+ }
240
+ /**
241
+ * Delete item from collection by predicate
242
+ * @param collection Array of items
243
+ * @param predicate Function to define remove logic
244
+ * @returns True if successfully removed
245
+ */
246
+ export function removeItemBy(collection, predicate) {
247
+ const foundItem = firstOrDefault(collection, predicate);
248
+ if (isDefined(foundItem)) {
249
+ collection.splice(collection.indexOf(foundItem), 1);
250
+ return true;
251
+ }
252
+ return false;
253
+ }
254
+ /**
255
+ * Update item in collection by predicate
256
+ * @param collection Array of items
257
+ * @param predicate Function to define item for deleting
258
+ * @returns True if successfully removed
259
+ */
260
+ export function updateItemBy(collection, predicate, newItem) {
261
+ const itemIndex = collection.findIndex(predicate);
262
+ if (itemIndex !== CommonConstants.NOT_FOUND_INDEX) {
263
+ const result = collection.slice(0);
264
+ result[itemIndex] = {
265
+ ...collection[itemIndex],
266
+ ...newItem
267
+ };
268
+ return result;
269
+ }
270
+ return null;
271
+ }
272
+ /**
273
+ * Return collection or empty if collection is not defined
274
+ * @param collection Array of items
275
+ * @returns Collection or empty
276
+ */
277
+ export function getCollectionOrEmpty(collection) {
278
+ return isDefined(collection) ? collection : [];
279
+ }
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL3V0aWxzL2NvbGxlY3Rpb25zLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FBSSxVQUF1QztJQUMxRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSyxVQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBSSxVQUFvQixFQUFFLEtBQVE7SUFDckQsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDO1dBQ2YsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsS0FBSyxlQUFlLENBQUMsZUFBZSxDQUFDO0FBQzVGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksVUFBb0IsRUFBRSxTQUErQjtJQUM5RSxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLGVBQWUsQ0FBQyxlQUFlLENBQUM7QUFDbEcsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUksVUFBc0IsRUFBRSxvQkFBb0I7QUFDekUsUUFBZ0IsRUFBRSxLQUFRO0lBQzFCLE9BQU8s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Q0FBQztRQUNGLE9BQU8sTUFBTSxDQUFBO0tBQ2hCO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUksVUFBb0I7SUFDeEQsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Db25zdGFudHMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tIFwiLi4vZW51bXNcIjtcclxuaW1wb3J0IHsgaXNEZWZpbmVkIH0gZnJvbSBcIi4vY29tbW9uLnV0aWxzXCI7XHJcbmltcG9ydCB7IGlzTnVsbE9yRW1wdHlTdHJpbmcgfSBmcm9tIFwiLi9zdHJpbmcudXRpbHNcIjtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBjb2xsZWN0aW9uIG5vdCBlbXB0eVxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGNvbGxlY3Rpb24gbm90IGVtcHR5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYW55PFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzRGVmaW5lZChjb2xsZWN0aW9uKSAmJiAoY29sbGVjdGlvbiBhcyBBcnJheTxUPikubGVuZ3RoID4gMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIGNvbGxlY3Rpb24gaGFzIHN1Y2ggdmFsdWVcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgZm91bmQgdmFsdWUgaW4gY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc0l0ZW08VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHZhbHVlOiBUKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYW55KGNvbGxlY3Rpb24pXHJcbiAgICAgICAgJiYgY29sbGVjdGlvbi5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSB2YWx1ZSkgIT09IENvbW1vbkNvbnN0YW50cy5OT1RfRk9VTkRfSU5ERVg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBjb2xsZWN0aW9uIGhhcyBzdWNoIHZhbHVlIGJ5IHByZWRpY2F0ZSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSBjaGVjayBsb2dpY1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGZvdW5kIHZhbHVlIGluIGNvbGxlY3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNJdGVtQnk8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbikgJiYgY29sbGVjdGlvbi5maW5kSW5kZXgocHJlZGljYXRlKSAhPT0gQ29tbW9uQ29uc3RhbnRzLk5PVF9GT1VORF9JTkRFWDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBoYXMgc3VjaCB2YWx1ZSBhcyBvYmplY3RcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2Ygb2JqZWN0c1xyXG4gKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgbmFtZVxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2tcclxuICogQHJldHVybnMgVHJ1ZSBpZiBmb3VuZCB2YWx1ZSBpbiBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaGFzT2JqZWN0SXRlbTxUPihjb2xsZWN0aW9uOiBBcnJheTxhbnk+LCAvLyBUT0RPIDwtLSBBcnJheTxUPlxyXG4gICAgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IFQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbilcclxuICAgICAgICAmJiBjb2xsZWN0aW9uLmZpbmRJbmRleChpdGVtID0+XHJcbiAgICAgICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkocHJvcGVydHkpXHJcbiAgICAgICAgICAgICYmIGl0ZW1bcHJvcGVydHldID09PSB2YWx1ZSkgIT09IENvbW1vbkNvbnN0YW50cy5OT1RfRk9VTkRfSU5ERVg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdmFsdWUgZnJvbSBjb2xsZWN0aW9uIGJ5IHByZWRpY2F0ZSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSBzZWFyY2ggbG9naWNcclxuICogQHJldHVybnMgVmFsdWUgZnJvbSBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmlyc3RPckRlZmF1bHQ8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4gfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbilcclxuICAgIDogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gYW55KGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbj8uZmluZChwcmVkaWNhdGUpIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIGZpcnN0IGl0ZW0gZnJvbSBjb2xsZWN0aW9uXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEByZXR1cm5zIEZpcnN0IHZhbHVlIGZyb20gY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0SXRlbTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPik6IFQgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uWzBdIDogbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBsYXN0IGl0ZW0gZnJvbSBjb2xsZWN0aW9uXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEByZXR1cm5zIExhc3QgdmFsdWUgZnJvbSBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGFzdEl0ZW08VD4oY29sbGVjdGlvbjogQXJyYXk8VD4pOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gYW55KGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbltjb2xsZWN0aW9uLmxlbmd0aCAtIDFdIDogbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBUcnVlIGlmIGFsbCB2YWx1ZXMgbWF0Y2ggcHJlZGljYXRlIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIG9iamVjdHNcclxuICogQHBhcmFtIHByZWRpY2F0ZSBGdW5jdGlvbiB0byBkZWZpbmUgY2hlY2sgbG9naWNcclxuICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgdmFsdWVzIG1hdGNoIHByZWRpY2F0ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFsbDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGFueShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24uZmlsdGVyKHByZWRpY2F0ZSkubGVuZ3RoID09IGNvbGxlY3Rpb24ubGVuZ3RoIDogZmFsc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gY291bnQgYnkgcHJlZGljYXRlXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIG9iamVjdHNcclxuICogQHBhcmFtIHByZWRpY2F0ZSBGdW5jdGlvbiB0byBkZWZpbmUgY2hlY2sgbG9naWNcclxuICogQHJldHVybnMgSXRlbXMgY291bnRcclxuICovXHJcbiBleHBvcnQgZnVuY3Rpb24gY291bnQ8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKHByZWRpY2F0ZSkubGVuZ3RoO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIGl0ZW1zIGZyb20gY29sbGVjdGlvbiBieSBwcmVkaWNhdGUgZnVuY3Rpb25cclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHByZWRpY2F0ZSBGdW5jdGlvbiB0byBkZWZpbmUgc2VhcmNoIGxvZ2ljXHJcbiAqIEByZXR1cm5zIFZhbHVlcyBmcm9tIGNvbGxlY3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB3aGVyZTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbilcclxuICAgIDogQXJyYXk8VD4gfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uLmZpbHRlcihwcmVkaWNhdGUpIDogbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBzbGljZWQgY29sbGVjdGlvbiBieSBwYWdlIG51bWJlciBhbmQgcGFnZSBzaXplXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEBwYXJhbSBwYWdlIFBhZ2UgbnVtYmVyXHJcbiAqIEBwYXJhbSBzaXplIFBhZ2Ugc2l6ZVxyXG4gKiBAcmV0dXJucyBTbGljZWQgY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNraXA8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHBhZ2U6IG51bWJlciwgc2l6ZTogbnVtYmVyKTogQXJyYXk8VD4ge1xyXG4gICAgaWYgKGFueShjb2xsZWN0aW9uKSkge1xyXG4gICAgICAgIGxldCBzdGFydCA9IChwYWdlIC0gMSkgKiBzaXplO1xyXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNsaWNlKHN0YXJ0LCBzdGFydCArIHNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc29ydDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgZGlyZWN0aW9uOiBTb3J0aW5nRGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Bc2NlbmRpbmcpOiBBcnJheTxUPiB7XHJcbiAgICBpZiAoYW55KGNvbGxlY3Rpb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBTb3J0aW5nRGlyZWN0aW9uLkFzY2VuZGluZ1xyXG4gICAgICAgICAgICA/IGNvbGxlY3Rpb24uc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGEgLSBiKVxyXG4gICAgICAgICAgICA6IGNvbGxlY3Rpb24uc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIgLSBhKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBzb3J0ZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzIGJ5IHByb3BlcnR5XHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lXHJcbiAqIEBwYXJhbSBkaXJlY3Rpb24gU29ydGluZyBkaXJlY3Rpb25cclxuICogQHJldHVybnMgU29ydGVkIGNvbGxlY3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzb3J0Qnk8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHByb3BlcnR5OiBzdHJpbmcsXHJcbiAgICBkaXJlY3Rpb246IFNvcnRpbmdEaXJlY3Rpb24pOiBBcnJheTxUPiB7XHJcbiAgICBpZiAoYW55KGNvbGxlY3Rpb24pKSB7XHJcbiAgICAgICAgbGV0IF9zb3J0RnVuYyA9IChhOiBhbnksIGI6IGFueSkgPT5cclxuICAgICAgICAgICAgKHQxOiBudW1iZXIsIHQyOiBudW1iZXIpID0+XHJcbiAgICAgICAgICAgICAgICAoYVtwcm9wZXJ0eV0gPiBiW3Byb3BlcnR5XSA/IHQxIDogdDIpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09IFNvcnRpbmdEaXJlY3Rpb24uQXNjZW5kaW5nXHJcbiAgICAgICAgICAgID8gY29sbGVjdGlvbi5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gX3NvcnRGdW5jKGEsIGIpKDEsIC0xKSlcclxuICAgICAgICAgICAgOiBjb2xsZWN0aW9uLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBfc29ydEZ1bmMoYSwgYikoLTEsIDEpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBzb3J0ZWQgY29sbGVjdGlvbiBvZiBvYmplY3RzIGJ5IHBhdGhcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHBhdGggUGF0aCB0byBwcm9wZXJ0eVxyXG4gKiBAcGFyYW0gZGlyZWN0aW9uIFNvcnRpbmcgZGlyZWN0aW9uXHJcbiAqIEByZXR1cm5zIFNvcnRlZCBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc29ydEJ5UGF0aDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcGF0aDogc3RyaW5nLCBkaXJlY3Rpb246IFNvcnRpbmdEaXJlY3Rpb24pXHJcbiAgICA6IEFycmF5PFQ+IHtcclxuICAgIGlmIChhbnkoY29sbGVjdGlvbikpIHtcclxuICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eVN0cmluZyhwYXRoKSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uIHV0aWxzIHwgU29ydCBCeSBQYXRoIGZ1bmN0aW9uIC0tPiBQYXRoIGlzIGVtcHR5LicpO1xyXG5cclxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XHJcblxyXG4gICAgICAgIGlmICghYW55KHBhdGhQYXJ0cykpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiB1dGlscyB8IFNvcnQgQnkgUGF0aCBmdW5jdGlvbiAtLT4gUGF0aCBpcyBpbmNvcnJlY3QuJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcnRzTGVuZ3RoID0gcGF0aFBhcnRzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgY29sbGVjdGlvbi5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgcGFydHNMZW5ndGgpIHsgYSA9IGFbcGF0aFBhcnRzW2ldXTsgYiA9IGJbcGF0aFBhcnRzW2ldXTsgaSsrOyB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09IFNvcnRpbmdEaXJlY3Rpb24uQXNjZW5kaW5nXHJcbiAgICAgICAgICAgICAgICA/IGEgPj0gYiA/IDEgOiAtMVxyXG4gICAgICAgICAgICAgICAgOiBhID4gYiA/IC0xIDogMTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gY29sbGVjdGlvbiB3aXRob3V0IG1hdGNoZXNcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHJldHVybnMgQ29sbGVjdGlvbiB3aXRob3V0IG1hdGNoZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPik6IEFycmF5PFQ+IHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbilcclxuICAgICAgICA/IGNvbGxlY3Rpb24uZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxyXG4gICAgICAgIDogY29sbGVjdGlvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBzdW0gdmFsdWUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGJ5IG1hcCBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gc2VsZWN0IE1hcCBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyBTdW0gdmFsdWUgb2YgY29sZWN0aW9uIGl0ZW1zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3VtPFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBzZWxlY3Q6IChpdGVtOiBUKSA9PiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGFueShjb2xsZWN0aW9uKVxyXG4gICAgICAgID8gY29sbGVjdGlvblxyXG4gICAgICAgICAgICAubWFwKHNlbGVjdClcclxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4geyByZXR1cm4gYSArIGIgfSwgMClcclxuICAgICAgICA6IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gbWF4IHZhbHVlIGZyb20gY29sbGVjdGlvbiBpdGVtcyBieSBtYXAgZnVuY3Rpb25cclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHNlbGVjdCBNYXAgZnVuY3Rpb25cclxuICogQHJldHVybnMgTWF4IHZhbHVlIG9mIGNvbGxlY3Rpb24gaXRlbXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXg8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHNlbGVjdDogKGl0ZW06IFQpID0+IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoYW55KGNvbGxlY3Rpb24pKVxyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCguLi5jb2xsZWN0aW9uLm1hcChzZWxlY3QpKTtcclxuXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gdXRpbHMgfCBNYXggZnVuY3Rpb24gLS0+IENvbGxlY3Rpb24gaXMgZW1wdHkuJylcclxufVxyXG5cclxuLyoqXHJcbiAqIERlbGV0ZSBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gYnkgcHJlZGljYXRlXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdG8gZGVmaW5lIHJlbW92ZSBsb2dpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdmFyIGkgPSBjb2xsZWN0aW9uLmxlbmd0aDtcclxuICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGNvbGxlY3Rpb25baV0pKSB7XHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZCBpdGVtIHRvIGNvbGxlY3Rpb25cclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIGl0ZW0gTmV3IGl0ZW1cclxuICogQHBhcmFtIHByZWRpY2F0ZSBGdW5jdGlvbiB0byBkZWZpbmUgaWYgYWxsb3dlZCB0byBhZGQgbmV3IGl0ZW1cclxuICogQHJldHVybnMgVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRJdGVtPFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBpdGVtOiBULFxyXG4gICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghaXNEZWZpbmVkKGNvbGxlY3Rpb24pKVxyXG4gICAgICAgIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXk8VD4oKTtcclxuXHJcbiAgICBpZiAoaXNEZWZpbmVkKHByZWRpY2F0ZSkgJiYgcHJlZGljYXRlKGl0ZW0pKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb2xsZWN0aW9uLnB1c2goaXRlbSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWxldGUgaXRlbSBmcm9tIGNvbGxlY3Rpb25cclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIGl0ZW0gSXRlbSB0byBkZWxldGVcclxuICogQHJldHVybnMgVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUl0ZW08VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIGl0ZW06IFQpOiBib29sZWFuIHtcclxuICAgIGlmIChpc0RlZmluZWQoaXRlbSkgJiYgaGFzSXRlbShjb2xsZWN0aW9uLCBpdGVtKSkge1xyXG4gICAgICAgIGNvbGxlY3Rpb24uc3BsaWNlKGNvbGxlY3Rpb24uaW5kZXhPZihpdGVtKSwgMSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vKipcclxuICogRGVsZXRlIGl0ZW0gZnJvbSBjb2xsZWN0aW9uIGJ5IHByZWRpY2F0ZVxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSByZW1vdmUgbG9naWNcclxuICogQHJldHVybnMgVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUl0ZW1CeTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZm91bmRJdGVtOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCA9IGZpcnN0T3JEZWZhdWx0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSk7XHJcbiAgICBpZiAoaXNEZWZpbmVkKGZvdW5kSXRlbSkpIHtcclxuICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShjb2xsZWN0aW9uLmluZGV4T2YoZm91bmRJdGVtIGFzIFQpLCAxKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgaXRlbSBpbiBjb2xsZWN0aW9uIGJ5IHByZWRpY2F0ZVxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSBpdGVtIGZvciBkZWxldGluZ1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHN1Y2Nlc3NmdWxseSByZW1vdmVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlSXRlbUJ5PFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuLCBuZXdJdGVtOiBUKVxyXG4gICAgOiBBcnJheTxUPiB8IG51bGwge1xyXG4gICAgY29uc3QgaXRlbUluZGV4ID0gY29sbGVjdGlvbi5maW5kSW5kZXgocHJlZGljYXRlKTtcclxuXHJcbiAgICBpZiAoaXRlbUluZGV4ICE9PSBDb21tb25Db25zdGFudHMuTk9UX0ZPVU5EX0lOREVYKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29sbGVjdGlvbi5zbGljZSgwKTtcclxuICAgICAgICByZXN1bHRbaXRlbUluZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4uY29sbGVjdGlvbltpdGVtSW5kZXhdLFxyXG4gICAgICAgICAgICAuLi5uZXdJdGVtXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gY29sbGVjdGlvbiBvciBlbXB0eSBpZiBjb2xsZWN0aW9uIGlzIG5vdCBkZWZpbmVkXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb3IgZW1wdHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uT3JFbXB0eTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPik6IEFycmF5PFQ+IHtcclxuICAgIHJldHVybiBpc0RlZmluZWQoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogW107XHJcbn0iXX0=
@@ -0,0 +1,184 @@
1
+ import { Observable } from 'rxjs';
2
+ import { isEqualDateTimes } from './date-time.utils';
3
+ /**
4
+ * Return true if value defined
5
+ * @param value Value to check
6
+ * @returns True if value is not null and defined
7
+ */
8
+ export function isDefined(value) {
9
+ return value !== undefined && value !== null;
10
+ }
11
+ /**
12
+ * Return true if value is object
13
+ * @param value Value to check
14
+ * @returns True if value is object
15
+ */
16
+ export function isObject(value) {
17
+ return (isDefined(value) && typeof value === 'object'
18
+ && !Array.isArray(value)
19
+ && !(value instanceof Date || value instanceof File));
20
+ }
21
+ /**
22
+ * Return true if data is observable
23
+ * @param data Object to check
24
+ * @returns True if data is observable
25
+ */
26
+ export function isAsyncData(data) {
27
+ return data instanceof Observable;
28
+ }
29
+ /**
30
+ * Return extended object with new property
31
+ * @param obj Object to extend by property
32
+ * @param property New property name
33
+ * @param value Value for new property
34
+ * @returns Extended object with new property
35
+ */
36
+ export function addPropertyToObject(obj, property, value = null) {
37
+ if (isDefined(property) && !obj.hasOwnProperty(property)) {
38
+ let newObj = {};
39
+ newObj[property] = value;
40
+ obj = { ...obj, ...newObj };
41
+ }
42
+ return obj;
43
+ }
44
+ /**
45
+ * Remove property from object
46
+ * @param obj Object for removing property
47
+ * @param property Property name to remove
48
+ */
49
+ export function removePropertyFromObject(obj, property) {
50
+ if (obj.hasOwnProperty(property)) {
51
+ delete obj[property];
52
+ }
53
+ }
54
+ /**
55
+ * Deep merge object with others
56
+ * @param target Object to merge
57
+ * @param sources
58
+ */
59
+ /**
60
+ * Deep merge object with others
61
+ * @param target Object to merge
62
+ * @param sources Objects to be merged with target
63
+ * @returns Merged object
64
+ */
65
+ export function mergeDeep(target, ...sources) {
66
+ if (!sources.length)
67
+ return target;
68
+ const source = sources.shift();
69
+ if (isObject(target) && isObject(source)) {
70
+ for (const key in source) {
71
+ if (isObject(source[key])) {
72
+ if (!target[key])
73
+ Object.assign(target, { [key]: {} });
74
+ mergeDeep(target[key], source[key]);
75
+ }
76
+ else {
77
+ Object.assign(target, { [key]: source[key] });
78
+ }
79
+ }
80
+ }
81
+ return mergeDeep(target, ...sources);
82
+ }
83
+ /**
84
+ * Get type's property name safety
85
+ * @param name KeyOf property
86
+ * @returns Type's property name
87
+ */
88
+ export const nameof = (name) => name;
89
+ /**
90
+ * Determines if the input is a Number or something that can be coerced to a Number
91
+ * @param - The input to be tested
92
+ * @returns - An indication if the input is a Number or can be coerced to a Number
93
+ */
94
+ export function isNumeric(number) {
95
+ return !isNaN(parseFloat(number));
96
+ }
97
+ /**
98
+ * Return true if current browser is Chrome
99
+ * @returns If current browser is Chrome
100
+ */
101
+ export function isChromeBrowser() {
102
+ return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
103
+ }
104
+ /**
105
+ * Return true if value is valid email address
106
+ * @returns True if it's valid email address
107
+ */
108
+ export function isEmail(value) {
109
+ return isDefined(value.match(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/));
110
+ }
111
+ /**
112
+ * Return true if string is "true"
113
+ * @returns parsed string as boolean
114
+ */
115
+ export function parseBoolean(value) {
116
+ return /^true$/i.test(value);
117
+ }
118
+ /**
119
+ * Return true if values equal
120
+ * @param obj1 First value to compare
121
+ * @param obj2 Second value to compare
122
+ * @returns True if equal
123
+ */
124
+ export function isEqual(obj1, obj2) {
125
+ /**
126
+ * More accurately check the type of a JavaScript object
127
+ * @param {Object} obj The object
128
+ * @return {String} The object type
129
+ */
130
+ function getType(obj) {
131
+ return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
132
+ }
133
+ function areArraysEqual() {
134
+ // Check length
135
+ if (obj1.length !== obj2.length)
136
+ return false;
137
+ // Check each item in the array
138
+ for (let i = 0; i < obj1.length; i++) {
139
+ if (!isEqual(obj1[i], obj2[i]))
140
+ return false;
141
+ }
142
+ // If no errors, return true
143
+ return true;
144
+ }
145
+ function areObjectsEqual() {
146
+ if (Object.keys(obj1).length !== Object.keys(obj2).length)
147
+ return false;
148
+ // Check each item in the object
149
+ for (let key in obj1) {
150
+ if (Object.prototype.hasOwnProperty.call(obj1, key)) {
151
+ if (!isEqual(obj1[key], obj2[key])) {
152
+ return false;
153
+ }
154
+ }
155
+ }
156
+ // If no errors, return true
157
+ return true;
158
+ }
159
+ function areFunctionsEqual() {
160
+ return obj1.toString() === obj2.toString();
161
+ }
162
+ function arePrimativesEqual() {
163
+ return obj1 === obj2;
164
+ }
165
+ function areDatesEqual() {
166
+ return isEqualDateTimes(obj1, obj2);
167
+ }
168
+ // Get the object type
169
+ let type = getType(obj1);
170
+ // If the two items are not the same type, return false
171
+ if (type !== getType(obj2))
172
+ return false;
173
+ // Compare based on type
174
+ if (type === 'array')
175
+ return areArraysEqual();
176
+ if (type === 'date')
177
+ return areDatesEqual();
178
+ if (type === 'object')
179
+ return areObjectsEqual();
180
+ if (type === 'function')
181
+ return areFunctionsEqual();
182
+ return arePrimativesEqual();
183
+ }
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21tb24vc3JjL2xpYi91dGlscy9jb21tb24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBSSxLQUEyQjtJQUNwRCxPQUFVLEtBQUssS0FBSyxTQUFTLElBQU8sS0FBSyxLQUFLLElBQUksQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBVTtJQUMvQixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7V0FDOUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztXQUNyQixDQUFDLENBQUMsS0FBSyxZQUFZLElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBUztJQUNqQyxPQUFPLElBQUksWUFBWSxVQUFVLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFRLEVBQUUsUUFBZ0IsRUFBRSxRQUFhLElBQUk7SUFDN0UsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3RELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLEdBQUcsR0FBRyxFQUFF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TyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXpCLHVEQUF1RDtJQUN2RCxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFekMsd0JBQXdCO0lBQ3hCLElBQUksSUFBSSxLQUFLLE9BQU87UUFBRSxPQUFPLGNBQWMsRUFBRSxDQUFDO0lBRTlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLGFBQWEsRUFBRSxDQUFDO0lBRTVDLElBQUksSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLGVBQWUsRUFBRSxDQUFDO0lBRWhELElBQUksSUFBSSxLQUFLLFVBQVU7UUFBRSxPQUFPLGlCQUFpQixFQUFFLENBQUM7SUFFcEQsT0FBTyxrQkFBa0IsRUFBRSxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGlzRXF1YWxEYXRlVGltZXMgfSBmcm9tICcuL2RhdGUtdGltZS51dGlscyc7XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgdmFsdWUgZGVmaW5lZFxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2tcclxuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBub3QgbnVsbCBhbmQgZGVmaW5lZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZDxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIHJldHVybiA8VD52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIDxUPnZhbHVlICE9PSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgdmFsdWUgaXMgb2JqZWN0XHJcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBjaGVja1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbHVlIGlzIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoaXNEZWZpbmVkKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXHJcbiAgICAgICAgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXHJcbiAgICAgICAgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIGlzIG9ic2VydmFibGVcclxuICogQHBhcmFtIGRhdGEgT2JqZWN0IHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgZGF0YSBpcyBvYnNlcnZhYmxlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0RhdGEoZGF0YTogYW55KSB7XHJcbiAgICByZXR1cm4gZGF0YSBpbnN0YW5jZW9mIE9ic2VydmFibGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gZXh0ZW5kZWQgb2JqZWN0IHdpdGggbmV3IHByb3BlcnR5XHJcbiAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGV4dGVuZCBieSBwcm9wZXJ0eVxyXG4gKiBAcGFyYW0gcHJvcGVydHkgTmV3IHByb3BlcnR5IG5hbWUgXHJcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBmb3IgbmV3IHByb3BlcnR5XHJcbiAqIEByZXR1cm5zIEV4dGVuZGVkIG9iamVjdCB3aXRoIG5ldyBwcm9wZXJ0eVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFByb3BlcnR5VG9PYmplY3Qob2JqOiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkgPSBudWxsKTogYW55IHtcclxuICAgIGlmIChpc0RlZmluZWQocHJvcGVydHkpICYmICFvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICAgICAgbGV0IG5ld09iajogYW55ID0ge307XHJcbiAgICAgICAgbmV3T2JqW3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgIG9iaiA9IHsgLi4ub2JqLCAuLi5uZXdPYmogfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2JqO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHByb3BlcnR5IGZyb20gb2JqZWN0XHJcbiAqIEBwYXJhbSBvYmogT2JqZWN0IGZvciByZW1vdmluZyBwcm9wZXJ0eVxyXG4gKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZW1vdmVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcm9wZXJ0eUZyb21PYmplY3Qob2JqOiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XHJcbiAgICAgICAgZGVsZXRlIG9ialtwcm9wZXJ0eV07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gICogRGVlcCBtZXJnZSBvYmplY3Qgd2l0aCBvdGhlcnNcclxuICAqIEBwYXJhbSB0YXJnZXQgT2JqZWN0IHRvIG1lcmdlXHJcbiAgKiBAcGFyYW0gc291cmNlcyBcclxuICAqL1xyXG5cclxuLyoqXHJcbiAqIERlZXAgbWVyZ2Ugb2JqZWN0IHdpdGggb3RoZXJzXHJcbiAqIEBwYXJhbSB0YXJnZXQgIE9iamVjdCB0byBtZXJnZVxyXG4gKiBAcGFyYW0gc291cmNlcyBPYmplY3RzIHRvIGJlIG1lcmdlZCB3aXRoIHRhcmdldFxyXG4gKiBAcmV0dXJucyBNZXJnZWQgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwKHRhcmdldDogYW55LCAuLi5zb3VyY2VzOiBhbnlbXSk6IGFueSB7XHJcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKVxyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcblxyXG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xyXG5cclxuICAgIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pO1xyXG4gICAgICAgICAgICAgICAgbWVyZ2VEZWVwKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHR5cGUncyBwcm9wZXJ0eSBuYW1lIHNhZmV0eVxyXG4gKiBAcGFyYW0gbmFtZSBLZXlPZiBwcm9wZXJ0eVxyXG4gKiBAcmV0dXJucyBUeXBlJ3MgcHJvcGVydHkgbmFtZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG5hbWVvZiA9IDxUPihuYW1lOiBrZXlvZiBUKSA9PiBuYW1lO1xyXG5cclxuLyoqXHJcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYSBOdW1iZXIgb3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gYSBOdW1iZXJcclxuICAgKiBAcGFyYW0gLSBUaGUgaW5wdXQgdG8gYmUgdGVzdGVkXHJcbiAgICogQHJldHVybnMgLSBBbiBpbmRpY2F0aW9uIGlmIHRoZSBpbnB1dCBpcyBhIE51bWJlciBvciBjYW4gYmUgY29lcmNlZCB0byBhIE51bWJlclxyXG4gICAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljKG51bWJlcjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobnVtYmVyKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IGJyb3dzZXIgaXMgQ2hyb21lXHJcbiAqIEByZXR1cm5zIElmIGN1cnJlbnQgYnJvd3NlciBpcyBDaHJvbWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gL0Nocm9tZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAvR29vZ2xlIEluYy8udGVzdChuYXZpZ2F0b3IudmVuZG9yKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHZhbHVlIGlzIHZhbGlkIGVtYWlsIGFkZHJlc3NcclxuICogQHJldHVybnMgVHJ1ZSBpZiBpdCdzIHZhbGlkIGVtYWlsIGFkZHJlc3NcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtYWlsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpc0RlZmluZWQodmFsdWUubWF0Y2goXHJcbiAgICAgICAgL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcXSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC9cclxuICAgICkpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgc3RyaW5nIGlzIFwidHJ1ZVwiXHJcbiAqIEByZXR1cm5zIHBhcnNlZCBzdHJpbmcgYXMgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQm9vbGVhbih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gL150cnVlJC9pLnRlc3QodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgdmFsdWVzIGVxdWFsXHJcbiAqIEBwYXJhbSBvYmoxIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcclxuICogQHBhcmFtIG9iajIgU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcclxuICogQHJldHVybnMgVHJ1ZSBpZiBlcXVhbFxyXG4gKi9cclxuIGV4cG9ydCBmdW5jdGlvbiBpc0VxdWFsKG9iajE6IGFueSwgb2JqMjogYW55KSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3JlIGFjY3VyYXRlbHkgY2hlY2sgdGhlIHR5cGUgb2YgYSBKYXZhU2NyaXB0IG9iamVjdFxyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBvYmogVGhlIG9iamVjdFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAgICAgVGhlIG9iamVjdCB0eXBlXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGdldFR5cGUob2JqOiBhbnkpIHtcclxuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwoKSB7XHJcbiAgXHJcbiAgICAgIC8vIENoZWNrIGxlbmd0aFxyXG4gICAgICBpZiAob2JqMS5sZW5ndGggIT09IG9iajIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgXHJcbiAgICAgIC8vIENoZWNrIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXlcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKCFpc0VxdWFsKG9iajFbaV0sIG9iajJbaV0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLy8gSWYgbm8gZXJyb3JzLCByZXR1cm4gdHJ1ZVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICBcclxuICAgIH1cclxuICBcclxuICAgIGZ1bmN0aW9uIGFyZU9iamVjdHNFcXVhbCgpIHtcclxuICBcclxuICAgICAgaWYgKE9iamVjdC5rZXlzKG9iajEpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob2JqMikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgXHJcbiAgICAgIC8vIENoZWNrIGVhY2ggaXRlbSBpbiB0aGUgb2JqZWN0XHJcbiAgICAgIGZvciAobGV0IGtleSBpbiBvYmoxKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmoxLCBrZXkpKSB7XHJcbiAgICAgICAgICBpZiAoIWlzRXF1YWwob2JqMVtrZXldLCBvYmoyW2tleV0pKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIElmIG5vIGVycm9ycywgcmV0dXJuIHRydWVcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgXHJcbiAgICB9XHJcbiAgXHJcbiAgICBmdW5jdGlvbiBhcmVGdW5jdGlvbnNFcXVhbCgpIHtcclxuICAgICAgcmV0dXJuIG9iajEudG9TdHJpbmcoKSA9PT0gb2JqMi50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgZnVuY3Rpb24gYXJlUHJpbWF0aXZlc0VxdWFsKCkge1xyXG4gICAgICByZXR1cm4gb2JqMSA9PT0gb2JqMjtcclxuICAgIH1cclxuICBcclxuICAgIGZ1bmN0aW9uIGFyZURhdGVzRXF1YWwoKSB7XHJcbiAgICAgIHJldHVybiBpc0VxdWFsRGF0ZVRpbWVzKG9iajEsIG9iajIpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gR2V0IHRoZSBvYmplY3QgdHlwZVxyXG4gICAgbGV0IHR5cGUgPSBnZXRUeXBlKG9iajEpO1xyXG4gIFxyXG4gICAgLy8gSWYgdGhlIHR3byBpdGVtcyBhcmUgbm90IHRoZSBzYW1lIHR5cGUsIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHR5cGUgIT09IGdldFR5cGUob2JqMikpIHJldHVybiBmYWxzZTtcclxuICBcclxuICAgIC8vIENvbXBhcmUgYmFzZWQgb24gdHlwZVxyXG4gICAgaWYgKHR5cGUgPT09ICdhcnJheScpIHJldHVybiBhcmVBcnJheXNFcXVhbCgpO1xyXG4gIFxyXG4gICAgaWYgKHR5cGUgPT09ICdkYXRlJykgcmV0dXJuIGFyZURhdGVzRXF1YWwoKTtcclxuICBcclxuICAgIGlmICh0eXBlID09PSAnb2JqZWN0JykgcmV0dXJuIGFyZU9iamVjdHNFcXVhbCgpO1xyXG4gIFxyXG4gICAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicpIHJldHVybiBhcmVGdW5jdGlvbnNFcXVhbCgpO1xyXG4gIFxyXG4gICAgcmV0dXJuIGFyZVByaW1hdGl2ZXNFcXVhbCgpO1xyXG4gIH0iXX0=