@sinequa/atomic-angular 0.0.140

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 (174) hide show
  1. package/assets/tailwind.css +248 -0
  2. package/esm2022/lib/assistant/index.mjs +2 -0
  3. package/esm2022/lib/assistant/signalR.web.service.mjs +81 -0
  4. package/esm2022/lib/components/dropdown.mjs +127 -0
  5. package/esm2022/lib/components/index.mjs +5 -0
  6. package/esm2022/lib/components/menu/index.mjs +3 -0
  7. package/esm2022/lib/components/menu/menu-item.mjs +22 -0
  8. package/esm2022/lib/components/menu/menu.mjs +99 -0
  9. package/esm2022/lib/components/metadata/index.mjs +2 -0
  10. package/esm2022/lib/components/metadata/metadata.component.mjs +65 -0
  11. package/esm2022/lib/components/theme/index.mjs +3 -0
  12. package/esm2022/lib/components/theme/theme-selector.component.mjs +67 -0
  13. package/esm2022/lib/components/theme/theme-toggle.component.mjs +67 -0
  14. package/esm2022/lib/directives/index.mjs +5 -0
  15. package/esm2022/lib/directives/infinite-scroll.directive.mjs +47 -0
  16. package/esm2022/lib/directives/select-article-on-click.directive.mjs +39 -0
  17. package/esm2022/lib/directives/show-bookmark.directive.mjs +55 -0
  18. package/esm2022/lib/directives/theme-provider.directive.mjs +31 -0
  19. package/esm2022/lib/guards/auth.guard.mjs +27 -0
  20. package/esm2022/lib/guards/index.mjs +3 -0
  21. package/esm2022/lib/guards/initialization.guard.mjs +41 -0
  22. package/esm2022/lib/interceptors/audit.interceptor.mjs +23 -0
  23. package/esm2022/lib/interceptors/auth.interceptor.mjs +49 -0
  24. package/esm2022/lib/interceptors/body.interceptor.mjs +24 -0
  25. package/esm2022/lib/interceptors/error.interceptor.mjs +35 -0
  26. package/esm2022/lib/interceptors/index.mjs +7 -0
  27. package/esm2022/lib/interceptors/toast.interceptor.mjs +27 -0
  28. package/esm2022/lib/models/aggregation.mjs +2 -0
  29. package/esm2022/lib/models/article-metadata.mjs +2 -0
  30. package/esm2022/lib/models/autocomplete.mjs +2 -0
  31. package/esm2022/lib/models/custom-json.mjs +2 -0
  32. package/esm2022/lib/models/filter-dropdown.mjs +2 -0
  33. package/esm2022/lib/models/index.mjs +7 -0
  34. package/esm2022/lib/models/user-settings.mjs +2 -0
  35. package/esm2022/lib/pipes/highlight-word.pipe.mjs +33 -0
  36. package/esm2022/lib/pipes/index.mjs +3 -0
  37. package/esm2022/lib/pipes/source-icon.pipe.mjs +43 -0
  38. package/esm2022/lib/providers/eager-provider.mjs +24 -0
  39. package/esm2022/lib/providers/index.mjs +2 -0
  40. package/esm2022/lib/public-api.mjs +19 -0
  41. package/esm2022/lib/resolvers/index.mjs +2 -0
  42. package/esm2022/lib/resolvers/query-name-resolver.mjs +14 -0
  43. package/esm2022/lib/resources/index.mjs +2 -0
  44. package/esm2022/lib/resources/themes.mjs +53 -0
  45. package/esm2022/lib/services/application.service.mjs +245 -0
  46. package/esm2022/lib/services/autocomplete.service.mjs +85 -0
  47. package/esm2022/lib/services/drawer/backdrop.service.mjs +23 -0
  48. package/esm2022/lib/services/drawer/drawer-stack.service.mjs +152 -0
  49. package/esm2022/lib/services/drawer/drawer.service.mjs +38 -0
  50. package/esm2022/lib/services/index.mjs +12 -0
  51. package/esm2022/lib/services/label.service.mjs +161 -0
  52. package/esm2022/lib/services/navigation.service.mjs +59 -0
  53. package/esm2022/lib/services/saved-searches.service.mjs +75 -0
  54. package/esm2022/lib/services/search.service.mjs +89 -0
  55. package/esm2022/lib/services/selection-history.service.mjs +92 -0
  56. package/esm2022/lib/services/selection.service.mjs +87 -0
  57. package/esm2022/lib/stores/aggregations.store.mjs +62 -0
  58. package/esm2022/lib/stores/app.store.mjs +265 -0
  59. package/esm2022/lib/stores/application.store.mjs +93 -0
  60. package/esm2022/lib/stores/index.mjs +9 -0
  61. package/esm2022/lib/stores/principal.store.mjs +47 -0
  62. package/esm2022/lib/stores/query-params.store.mjs +208 -0
  63. package/esm2022/lib/stores/selection.store.mjs +46 -0
  64. package/esm2022/lib/stores/theme.store.mjs +116 -0
  65. package/esm2022/lib/stores/user-settings.store.mjs +272 -0
  66. package/esm2022/lib/tokens/highlights.mjs +32 -0
  67. package/esm2022/lib/tokens/index.mjs +2 -0
  68. package/esm2022/lib/utils/debounced-signal.mjs +38 -0
  69. package/esm2022/lib/utils/index.mjs +8 -0
  70. package/esm2022/lib/utils/inline-worker.mjs +40 -0
  71. package/esm2022/lib/utils/query.mjs +58 -0
  72. package/esm2022/lib/utils/routes.mjs +28 -0
  73. package/esm2022/lib/utils/tailwind-utils.mjs +6 -0
  74. package/esm2022/lib/utils/theme-body-hook.mjs +18 -0
  75. package/esm2022/lib/utils/theme-registry.mjs +6 -0
  76. package/esm2022/lib/web-services/aggregations.service.mjs +104 -0
  77. package/esm2022/lib/web-services/app.service.mjs +48 -0
  78. package/esm2022/lib/web-services/audit.service.mjs +122 -0
  79. package/esm2022/lib/web-services/index.mjs +10 -0
  80. package/esm2022/lib/web-services/json-method-plugin.service.mjs +54 -0
  81. package/esm2022/lib/web-services/preview.service.mjs +327 -0
  82. package/esm2022/lib/web-services/principal.service.mjs +46 -0
  83. package/esm2022/lib/web-services/query.service.mjs +123 -0
  84. package/esm2022/lib/web-services/text-chunck.service.mjs +46 -0
  85. package/esm2022/public-api.mjs +5 -0
  86. package/esm2022/sinequa-atomic-angular.mjs +5 -0
  87. package/fesm2022/sinequa-atomic-angular.mjs +4204 -0
  88. package/fesm2022/sinequa-atomic-angular.mjs.map +1 -0
  89. package/index.d.ts +5 -0
  90. package/lib/assistant/index.d.ts +1 -0
  91. package/lib/assistant/signalR.web.service.d.ts +46 -0
  92. package/lib/components/dropdown.d.ts +50 -0
  93. package/lib/components/index.d.ts +4 -0
  94. package/lib/components/menu/index.d.ts +2 -0
  95. package/lib/components/menu/menu-item.d.ts +8 -0
  96. package/lib/components/menu/menu.d.ts +24 -0
  97. package/lib/components/metadata/index.d.ts +1 -0
  98. package/lib/components/metadata/metadata.component.d.ts +24 -0
  99. package/lib/components/theme/index.d.ts +2 -0
  100. package/lib/components/theme/theme-selector.component.d.ts +70 -0
  101. package/lib/components/theme/theme-toggle.component.d.ts +10 -0
  102. package/lib/directives/index.d.ts +4 -0
  103. package/lib/directives/infinite-scroll.directive.d.ts +30 -0
  104. package/lib/directives/select-article-on-click.directive.d.ts +14 -0
  105. package/lib/directives/show-bookmark.directive.d.ts +52 -0
  106. package/lib/directives/theme-provider.directive.d.ts +20 -0
  107. package/lib/guards/auth.guard.d.ts +7 -0
  108. package/lib/guards/index.d.ts +2 -0
  109. package/lib/guards/initialization.guard.d.ts +20 -0
  110. package/lib/interceptors/audit.interceptor.d.ts +13 -0
  111. package/lib/interceptors/auth.interceptor.d.ts +14 -0
  112. package/lib/interceptors/body.interceptor.d.ts +11 -0
  113. package/lib/interceptors/error.interceptor.d.ts +9 -0
  114. package/lib/interceptors/index.d.ts +5 -0
  115. package/lib/interceptors/toast.interceptor.d.ts +13 -0
  116. package/lib/models/aggregation.d.ts +12 -0
  117. package/lib/models/article-metadata.d.ts +5 -0
  118. package/lib/models/autocomplete.d.ts +5 -0
  119. package/lib/models/custom-json.d.ts +58 -0
  120. package/lib/models/filter-dropdown.d.ts +10 -0
  121. package/lib/models/index.d.ts +6 -0
  122. package/lib/models/user-settings.d.ts +32 -0
  123. package/lib/pipes/highlight-word.pipe.d.ts +22 -0
  124. package/lib/pipes/index.d.ts +2 -0
  125. package/lib/pipes/source-icon.pipe.d.ts +54 -0
  126. package/lib/providers/eager-provider.d.ts +11 -0
  127. package/lib/providers/index.d.ts +1 -0
  128. package/lib/public-api.d.ts +15 -0
  129. package/lib/resolvers/index.d.ts +1 -0
  130. package/lib/resolvers/query-name-resolver.d.ts +9 -0
  131. package/lib/resources/index.d.ts +1 -0
  132. package/lib/resources/themes.d.ts +51 -0
  133. package/lib/services/application.service.d.ts +178 -0
  134. package/lib/services/autocomplete.service.d.ts +91 -0
  135. package/lib/services/drawer/backdrop.service.d.ts +9 -0
  136. package/lib/services/drawer/drawer-stack.service.d.ts +70 -0
  137. package/lib/services/drawer/drawer.service.d.ts +15 -0
  138. package/lib/services/index.d.ts +11 -0
  139. package/lib/services/label.service.d.ts +117 -0
  140. package/lib/services/navigation.service.d.ts +33 -0
  141. package/lib/services/saved-searches.service.d.ts +145 -0
  142. package/lib/services/search.service.d.ts +155 -0
  143. package/lib/services/selection-history.service.d.ts +50 -0
  144. package/lib/services/selection.service.d.ts +127 -0
  145. package/lib/stores/aggregations.store.d.ts +50 -0
  146. package/lib/stores/app.store.d.ts +208 -0
  147. package/lib/stores/application.store.d.ts +106 -0
  148. package/lib/stores/index.d.ts +8 -0
  149. package/lib/stores/principal.store.d.ts +53 -0
  150. package/lib/stores/query-params.store.d.ts +187 -0
  151. package/lib/stores/selection.store.d.ts +62 -0
  152. package/lib/stores/theme.store.d.ts +55 -0
  153. package/lib/stores/user-settings.store.d.ts +161 -0
  154. package/lib/tokens/highlights.d.ts +8 -0
  155. package/lib/tokens/index.d.ts +1 -0
  156. package/lib/utils/debounced-signal.d.ts +25 -0
  157. package/lib/utils/index.d.ts +7 -0
  158. package/lib/utils/inline-worker.d.ts +11 -0
  159. package/lib/utils/query.d.ts +26 -0
  160. package/lib/utils/routes.d.ts +16 -0
  161. package/lib/utils/tailwind-utils.d.ts +2 -0
  162. package/lib/utils/theme-body-hook.d.ts +6 -0
  163. package/lib/utils/theme-registry.d.ts +3 -0
  164. package/lib/web-services/aggregations.service.d.ts +60 -0
  165. package/lib/web-services/app.service.d.ts +30 -0
  166. package/lib/web-services/audit.service.d.ts +75 -0
  167. package/lib/web-services/index.d.ts +9 -0
  168. package/lib/web-services/json-method-plugin.service.d.ts +41 -0
  169. package/lib/web-services/preview.service.d.ts +295 -0
  170. package/lib/web-services/principal.service.d.ts +28 -0
  171. package/lib/web-services/query.service.d.ts +29 -0
  172. package/lib/web-services/text-chunck.service.d.ts +22 -0
  173. package/package.json +28 -0
  174. package/public-api.d.ts +1 -0
@@ -0,0 +1,272 @@
1
+ import { withDevtools } from '@angular-architects/ngrx-toolkit';
2
+ import { patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';
3
+ import { deleteUserSettings, fetchUserSettings, patchUserSettings } from '@sinequa/atomic';
4
+ const initialState = {
5
+ bookmarks: [],
6
+ recentSearches: [],
7
+ savedSearches: [],
8
+ assistants: {},
9
+ language: undefined,
10
+ };
11
+ export const UserSettingsStore = signalStore({ providedIn: 'root' }, withDevtools('UserSettings'), withState(initialState), withUserSettingsFeatures(), withBookmarkFeatures(), withRecentSearchFeatures(), withSavedSearchFeatures(), withAssistantFeatures());
12
+ export function withUserSettingsFeatures() {
13
+ return signalStoreFeature(withState(initialState), withMethods((store) => ({
14
+ /**
15
+ * Initializes the user settings store by fetching the user settings from the backend API
16
+ * and patching the store with the retrieved settings.
17
+ *
18
+ * @returns {Promise<void>} A promise that resolves when the initialization is complete.
19
+ */
20
+ async initialize() {
21
+ // Fetch the user settings from the backend API and patch the store with the result
22
+ const settings = await fetchUserSettings();
23
+ patchState(store, settings);
24
+ },
25
+ /**
26
+ * Resets the user settings to the initial state.
27
+ *
28
+ * This method performs the following actions:
29
+ * 1. Deletes the current user settings.
30
+ * 2. Patches the state with the initial state.
31
+ *
32
+ * @returns {Promise<void>} A promise that resolves when the reset operation is complete.
33
+ */
34
+ async reset() {
35
+ // Reset the user settings to the initial state
36
+ await deleteUserSettings();
37
+ patchState(store, initialState);
38
+ },
39
+ })));
40
+ }
41
+ export function withBookmarkFeatures() {
42
+ return signalStoreFeature(withState(initialState), withMethods((store) => ({
43
+ /**
44
+ * Updates the user's bookmarks in the store and optionally logs audit events.
45
+ *
46
+ * @param bookmarks - An array of bookmarks to update in the user settings.
47
+ * @param auditEvents - Optional audit events to log during the update.
48
+ * @returns A promise that resolves when the update is complete.
49
+ */
50
+ async updateBookmarks(bookmarks, auditEvents) {
51
+ await patchUserSettings({ bookmarks }, auditEvents);
52
+ patchState(store, (state) => {
53
+ return { ...state, bookmarks: [...bookmarks] };
54
+ });
55
+ },
56
+ /**
57
+ * Adds an article to the bookmarks if it is not already bookmarked.
58
+ *
59
+ * @param article - The article to be bookmarked.
60
+ * @param queryName - Optional name of the query associated with the bookmark.
61
+ * @returns A promise that resolves when the bookmark has been added.
62
+ */
63
+ async bookmark(article, queryName) {
64
+ if (!article.id)
65
+ return;
66
+ if (this.isBookmarked(article))
67
+ return;
68
+ const bookmark = {
69
+ id: article.id,
70
+ label: article.title,
71
+ source: article.collection[0],
72
+ author: article.authors?.[0],
73
+ queryName,
74
+ };
75
+ await this.updateBookmarks([...store.bookmarks(), bookmark], {
76
+ type: "Basket_AddDoc",
77
+ detail: {
78
+ docid: article.id
79
+ }
80
+ });
81
+ },
82
+ /**
83
+ * Removes a bookmark by its ID.
84
+ *
85
+ * @param id - The ID of the bookmark to remove.
86
+ * @returns A promise that resolves when the bookmark has been removed and the bookmarks have been updated.
87
+ *
88
+ * @remarks
89
+ * - If the provided ID is falsy, the function will return immediately.
90
+ * - If the bookmark with the given ID is not found, the function will return immediately.
91
+ * - The function updates the bookmarks and logs the removal action with a type of "Basket_RemoveDoc".
92
+ */
93
+ async unbookmark(id) {
94
+ if (!id)
95
+ return;
96
+ const bookmarks = store.bookmarks();
97
+ const index = bookmarks?.findIndex((bookmark) => bookmark.id === id);
98
+ if (index === -1)
99
+ return;
100
+ bookmarks.splice(index, 1);
101
+ await this.updateBookmarks([...bookmarks], {
102
+ type: "Basket_RemoveDoc",
103
+ detail: {
104
+ docid: id
105
+ }
106
+ });
107
+ },
108
+ /**
109
+ * Checks if the given article is bookmarked.
110
+ *
111
+ * @param article - An optional partial article object to check.
112
+ * @returns `true` if the article is bookmarked, `false` otherwise.
113
+ */
114
+ isBookmarked(article) {
115
+ if (!article || !article.id)
116
+ return false;
117
+ const bookmarks = store.bookmarks();
118
+ return !!bookmarks?.find((bookmark) => bookmark.id === article.id);
119
+ },
120
+ /**
121
+ * Toggles the bookmark status of a given article.
122
+ *
123
+ * This method checks if the article is currently bookmarked. If it is,
124
+ * it removes the bookmark. If it is not, it adds a bookmark.
125
+ *
126
+ * @param article - The article to toggle the bookmark status for.
127
+ * @returns A promise that resolves when the bookmark status has been toggled.
128
+ */
129
+ async toggleBookmark(article) {
130
+ const isBookmarked = await this.isBookmarked(article);
131
+ if (isBookmarked)
132
+ this.unbookmark(article.id);
133
+ else
134
+ this.bookmark(article);
135
+ },
136
+ })));
137
+ }
138
+ export function withRecentSearchFeatures() {
139
+ return signalStoreFeature(withState(initialState), withMethods((store) => ({
140
+ /**
141
+ * Deletes a recent search entry from the user's recent searches list.
142
+ *
143
+ * @param {number} index - The index of the recent search to delete.
144
+ * @returns {Promise<void>} A promise that resolves when the recent search has been deleted and the state has been updated.
145
+ */
146
+ async deleteRecentSearch(index) {
147
+ const recentSearches = store.recentSearches();
148
+ if (recentSearches) {
149
+ const recentSearchToDelete = recentSearches.splice(index, 1)[0];
150
+ await patchUserSettings({ recentSearches }, {
151
+ type: "RecentQuery_Delete",
152
+ detail: {
153
+ recentQuery: recentSearchToDelete.queryParams?.text
154
+ }
155
+ });
156
+ patchState(store, (state) => {
157
+ return { ...state, recentSearches: [...recentSearches] };
158
+ });
159
+ }
160
+ },
161
+ /**
162
+ * Updates the recent searches in the user settings.
163
+ *
164
+ * @param recentSearches - An array of recent searches to be updated in the user settings.
165
+ * @param auditEvents - Optional audit events to be logged during the update.
166
+ * @returns A promise that resolves when the recent searches have been updated.
167
+ */
168
+ async updateRecentSearches(recentSearches, auditEvents) {
169
+ await patchUserSettings({ recentSearches }, auditEvents);
170
+ patchState(store, (state) => {
171
+ return { ...state, recentSearches: [...recentSearches] };
172
+ });
173
+ },
174
+ /**
175
+ * Adds the current search to the recent searches list.
176
+ *
177
+ * This method checks if a search with the same label already exists in the recent searches.
178
+ * If it does, it updates the existing search with the new query parameters and date.
179
+ * If it does not, it adds a new search to the recent searches list.
180
+ *
181
+ * @param queryParams - The parameters of the current search.
182
+ * @returns A promise that resolves when the recent searches have been updated.
183
+ */
184
+ async addCurrentSearch(queryParams) {
185
+ // fist search if the search is already in the recent searches with the same label
186
+ const recentSearches = store.recentSearches();
187
+ const existingSearch = recentSearches.find((search) => search.label === queryParams.text);
188
+ const url = window.location.hash.substring(1);
189
+ const path = url.split('?')[0];
190
+ if (existingSearch) {
191
+ await this.updateRecentSearches([
192
+ { ...existingSearch,
193
+ date: new Date().toISOString(),
194
+ url,
195
+ path,
196
+ queryParams,
197
+ filterCount: queryParams.filters?.length
198
+ },
199
+ ...recentSearches.filter((search) => search.label !== queryParams.text),
200
+ ], {
201
+ type: "RecentQuery_Update",
202
+ detail: {
203
+ recentQuery: queryParams.text
204
+ }
205
+ });
206
+ }
207
+ else {
208
+ const recentSearch = {
209
+ url,
210
+ path,
211
+ display: queryParams.text,
212
+ label: queryParams.text,
213
+ filterCount: queryParams.filters?.length,
214
+ date: new Date().toISOString(),
215
+ queryParams
216
+ };
217
+ await this.updateRecentSearches([recentSearch, ...store.recentSearches()], {
218
+ type: "RecentQuery_Add",
219
+ detail: {
220
+ recentQuery: queryParams.text
221
+ }
222
+ });
223
+ }
224
+ },
225
+ })));
226
+ }
227
+ export function withSavedSearchFeatures() {
228
+ return signalStoreFeature(withState(initialState), withMethods((store) => ({
229
+ async deleteSavedSearch(index) {
230
+ const savedSearches = store.savedSearches();
231
+ if (savedSearches) {
232
+ const savedSearchToDelete = savedSearches.splice(index, 1)[0];
233
+ await patchUserSettings({ savedSearches }, {
234
+ type: "SavedQuery_Delete",
235
+ detail: {
236
+ savedQuery: savedSearchToDelete.display
237
+ }
238
+ });
239
+ patchState(store, (state) => {
240
+ return { ...state, savedSearches: [...savedSearches] };
241
+ });
242
+ }
243
+ },
244
+ async updateSavedSearches(savedSearches) {
245
+ await patchUserSettings({ savedSearches }, {
246
+ type: "SavedQuery_Add",
247
+ detail: {
248
+ savedQuery: savedSearches[0].display
249
+ }
250
+ });
251
+ patchState(store, (state) => {
252
+ return { ...state, savedSearches: [...savedSearches] };
253
+ });
254
+ },
255
+ })));
256
+ }
257
+ export function withAssistantFeatures() {
258
+ return signalStoreFeature(withState(initialState), withMethods((store) => ({
259
+ async updateAssistantSettings(assistantSettings) {
260
+ patchState(store, (state) => {
261
+ return { ...state, assistants: assistantSettings };
262
+ });
263
+ },
264
+ async updateLanguage(language, auditEvents) {
265
+ await patchUserSettings({ language }, auditEvents);
266
+ patchState(store, (state) => {
267
+ return { ...state, language };
268
+ });
269
+ },
270
+ })));
271
+ }
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1zZXR0aW5ncy5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvc3RvcmVzL3VzZXItc2V0dGluZ3Muc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEcsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBZSxNQUFNLGlCQUFpQixDQUFDO0FBTTlILE1BQU0sWUFBWSxHQUFpQjtJQUNqQyxTQUFTLEVBQUUsRUFBRTtJQUNiLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLGFBQWEsRUFBRSxFQUFFO0lBQ2pCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsUUFBUSxFQUFFLFNBQVM7Q0FDcEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FDMUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQ3RCLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFDNUIsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUN2Qix3QkFBd0IsRUFBRSxFQUMxQixvQkFBb0IsRUFBRSxFQUN0Qix3QkFBd0IsRUFBRSxFQUMxQix1QkFBdUIsRUFBRSxFQUN6QixxQkFBcUIsRUFBRSxDQUN4QixDQUFBO0FBRUQsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLGtCQUFrQixDQUN2QixTQUFTLENBQUMsWUFBWSxDQUFDLEVBQ3ZCLFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0Qjs7Ozs7V0FLRztRQUNILEtBQUssQ0FBQyxVQUFVO1lBQ2QsbUZBQW1GO1lBQ25GLE1BQU0sUUFB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S0FBSyxDQUFDLHVCQUF1QixDQUFDLGlCQUE2QztZQUN6RSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztZQUNyRCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQWtDLEVBQUUsV0FBeUI7WUFDaEYsTUFBTSxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ25ELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUNKLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2l0aERldnRvb2xzIH0gZnJvbSAnQGFuZ3VsYXItYXJjaGl0ZWN0cy9uZ3J4LXRvb2xraXQnO1xuaW1wb3J0IHsgcGF0Y2hTdGF0ZSwgc2lnbmFsU3RvcmUsIHNpZ25hbFN0b3JlRmVhdHVyZSwgd2l0aE1ldGhvZHMsIHdpdGhTdGF0ZSB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuXG5pbXBvcnQgeyBBcnRpY2xlLCBBdWRpdEV2ZW50cywgZGVsZXRlVXNlclNldHRpbmdzLCBmZXRjaFVzZXJTZXR0aW5ncywgcGF0Y2hVc2VyU2V0dGluZ3MsIFF1ZXJ5UGFyYW1zIH0gZnJvbSAnQHNpbmVxdWEvYXRvbWljJztcblxuaW1wb3J0IHsgUmVjZW50U2VhcmNoLCBVc2VyU2V0dGluZ3MgfSBmcm9tICcuLi9tb2RlbHMvdXNlci1zZXR0aW5ncyc7XG5cblxuXG5jb25zdCBpbml0aWFsU3RhdGU6IFVzZXJTZXR0aW5ncyA9IHtcbiAgYm9va21hcmtzOiBbXSxcbiAgcmVjZW50U2VhcmNoZXM6IFtdLFxuICBzYXZlZFNlYXJjaGVzOiBbXSxcbiAgYXNzaXN0YW50czoge30sXG4gIGxhbmd1YWdlOiB1bmRlZmluZWQsXG59O1xuXG5leHBvcnQgY29uc3QgVXNlclNldHRpbmdzU3RvcmUgPSBzaWduYWxTdG9yZShcbiAgeyBwcm92aWRlZEluOiAncm9vdCcgfSxcbiAgd2l0aERldnRvb2xzKCdVc2VyU2V0dGluZ3MnKSxcbiAgd2l0aFN0YXRlKGluaXRpYWxTdGF0ZSksXG4gIHdpdGhVc2VyU2V0dGluZ3NGZWF0dXJlcygpLFxuICB3aXRoQm9va21hcmtGZWF0dXJlcygpLFxuICB3aXRoUmVjZW50U2VhcmNoRmVhdHVyZXMoKSxcbiAgd2l0aFNhdmVkU2VhcmNoRmVhdHVyZXMoKSxcbiAgd2l0aEFzc2lzdGFudEZlYXR1cmVzKClcbilcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhVc2VyU2V0dGluZ3NGZWF0dXJlcygpIHtcbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcbiAgICB3aXRoU3RhdGUoaW5pdGlhbFN0YXRlKSxcbiAgICB3aXRoTWV0aG9kcygoc3RvcmUpID0+ICh7XG4gICAgICAvKipcbiAgICAgICAqIEluaXRpYWxpemVzIHRoZSB1c2VyIHNldHRpbmdzIHN0b3JlIGJ5IGZldGNoaW5nIHRoZSB1c2VyIHNldHRpbmdzIGZyb20gdGhlIGJhY2tlbmQgQVBJXG4gICAgICAgKiBhbmQgcGF0Y2hpbmcgdGhlIHN0b3JlIHdpdGggdGhlIHJldHJpZXZlZCBzZXR0aW5ncy5cbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEZldGNoIHRoZSB1c2VyIHNldHRpbmdzIGZyb20gdGhlIGJhY2tlbmQgQVBJIGFuZCBwYXRjaCB0aGUgc3RvcmUgd2l0aCB0aGUgcmVzdWx0XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgZmV0Y2hVc2VyU2V0dGluZ3M8VXNlclNldHRpbmdzPigpO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBzZXR0aW5ncyk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBSZXNldHMgdGhlIHVzZXIgc2V0dGluZ3MgdG8gdGhlIGluaXRpYWwgc3RhdGUuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOlxuICAgICAgICogMS4gRGVsZXRlcyB0aGUgY3VycmVudCB1c2VyIHNldHRpbmdzLlxuICAgICAgICogMi4gUGF0Y2hlcyB0aGUgc3RhdGUgd2l0aCB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVzZXQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICAgICAgICovXG4gICAgICBhc3luYyByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHVzZXIgc2V0dGluZ3MgdG8gdGhlIGluaXRpYWwgc3RhdGVcbiAgICAgICAgYXdhaXQgZGVsZXRlVXNlclNldHRpbmdzKCk7XG4gICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIGluaXRpYWxTdGF0ZSk7XG4gICAgICB9LFxuICAgIH0pKSxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aEJvb2ttYXJrRmVhdHVyZXMoKSB7XG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gICAgd2l0aFN0YXRlKGluaXRpYWxTdGF0ZSksXG4gICAgd2l0aE1ldGhvZHMoKHN0b3JlKSA9PiAoe1xuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGVzIHRoZSB1c2VyJ3MgYm9va21hcmtzIGluIHRoZSBzdG9yZSBhbmQgb3B0aW9uYWxseSBsb2dzIGF1ZGl0IGV2ZW50cy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gYm9va21hcmtzIC0gQW4gYXJyYXkgb2YgYm9va21hcmtzIHRvIHVwZGF0ZSBpbiB0aGUgdXNlciBzZXR0aW5ncy5cbiAgICAgICAqIEBwYXJhbSBhdWRpdEV2ZW50cyAtIE9wdGlvbmFsIGF1ZGl0IGV2ZW50cyB0byBsb2cgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHVwZGF0ZUJvb2ttYXJrcyhib29rbWFya3M6IFVzZXJTZXR0aW5nc1snYm9va21hcmtzJ10sIGF1ZGl0RXZlbnRzPzogQXVkaXRFdmVudHMpIHtcbiAgICAgICAgYXdhaXQgcGF0Y2hVc2VyU2V0dGluZ3MoeyBib29rbWFya3MgfSwgYXVkaXRFdmVudHMpO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgYm9va21hcmtzOiBbLi4uYm9va21hcmtzXSB9O1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogQWRkcyBhbiBhcnRpY2xlIHRvIHRoZSBib29rbWFya3MgaWYgaXQgaXMgbm90IGFscmVhZHkgYm9va21hcmtlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gYXJ0aWNsZSAtIFRoZSBhcnRpY2xlIHRvIGJlIGJvb2ttYXJrZWQuXG4gICAgICAgKiBAcGFyYW0gcXVlcnlOYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgcXVlcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBib29rbWFyay5cbiAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJvb2ttYXJrIGhhcyBiZWVuIGFkZGVkLlxuICAgICAgICovXG4gICAgICBhc3luYyBib29rbWFyayhhcnRpY2xlOiBBcnRpY2xlLCBxdWVyeU5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFhcnRpY2xlLmlkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuaXNCb29rbWFya2VkKGFydGljbGUpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYm9va21hcmsgPSB7XG4gICAgICAgICAgaWQ6IGFydGljbGUuaWQsXG4gICAgICAgICAgbGFiZWw6IGFydGljbGUudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBhcnRpY2xlLmNvbGxlY3Rpb25bMF0sXG4gICAgICAgICAgYXV0aG9yOiBhcnRpY2xlLmF1dGhvcnM/LlswXSxcbiAgICAgICAgICBxdWVyeU5hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQm9va21hcmtzKFsuLi5zdG9yZS5ib29rbWFya3MoKSwgYm9va21hcmtdLCB7XG4gICAgICAgICAgdHlwZTogXCJCYXNrZXRfQWRkRG9jXCIsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBkb2NpZDogYXJ0aWNsZS5pZFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmVzIGEgYm9va21hcmsgYnkgaXRzIElELlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgYm9va21hcmsgdG8gcmVtb3ZlLlxuICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYm9va21hcmsgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgdGhlIGJvb2ttYXJrcyBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogLSBJZiB0aGUgcHJvdmlkZWQgSUQgaXMgZmFsc3ksIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBpbW1lZGlhdGVseS5cbiAgICAgICAqIC0gSWYgdGhlIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIElEIGlzIG5vdCBmb3VuZCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LlxuICAgICAgICogLSBUaGUgZnVuY3Rpb24gdXBkYXRlcyB0aGUgYm9va21hcmtzIGFuZCBsb2dzIHRoZSByZW1vdmFsIGFjdGlvbiB3aXRoIGEgdHlwZSBvZiBcIkJhc2tldF9SZW1vdmVEb2NcIi5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgdW5ib29rbWFyayhpZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghaWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBib29rbWFya3MgPSBzdG9yZS5ib29rbWFya3MoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBib29rbWFya3M/LmZpbmRJbmRleCgoYm9va21hcmspID0+IGJvb2ttYXJrLmlkID09PSBpZCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgICAgIGJvb2ttYXJrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUJvb2ttYXJrcyhbLi4uYm9va21hcmtzXSwge1xuICAgICAgICAgIHR5cGU6IFwiQmFza2V0X1JlbW92ZURvY1wiLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgZG9jaWQ6IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJ0aWNsZSBpcyBib29rbWFya2VkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBhcnRpY2xlIC0gQW4gb3B0aW9uYWwgcGFydGlhbCBhcnRpY2xlIG9iamVjdCB0byBjaGVjay5cbiAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJ0aWNsZSBpcyBib29rbWFya2VkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgICAqL1xuICAgICAgaXNCb29rbWFya2VkKGFydGljbGU6IFBhcnRpYWw8QXJ0aWNsZT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFhcnRpY2xlIHx8ICFhcnRpY2xlLmlkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGJvb2ttYXJrcyA9IHN0b3JlLmJvb2ttYXJrcygpO1xuXG4gICAgICAgIHJldHVybiAhIWJvb2ttYXJrcz8uZmluZCgoYm9va21hcmspID0+IGJvb2ttYXJrLmlkID09PSBhcnRpY2xlLmlkKTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZXMgdGhlIGJvb2ttYXJrIHN0YXR1cyBvZiBhIGdpdmVuIGFydGljbGUuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBhcnRpY2xlIGlzIGN1cnJlbnRseSBib29rbWFya2VkLiBJZiBpdCBpcyxcbiAgICAgICAqIGl0IHJlbW92ZXMgdGhlIGJvb2ttYXJrLiBJZiBpdCBpcyBub3QsIGl0IGFkZHMgYSBib29rbWFyay5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gYXJ0aWNsZSAtIFRoZSBhcnRpY2xlIHRvIHRvZ2dsZSB0aGUgYm9va21hcmsgc3RhdHVzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJvb2ttYXJrIHN0YXR1cyBoYXMgYmVlbiB0b2dnbGVkLlxuICAgICAgICovXG4gICAgICBhc3luYyB0b2dnbGVCb29rbWFyayhhcnRpY2xlOiBBcnRpY2xlKSB7XG4gICAgICAgIGNvbnN0IGlzQm9va21hcmtlZCA9IGF3YWl0IHRoaXMuaXNCb29rbWFya2VkKGFydGljbGUpO1xuXG4gICAgICAgIGlmIChpc0Jvb2ttYXJrZWQpXG4gICAgICAgICAgdGhpcy51bmJvb2ttYXJrKGFydGljbGUuaWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5ib29rbWFyayhhcnRpY2xlKTtcbiAgICAgIH0sXG4gICAgfSkpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWNlbnRTZWFyY2hGZWF0dXJlcygpIHtcbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcbiAgICB3aXRoU3RhdGUoaW5pdGlhbFN0YXRlKSxcbiAgICB3aXRoTWV0aG9kcygoc3RvcmUpID0+ICh7XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSByZWNlbnQgc2VhcmNoIGVudHJ5IGZyb20gdGhlIHVzZXIncyByZWNlbnQgc2VhcmNoZXMgbGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHJlY2VudCBzZWFyY2ggdG8gZGVsZXRlLlxuICAgICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlY2VudCBzZWFyY2ggaGFzIGJlZW4gZGVsZXRlZCBhbmQgdGhlIHN0YXRlIGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGRlbGV0ZVJlY2VudFNlYXJjaChpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlY2VudFNlYXJjaGVzID0gc3RvcmUucmVjZW50U2VhcmNoZXMoKTtcbiAgICAgICAgaWYgKHJlY2VudFNlYXJjaGVzKSB7XG4gICAgICAgICAgY29uc3QgcmVjZW50U2VhcmNoVG9EZWxldGUgPSByZWNlbnRTZWFyY2hlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgcmVjZW50U2VhcmNoZXMgfSwge1xuICAgICAgICAgICAgdHlwZTogXCJSZWNlbnRRdWVyeV9EZWxldGVcIixcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICByZWNlbnRRdWVyeTogcmVjZW50U2VhcmNoVG9EZWxldGUucXVlcnlQYXJhbXM/LnRleHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHJlY2VudFNlYXJjaGVzOiBbLi4ucmVjZW50U2VhcmNoZXNdIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlcyB0aGUgcmVjZW50IHNlYXJjaGVzIGluIHRoZSB1c2VyIHNldHRpbmdzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSByZWNlbnRTZWFyY2hlcyAtIEFuIGFycmF5IG9mIHJlY2VudCBzZWFyY2hlcyB0byBiZSB1cGRhdGVkIGluIHRoZSB1c2VyIHNldHRpbmdzLlxuICAgICAgICogQHBhcmFtIGF1ZGl0RXZlbnRzIC0gT3B0aW9uYWwgYXVkaXQgZXZlbnRzIHRvIGJlIGxvZ2dlZCBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlY2VudCBzZWFyY2hlcyBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgdXBkYXRlUmVjZW50U2VhcmNoZXMocmVjZW50U2VhcmNoZXM6IFVzZXJTZXR0aW5nc1sncmVjZW50U2VhcmNoZXMnXSwgYXVkaXRFdmVudHM/OiBBdWRpdEV2ZW50cykge1xuICAgICAgICBhd2FpdCBwYXRjaFVzZXJTZXR0aW5ncyh7IHJlY2VudFNlYXJjaGVzIH0sIGF1ZGl0RXZlbnRzKTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHJlY2VudFNlYXJjaGVzOiBbLi4ucmVjZW50U2VhcmNoZXNdIH07XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBBZGRzIHRoZSBjdXJyZW50IHNlYXJjaCB0byB0aGUgcmVjZW50IHNlYXJjaGVzIGxpc3QuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIGEgc2VhcmNoIHdpdGggdGhlIHNhbWUgbGFiZWwgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHJlY2VudCBzZWFyY2hlcy5cbiAgICAgICAqIElmIGl0IGRvZXMsIGl0IHVwZGF0ZXMgdGhlIGV4aXN0aW5nIHNlYXJjaCB3aXRoIHRoZSBuZXcgcXVlcnkgcGFyYW1ldGVycyBhbmQgZGF0ZS5cbiAgICAgICAqIElmIGl0IGRvZXMgbm90LCBpdCBhZGRzIGEgbmV3IHNlYXJjaCB0byB0aGUgcmVjZW50IHNlYXJjaGVzIGxpc3QuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgc2VhcmNoLlxuICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVjZW50IHNlYXJjaGVzIGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAgICovXG4gICAgICBhc3luYyBhZGRDdXJyZW50U2VhcmNoKHF1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtcykge1xuICAgICAgICAvLyBmaXN0IHNlYXJjaCBpZiB0aGUgc2VhcmNoIGlzIGFscmVhZHkgaW4gdGhlIHJlY2VudCBzZWFyY2hlcyB3aXRoIHRoZSBzYW1lIGxhYmVsXG4gICAgICAgIGNvbnN0IHJlY2VudFNlYXJjaGVzID0gc3RvcmUucmVjZW50U2VhcmNoZXMoKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTZWFyY2ggPSByZWNlbnRTZWFyY2hlcy5maW5kKChzZWFyY2gpID0+IHNlYXJjaC5sYWJlbCA9PT0gcXVlcnlQYXJhbXMudGV4dCk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpO1xuICAgICAgICBjb25zdCBwYXRoID0gdXJsLnNwbGl0KCc/JylbMF07XG4gICAgICAgIGlmIChleGlzdGluZ1NlYXJjaCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjZW50U2VhcmNoZXMoW1xuICAgICAgICAgICAgeyAuLi5leGlzdGluZ1NlYXJjaCxcbiAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgICBmaWx0ZXJDb3VudDogcXVlcnlQYXJhbXMuZmlsdGVycz8ubGVuZ3RoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4ucmVjZW50U2VhcmNoZXMuZmlsdGVyKChzZWFyY2gpID0+IHNlYXJjaC5sYWJlbCAhPT0gcXVlcnlQYXJhbXMudGV4dCksXG4gICAgICAgICAgXSwge1xuICAgICAgICAgICAgdHlwZTogXCJSZWNlbnRRdWVyeV9VcGRhdGVcIixcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICByZWNlbnRRdWVyeTogcXVlcnlQYXJhbXMudGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlY2VudFNlYXJjaCA9IHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBkaXNwbGF5OiBxdWVyeVBhcmFtcy50ZXh0LFxuICAgICAgICAgICAgbGFiZWw6IHF1ZXJ5UGFyYW1zLnRleHQsXG4gICAgICAgICAgICBmaWx0ZXJDb3VudDogcXVlcnlQYXJhbXMuZmlsdGVycz8ubGVuZ3RoLFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXNcbiAgICAgICAgICB9IGFzIFJlY2VudFNlYXJjaDtcblxuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUmVjZW50U2VhcmNoZXMoW3JlY2VudFNlYXJjaCwgLi4uc3RvcmUucmVjZW50U2VhcmNoZXMoKV0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiUmVjZW50UXVlcnlfQWRkXCIsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVjZW50UXVlcnk6IHF1ZXJ5UGFyYW1zLnRleHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNhdmVkU2VhcmNoRmVhdHVyZXMoKSB7XG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gICAgd2l0aFN0YXRlKGluaXRpYWxTdGF0ZSksXG4gICAgd2l0aE1ldGhvZHMoKHN0b3JlKSA9PiAoe1xuICAgICAgYXN5bmMgZGVsZXRlU2F2ZWRTZWFyY2goaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBzYXZlZFNlYXJjaGVzID0gc3RvcmUuc2F2ZWRTZWFyY2hlcygpO1xuICAgICAgICBpZiAoc2F2ZWRTZWFyY2hlcykge1xuICAgICAgICAgIGNvbnN0IHNhdmVkU2VhcmNoVG9EZWxldGUgPSBzYXZlZFNlYXJjaGVzLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgICAgICAgYXdhaXQgcGF0Y2hVc2VyU2V0dGluZ3MoeyBzYXZlZFNlYXJjaGVzIH0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiU2F2ZWRRdWVyeV9EZWxldGVcIixcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBzYXZlZFF1ZXJ5OiBzYXZlZFNlYXJjaFRvRGVsZXRlLmRpc3BsYXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHNhdmVkU2VhcmNoZXM6IFsuLi5zYXZlZFNlYXJjaGVzXSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyB1cGRhdGVTYXZlZFNlYXJjaGVzKHNhdmVkU2VhcmNoZXM6IFVzZXJTZXR0aW5nc1snc2F2ZWRTZWFyY2hlcyddKSB7XG4gICAgICAgIGF3YWl0IHBhdGNoVXNlclNldHRpbmdzKHsgc2F2ZWRTZWFyY2hlcyB9LCB7XG4gICAgICAgICAgdHlwZTogXCJTYXZlZFF1ZXJ5X0FkZFwiLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgc2F2ZWRRdWVyeTogc2F2ZWRTZWFyY2hlc1swXS5kaXNwbGF5XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHNhdmVkU2VhcmNoZXM6IFsuLi5zYXZlZFNlYXJjaGVzXSB9O1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9KSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aEFzc2lzdGFudEZlYXR1cmVzKCkge1xuICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgIHdpdGhTdGF0ZShpbml0aWFsU3RhdGUpLFxuICAgIHdpdGhNZXRob2RzKChzdG9yZSkgPT4gKHtcbiAgICAgIGFzeW5jIHVwZGF0ZUFzc2lzdGFudFNldHRpbmdzKGFzc2lzdGFudFNldHRpbmdzOiBVc2VyU2V0dGluZ3NbJ2Fzc2lzdGFudHMnXSkge1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgYXNzaXN0YW50czogYXNzaXN0YW50U2V0dGluZ3MgfTtcbiAgICAgICAgfSlcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIHVwZGF0ZUxhbmd1YWdlKGxhbmd1YWdlOiBVc2VyU2V0dGluZ3NbJ2xhbmd1YWdlJ10sIGF1ZGl0RXZlbnRzPzogQXVkaXRFdmVudHMpIHtcbiAgICAgICAgYXdhaXQgcGF0Y2hVc2VyU2V0dGluZ3MoeyBsYW5ndWFnZSB9LCBhdWRpdEV2ZW50cyk7XG4gICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBsYW5ndWFnZSB9O1xuICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9KSlcbiAgKVxufSJdfQ==
@@ -0,0 +1,32 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ // pre-configured highlights's colors
3
+ export const HIGHLIGHTS = new InjectionToken('highlights', {
4
+ factory: () => [
5
+ {
6
+ name: 'company',
7
+ color: 'white',
8
+ bgColor: '#FF7675'
9
+ },
10
+ {
11
+ name: 'geo',
12
+ color: 'white',
13
+ bgColor: '#74B9FF'
14
+ },
15
+ {
16
+ name: 'person',
17
+ color: 'white',
18
+ bgColor: '#00ABB5'
19
+ },
20
+ {
21
+ name: 'extractslocations',
22
+ color: 'black',
23
+ bgColor: '#fffacd'
24
+ },
25
+ {
26
+ name: 'matchlocations',
27
+ color: 'black',
28
+ bgColor: '#ff0'
29
+ }
30
+ ],
31
+ });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvdG9rZW5zL2hpZ2hsaWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVMvQyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFxQixZQUFZLEVBQUU7SUFDN0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2I7WUFDRSxJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLFNBQVM7U0FDbkI7UUFDRDtZQUNFLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsU0FBUztTQUNuQjtRQUNEO1lBQ0UsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsT0FBTztZQUNkLE9BQU8sRUFBRSxTQUFTO1NBQ25CO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLEtBQUssRUFBRSxPQUFPO1lBQ2QsT0FBTyxFQUFFLFNBQVM7U0FDbkI7UUFDRDtZQUNFLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsTUFBTTtTQUNoQjtLQUNGO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5leHBvcnQgdHlwZSBQcmV2aWV3SGlnaGxpZ2h0TmFtZSA9ICdjb21wYW55JyB8ICdnZW8nIHwgJ3BlcnNvbicgfCAnZXh0cmFjdHNsb2NhdGlvbnMnIHwgJ21hdGNobG9jYXRpb25zJztcbmV4cG9ydCB0eXBlIFByZXZpZXdIaWdobGlnaHQgPSB7XG4gIG5hbWU6IFByZXZpZXdIaWdobGlnaHROYW1lLFxuICBjb2xvcjogc3RyaW5nLFxuICBiZ0NvbG9yOiBzdHJpbmdcbn07XG5cbi8vIHByZS1jb25maWd1cmVkIGhpZ2hsaWdodHMncyBjb2xvcnNcbmV4cG9ydCBjb25zdCBISUdITElHSFRTID0gbmV3IEluamVjdGlvblRva2VuPFByZXZpZXdIaWdobGlnaHRbXT4oJ2hpZ2hsaWdodHMnLCB7XG4gIGZhY3Rvcnk6ICgpID0+IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY29tcGFueScsXG4gICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgIGJnQ29sb3I6ICcjRkY3Njc1J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2dlbycsXG4gICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgIGJnQ29sb3I6ICcjNzRCOUZGJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3BlcnNvbicsXG4gICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgIGJnQ29sb3I6ICcjMDBBQkI1J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2V4dHJhY3RzbG9jYXRpb25zJyxcbiAgICAgIGNvbG9yOiAnYmxhY2snLFxuICAgICAgYmdDb2xvcjogJyNmZmZhY2QnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbWF0Y2hsb2NhdGlvbnMnLFxuICAgICAgY29sb3I6ICdibGFjaycsXG4gICAgICBiZ0NvbG9yOiAnI2ZmMCdcbiAgICB9XG4gIF0sXG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from "./highlights";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3Rva2Vucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2hpZ2hsaWdodHNcIjtcclxuIl19
@@ -0,0 +1,38 @@
1
+ import { effect, signal } from "@angular/core";
2
+ /**
3
+ * Creates a debounced signal that updates its value after a specified timeout.
4
+ *
5
+ * @template T - The type of the signal value.
6
+ * @param Signal<T> input - The input signal whose value will be debounced.
7
+ * @param number [timeOutMs=0] - The debounce timeout in milliseconds. Defaults to 0.
8
+ * @returns Signal<T> - A new signal that updates its value after the specified debounce timeout.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const input = signal('');
13
+ * const debounced = debouncedSignal(input, 1000);
14
+ *
15
+ * contructor() {
16
+ * effect(() => {
17
+ * console.log(debounced());
18
+ * // will log the input value after 1 second of inactivity.
19
+ * });
20
+ * }
21
+ * ...
22
+ * <input [ngModel]="input()" (ngModelChange)="input.set($event)">
23
+ * ```
24
+ */
25
+ export function debouncedSignal(input, timeOutMs = 0) {
26
+ const debounceSignal = signal(input());
27
+ let timeout;
28
+ effect((onCleanUp) => {
29
+ const value = input();
30
+ clearTimeout(timeout);
31
+ timeout = setTimeout(() => {
32
+ debounceSignal.set(value);
33
+ }, timeOutMs);
34
+ onCleanUp(() => clearTimeout(timeout));
35
+ });
36
+ return debounceSignal;
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2VkLXNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvdXRpbHMvZGVib3VuY2VkLXNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUksS0FBZ0IsRUFBRSxTQUFTLEdBQUcsQ0FBQztJQUNoRSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQVksQ0FBQztJQUNqQixNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUNuQixNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN0QixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDZCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZWZmZWN0LCBzaWduYWwsIFNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBzaWduYWwgdGhhdCB1cGRhdGVzIGl0cyB2YWx1ZSBhZnRlciBhIHNwZWNpZmllZCB0aW1lb3V0LlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBzaWduYWwgdmFsdWUuXHJcbiAqIEBwYXJhbSBTaWduYWw8VD4gaW5wdXQgLSBUaGUgaW5wdXQgc2lnbmFsIHdob3NlIHZhbHVlIHdpbGwgYmUgZGVib3VuY2VkLlxyXG4gKiBAcGFyYW0gbnVtYmVyIFt0aW1lT3V0TXM9MF0gLSBUaGUgZGVib3VuY2UgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDAuXHJcbiAqIEByZXR1cm5zIFNpZ25hbDxUPiAtIEEgbmV3IHNpZ25hbCB0aGF0IHVwZGF0ZXMgaXRzIHZhbHVlIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVib3VuY2UgdGltZW91dC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3QgaW5wdXQgPSBzaWduYWwoJycpO1xyXG4gKiBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZWRTaWduYWwoaW5wdXQsIDEwMDApO1xyXG4gKlxyXG4gKiBjb250cnVjdG9yKCkge1xyXG4gKiAgZWZmZWN0KCgpID0+IHtcclxuICogICBjb25zb2xlLmxvZyhkZWJvdW5jZWQoKSk7XHJcbiAqICAgLy8gd2lsbCBsb2cgdGhlIGlucHV0IHZhbHVlIGFmdGVyIDEgc2Vjb25kIG9mIGluYWN0aXZpdHkuXHJcbiAqICB9KTtcclxuICogfVxyXG4gKiAuLi5cclxuICogPGlucHV0IFtuZ01vZGVsXT1cImlucHV0KClcIiAobmdNb2RlbENoYW5nZSk9XCJpbnB1dC5zZXQoJGV2ZW50KVwiPlxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZWRTaWduYWw8VD4oaW5wdXQ6IFNpZ25hbDxUPiwgdGltZU91dE1zID0gMCk6IFNpZ25hbDxUPiB7XHJcbiAgY29uc3QgZGVib3VuY2VTaWduYWwgPSBzaWduYWwoaW5wdXQoKSk7XHJcbiAgbGV0IHRpbWVvdXQ6IGFueTtcclxuICBlZmZlY3QoKG9uQ2xlYW5VcCkgPT4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dCgpO1xyXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBkZWJvdW5jZVNpZ25hbC5zZXQodmFsdWUpO1xyXG4gICAgfSwgdGltZU91dE1zKTtcclxuICAgIG9uQ2xlYW5VcCgoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpXHJcbiAgfSk7XHJcbiAgcmV0dXJuIGRlYm91bmNlU2lnbmFsO1xyXG59Il19
@@ -0,0 +1,8 @@
1
+ export * from './inline-worker';
2
+ export * from './query';
3
+ export * from './routes';
4
+ export * from './tailwind-utils';
5
+ export * from './theme-body-hook';
6
+ export * from './theme-registry';
7
+ export * from './debounced-signal';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaW5saW5lLXdvcmtlcic7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdGFpbHdpbmQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi90aGVtZS1ib2R5LWhvb2snO1xuZXhwb3J0ICogZnJvbSAnLi90aGVtZS1yZWdpc3RyeSc7XG5leHBvcnQgKiBmcm9tICcuL2RlYm91bmNlZC1zaWduYWwnOyJdfQ==
@@ -0,0 +1,40 @@
1
+ import { Subject } from 'rxjs';
2
+ export class InlineWorker {
3
+ constructor(func) {
4
+ this.onMessage = new Subject();
5
+ this.onError = new Subject();
6
+ const WORKER_ENABLED = !!(Worker);
7
+ if (WORKER_ENABLED) {
8
+ const functionBody = func.toString().replace(/^[^{]*{\s*/, '').replace(/\s*}[^}]*$/, '');
9
+ try {
10
+ this.worker = new Worker(URL.createObjectURL(new Blob([functionBody], { type: 'text/javascript' })));
11
+ this.worker.onmessage = (data) => {
12
+ this.onMessage.next(data);
13
+ };
14
+ this.worker.onerror = (data) => {
15
+ this.onError.next(data);
16
+ };
17
+ }
18
+ catch (e) {
19
+ throw new Error('WebWorker is not enabled');
20
+ }
21
+ }
22
+ else {
23
+ throw new Error('WebWorker is not enabled');
24
+ }
25
+ }
26
+ postMessage(data) {
27
+ this.worker.postMessage(data);
28
+ }
29
+ onmessage() {
30
+ return this.onMessage.asObservable();
31
+ }
32
+ onerror() {
33
+ return this.onError.asObservable();
34
+ }
35
+ terminate() {
36
+ if (this.worker)
37
+ this.worker.terminate();
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvdXRpbHMvaW5saW5lLXdvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE1BQU0sT0FBTyxZQUFZO0lBTXZCLFlBQVksSUFBZ0I7UUFIcEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQ3hDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRzFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV6RixJQUFJLENBQUM7Z0JBRUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FDdEQsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixDQUFDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUMsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFNLENBQUMsRUFBQyxDQUFDO2dCQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBRUgsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBYTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGNsYXNzIElubGluZVdvcmtlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyOiBXb3JrZXI7XG5cbiAgcHJpdmF0ZSBvbk1lc3NhZ2UgPSBuZXcgU3ViamVjdDxNZXNzYWdlRXZlbnQ+KCk7XG4gIHByaXZhdGUgb25FcnJvciA9IG5ldyBTdWJqZWN0PEVycm9yRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoZnVuYzogKCkgPT4gdm9pZCkge1xuICAgIGNvbnN0IFdPUktFUl9FTkFCTEVEID0gISEoV29ya2VyKTtcblxuICAgIGlmIChXT1JLRVJfRU5BQkxFRCkge1xuICAgICAgY29uc3QgZnVuY3Rpb25Cb2R5ID0gZnVuYy50b1N0cmluZygpLnJlcGxhY2UoL15bXntdKntcXHMqLywgJycpLnJlcGxhY2UoL1xccyp9W159XSokLywgJycpO1xuXG4gICAgICB0cnkge1xuXG4gICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKFxuICAgICAgICAgIG5ldyBCbG9iKFtmdW5jdGlvbkJvZHldLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pXG4gICAgICAgICkpO1xuXG4gICAgICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbk1lc3NhZ2UubmV4dChkYXRhKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLndvcmtlci5vbmVycm9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLm9uRXJyb3IubmV4dChkYXRhKTtcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViV29ya2VyIGlzIG5vdCBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJXb3JrZXIgaXMgbm90IGVuYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBwb3N0TWVzc2FnZShkYXRhOiB1bmtub3duKSB7XG4gICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIH1cblxuICBvbm1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5vbk1lc3NhZ2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBvbmVycm9yKCk6IE9ic2VydmFibGU8RXJyb3JFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLm9uRXJyb3IuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICB0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKHRoaXMud29ya2VyKSB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,58 @@
1
+ import { assertInInjectionContext, inject } from '@angular/core';
2
+ import { ActivatedRoute, Router } from '@angular/router';
3
+ import { getQueryParamsFromUrl } from '@sinequa/atomic';
4
+ /**
5
+ * Retrieves the query name from the current route.
6
+ *
7
+ * @remarks
8
+ * This function must be used within an injection context.
9
+ *
10
+ * This function traverses the route tree recursively to find the query name.
11
+ * It first checks for a query parameter `t` in the route's snapshot. If the query name is not found
12
+ * in the route data, it attempts to find it in the child routes of the "search" route.
13
+ * If the query name is still not found, it falls back to the `queryName` defined in the route's data.
14
+ *
15
+ * @returns {string | undefined} The query name if found, otherwise `undefined`.
16
+ */
17
+ export function getQueryNameFromRoute() {
18
+ assertInInjectionContext(getQueryNameFromRoute);
19
+ const route = inject(ActivatedRoute);
20
+ const routes = inject(Router);
21
+ const recursive = (route) => {
22
+ if (route?.firstChild)
23
+ return recursive(route.firstChild);
24
+ // Get query name from route data
25
+ const { t } = route.snapshot.queryParams;
26
+ // ! This is a workaround for the case where the queryName is not defined in the route data
27
+ // "search" is the parent route of the search results, and "t" is the query parameter for the tab
28
+ const { queryName } = routes.config.filter(p => p.path === "search")[0].children?.find(route => route.path === t)?.data || {};
29
+ if (queryName)
30
+ return queryName;
31
+ // fallback to queryName from route data
32
+ if (route?.snapshot.data['queryName'])
33
+ return route.snapshot.data['queryName'];
34
+ return undefined;
35
+ };
36
+ return recursive(route);
37
+ }
38
+ /**
39
+ * Builds a query object based on the provided partial query.
40
+ * If any properties are missing in the partial query, default values are used.
41
+ *
42
+ * @remarks
43
+ * This function must be used within an injection context.
44
+ *
45
+ * @param query - The partial query object.
46
+ * @returns The complete query object.
47
+ */
48
+ export function buildQuery(query) {
49
+ assertInInjectionContext(buildQuery);
50
+ const name = query?.name || getQueryNameFromRoute();
51
+ const params = getQueryParamsFromUrl(window.location.toString());
52
+ return {
53
+ ...params, // default values retrieved from the URL
54
+ ...query, // override with query
55
+ name, // override with query name
56
+ };
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3V0aWxzL3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RCxPQUFPLEVBQUUscUJBQXFCLEVBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUsvRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUU3QixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQXFCLEVBQXNCLEVBQUU7UUFDOUQsSUFBSSxLQUFLLEVBQUUsVUFBVTtZQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRCxpQ0FBaUM7UUFDakMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLDJGQUEyRjtRQUMzRixpR0FBaUc7UUFDakcsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzlILElBQUksU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWhDLHdDQUF3QztRQUN4QyxJQUFJLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFL0UsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFBO0lBRUQsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBc0I7SUFDL0Msd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBQ3BELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRSxPQUFRO1FBQ04sR0FBRyxNQUFNLEVBQUcsd0NBQXdDO1FBQ3BELEdBQUcsS0FBSyxFQUFJLHNCQUFzQjtRQUNsQyxJQUFJLEVBQVEsMkJBQTJCO0tBQzlCLENBQUE7QUFFYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBnZXRRdWVyeVBhcmFtc0Zyb21VcmwsIFF1ZXJ5IH0gZnJvbSAnQHNpbmVxdWEvYXRvbWljJztcblxuaW1wb3J0IHsgUXVlcnlQYXJhbXNTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcyc7XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHF1ZXJ5IG5hbWUgZnJvbSB0aGUgY3VycmVudCByb3V0ZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIGluamVjdGlvbiBjb250ZXh0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSByb3V0ZSB0cmVlIHJlY3Vyc2l2ZWx5IHRvIGZpbmQgdGhlIHF1ZXJ5IG5hbWUuXG4gKiBJdCBmaXJzdCBjaGVja3MgZm9yIGEgcXVlcnkgcGFyYW1ldGVyIGB0YCBpbiB0aGUgcm91dGUncyBzbmFwc2hvdC4gSWYgdGhlIHF1ZXJ5IG5hbWUgaXMgbm90IGZvdW5kXG4gKiBpbiB0aGUgcm91dGUgZGF0YSwgaXQgYXR0ZW1wdHMgdG8gZmluZCBpdCBpbiB0aGUgY2hpbGQgcm91dGVzIG9mIHRoZSBcInNlYXJjaFwiIHJvdXRlLlxuICogSWYgdGhlIHF1ZXJ5IG5hbWUgaXMgc3RpbGwgbm90IGZvdW5kLCBpdCBmYWxscyBiYWNrIHRvIHRoZSBgcXVlcnlOYW1lYCBkZWZpbmVkIGluIHRoZSByb3V0ZSdzIGRhdGEuXG4gKlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIHF1ZXJ5IG5hbWUgaWYgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXJ5TmFtZUZyb21Sb3V0ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoZ2V0UXVlcnlOYW1lRnJvbVJvdXRlKTtcblxuICBjb25zdCByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIGNvbnN0IHJvdXRlcyA9IGluamVjdChSb3V0ZXIpXG5cbiAgY29uc3QgcmVjdXJzaXZlID0gKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHJvdXRlPy5maXJzdENoaWxkKSByZXR1cm4gcmVjdXJzaXZlKHJvdXRlLmZpcnN0Q2hpbGQpO1xuXG4gICAgLy8gR2V0IHF1ZXJ5IG5hbWUgZnJvbSByb3V0ZSBkYXRhXG4gICAgY29uc3QgeyB0IH0gPSByb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcbiAgICAvLyAhIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgcXVlcnlOYW1lIGlzIG5vdCBkZWZpbmVkIGluIHRoZSByb3V0ZSBkYXRhXG4gICAgLy8gXCJzZWFyY2hcIiBpcyB0aGUgcGFyZW50IHJvdXRlIG9mIHRoZSBzZWFyY2ggcmVzdWx0cywgYW5kIFwidFwiIGlzIHRoZSBxdWVyeSBwYXJhbWV0ZXIgZm9yIHRoZSB0YWJcbiAgICBjb25zdCB7IHF1ZXJ5TmFtZSB9ID0gcm91dGVzLmNvbmZpZy5maWx0ZXIocCA9PiBwLnBhdGggPT09IFwic2VhcmNoXCIpWzBdLmNoaWxkcmVuPy5maW5kKHJvdXRlID0+IHJvdXRlLnBhdGggPT09IHQpPy5kYXRhIHx8IHt9O1xuICAgIGlmIChxdWVyeU5hbWUpIHJldHVybiBxdWVyeU5hbWU7XG5cbiAgICAvLyBmYWxsYmFjayB0byBxdWVyeU5hbWUgZnJvbSByb3V0ZSBkYXRhXG4gICAgaWYgKHJvdXRlPy5zbmFwc2hvdC5kYXRhWydxdWVyeU5hbWUnXSkgcmV0dXJuIHJvdXRlLnNuYXBzaG90LmRhdGFbJ3F1ZXJ5TmFtZSddO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiByZWN1cnNpdmUocm91dGUpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHF1ZXJ5IG9iamVjdCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFydGlhbCBxdWVyeS5cbiAqIElmIGFueSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nIGluIHRoZSBwYXJ0aWFsIHF1ZXJ5LCBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgd2l0aGluIGFuIGluamVjdGlvbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBwYXJ0aWFsIHF1ZXJ5IG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBjb21wbGV0ZSBxdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1ZXJ5KHF1ZXJ5PzogUGFydGlhbDxRdWVyeT4pOiBRdWVyeSB7XG4gIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dChidWlsZFF1ZXJ5KTtcblxuICBjb25zdCBuYW1lID0gcXVlcnk/Lm5hbWUgfHwgZ2V0UXVlcnlOYW1lRnJvbVJvdXRlKCk7XG4gIGNvbnN0IHBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zRnJvbVVybCh3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKSk7XG4gIHJldHVybiAoe1xuICAgIC4uLnBhcmFtcywgIC8vIGRlZmF1bHQgdmFsdWVzIHJldHJpZXZlZCBmcm9tIHRoZSBVUkxcbiAgICAuLi5xdWVyeSwgICAvLyBvdmVycmlkZSB3aXRoIHF1ZXJ5XG4gICAgbmFtZSwgICAgICAgLy8gb3ZlcnJpZGUgd2l0aCBxdWVyeSBuYW1lXG4gIH0gYXMgUXVlcnkpXG5cbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { assertInInjectionContext, inject } from "@angular/core";
2
+ import { ActivatedRoute, Router } from "@angular/router";
3
+ /**
4
+ * Retrieves the current path from the Angular `ActivatedRoute` service.
5
+ *
6
+ * @returns {string | undefined} The current path as a string, or `undefined` if the path cannot be determined.
7
+ */
8
+ export function getCurrentPath() {
9
+ assertInInjectionContext(getCurrentPath);
10
+ const route = inject(ActivatedRoute);
11
+ return route?.snapshot.url.toString();
12
+ }
13
+ /**
14
+ * Retrieves the current query name based on the current path and router configuration.
15
+ *
16
+ * This function asserts that it is being called within an injection context and then
17
+ * uses Angular's dependency injection to get the router configuration. It matches the
18
+ * current path against the router's configuration to find the corresponding query name.
19
+ *
20
+ * @returns {string | undefined} The name of the current query if found, otherwise undefined.
21
+ */
22
+ export function getCurrentQueryName() {
23
+ assertInInjectionContext(getCurrentQueryName);
24
+ const routes = inject(Router).config;
25
+ const path = getCurrentPath();
26
+ return routes.find(r => r.path === 'search')?.children?.find(r => r.path === path)?.data?.['queryName'];
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXRvbWljLWFuZ3VsYXIvc3JjL2xpYi91dGlscy9yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUM1Qix3QkFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV6QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFckMsT0FBTyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBSUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUVyQyxNQUFNLElBQUksR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUU5QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBwYXRoIGZyb20gdGhlIEFuZ3VsYXIgYEFjdGl2YXRlZFJvdXRlYCBzZXJ2aWNlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgY3VycmVudCBwYXRoIGFzIGEgc3RyaW5nLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50UGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dChnZXRDdXJyZW50UGF0aCk7XHJcblxyXG4gIGNvbnN0IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcclxuXHJcbiAgcmV0dXJuIHJvdXRlPy5zbmFwc2hvdC51cmwudG9TdHJpbmcoKTtcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHF1ZXJ5IG5hbWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGF0aCBhbmQgcm91dGVyIGNvbmZpZ3VyYXRpb24uXHJcbiAqXHJcbiAqIFRoaXMgZnVuY3Rpb24gYXNzZXJ0cyB0aGF0IGl0IGlzIGJlaW5nIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQgYW5kIHRoZW5cclxuICogdXNlcyBBbmd1bGFyJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gdG8gZ2V0IHRoZSByb3V0ZXIgY29uZmlndXJhdGlvbi4gSXQgbWF0Y2hlcyB0aGVcclxuICogY3VycmVudCBwYXRoIGFnYWluc3QgdGhlIHJvdXRlcidzIGNvbmZpZ3VyYXRpb24gdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBuYW1lLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBxdWVyeSBpZiBmb3VuZCwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50UXVlcnlOYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KGdldEN1cnJlbnRRdWVyeU5hbWUpO1xyXG5cclxuICBjb25zdCByb3V0ZXMgPSBpbmplY3QoUm91dGVyKS5jb25maWc7XHJcblxyXG4gIGNvbnN0IHBhdGggPSBnZXRDdXJyZW50UGF0aCgpO1xyXG5cclxuICByZXR1cm4gcm91dGVzLmZpbmQociA9PiByLnBhdGggPT09ICdzZWFyY2gnKT8uY2hpbGRyZW4/LmZpbmQociA9PiByLnBhdGggPT09IHBhdGgpPy5kYXRhPy5bJ3F1ZXJ5TmFtZSddO1xyXG59Il19
@@ -0,0 +1,6 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3V0aWxzL3RhaWx3aW5kLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBb0I7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ2xhc3NWYWx1ZSwgY2xzeCB9IGZyb20gJ2Nsc3gnO1xyXG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNuKC4uLmlucHV0czogQ2xhc3NWYWx1ZVtdKSB7XHJcbiAgcmV0dXJuIHR3TWVyZ2UoY2xzeChpbnB1dHMpKTtcclxufVxyXG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { effect, inject, runInInjectionContext } from "@angular/core";
2
+ import { applyThemeToNativeElement, ThemeStore } from "../stores";
3
+ export function withThemeBodyHook(app, params) {
4
+ runInInjectionContext(app.injector, () => {
5
+ const themeStore = inject(ThemeStore);
6
+ const { scope, theme } = params || { scope: 'application', theme: 'Default' };
7
+ themeStore.setCurrentTheme(scope, theme);
8
+ applyThemeToNativeElement(window.document.body, themeStore.scopes()?.[scope]?.cssVars?.light);
9
+ effect(() => {
10
+ const bodyScope = themeStore.scopes()?.[scope];
11
+ const vars = bodyScope.darkMode ? bodyScope.cssVars.dark : bodyScope.cssVars.light;
12
+ if (vars)
13
+ applyThemeToNativeElement(window.document.body, vars);
14
+ });
15
+ });
16
+ return app;
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUtYm9keS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXRvbWljLWFuZ3VsYXIvc3JjL2xpYi91dGlscy90aGVtZS1ib2R5LWhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFPbEUsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixHQUFtQixFQUNuQixNQUEyQztJQUUzQyxxQkFBcUIsQ0FDbkIsR0FBRyxDQUFDLFFBQVEsRUFDWixHQUFHLEVBQUU7UUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUU5RSxVQUFVLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6Qyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUYsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUVuRixJQUFJLElBQUk7Z0JBQUUseUJBQXlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQ0YsQ0FBQztJQUVGLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uUmVmLCBlZmZlY3QsIGluamVjdCwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgYXBwbHlUaGVtZVRvTmF0aXZlRWxlbWVudCwgVGhlbWVTdG9yZSB9IGZyb20gXCIuLi9zdG9yZXNcIjtcblxuZXhwb3J0IHR5cGUgVGhlbWVCb2R5SG9va1BhcmFtZXRlcnMgPSB7XG4gIHNjb3BlOiBzdHJpbmc7XG4gIHRoZW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRoZW1lQm9keUhvb2soXG4gIGFwcDogQXBwbGljYXRpb25SZWYsXG4gIHBhcmFtczogVGhlbWVCb2R5SG9va1BhcmFtZXRlcnMgfCB1bmRlZmluZWRcbik6IEFwcGxpY2F0aW9uUmVmIHtcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0KFxuICAgIGFwcC5pbmplY3RvcixcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCB0aGVtZVN0b3JlID0gaW5qZWN0KFRoZW1lU3RvcmUpO1xuICAgICAgY29uc3QgeyBzY29wZSwgdGhlbWUgfSA9IHBhcmFtcyB8fCB7IHNjb3BlOiAnYXBwbGljYXRpb24nLCB0aGVtZTogJ0RlZmF1bHQnIH07XG5cbiAgICAgIHRoZW1lU3RvcmUuc2V0Q3VycmVudFRoZW1lKHNjb3BlLCB0aGVtZSk7XG5cbiAgICAgIGFwcGx5VGhlbWVUb05hdGl2ZUVsZW1lbnQod2luZG93LmRvY3VtZW50LmJvZHksIHRoZW1lU3RvcmUuc2NvcGVzKCk/LltzY29wZV0/LmNzc1ZhcnM/LmxpZ2h0KTtcblxuICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYm9keVNjb3BlID0gdGhlbWVTdG9yZS5zY29wZXMoKT8uW3Njb3BlXTtcbiAgICAgICAgY29uc3QgdmFycyA9IGJvZHlTY29wZS5kYXJrTW9kZSA/IGJvZHlTY29wZS5jc3NWYXJzLmRhcmsgOiBib2R5U2NvcGUuY3NzVmFycy5saWdodDtcblxuICAgICAgICBpZiAodmFycykgYXBwbHlUaGVtZVRvTmF0aXZlRWxlbWVudCh3aW5kb3cuZG9jdW1lbnQuYm9keSwgdmFycyk7XG4gICAgICB9KVxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gYXBwO1xufVxuIl19
@@ -0,0 +1,6 @@
1
+ import { THEMES } from "../resources";
2
+ export function withThemes(app, themes) {
3
+ themes.forEach(theme => THEMES.push(theme));
4
+ return app;
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3V0aWxzL3RoZW1lLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBUyxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFtQixFQUFFLE1BQWU7SUFDN0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUU1QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBsaWNhdGlvblJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IFRoZW1lLCBUSEVNRVMgfSBmcm9tIFwiLi4vcmVzb3VyY2VzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVGhlbWVzKGFwcDogQXBwbGljYXRpb25SZWYsIHRoZW1lczogVGhlbWVbXSk6IEFwcGxpY2F0aW9uUmVmIHtcbiAgdGhlbWVzLmZvckVhY2godGhlbWUgPT4gVEhFTUVTLnB1c2godGhlbWUpKTtcblxuICByZXR1cm4gYXBwO1xufVxuIl19