@fundamental-ngx/core 0.35.3 → 0.35.4-rc.10

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 (212) hide show
  1. package/action-bar/package.json +1 -1
  2. package/action-sheet/package.json +1 -1
  3. package/alert/package.json +1 -1
  4. package/avatar/package.json +1 -1
  5. package/avatar-group/package.json +1 -1
  6. package/bar/package.json +1 -1
  7. package/breadcrumb/breadcrumb-item.component.d.ts +20 -13
  8. package/breadcrumb/breadcrumb.component.d.ts +46 -34
  9. package/breadcrumb/breadcrumb.module.d.ts +3 -1
  10. package/breadcrumb/esm2020/breadcrumb-item.component.mjs +44 -23
  11. package/breadcrumb/esm2020/breadcrumb.component.mjs +93 -88
  12. package/breadcrumb/esm2020/breadcrumb.module.mjs +12 -4
  13. package/breadcrumb/fesm2015/fundamental-ngx-core-breadcrumb.mjs +147 -114
  14. package/breadcrumb/fesm2015/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  15. package/breadcrumb/fesm2020/fundamental-ngx-core-breadcrumb.mjs +144 -111
  16. package/breadcrumb/fesm2020/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  17. package/breadcrumb/package.json +1 -1
  18. package/busy-indicator/package.json +1 -1
  19. package/button/package.json +1 -1
  20. package/calendar/package.json +1 -1
  21. package/card/package.json +1 -1
  22. package/carousel/package.json +1 -1
  23. package/checkbox/package.json +1 -1
  24. package/combobox/combobox.component.d.ts +8 -1
  25. package/combobox/combobox.interface.d.ts +1 -0
  26. package/combobox/esm2020/combobox-mobile/combobox-mobile.component.mjs +2 -2
  27. package/combobox/esm2020/combobox.component.mjs +22 -9
  28. package/combobox/esm2020/combobox.interface.mjs +1 -1
  29. package/combobox/fesm2015/fundamental-ngx-core-combobox.mjs +22 -9
  30. package/combobox/fesm2015/fundamental-ngx-core-combobox.mjs.map +1 -1
  31. package/combobox/fesm2020/fundamental-ngx-core-combobox.mjs +22 -9
  32. package/combobox/fesm2020/fundamental-ngx-core-combobox.mjs.map +1 -1
  33. package/combobox/package.json +1 -1
  34. package/content-density/esm2020/classes/deprecated-compact.directive.mjs +4 -4
  35. package/content-density/esm2020/classes/deprecated-condensed.directive.mjs +3 -3
  36. package/content-density/esm2020/classes/deprecated-cozy.directive.mjs +3 -3
  37. package/content-density/fesm2015/fundamental-ngx-core-content-density.mjs +7 -7
  38. package/content-density/fesm2015/fundamental-ngx-core-content-density.mjs.map +1 -1
  39. package/content-density/fesm2020/fundamental-ngx-core-content-density.mjs +7 -7
  40. package/content-density/fesm2020/fundamental-ngx-core-content-density.mjs.map +1 -1
  41. package/content-density/package.json +3 -3
  42. package/date-picker/package.json +1 -1
  43. package/datetime/package.json +1 -1
  44. package/datetime-picker/package.json +1 -1
  45. package/dialog/package.json +1 -1
  46. package/dynamic-page/package.json +1 -1
  47. package/dynamic-side-content/package.json +1 -1
  48. package/esm2020/breadcrumb/breadcrumb-item.component.mjs +44 -23
  49. package/esm2020/breadcrumb/breadcrumb.component.mjs +93 -88
  50. package/esm2020/breadcrumb/breadcrumb.module.mjs +12 -4
  51. package/esm2020/combobox/combobox-mobile/combobox-mobile.component.mjs +2 -2
  52. package/esm2020/combobox/combobox.component.mjs +22 -9
  53. package/esm2020/combobox/combobox.interface.mjs +1 -1
  54. package/esm2020/content-density/classes/deprecated-compact.directive.mjs +4 -4
  55. package/esm2020/content-density/classes/deprecated-condensed.directive.mjs +3 -3
  56. package/esm2020/content-density/classes/deprecated-cozy.directive.mjs +3 -3
  57. package/esm2020/overflow-layout/directives/overflow-expand.directive.mjs +6 -4
  58. package/esm2020/overflow-layout/directives/overflow-item-container-ref.directive.mjs +2 -2
  59. package/esm2020/overflow-layout/directives/overflow-item-ref.directive.mjs +20 -8
  60. package/esm2020/overflow-layout/directives/overflow-layout-item-container.directive.mjs +30 -3
  61. package/esm2020/overflow-layout/directives/overflow-layout-item.directive.mjs +12 -3
  62. package/esm2020/overflow-layout/index.mjs +3 -1
  63. package/esm2020/overflow-layout/interfaces/overflow-expand.interface.mjs +1 -1
  64. package/esm2020/overflow-layout/interfaces/overflow-item-ref.interface.mjs +1 -1
  65. package/esm2020/overflow-layout/interfaces/overflow-item.interface.mjs +1 -1
  66. package/esm2020/overflow-layout/overflow-layout.component.mjs +83 -157
  67. package/esm2020/overflow-layout/overflow-layout.service.mjs +241 -0
  68. package/esm2020/tile/directives/numeric-content.directives.mjs +1 -1
  69. package/esm2020/time/time-column/time-column.component.mjs +7 -8
  70. package/esm2020/utils/functions/resize-observable.mjs +9 -2
  71. package/facets/package.json +1 -1
  72. package/feed-input/package.json +1 -1
  73. package/feed-list-item/package.json +1 -1
  74. package/fesm2015/fundamental-ngx-core-breadcrumb.mjs +147 -114
  75. package/fesm2015/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  76. package/fesm2015/fundamental-ngx-core-combobox.mjs +22 -9
  77. package/fesm2015/fundamental-ngx-core-combobox.mjs.map +1 -1
  78. package/fesm2015/fundamental-ngx-core-content-density.mjs +7 -7
  79. package/fesm2015/fundamental-ngx-core-content-density.mjs.map +1 -1
  80. package/fesm2015/fundamental-ngx-core-overflow-layout.mjs +378 -166
  81. package/fesm2015/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  82. package/fesm2015/fundamental-ngx-core-tile.mjs.map +1 -1
  83. package/fesm2015/fundamental-ngx-core-time.mjs +6 -7
  84. package/fesm2015/fundamental-ngx-core-time.mjs.map +1 -1
  85. package/fesm2015/fundamental-ngx-core-utils.mjs +8 -1
  86. package/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  87. package/fesm2020/fundamental-ngx-core-breadcrumb.mjs +144 -111
  88. package/fesm2020/fundamental-ngx-core-breadcrumb.mjs.map +1 -1
  89. package/fesm2020/fundamental-ngx-core-combobox.mjs +22 -9
  90. package/fesm2020/fundamental-ngx-core-combobox.mjs.map +1 -1
  91. package/fesm2020/fundamental-ngx-core-content-density.mjs +7 -7
  92. package/fesm2020/fundamental-ngx-core-content-density.mjs.map +1 -1
  93. package/fesm2020/fundamental-ngx-core-overflow-layout.mjs +375 -165
  94. package/fesm2020/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  95. package/fesm2020/fundamental-ngx-core-tile.mjs.map +1 -1
  96. package/fesm2020/fundamental-ngx-core-time.mjs +6 -7
  97. package/fesm2020/fundamental-ngx-core-time.mjs.map +1 -1
  98. package/fesm2020/fundamental-ngx-core-utils.mjs +8 -1
  99. package/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  100. package/file-uploader/package.json +1 -1
  101. package/fixed-card-layout/package.json +1 -1
  102. package/flexible-column-layout/package.json +1 -1
  103. package/form/package.json +1 -1
  104. package/formatted-text/package.json +1 -1
  105. package/grid-list/package.json +1 -1
  106. package/icon/package.json +1 -1
  107. package/illustrated-message/package.json +1 -1
  108. package/infinite-scroll/package.json +1 -1
  109. package/info-label/package.json +1 -1
  110. package/inline-help/package.json +1 -1
  111. package/input-group/package.json +1 -1
  112. package/layout-grid/package.json +1 -1
  113. package/layout-panel/package.json +1 -1
  114. package/link/package.json +1 -1
  115. package/list/package.json +1 -1
  116. package/menu/package.json +1 -1
  117. package/message-box/package.json +1 -1
  118. package/message-strip/package.json +1 -1
  119. package/message-toast/package.json +1 -1
  120. package/micro-process-flow/package.json +1 -1
  121. package/mobile-mode/package.json +1 -1
  122. package/multi-input/package.json +1 -1
  123. package/nested-list/package.json +1 -1
  124. package/notification/package.json +1 -1
  125. package/object-identifier/package.json +1 -1
  126. package/object-marker/package.json +1 -1
  127. package/object-number/package.json +1 -1
  128. package/object-status/package.json +1 -1
  129. package/overflow-layout/directives/overflow-expand.directive.d.ts +6 -5
  130. package/overflow-layout/directives/overflow-item-ref.directive.d.ts +16 -6
  131. package/overflow-layout/directives/overflow-layout-item-container.directive.d.ts +13 -1
  132. package/overflow-layout/directives/overflow-layout-item.directive.d.ts +7 -2
  133. package/overflow-layout/esm2020/directives/overflow-expand.directive.mjs +6 -4
  134. package/overflow-layout/esm2020/directives/overflow-item-container-ref.directive.mjs +2 -2
  135. package/overflow-layout/esm2020/directives/overflow-item-ref.directive.mjs +20 -8
  136. package/overflow-layout/esm2020/directives/overflow-layout-item-container.directive.mjs +30 -3
  137. package/overflow-layout/esm2020/directives/overflow-layout-item.directive.mjs +12 -3
  138. package/overflow-layout/esm2020/index.mjs +3 -1
  139. package/overflow-layout/esm2020/interfaces/overflow-expand.interface.mjs +1 -1
  140. package/overflow-layout/esm2020/interfaces/overflow-item-ref.interface.mjs +1 -1
  141. package/overflow-layout/esm2020/interfaces/overflow-item.interface.mjs +1 -1
  142. package/overflow-layout/esm2020/overflow-layout.component.mjs +83 -157
  143. package/overflow-layout/esm2020/overflow-layout.service.mjs +241 -0
  144. package/overflow-layout/fesm2015/fundamental-ngx-core-overflow-layout.mjs +378 -166
  145. package/overflow-layout/fesm2015/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  146. package/overflow-layout/fesm2020/fundamental-ngx-core-overflow-layout.mjs +375 -165
  147. package/overflow-layout/fesm2020/fundamental-ngx-core-overflow-layout.mjs.map +1 -1
  148. package/overflow-layout/index.d.ts +2 -0
  149. package/overflow-layout/interfaces/overflow-expand.interface.d.ts +4 -4
  150. package/overflow-layout/interfaces/overflow-item-ref.interface.d.ts +14 -3
  151. package/overflow-layout/interfaces/overflow-item.interface.d.ts +2 -1
  152. package/overflow-layout/overflow-layout.component.d.ts +19 -31
  153. package/overflow-layout/overflow-layout.service.d.ts +90 -0
  154. package/overflow-layout/package.json +14 -13
  155. package/overflow-layout/tokens/overflow-expand.token.d.ts +1 -1
  156. package/overflow-layout/tokens/overflow-item-ref.token.d.ts +1 -1
  157. package/package.json +1 -1
  158. package/pagination/package.json +1 -1
  159. package/panel/package.json +1 -1
  160. package/popover/package.json +1 -1
  161. package/product-switch/package.json +1 -1
  162. package/progress-indicator/package.json +1 -1
  163. package/quick-view/package.json +1 -1
  164. package/radio/package.json +1 -1
  165. package/rating-indicator/package.json +1 -1
  166. package/resizable-card-layout/package.json +1 -1
  167. package/schematics/ng-add/index.js +5 -1
  168. package/schematics/ng-add/index.js.map +1 -1
  169. package/scroll-spy/package.json +1 -1
  170. package/scrollbar/package.json +1 -1
  171. package/segmented-button/package.json +1 -1
  172. package/select/package.json +1 -1
  173. package/shared/package.json +1 -1
  174. package/shellbar/package.json +1 -1
  175. package/side-navigation/package.json +1 -1
  176. package/slider/package.json +1 -1
  177. package/split-button/package.json +1 -1
  178. package/splitter/package.json +1 -1
  179. package/status-indicator/package.json +1 -1
  180. package/step-input/package.json +1 -1
  181. package/switch/package.json +1 -1
  182. package/table/package.json +1 -1
  183. package/tabs/package.json +1 -1
  184. package/text/package.json +1 -1
  185. package/theming/package.json +1 -1
  186. package/tile/directives/numeric-content.directives.d.ts +2 -3
  187. package/tile/esm2020/directives/numeric-content.directives.mjs +1 -1
  188. package/tile/fesm2015/fundamental-ngx-core-tile.mjs.map +1 -1
  189. package/tile/fesm2020/fundamental-ngx-core-tile.mjs.map +1 -1
  190. package/tile/package.json +1 -1
  191. package/time/esm2020/time-column/time-column.component.mjs +7 -8
  192. package/time/fesm2015/fundamental-ngx-core-time.mjs +6 -7
  193. package/time/fesm2015/fundamental-ngx-core-time.mjs.map +1 -1
  194. package/time/fesm2020/fundamental-ngx-core-time.mjs +6 -7
  195. package/time/fesm2020/fundamental-ngx-core-time.mjs.map +1 -1
  196. package/time/package.json +1 -1
  197. package/time/time-column/time-column.component.d.ts +1 -0
  198. package/time-picker/package.json +1 -1
  199. package/timeline/package.json +1 -1
  200. package/title/package.json +1 -1
  201. package/token/package.json +1 -1
  202. package/toolbar/package.json +1 -1
  203. package/tree/package.json +1 -1
  204. package/upload-collection/package.json +1 -1
  205. package/utils/esm2020/functions/resize-observable.mjs +9 -2
  206. package/utils/fesm2015/fundamental-ngx-core-utils.mjs +8 -1
  207. package/utils/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  208. package/utils/fesm2020/fundamental-ngx-core-utils.mjs +8 -1
  209. package/utils/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  210. package/utils/package.json +1 -1
  211. package/vertical-navigation/package.json +1 -1
  212. package/wizard/package.json +1 -1
@@ -0,0 +1,241 @@
1
+ import { FocusKeyManager } from '@angular/cdk/a11y';
2
+ import { ElementRef, Injectable, Optional } from '@angular/core';
3
+ import { resizeObservable } from '@fundamental-ngx/core/utils';
4
+ import { debounceTime, distinctUntilChanged, filter, skip, Subject, Subscription } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@fundamental-ngx/core/utils";
7
+ export class OverflowLayoutListeningResult {
8
+ constructor() {
9
+ this.showMore = false;
10
+ this.items = [];
11
+ this.hiddenItems = [];
12
+ this.visibleItems = [];
13
+ }
14
+ }
15
+ export class OverflowLayoutService {
16
+ /** @hidden */
17
+ constructor(_elRef, _rtlService) {
18
+ this._elRef = _elRef;
19
+ this._rtlService = _rtlService;
20
+ /**
21
+ * Overflow Layout calculation result.
22
+ */
23
+ this.result = new OverflowLayoutListeningResult();
24
+ /** @hidden */
25
+ this._listenToItemResize = true;
26
+ /** @hidden */
27
+ this._subscription = new Subscription();
28
+ /** @hidden */
29
+ this._allItems = [];
30
+ /** @hidden */
31
+ this._hiddenItems = [];
32
+ /** @hidden */
33
+ this._overflowItems = [];
34
+ /** @hidden */
35
+ this._detectChanges$ = new Subject();
36
+ /** @hidden */
37
+ this._result$ = new Subject();
38
+ /** @hidden */
39
+ this._dir = 'ltr';
40
+ }
41
+ /**
42
+ * Observable which emits when changes detection is required.
43
+ */
44
+ get detectChanges() {
45
+ return this._detectChanges$.asObservable();
46
+ }
47
+ /**
48
+ * Observable which emits when new calculation result is available.
49
+ */
50
+ get onResult() {
51
+ return this._result$.asObservable();
52
+ }
53
+ /** @hidden */
54
+ ngOnDestroy() {
55
+ this._subscription.unsubscribe();
56
+ }
57
+ startListening(config) {
58
+ this.setConfig(config);
59
+ this.fitVisibleItems();
60
+ this._setFocusKeyManager();
61
+ this._listenToChanges();
62
+ this._subscribeToRtl();
63
+ }
64
+ setConfig(config) {
65
+ this.config = config;
66
+ }
67
+ _emitResult() {
68
+ this._result$.next(this.result);
69
+ }
70
+ /** @hidden */
71
+ _listenToChanges() {
72
+ this._subscription.add(this.config.items.changes.subscribe(() => {
73
+ setTimeout(() => {
74
+ this.fitVisibleItems();
75
+ });
76
+ }));
77
+ this._listenToSizeChanges(this._elRef.nativeElement, this.config.itemsWrapper);
78
+ }
79
+ /** @hidden */
80
+ _listenToSizeChanges(...elements) {
81
+ elements.forEach((element) => this._subscription.add(resizeObservable(element)
82
+ .pipe(skip(1), filter(() => this._listenToItemResize), distinctUntilChanged(), debounceTime(30))
83
+ .subscribe(() => {
84
+ setTimeout(() => {
85
+ this.fitVisibleItems();
86
+ });
87
+ })));
88
+ }
89
+ /** @hidden */
90
+ fitVisibleItems() {
91
+ this._listenToItemResize = false;
92
+ this._allItems = this.config.items.toArray();
93
+ let allItems = this.config.items.toArray();
94
+ let visibleContainerItems = this.config.visibleItems.toArray();
95
+ allItems.forEach((item, index) => {
96
+ // Softly hide previously completely hidden item in order to correctly calculate it's size.
97
+ item.softHidden = true;
98
+ item.hidden = false;
99
+ item.index = index;
100
+ item.first = index === 0;
101
+ item.last = index === allItems.length - 1;
102
+ visibleContainerItems[index].containerRef.hidden = false;
103
+ });
104
+ this._detectChanges$.next();
105
+ allItems = this.config.direction === 'right' ? allItems : allItems.reverse();
106
+ visibleContainerItems =
107
+ this.config.direction === 'right' ? visibleContainerItems : visibleContainerItems.reverse();
108
+ this.result.showMore = false;
109
+ this._emitResult();
110
+ const containerWidth = this._elRef.nativeElement.getBoundingClientRect().width;
111
+ const itemsContainerWidth = this.config.itemsWrapper.getBoundingClientRect().width;
112
+ if (containerWidth >= itemsContainerWidth &&
113
+ this.config.visibleItems.length <= this.config.maxVisibleItems &&
114
+ this._hiddenItems.length === 0) {
115
+ // Make all items fully visible.
116
+ allItems.forEach((item) => {
117
+ item.softHidden = false;
118
+ });
119
+ this.result.showMore = false;
120
+ this.result.hiddenItems = this._hiddenItems;
121
+ this._emitResult();
122
+ this._listenToItemResize = true;
123
+ return;
124
+ }
125
+ this.result.showMore = true;
126
+ this._emitResult();
127
+ let fittingElmCount = 0;
128
+ let fittingElmsWidth = 0;
129
+ let shouldHideItems = false;
130
+ const showMoreContainerWidth = Math.ceil(this.config.showMoreContainer.getBoundingClientRect().width);
131
+ let layoutWidth = Math.ceil(this.config.layoutContainerElement.getBoundingClientRect().width);
132
+ // Try to find all forced visible items
133
+ const forcedItemsIndexes = this._getForcedItemsIndexes();
134
+ forcedItemsIndexes.forEach((itemIndex) => {
135
+ const container = this.config.visibleItems.get(itemIndex);
136
+ if (!container) {
137
+ return;
138
+ }
139
+ const elementSize = this._getElementWidth(container.elementRef.nativeElement);
140
+ layoutWidth -= elementSize;
141
+ });
142
+ if (layoutWidth < 0 && forcedItemsIndexes.length > 0) {
143
+ console.warn('There is no enough space to fit all forced visible items into the container. Please adjust their visibility accordingly.');
144
+ }
145
+ this._detectChanges$.next();
146
+ visibleContainerItems.forEach((item, index) => {
147
+ const itemRef = allItems[index];
148
+ if (shouldHideItems && !itemRef.overflowItem.forceVisibility) {
149
+ item.containerRef.hidden = true;
150
+ item.softHidden = false;
151
+ itemRef.hidden = true;
152
+ return;
153
+ }
154
+ const elementSize = this._getElementWidth(item.elementRef.nativeElement);
155
+ const combinedWidth = fittingElmsWidth + elementSize;
156
+ const condition = (combinedWidth <= layoutWidth ||
157
+ (item === this.config.visibleItems.last &&
158
+ combinedWidth <= layoutWidth + showMoreContainerWidth)) &&
159
+ fittingElmCount < this.config.maxVisibleItems;
160
+ if (condition) {
161
+ fittingElmsWidth += elementSize;
162
+ fittingElmCount++;
163
+ }
164
+ else if (!itemRef.overflowItem.forceVisibility) {
165
+ shouldHideItems = true;
166
+ item.softHidden = false;
167
+ item.containerRef.hidden = true;
168
+ itemRef.hidden = true;
169
+ }
170
+ });
171
+ // Reverse original order back.
172
+ allItems = this.config.direction === 'right' ? allItems : allItems.reverse();
173
+ allItems.forEach((item) => {
174
+ item.softHidden = false;
175
+ });
176
+ let hiddenItems = allItems.filter((i) => i.hidden);
177
+ hiddenItems = !this.config.reverseHiddenItems ? hiddenItems.reverse() : hiddenItems;
178
+ const visibleItems = allItems.filter((i) => !i.hidden);
179
+ visibleItems.forEach((item, index) => {
180
+ item.index = index;
181
+ item.first = index === 0;
182
+ item.last = index === visibleItems.length - 1;
183
+ });
184
+ this._hiddenItems = hiddenItems.map((item, index) => {
185
+ item.first = index === 0;
186
+ item.last = index === hiddenItems.length - 1;
187
+ item.index = index;
188
+ return item;
189
+ });
190
+ this.result.showMore = this._hiddenItems.length > 0;
191
+ this.result.hiddenItems = this._hiddenItems;
192
+ this._emitResult();
193
+ this._listenToItemResize = true;
194
+ }
195
+ /** @hidden */
196
+ _setFocusKeyManager() {
197
+ if (!this.config.enableKeyboardNavigation) {
198
+ return;
199
+ }
200
+ this._dir = this._rtlService?.rtl.value ? 'rtl' : 'ltr';
201
+ this._keyboardEventsManager = new FocusKeyManager(this._overflowItems)
202
+ .withWrap()
203
+ .withHorizontalOrientation(this._dir)
204
+ .skipPredicate((item) => !item.focusable || item.hidden);
205
+ }
206
+ /** @hidden Rtl change subscription */
207
+ _subscribeToRtl() {
208
+ if (!this._rtlService || !this.config.enableKeyboardNavigation) {
209
+ return;
210
+ }
211
+ this._subscription.add(this._rtlService.rtl.subscribe((isRtl) => {
212
+ this._dir = isRtl ? 'rtl' : 'ltr';
213
+ this._keyboardEventsManager = this._keyboardEventsManager.withHorizontalOrientation(this._dir);
214
+ }));
215
+ }
216
+ /** @hidden */
217
+ _getForcedItemsIndexes() {
218
+ return this._allItems
219
+ .map((item, index) => (item.overflowItem.forceVisibility ? index : -1))
220
+ .filter((i) => i > -1);
221
+ }
222
+ /**
223
+ * @hidden
224
+ * Returns combined width of the element including margins.
225
+ * @param element Element to calculate width of.
226
+ */
227
+ _getElementWidth(element) {
228
+ const elementStyle = getComputedStyle(element);
229
+ const elementWidth = element.getBoundingClientRect().width;
230
+ const elementSize = elementWidth + parseFloat(elementStyle.marginLeft) + parseFloat(elementStyle.marginRight);
231
+ return Math.ceil(elementSize);
232
+ }
233
+ }
234
+ OverflowLayoutService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: OverflowLayoutService, deps: [{ token: i0.ElementRef }, { token: i1.RtlService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
235
+ OverflowLayoutService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: OverflowLayoutService });
236
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: OverflowLayoutService, decorators: [{
237
+ type: Injectable
238
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.RtlService, decorators: [{
239
+ type: Optional
240
+ }] }]; } });
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctbGF5b3V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9vdmVyZmxvdy1sYXlvdXQvb3ZlcmZsb3ctbGF5b3V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsZ0JBQWdCLEVBQWMsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBYyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBaUIzRyxNQUFNLE9BQU8sNkJBQTZCO0lBQTFDO1FBQ0ksYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixVQUFLLEdBQXNCLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFzQixFQUFFLENBQUM7UUFDcEMsaUJBQVksR0FBc0IsRUFBRSxDQUFDO0lBQ3pDLENBQUM7Q0FBQTtBQUdELE1BQU0sT0FBTyxxQkFBcUI7SUFvRDlCLGNBQWM7SUFDZCxZQUFvQixNQUErQixFQUFzQixXQUE4QjtRQUFuRixXQUFNLEdBQU4sTUFBTSxDQUF5QjtRQUFzQixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUEvQ3ZHOztXQUVHO1FBQ0gsV0FBTSxHQUFHLElBQUksNkJBQTZCLEVBQUUsQ0FBQztRQUs3QyxjQUFjO1FBQ04sd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRW5DLGNBQWM7UUFDRyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEQsY0FBYztRQUNOLGNBQVMsR0FBc0IsRUFBRSxDQUFDO1FBRTFDLGNBQWM7UUFDTixpQkFBWSxHQUFzQixFQUFFLENB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QUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxPQUFvQjtRQUN6QyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDM0QsTUFBTSxXQUFXLEdBQUcsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5RyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7a0hBaFNRLHFCQUFxQjtzSEFBckIscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVU7OzBCQXNEK0MsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzS2V5TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWwsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcmVzaXplT2JzZXJ2YWJsZSwgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS91dGlscyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIE9ic2VydmFibGUsIHNraXAsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT3ZlcmZsb3dMYXlvdXRJdGVtQ29udGFpbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL292ZXJmbG93LWxheW91dC1pdGVtLWNvbnRhaW5lci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT3ZlcmZsb3dJdGVtUmVmIH0gZnJvbSAnLi9pbnRlcmZhY2VzL292ZXJmbG93LWl0ZW0tcmVmLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPdmVyZmxvd0l0ZW0gfSBmcm9tICcuL2ludGVyZmFjZXMvb3ZlcmZsb3ctaXRlbS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJmbG93TGF5b3V0Q29uZmlnIHtcbiAgICBpdGVtczogUXVlcnlMaXN0PE92ZXJmbG93SXRlbVJlZj47XG4gICAgdmlzaWJsZUl0ZW1zOiBRdWVyeUxpc3Q8T3ZlcmZsb3dMYXlvdXRJdGVtQ29udGFpbmVyRGlyZWN0aXZlPjtcbiAgICBpdGVtc1dyYXBwZXI6IEhUTUxFbGVtZW50O1xuICAgIHNob3dNb3JlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBsYXlvdXRDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBtYXhWaXNpYmxlSXRlbXM6IG51bWJlcjtcbiAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XG4gICAgZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uOiBib29sZWFuO1xuICAgIHJldmVyc2VIaWRkZW5JdGVtczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE92ZXJmbG93TGF5b3V0TGlzdGVuaW5nUmVzdWx0IHtcbiAgICBzaG93TW9yZSA9IGZhbHNlO1xuICAgIGl0ZW1zOiBPdmVyZmxvd0l0ZW1SZWZbXSA9IFtdO1xuICAgIGhpZGRlbkl0ZW1zOiBPdmVyZmxvd0l0ZW1SZWZbXSA9IFtdO1xuICAgIHZpc2libGVJdGVtczogT3ZlcmZsb3dJdGVtUmVmW10gPSBbXTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE92ZXJmbG93TGF5b3V0U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogT3ZlcmZsb3cgTGF5b3V0IGNvbmZpZy5cbiAgICAgKi9cbiAgICBjb25maWc6IE92ZXJmbG93TGF5b3V0Q29uZmlnO1xuXG4gICAgLyoqXG4gICAgICogT3ZlcmZsb3cgTGF5b3V0IGNhbGN1bGF0aW9uIHJlc3VsdC5cbiAgICAgKi9cbiAgICByZXN1bHQgPSBuZXcgT3ZlcmZsb3dMYXlvdXRMaXN0ZW5pbmdSZXN1bHQoKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2tleWJvYXJkRXZlbnRzTWFuYWdlcjogRm9jdXNLZXlNYW5hZ2VyPE92ZXJmbG93SXRlbT47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xpc3RlblRvSXRlbVJlc2l6ZSA9IHRydWU7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYWxsSXRlbXM6IE92ZXJmbG93SXRlbVJlZltdID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2hpZGRlbkl0ZW1zOiBPdmVyZmxvd0l0ZW1SZWZbXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9vdmVyZmxvd0l0ZW1zOiBPdmVyZmxvd0l0ZW1bXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZXRlY3RDaGFuZ2VzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Jlc3VsdCQgPSBuZXcgU3ViamVjdDxPdmVyZmxvd0xheW91dExpc3RlbmluZ1Jlc3VsdD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGlyOiAncnRsJyB8ICdsdHInID0gJ2x0cic7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlIHdoaWNoIGVtaXRzIHdoZW4gY2hhbmdlcyBkZXRlY3Rpb24gaXMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgZ2V0IGRldGVjdENoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXRlY3RDaGFuZ2VzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlIHdoaWNoIGVtaXRzIHdoZW4gbmV3IGNhbGN1bGF0aW9uIHJlc3VsdCBpcyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgZ2V0IG9uUmVzdWx0KCk6IE9ic2VydmFibGU8T3ZlcmZsb3dMYXlvdXRMaXN0ZW5pbmdSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIEBPcHRpb25hbCgpIHByaXZhdGUgX3J0bFNlcnZpY2U6IFJ0bFNlcnZpY2UgfCBudWxsKSB7fVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgc3RhcnRMaXN0ZW5pbmcoY29uZmlnOiBPdmVyZmxvd0xheW91dENvbmZpZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENvbmZpZyhjb25maWcpO1xuICAgICAgICB0aGlzLmZpdFZpc2libGVJdGVtcygpO1xuICAgICAgICB0aGlzLl9zZXRGb2N1c0tleU1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuVG9DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZVRvUnRsKCk7XG4gICAgfVxuXG4gICAgc2V0Q29uZmlnKGNvbmZpZzogT3ZlcmZsb3dMYXlvdXRDb25maWcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW1pdFJlc3VsdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVzdWx0JC5uZXh0KHRoaXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xpc3RlblRvQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLml0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXRWaXNpYmxlSXRlbXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fbGlzdGVuVG9TaXplQ2hhbmdlcyh0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbmZpZy5pdGVtc1dyYXBwZXIpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuVG9TaXplQ2hhbmdlcyguLi5lbGVtZW50czogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZhYmxlKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9saXN0ZW5Ub0l0ZW1SZXNpemUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZml0VmlzaWJsZUl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGZpdFZpc2libGVJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuVG9JdGVtUmVzaXplID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FsbEl0ZW1zID0gdGhpcy5jb25maWcuaXRlbXMudG9BcnJheSgpO1xuXG4gICAgICAgIGxldCBhbGxJdGVtcyA9IHRoaXMuY29uZmlnLml0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IHZpc2libGVDb250YWluZXJJdGVtcyA9IHRoaXMuY29uZmlnLnZpc2libGVJdGVtcy50b0FycmF5KCk7XG5cbiAgICAgICAgYWxsSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIC8vIFNvZnRseSBoaWRlIHByZXZpb3VzbHkgY29tcGxldGVseSBoaWRkZW4gaXRlbSBpbiBvcmRlciB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIGl0J3Mgc2l6ZS5cbiAgICAgICAgICAgIGl0ZW0uc29mdEhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICBpdGVtLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgaXRlbS5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgaXRlbS5maXJzdCA9IGluZGV4ID09PSAwO1xuICAgICAgICAgICAgaXRlbS5sYXN0ID0gaW5kZXggPT09IGFsbEl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB2aXNpYmxlQ29udGFpbmVySXRlbXNbaW5kZXhdLmNvbnRhaW5lclJlZi5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcyQubmV4dCgpO1xuXG4gICAgICAgIGFsbEl0ZW1zID0gdGhpcy5jb25maWcuZGlyZWN0aW9uID09PSAncmlnaHQnID8gYWxsSXRlbXMgOiBhbGxJdGVtcy5yZXZlcnNlKCk7XG4gICAgICAgIHZpc2libGVDb250YWluZXJJdGVtcyA9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5kaXJlY3Rpb24gPT09ICdyaWdodCcgPyB2aXNpYmxlQ29udGFpbmVySXRlbXMgOiB2aXNpYmxlQ29udGFpbmVySXRlbXMucmV2ZXJzZSgpO1xuXG4gICAgICAgIHRoaXMucmVzdWx0LnNob3dNb3JlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VtaXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLl9lbFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lcldpZHRoID0gdGhpcy5jb25maWcuaXRlbXNXcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoID49IGl0ZW1zQ29udGFpbmVyV2lkdGggJiZcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnZpc2libGVJdGVtcy5sZW5ndGggPD0gdGhpcy5jb25maWcubWF4VmlzaWJsZUl0ZW1zICYmXG4gICAgICAgICAgICB0aGlzLl9oaWRkZW5JdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGFsbCBpdGVtcyBmdWxseSB2aXNpYmxlLlxuICAgICAgICAgICAgYWxsSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uc29mdEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdC5zaG93TW9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZXN1bHQuaGlkZGVuSXRlbXMgPSB0aGlzLl9oaWRkZW5JdGVtcztcbiAgICAgICAgICAgIHRoaXMuX2VtaXRSZXN1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlblRvSXRlbVJlc2l6ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHQuc2hvd01vcmUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9lbWl0UmVzdWx0KCk7XG4gICAgICAgIGxldCBmaXR0aW5nRWxtQ291bnQgPSAwO1xuICAgICAgICBsZXQgZml0dGluZ0VsbXNXaWR0aCA9IDA7XG4gICAgICAgIGxldCBzaG91bGRIaWRlSXRlbXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBzaG93TW9yZUNvbnRhaW5lcldpZHRoID0gTWF0aC5jZWlsKHRoaXMuY29uZmlnLnNob3dNb3JlQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgbGV0IGxheW91dFdpZHRoID0gTWF0aC5jZWlsKHRoaXMuY29uZmlnLmxheW91dENvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuXG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGFsbCBmb3JjZWQgdmlzaWJsZSBpdGVtc1xuICAgICAgICBjb25zdCBmb3JjZWRJdGVtc0luZGV4ZXMgPSB0aGlzLl9nZXRGb3JjZWRJdGVtc0luZGV4ZXMoKTtcblxuICAgICAgICBmb3JjZWRJdGVtc0luZGV4ZXMuZm9yRWFjaCgoaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbmZpZy52aXNpYmxlSXRlbXMuZ2V0KGl0ZW1JbmRleCk7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTaXplID0gdGhpcy5fZ2V0RWxlbWVudFdpZHRoKGNvbnRhaW5lci5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBsYXlvdXRXaWR0aCAtPSBlbGVtZW50U2l6ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGxheW91dFdpZHRoIDwgMCAmJiBmb3JjZWRJdGVtc0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICdUaGVyZSBpcyBubyBlbm91Z2ggc3BhY2UgdG8gZml0IGFsbCBmb3JjZWQgdmlzaWJsZSBpdGVtcyBpbnRvIHRoZSBjb250YWluZXIuIFBsZWFzZSBhZGp1c3QgdGhlaXIgdmlzaWJpbGl0eSBhY2NvcmRpbmdseS4nXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcyQubmV4dCgpO1xuXG4gICAgICAgIHZpc2libGVDb250YWluZXJJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbVJlZiA9IGFsbEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzaG91bGRIaWRlSXRlbXMgJiYgIWl0ZW1SZWYub3ZlcmZsb3dJdGVtLmZvcmNlVmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uY29udGFpbmVyUmVmLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgaXRlbS5zb2Z0SGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaXRlbVJlZi5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudFNpemUgPSB0aGlzLl9nZXRFbGVtZW50V2lkdGgoaXRlbS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWRXaWR0aCA9IGZpdHRpbmdFbG1zV2lkdGggKyBlbGVtZW50U2l6ZTtcblxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uID1cbiAgICAgICAgICAgICAgICAoY29tYmluZWRXaWR0aCA8PSBsYXlvdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgICAoaXRlbSA9PT0gdGhpcy5jb25maWcudmlzaWJsZUl0ZW1zLmxhc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkV2lkdGggPD0gbGF5b3V0V2lkdGggKyBzaG93TW9yZUNvbnRhaW5lcldpZHRoKSkgJiZcbiAgICAgICAgICAgICAgICBmaXR0aW5nRWxtQ291bnQgPCB0aGlzLmNvbmZpZy5tYXhWaXNpYmxlSXRlbXM7XG5cbiAgICAgICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICBmaXR0aW5nRWxtc1dpZHRoICs9IGVsZW1lbnRTaXplO1xuICAgICAgICAgICAgICAgIGZpdHRpbmdFbG1Db3VudCsrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXRlbVJlZi5vdmVyZmxvd0l0ZW0uZm9yY2VWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkSGlkZUl0ZW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpdGVtLnNvZnRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbnRhaW5lclJlZi5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGl0ZW1SZWYuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmV2ZXJzZSBvcmlnaW5hbCBvcmRlciBiYWNrLlxuICAgICAgICBhbGxJdGVtcyA9IHRoaXMuY29uZmlnLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IGFsbEl0ZW1zIDogYWxsSXRlbXMucmV2ZXJzZSgpO1xuXG4gICAgICAgIGFsbEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc29mdEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgaGlkZGVuSXRlbXMgPSBhbGxJdGVtcy5maWx0ZXIoKGkpID0+IGkuaGlkZGVuKTtcbiAgICAgICAgaGlkZGVuSXRlbXMgPSAhdGhpcy5jb25maWcucmV2ZXJzZUhpZGRlbkl0ZW1zID8gaGlkZGVuSXRlbXMucmV2ZXJzZSgpIDogaGlkZGVuSXRlbXM7XG4gICAgICAgIGNvbnN0IHZpc2libGVJdGVtcyA9IGFsbEl0ZW1zLmZpbHRlcigoaSkgPT4gIWkuaGlkZGVuKTtcblxuICAgICAgICB2aXNpYmxlSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIGl0ZW0uZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgICAgIGl0ZW0ubGFzdCA9IGluZGV4ID09PSB2aXNpYmxlSXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5faGlkZGVuSXRlbXMgPSBoaWRkZW5JdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmZpcnN0ID0gaW5kZXggPT09IDA7XG4gICAgICAgICAgICBpdGVtLmxhc3QgPSBpbmRleCA9PT0gaGlkZGVuSXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGl0ZW0uaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc3VsdC5zaG93TW9yZSA9IHRoaXMuX2hpZGRlbkl0ZW1zLmxlbmd0aCA+IDA7XG4gICAgICAgIHRoaXMucmVzdWx0LmhpZGRlbkl0ZW1zID0gdGhpcy5faGlkZGVuSXRlbXM7XG4gICAgICAgIHRoaXMuX2VtaXRSZXN1bHQoKTtcblxuICAgICAgICB0aGlzLl9saXN0ZW5Ub0l0ZW1SZXNpemUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2V0Rm9jdXNLZXlNYW5hZ2VyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpciA9IHRoaXMuX3J0bFNlcnZpY2U/LnJ0bC52YWx1ZSA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlciA9IG5ldyBGb2N1c0tleU1hbmFnZXIodGhpcy5fb3ZlcmZsb3dJdGVtcylcbiAgICAgICAgICAgIC53aXRoV3JhcCgpXG4gICAgICAgICAgICAud2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0aGlzLl9kaXIpXG4gICAgICAgICAgICAuc2tpcFByZWRpY2F0ZSgoaXRlbSkgPT4gIWl0ZW0uZm9jdXNhYmxlIHx8IGl0ZW0uaGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBSdGwgY2hhbmdlIHN1YnNjcmlwdGlvbiAqL1xuICAgIHByaXZhdGUgX3N1YnNjcmliZVRvUnRsKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3J0bFNlcnZpY2UgfHwgIXRoaXMuY29uZmlnLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMuX3J0bFNlcnZpY2UucnRsLnN1YnNjcmliZSgoaXNSdGwpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXIgPSBpc1J0bCA/ICdydGwnIDogJ2x0cic7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlib2FyZEV2ZW50c01hbmFnZXIgPSB0aGlzLl9rZXlib2FyZEV2ZW50c01hbmFnZXIud2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0aGlzLl9kaXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldEZvcmNlZEl0ZW1zSW5kZXhlcygpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxJdGVtc1xuICAgICAgICAgICAgLm1hcCgoaXRlbSwgaW5kZXgpID0+IChpdGVtLm92ZXJmbG93SXRlbS5mb3JjZVZpc2liaWxpdHkgPyBpbmRleCA6IC0xKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGkpID0+IGkgPiAtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJldHVybnMgY29tYmluZWQgd2lkdGggb2YgdGhlIGVsZW1lbnQgaW5jbHVkaW5nIG1hcmdpbnMuXG4gICAgICogQHBhcmFtIGVsZW1lbnQgRWxlbWVudCB0byBjYWxjdWxhdGUgd2lkdGggb2YuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0RWxlbWVudFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgZWxlbWVudFNpemUgPSBlbGVtZW50V2lkdGggKyBwYXJzZUZsb2F0KGVsZW1lbnRTdHlsZS5tYXJnaW5MZWZ0KSArIHBhcnNlRmxvYXQoZWxlbWVudFN0eWxlLm1hcmdpblJpZ2h0KTtcblxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKGVsZW1lbnRTaXplKTtcbiAgICB9XG59XG4iXX0=