@skyux/lists 5.7.2 → 6.0.0-beta.2

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 (141) hide show
  1. package/esm2020/index.mjs +22 -0
  2. package/esm2020/lib/modules/filter/filter-button.component.mjs +62 -0
  3. package/esm2020/lib/modules/filter/filter-inline-item.component.mjs +14 -0
  4. package/esm2020/lib/modules/filter/filter-inline.component.mjs +14 -0
  5. package/esm2020/lib/modules/filter/filter-summary-item.component.mjs +45 -0
  6. package/esm2020/lib/modules/filter/filter-summary.component.mjs +15 -0
  7. package/esm2020/lib/modules/filter/filter.module.mjs +61 -0
  8. package/esm2020/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.mjs +93 -0
  9. package/esm2020/lib/modules/infinite-scroll/infinite-scroll.component.mjs +109 -0
  10. package/esm2020/lib/modules/infinite-scroll/infinite-scroll.module.mjs +20 -0
  11. package/esm2020/lib/modules/paging/paging.component.mjs +122 -0
  12. package/esm2020/lib/modules/paging/paging.module.mjs +34 -0
  13. package/esm2020/lib/modules/repeater/repeater-adapter.service.mjs +69 -0
  14. package/esm2020/lib/modules/repeater/repeater-item-content.component.mjs +14 -0
  15. package/esm2020/lib/modules/repeater/repeater-item-context-menu.component.mjs +17 -0
  16. package/esm2020/lib/modules/repeater/repeater-item-title.component.mjs +14 -0
  17. package/esm2020/lib/modules/repeater/repeater-item.component.mjs +383 -0
  18. package/esm2020/lib/modules/repeater/repeater.component.mjs +256 -0
  19. package/esm2020/lib/modules/repeater/repeater.module.mjs +69 -0
  20. package/esm2020/lib/modules/repeater/repeater.service.mjs +72 -0
  21. package/esm2020/lib/modules/shared/sky-lists-resources.module.mjs +80 -0
  22. package/esm2020/lib/modules/sort/sort-item.component.mjs +60 -0
  23. package/esm2020/lib/modules/sort/sort-menu-heading.component.mjs +13 -0
  24. package/esm2020/lib/modules/sort/sort.component.mjs +35 -0
  25. package/esm2020/lib/modules/sort/sort.module.mjs +50 -0
  26. package/esm2020/lib/modules/sort/sort.service.mjs +20 -0
  27. package/esm2020/skyux-lists.mjs +5 -0
  28. package/esm2020/testing/filter/filter-fixture-button.mjs +46 -0
  29. package/esm2020/testing/filter/filter-fixture-summary.mjs +28 -0
  30. package/esm2020/testing/filter/filter-testing.module.mjs +15 -0
  31. package/esm2020/testing/filter/lists-filter-fixture-button.mjs +2 -0
  32. package/esm2020/testing/infinite-scroll/infinite-scroll-fixture.mjs +27 -0
  33. package/esm2020/testing/infinite-scroll/infinite-scroll-testing.module.mjs +15 -0
  34. package/esm2020/testing/paging/paging-fixture-button.mjs +2 -0
  35. package/esm2020/testing/paging/paging-fixture.mjs +93 -0
  36. package/esm2020/testing/paging/paging-testing.module.mjs +15 -0
  37. package/esm2020/testing/public-api.mjs +13 -0
  38. package/esm2020/testing/skyux-lists-testing.mjs +5 -0
  39. package/esm2020/testing/sort/sort-fixture-menu-item.mjs +2 -0
  40. package/esm2020/testing/sort/sort-fixture-menu.mjs +2 -0
  41. package/esm2020/testing/sort/sort-fixture.mjs +140 -0
  42. package/esm2020/testing/sort/sort-testing.module.mjs +17 -0
  43. package/fesm2015/{skyux-lists-testing.js → skyux-lists-testing.mjs} +17 -17
  44. package/fesm2015/skyux-lists-testing.mjs.map +1 -0
  45. package/fesm2015/skyux-lists.mjs +1615 -0
  46. package/fesm2015/skyux-lists.mjs.map +1 -0
  47. package/fesm2020/skyux-lists-testing.mjs +389 -0
  48. package/fesm2020/skyux-lists-testing.mjs.map +1 -0
  49. package/fesm2020/skyux-lists.mjs +1615 -0
  50. package/fesm2020/skyux-lists.mjs.map +1 -0
  51. package/package.json +43 -19
  52. package/testing/package.json +5 -5
  53. package/bundles/skyux-lists-testing.umd.js +0 -887
  54. package/bundles/skyux-lists.umd.js +0 -2149
  55. package/esm2015/index.js +0 -22
  56. package/esm2015/index.js.map +0 -1
  57. package/esm2015/lib/modules/filter/filter-button.component.js +0 -67
  58. package/esm2015/lib/modules/filter/filter-button.component.js.map +0 -1
  59. package/esm2015/lib/modules/filter/filter-inline-item.component.js +0 -18
  60. package/esm2015/lib/modules/filter/filter-inline-item.component.js.map +0 -1
  61. package/esm2015/lib/modules/filter/filter-inline.component.js +0 -18
  62. package/esm2015/lib/modules/filter/filter-inline.component.js.map +0 -1
  63. package/esm2015/lib/modules/filter/filter-summary-item.component.js +0 -50
  64. package/esm2015/lib/modules/filter/filter-summary-item.component.js.map +0 -1
  65. package/esm2015/lib/modules/filter/filter-summary.component.js +0 -20
  66. package/esm2015/lib/modules/filter/filter-summary.component.js.map +0 -1
  67. package/esm2015/lib/modules/filter/filter.module.js +0 -61
  68. package/esm2015/lib/modules/filter/filter.module.js.map +0 -1
  69. package/esm2015/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.js +0 -93
  70. package/esm2015/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.js.map +0 -1
  71. package/esm2015/lib/modules/infinite-scroll/infinite-scroll.component.js +0 -115
  72. package/esm2015/lib/modules/infinite-scroll/infinite-scroll.component.js.map +0 -1
  73. package/esm2015/lib/modules/infinite-scroll/infinite-scroll.module.js +0 -20
  74. package/esm2015/lib/modules/infinite-scroll/infinite-scroll.module.js.map +0 -1
  75. package/esm2015/lib/modules/paging/paging.component.js +0 -127
  76. package/esm2015/lib/modules/paging/paging.component.js.map +0 -1
  77. package/esm2015/lib/modules/paging/paging.module.js +0 -34
  78. package/esm2015/lib/modules/paging/paging.module.js.map +0 -1
  79. package/esm2015/lib/modules/repeater/repeater-adapter.service.js +0 -69
  80. package/esm2015/lib/modules/repeater/repeater-adapter.service.js.map +0 -1
  81. package/esm2015/lib/modules/repeater/repeater-item-content.component.js +0 -17
  82. package/esm2015/lib/modules/repeater/repeater-item-content.component.js.map +0 -1
  83. package/esm2015/lib/modules/repeater/repeater-item-context-menu.component.js +0 -20
  84. package/esm2015/lib/modules/repeater/repeater-item-context-menu.component.js.map +0 -1
  85. package/esm2015/lib/modules/repeater/repeater-item-title.component.js +0 -17
  86. package/esm2015/lib/modules/repeater/repeater-item-title.component.js.map +0 -1
  87. package/esm2015/lib/modules/repeater/repeater-item.component.js +0 -389
  88. package/esm2015/lib/modules/repeater/repeater-item.component.js.map +0 -1
  89. package/esm2015/lib/modules/repeater/repeater.component.js +0 -262
  90. package/esm2015/lib/modules/repeater/repeater.component.js.map +0 -1
  91. package/esm2015/lib/modules/repeater/repeater.module.js +0 -69
  92. package/esm2015/lib/modules/repeater/repeater.module.js.map +0 -1
  93. package/esm2015/lib/modules/repeater/repeater.service.js +0 -72
  94. package/esm2015/lib/modules/repeater/repeater.service.js.map +0 -1
  95. package/esm2015/lib/modules/shared/sky-lists-resources.module.js +0 -80
  96. package/esm2015/lib/modules/shared/sky-lists-resources.module.js.map +0 -1
  97. package/esm2015/lib/modules/sort/sort-item.component.js +0 -65
  98. package/esm2015/lib/modules/sort/sort-item.component.js.map +0 -1
  99. package/esm2015/lib/modules/sort/sort-menu-heading.component.js +0 -17
  100. package/esm2015/lib/modules/sort/sort-menu-heading.component.js.map +0 -1
  101. package/esm2015/lib/modules/sort/sort.component.js +0 -41
  102. package/esm2015/lib/modules/sort/sort.component.js.map +0 -1
  103. package/esm2015/lib/modules/sort/sort.module.js +0 -50
  104. package/esm2015/lib/modules/sort/sort.module.js.map +0 -1
  105. package/esm2015/lib/modules/sort/sort.service.js +0 -20
  106. package/esm2015/lib/modules/sort/sort.service.js.map +0 -1
  107. package/esm2015/skyux-lists.js +0 -5
  108. package/esm2015/skyux-lists.js.map +0 -1
  109. package/esm2015/testing/filter/filter-fixture-button.js +0 -50
  110. package/esm2015/testing/filter/filter-fixture-button.js.map +0 -1
  111. package/esm2015/testing/filter/filter-fixture-summary.js +0 -31
  112. package/esm2015/testing/filter/filter-fixture-summary.js.map +0 -1
  113. package/esm2015/testing/filter/filter-testing.module.js +0 -15
  114. package/esm2015/testing/filter/filter-testing.module.js.map +0 -1
  115. package/esm2015/testing/filter/lists-filter-fixture-button.js +0 -2
  116. package/esm2015/testing/filter/lists-filter-fixture-button.js.map +0 -1
  117. package/esm2015/testing/infinite-scroll/infinite-scroll-fixture.js +0 -30
  118. package/esm2015/testing/infinite-scroll/infinite-scroll-fixture.js.map +0 -1
  119. package/esm2015/testing/infinite-scroll/infinite-scroll-testing.module.js +0 -15
  120. package/esm2015/testing/infinite-scroll/infinite-scroll-testing.module.js.map +0 -1
  121. package/esm2015/testing/paging/paging-fixture-button.js +0 -2
  122. package/esm2015/testing/paging/paging-fixture-button.js.map +0 -1
  123. package/esm2015/testing/paging/paging-fixture.js +0 -104
  124. package/esm2015/testing/paging/paging-fixture.js.map +0 -1
  125. package/esm2015/testing/paging/paging-testing.module.js +0 -15
  126. package/esm2015/testing/paging/paging-testing.module.js.map +0 -1
  127. package/esm2015/testing/public-api.js +0 -13
  128. package/esm2015/testing/public-api.js.map +0 -1
  129. package/esm2015/testing/skyux-lists-testing.js +0 -5
  130. package/esm2015/testing/skyux-lists-testing.js.map +0 -1
  131. package/esm2015/testing/sort/sort-fixture-menu-item.js +0 -2
  132. package/esm2015/testing/sort/sort-fixture-menu-item.js.map +0 -1
  133. package/esm2015/testing/sort/sort-fixture-menu.js +0 -2
  134. package/esm2015/testing/sort/sort-fixture-menu.js.map +0 -1
  135. package/esm2015/testing/sort/sort-fixture.js +0 -152
  136. package/esm2015/testing/sort/sort-fixture.js.map +0 -1
  137. package/esm2015/testing/sort/sort-testing.module.js +0 -17
  138. package/esm2015/testing/sort/sort-testing.module.js.map +0 -1
  139. package/fesm2015/skyux-lists-testing.js.map +0 -1
  140. package/fesm2015/skyux-lists.js +0 -1685
  141. package/fesm2015/skyux-lists.js.map +0 -1
@@ -0,0 +1,383 @@
1
+ import { ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { skyAnimationSlide } from '@skyux/animations';
3
+ import { SkyLibResourcesService } from '@skyux/i18n';
4
+ import { Subject, forkJoin as observableForkJoin } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import { SkyRepeaterAdapterService } from './repeater-adapter.service';
7
+ import { SkyRepeaterItemContentComponent } from './repeater-item-content.component';
8
+ import { SkyRepeaterItemContextMenuComponent } from './repeater-item-context-menu.component';
9
+ import { SkyRepeaterService } from './repeater.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./repeater.service";
12
+ import * as i2 from "./repeater-adapter.service";
13
+ import * as i3 from "@skyux/i18n";
14
+ import * as i4 from "@skyux/inline-form";
15
+ import * as i5 from "@skyux/indicators";
16
+ import * as i6 from "@skyux/forms";
17
+ import * as i7 from "@angular/common";
18
+ let nextContentId = 0;
19
+ /**
20
+ * Creates an individual repeater item.
21
+ */
22
+ export class SkyRepeaterItemComponent {
23
+ constructor(repeaterService, changeDetector, adapterService, elementRef, resourceService) {
24
+ this.repeaterService = repeaterService;
25
+ this.changeDetector = changeDetector;
26
+ this.adapterService = adapterService;
27
+ this.elementRef = elementRef;
28
+ this.resourceService = resourceService;
29
+ /**
30
+ * Indicates whether users can change the order of the repeater item.
31
+ * The repeater component's `reorderable` property must also be set to `true`.
32
+ */
33
+ this.reorderable = false;
34
+ /**
35
+ * Indicates whether to display a checkbox in the left of the repeater item.
36
+ */
37
+ this.selectable = false;
38
+ /**
39
+ * Indicates whether to display an inline form within the repeater.
40
+ * Users can toggle between displaying and hiding the inline form.
41
+ */
42
+ this.showInlineForm = false;
43
+ /**
44
+ * Fires when users collapse the repeater item.
45
+ */
46
+ this.collapse = new EventEmitter();
47
+ /**
48
+ * Fires when users expand the repeater item.
49
+ */
50
+ this.expand = new EventEmitter();
51
+ /**
52
+ * Fires when the repeater includes an inline form and users close it. This event emits
53
+ * [a `SkyInlineFormCloseArgs` type](https://developer.blackbaud.com/skyux/components/inline-form#skyinlineformcloseargs-properties).
54
+ */
55
+ this.inlineFormClose = new EventEmitter();
56
+ /**
57
+ * Fires when users select or clear the checkbox for the repeater item.
58
+ */
59
+ this.isSelectedChange = new EventEmitter();
60
+ this.contentId = `sky-repeater-item-content-${++nextContentId}`;
61
+ this.hasItemContent = false;
62
+ this.isActive = false;
63
+ this.keyboardReorderingEnabled = false;
64
+ this.ngUnsubscribe = new Subject();
65
+ this._isCollapsible = true;
66
+ this._isExpanded = true;
67
+ this._isSelected = false;
68
+ this.slideForExpanded(false);
69
+ observableForkJoin([
70
+ this.resourceService.getString('skyux_repeater_item_reorder_cancel'),
71
+ this.resourceService.getString('skyux_repeater_item_reorder_finish'),
72
+ this.resourceService.getString('skyux_repeater_item_reorder_instructions'),
73
+ this.resourceService.getString('skyux_repeater_item_reorder_operation'),
74
+ this.resourceService.getString('skyux_repeater_item_reorder_moved'),
75
+ ]).subscribe((translatedStrings) => {
76
+ this.reorderCancelText = translatedStrings[0];
77
+ this.reorderFinishText = translatedStrings[1];
78
+ this.reorderStateDescription = translatedStrings[2];
79
+ this.reorderInstructions = translatedStrings[3];
80
+ this.reorderMovedText = translatedStrings[4];
81
+ this.reorderButtonLabel = this.reorderInstructions;
82
+ });
83
+ }
84
+ /**
85
+ * Indicates whether the repeater item is expanded.
86
+ * @default true
87
+ */
88
+ set isExpanded(value) {
89
+ this.updateForExpanded(value, true);
90
+ }
91
+ get isExpanded() {
92
+ return this._isExpanded;
93
+ }
94
+ /**
95
+ * Indicates whether the repeater item's checkbox is selected.
96
+ * When users select the repeater item, the specified property on your model is updated accordingly.
97
+ * @default false
98
+ */
99
+ set isSelected(value) {
100
+ if (value !== this._isSelected) {
101
+ this._isSelected = value;
102
+ this.isSelectedChange.emit(this._isSelected);
103
+ }
104
+ }
105
+ get isSelected() {
106
+ return this._isSelected;
107
+ }
108
+ set isCollapsible(value) {
109
+ if (this.isCollapsible !== value) {
110
+ this._isCollapsible = value;
111
+ /*istanbul ignore else */
112
+ if (!value) {
113
+ this.updateForExpanded(true, false);
114
+ }
115
+ }
116
+ this.changeDetector.markForCheck();
117
+ }
118
+ get isCollapsible() {
119
+ return this._isCollapsible;
120
+ }
121
+ get repeaterGroupClass() {
122
+ return 'sky-repeater-item-group-' + this.repeaterService.repeaterGroupId;
123
+ }
124
+ ngOnInit() {
125
+ this.repeaterService.registerItem(this);
126
+ this.repeaterService.activeItemChange
127
+ .pipe(takeUntil(this.ngUnsubscribe))
128
+ .subscribe((item) => {
129
+ const newIsActiveValue = this === item;
130
+ if (newIsActiveValue !== this.isActive) {
131
+ this.isActive = newIsActiveValue;
132
+ this.changeDetector.markForCheck();
133
+ }
134
+ });
135
+ }
136
+ ngAfterViewInit() {
137
+ this.hasItemContent = this.repeaterItemContentComponents.length > 0;
138
+ this.updateExpandOnContentChange();
139
+ }
140
+ ngOnDestroy() {
141
+ this.collapse.complete();
142
+ this.expand.complete();
143
+ this.inlineFormClose.complete();
144
+ this.isSelectedChange.complete();
145
+ this.ngUnsubscribe.next();
146
+ this.ngUnsubscribe.complete();
147
+ this.repeaterService.unregisterItem(this);
148
+ }
149
+ headerClick() {
150
+ if (this.isCollapsible) {
151
+ this.updateForExpanded(!this.isExpanded, true);
152
+ }
153
+ }
154
+ chevronDirectionChange(direction) {
155
+ this.updateForExpanded(direction === 'up', true);
156
+ }
157
+ onRepeaterItemClick(event) {
158
+ // Only activate item if clicking on the title, content, or parent item div.
159
+ // This will avoid accidental activations when clicking inside interactive elements like
160
+ // the expand/collapse chevron, dropdown, inline-delete, etc...
161
+ if (event.target === this.itemRef.nativeElement ||
162
+ this.itemContentRef.nativeElement.contains(event.target) ||
163
+ this.itemHeaderRef.nativeElement.contains(event.target)) {
164
+ this.repeaterService.activateItem(this);
165
+ }
166
+ }
167
+ updateForExpanded(value, animate) {
168
+ if (this.isCollapsible === false && value === false) {
169
+ console.warn(`Setting isExpanded to false when the repeater item is not collapsible
170
+ will have no effect.`);
171
+ }
172
+ else if (this._isExpanded !== value) {
173
+ this._isExpanded = value;
174
+ if (this._isExpanded) {
175
+ this.expand.emit();
176
+ }
177
+ else {
178
+ this.collapse.emit();
179
+ }
180
+ this.repeaterService.onItemCollapseStateChange(this);
181
+ this.slideForExpanded(animate);
182
+ this.changeDetector.markForCheck();
183
+ }
184
+ }
185
+ onCheckboxChange(value) {
186
+ this.isSelected = value.checked;
187
+ }
188
+ onInlineFormClose(inlineFormCloseArgs) {
189
+ this.inlineFormClose.emit(inlineFormCloseArgs);
190
+ }
191
+ moveToTop(event) {
192
+ event.stopPropagation();
193
+ this.adapterService.moveItemUp(this.elementRef.nativeElement, true);
194
+ this.adapterService.focusElement(event.target);
195
+ this.repeaterService.registerOrderChange();
196
+ }
197
+ onReorderHandleKeyDown(event) {
198
+ /*istanbul ignore else */
199
+ if (event.key) {
200
+ switch (event.key.toLowerCase()) {
201
+ case ' ':
202
+ case 'enter':
203
+ this.keyboardToggleReorder();
204
+ event.preventDefault();
205
+ event.stopPropagation();
206
+ break;
207
+ case 'escape':
208
+ /* istanbul ignore else */
209
+ if (this.keyboardReorderingEnabled) {
210
+ this.keyboardReorderingEnabled = false;
211
+ this.revertReorderSteps();
212
+ this.reorderButtonLabel =
213
+ this.reorderCancelText + ' ' + this.reorderInstructions;
214
+ this.adapterService.focusElement(event.target);
215
+ event.preventDefault();
216
+ event.stopPropagation();
217
+ }
218
+ break;
219
+ case 'arrowup':
220
+ if (this.keyboardReorderingEnabled) {
221
+ this.keyboardReorderUp();
222
+ event.preventDefault();
223
+ event.stopPropagation();
224
+ this.repeaterService.registerOrderChange();
225
+ }
226
+ break;
227
+ case 'arrowdown':
228
+ /* istanbul ignore else */
229
+ if (this.keyboardReorderingEnabled) {
230
+ this.keyboardReorderDown();
231
+ event.preventDefault();
232
+ event.stopPropagation();
233
+ this.repeaterService.registerOrderChange();
234
+ }
235
+ break;
236
+ case 'arrowleft':
237
+ case 'arrowright':
238
+ /* istanbul ignore else */
239
+ if (this.keyboardReorderingEnabled) {
240
+ event.preventDefault();
241
+ event.stopPropagation();
242
+ }
243
+ break;
244
+ /* istanbul ignore next */
245
+ default:
246
+ break;
247
+ }
248
+ }
249
+ }
250
+ onReorderHandleBlur(event) {
251
+ this.keyboardReorderingEnabled = false;
252
+ this.revertReorderSteps();
253
+ this.reorderButtonLabel = this.reorderInstructions;
254
+ this.reorderState = undefined;
255
+ }
256
+ onItemKeyDown(event) {
257
+ /*istanbul ignore else */
258
+ if (event.key) {
259
+ switch (event.key.toLowerCase()) {
260
+ case ' ':
261
+ case 'enter':
262
+ /* istanbul ignore else */
263
+ /* Sanity check */
264
+ // Space/enter should never execute unless focused on the parent item element.
265
+ if (event.target === this.itemRef.nativeElement) {
266
+ if (this.selectable) {
267
+ this.isSelected = !this.isSelected;
268
+ }
269
+ this.repeaterService.activateItem(this);
270
+ event.preventDefault();
271
+ }
272
+ break;
273
+ /* istanbul ignore next */
274
+ default:
275
+ break;
276
+ }
277
+ }
278
+ }
279
+ slideForExpanded(animate) {
280
+ this.slideDirection = this.isExpanded ? 'down' : 'up';
281
+ }
282
+ keyboardReorderUp() {
283
+ this.reorderCurrentIndex = this.adapterService.moveItemUp(this.elementRef.nativeElement);
284
+ this.reorderSteps--;
285
+ this.adapterService.focusElement(this.grabHandle);
286
+ this.keyboardReorderingEnabled = true;
287
+ this.reorderButtonLabel = `${this.reorderMovedText} ${this.reorderCurrentIndex + 1}`;
288
+ }
289
+ keyboardReorderDown() {
290
+ this.reorderCurrentIndex = this.adapterService.moveItemDown(this.elementRef.nativeElement);
291
+ this.reorderSteps++;
292
+ this.adapterService.focusElement(this.grabHandle);
293
+ this.keyboardReorderingEnabled = true;
294
+ this.reorderButtonLabel = `${this.reorderMovedText} ${this.reorderCurrentIndex + 1}`;
295
+ }
296
+ keyboardToggleReorder() {
297
+ this.keyboardReorderingEnabled = !this.keyboardReorderingEnabled;
298
+ this.reorderSteps = 0;
299
+ if (this.keyboardReorderingEnabled) {
300
+ this.reorderState = this.reorderStateDescription;
301
+ }
302
+ else {
303
+ this.reorderState = `${this.reorderFinishText} ${this.reorderCurrentIndex + 1} ${this.reorderInstructions}`;
304
+ }
305
+ }
306
+ revertReorderSteps() {
307
+ if (this.reorderSteps < 0) {
308
+ this.adapterService.moveItemDown(this.elementRef.nativeElement, Math.abs(this.reorderSteps));
309
+ }
310
+ else if (this.reorderSteps > 0) {
311
+ this.adapterService.moveItemUp(this.elementRef.nativeElement, false, this.reorderSteps);
312
+ }
313
+ this.repeaterService.registerOrderChange();
314
+ }
315
+ updateExpandOnContentChange() {
316
+ this.repeaterItemContentComponents.changes
317
+ .pipe(takeUntil(this.ngUnsubscribe))
318
+ .subscribe(() => {
319
+ this.hasItemContent = this.repeaterItemContentComponents.length > 0;
320
+ /* istanbul ignore next */
321
+ this.isCollapsible =
322
+ this.hasItemContent && this.repeaterService.expandMode !== 'none';
323
+ /* istanbul ignore else */
324
+ if (this.repeaterService.expandMode === 'single') {
325
+ this.repeaterService.onItemCollapseStateChange(this);
326
+ }
327
+ });
328
+ }
329
+ }
330
+ SkyRepeaterItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyRepeaterItemComponent, deps: [{ token: i1.SkyRepeaterService }, { token: i0.ChangeDetectorRef }, { token: i2.SkyRepeaterAdapterService }, { token: i0.ElementRef }, { token: i3.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Component });
331
+ SkyRepeaterItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyRepeaterItemComponent, selector: "sky-repeater-item", inputs: { itemName: "itemName", inlineFormConfig: "inlineFormConfig", inlineFormTemplate: "inlineFormTemplate", isExpanded: "isExpanded", isSelected: "isSelected", reorderable: "reorderable", selectable: "selectable", showInlineForm: "showInlineForm", tag: "tag" }, outputs: { collapse: "collapse", expand: "expand", inlineFormClose: "inlineFormClose", isSelectedChange: "isSelectedChange" }, host: { properties: { "class": "this.repeaterGroupClass" } }, queries: [{ propertyName: "contextMenu", first: true, predicate: SkyRepeaterItemContextMenuComponent, descendants: true, read: ElementRef }, { propertyName: "repeaterItemContentComponents", predicate: SkyRepeaterItemContentComponent }], viewQueries: [{ propertyName: "grabHandle", first: true, predicate: ["grabHandle"], descendants: true, read: ElementRef }, { propertyName: "itemContentRef", first: true, predicate: ["itemContentRef"], descendants: true, read: ElementRef }, { propertyName: "itemHeaderRef", first: true, predicate: ["itemHeaderRef"], descendants: true, read: ElementRef }, { propertyName: "itemRef", first: true, predicate: ["itemRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n role=\"option\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? isSelected : null\"\n [ngClass]=\"{\n 'sky-repeater-item-active': isActive,\n 'sky-repeater-item-collapsible': isCollapsible,\n 'sky-repeater-item-selected': isSelected\n }\"\n (click)=\"onRepeaterItemClick($event)\"\n (keydown)=\"onItemKeyDown($event)\"\n #itemRef\n>\n <div #inlineDelete>\n <ng-content select=\"sky-inline-delete\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"inlineFormTemplate\">\n <sky-inline-form\n [config]=\"inlineFormConfig\"\n [showForm]=\"showInlineForm\"\n [template]=\"inlineFormTemplate\"\n (close)=\"onInlineFormClose($event)\"\n >\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </sky-inline-form>\n </ng-container>\n\n <ng-container *ngIf=\"!inlineFormTemplate\">\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #skyRepeaterItemLeft>\n <div class=\"sky-repeater-item-left\">\n <ng-container *ngIf=\"reorderable\">\n <span\n aria-live=\"assertive\"\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-state'\"\n >\n {{ reorderState }}\n </span>\n <span\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-instructions'\"\n >{{ reorderButtonLabel }}</span\n >\n <button\n class=\"sky-btn sky-tile-tools-control sky-repeater-item-grab-handle\"\n type=\"button\"\n [attr.aria-describedby]=\"contentId + '-reorder-instructions'\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_label' | skyLibResources: itemName)\n : ('skyux_repeater_item_reorder_label_default' | skyLibResources)\n \"\n (blur)=\"onReorderHandleBlur($event)\"\n (keydown)=\"onReorderHandleKeyDown($event)\"\n #grabHandle\n >\n <sky-icon icon=\"arrows-v\"></sky-icon>\n </button>\n </ng-container>\n <sky-checkbox\n *ngIf=\"selectable\"\n class=\"sky-repeater-item-checkbox\"\n [checked]=\"isSelected\"\n [label]=\"\n itemName\n ? ('skyux_repeater_item_checkbox_label' | skyLibResources: itemName)\n : ('skyux_repeater_item_checkbox_label_default' | skyLibResources)\n \"\n (change)=\"onCheckboxChange($event)\"\n >\n </sky-checkbox>\n <div\n class=\"sky-repeater-item-context-menu\"\n [hidden]=\"contextMenuEl.children.length === 0\"\n #contextMenuEl\n >\n <ng-content select=\"sky-repeater-item-context-menu\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #skyRepeaterItemRight>\n <div class=\"sky-repeater-item-right\" #itemHeaderRef>\n <div\n class=\"sky-repeater-item-header\"\n [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-emphasized\" #titleRef>\n <ng-content select=\"sky-repeater-item-title\"></ng-content>\n </div>\n <button\n *ngIf=\"reorderable\"\n class=\"sky-btn sky-btn-link sky-repeater-item-reorder-top\"\n type=\"button\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_top_label'\n | skyLibResources: itemName)\n : ('skyux_repeater_item_reorder_top_label_default'\n | skyLibResources)\n \"\n (click)=\"moveToTop($event)\"\n >\n <sky-icon icon=\"arrow-circle-up\"></sky-icon>\n {{ 'skyux_repeater_item_reorder_top' | skyLibResources }}\n </button>\n <div *ngIf=\"isCollapsible\" class=\"sky-repeater-item-chevron\">\n <sky-chevron\n [ariaControls]=\"contentId\"\n [ariaLabel]=\"\n itemName\n ? ('skyux_repeater_item_expand' | skyLibResources: itemName)\n : ('skyux_repeater_item_expand_default' | skyLibResources)\n \"\n [direction]=\"isExpanded ? 'up' : 'down'\"\n (directionChange)=\"chevronDirectionChange($event)\"\n >\n </sky-chevron>\n </div>\n <!-- Used for when the chevron is hidden to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"!isCollapsible && !contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder\"\n ></div>\n <!-- Used to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder-with-context\"\n ></div>\n </div>\n <div\n class=\"sky-repeater-item-content\"\n [id]=\"contentId\"\n [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\n >\n <ng-content select=\"sky-repeater-item-content\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["sky-repeater-item .sky-repeater-item{display:flex;border-bottom:1px dotted #cdcfd2;padding-top:0;position:relative;transition:box-shadow .15s;align-items:flex-start}sky-repeater-item .sky-repeater-item sky-inline-form{display:block;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form>:first-child,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-first,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{display:flex;flex:1 0 auto;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:10px}sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:#eeeeef;color:#212327;padding-left:6px;border-left:4px solid #00b4f1}sky-repeater-item .sky-repeater-item.sky-repeater-item-active .sky-inline-delete{margin-left:-4px;width:calc(100% + 4px)}sky-repeater-item .sky-repeater-item-left{display:flex;padding-top:10px;align-items:center}sky-repeater-item .sky-repeater-item-left sky-checkbox{display:flex}sky-repeater-item .sky-repeater-item-right{max-width:100%;flex-grow:1;align-self:center}sky-repeater-item .sky-repeater-item-header{align-items:center;display:flex;padding-top:10px}sky-repeater-item .sky-repeater-item-chevron{margin-left:10px}sky-repeater-item .sky-repeater-item-chevron-placeholder{height:24px}sky-repeater-item .sky-repeater-item-chevron-placeholder-with-context{height:29px}sky-repeater-item .sky-repeater-item-context-menu{padding:0 10px 0 0}sky-repeater-item .sky-repeater-item-checkbox{padding:0 5px 0 0}sky-repeater-item .sky-repeater-item-selected{background-color:#f1eef6;transition:background-color .15s}sky-repeater-item .sky-repeater-item-title{margin:0;flex-grow:1;line-height:1.1;color:#212327}sky-repeater-item sky-repeater-item-content{display:block;margin:10px 0 0}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-header{cursor:pointer}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-content{padding-right:34px}sky-repeater-item .sky-repeater-item-collapsed .sky-repeater-item-content{display:none}sky-repeater-item .sky-repeater-item-grab-handle{color:#cdcfd2;cursor:pointer;border:0;width:24px;height:24px;cursor:grab;cursor:-moz-grab;padding:0;margin-right:10px}sky-repeater-item .sky-repeater-item-grab-handle:hover{color:#979ba2;transition:color .15s}sky-repeater-item.sky-repeater-item-dragging.gu-mirror{opacity:initial;-ms-filter:initial;filter:initial;background-color:#fff;box-shadow:0 0 5px #0000004d}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item{background-color:#d8d8d8}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-left,sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-right{visibility:hidden}sky-repeater-item.sky-repeater-item-dragging .sky-repeater-item-grab-handle{cursor:grabbing;cursor:-webkit-grabbing}.sky-theme-modern sky-repeater-item .sky-repeater-item{padding-bottom:20px}.sky-theme-modern sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:transparent;border-left-color:#1870b8}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus,.sky-theme-modern sky-repeater-item .sky-repeater-item:active:focus{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern sky-repeater-item .sky-repeater-item-header[hidden]+.sky-repeater-item-content sky-repeater-item-content{margin:20px 0 0}.sky-theme-modern sky-repeater-item .sky-repeater-item-header,.sky-theme-modern sky-repeater-item .sky-repeater-item-left{padding-top:20px}.sky-theme-modern sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:20px}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item{border-bottom-color:#686c73}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item.sky-repeater-item-active{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item-title{color:#fbfcfe}\n"], components: [{ type: i4.λ1, selector: "sky-inline-form", inputs: ["config", "template", "showForm"], outputs: ["close"] }, { type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "required"], outputs: ["change", "checkedChange", "disabledChange"] }, { type: i5.λ2, selector: "sky-chevron", inputs: ["ariaControls", "ariaLabel", "direction", "disabled"], outputs: ["directionChange"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "skyLibResources": i3.SkyLibResourcesPipe }, animations: [skyAnimationSlide], encapsulation: i0.ViewEncapsulation.None });
332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyRepeaterItemComponent, decorators: [{
333
+ type: Component,
334
+ args: [{ selector: 'sky-repeater-item', animations: [skyAnimationSlide], encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n role=\"option\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? isSelected : null\"\n [ngClass]=\"{\n 'sky-repeater-item-active': isActive,\n 'sky-repeater-item-collapsible': isCollapsible,\n 'sky-repeater-item-selected': isSelected\n }\"\n (click)=\"onRepeaterItemClick($event)\"\n (keydown)=\"onItemKeyDown($event)\"\n #itemRef\n>\n <div #inlineDelete>\n <ng-content select=\"sky-inline-delete\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"inlineFormTemplate\">\n <sky-inline-form\n [config]=\"inlineFormConfig\"\n [showForm]=\"showInlineForm\"\n [template]=\"inlineFormTemplate\"\n (close)=\"onInlineFormClose($event)\"\n >\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </sky-inline-form>\n </ng-container>\n\n <ng-container *ngIf=\"!inlineFormTemplate\">\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #skyRepeaterItemLeft>\n <div class=\"sky-repeater-item-left\">\n <ng-container *ngIf=\"reorderable\">\n <span\n aria-live=\"assertive\"\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-state'\"\n >\n {{ reorderState }}\n </span>\n <span\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-instructions'\"\n >{{ reorderButtonLabel }}</span\n >\n <button\n class=\"sky-btn sky-tile-tools-control sky-repeater-item-grab-handle\"\n type=\"button\"\n [attr.aria-describedby]=\"contentId + '-reorder-instructions'\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_label' | skyLibResources: itemName)\n : ('skyux_repeater_item_reorder_label_default' | skyLibResources)\n \"\n (blur)=\"onReorderHandleBlur($event)\"\n (keydown)=\"onReorderHandleKeyDown($event)\"\n #grabHandle\n >\n <sky-icon icon=\"arrows-v\"></sky-icon>\n </button>\n </ng-container>\n <sky-checkbox\n *ngIf=\"selectable\"\n class=\"sky-repeater-item-checkbox\"\n [checked]=\"isSelected\"\n [label]=\"\n itemName\n ? ('skyux_repeater_item_checkbox_label' | skyLibResources: itemName)\n : ('skyux_repeater_item_checkbox_label_default' | skyLibResources)\n \"\n (change)=\"onCheckboxChange($event)\"\n >\n </sky-checkbox>\n <div\n class=\"sky-repeater-item-context-menu\"\n [hidden]=\"contextMenuEl.children.length === 0\"\n #contextMenuEl\n >\n <ng-content select=\"sky-repeater-item-context-menu\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #skyRepeaterItemRight>\n <div class=\"sky-repeater-item-right\" #itemHeaderRef>\n <div\n class=\"sky-repeater-item-header\"\n [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-emphasized\" #titleRef>\n <ng-content select=\"sky-repeater-item-title\"></ng-content>\n </div>\n <button\n *ngIf=\"reorderable\"\n class=\"sky-btn sky-btn-link sky-repeater-item-reorder-top\"\n type=\"button\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_top_label'\n | skyLibResources: itemName)\n : ('skyux_repeater_item_reorder_top_label_default'\n | skyLibResources)\n \"\n (click)=\"moveToTop($event)\"\n >\n <sky-icon icon=\"arrow-circle-up\"></sky-icon>\n {{ 'skyux_repeater_item_reorder_top' | skyLibResources }}\n </button>\n <div *ngIf=\"isCollapsible\" class=\"sky-repeater-item-chevron\">\n <sky-chevron\n [ariaControls]=\"contentId\"\n [ariaLabel]=\"\n itemName\n ? ('skyux_repeater_item_expand' | skyLibResources: itemName)\n : ('skyux_repeater_item_expand_default' | skyLibResources)\n \"\n [direction]=\"isExpanded ? 'up' : 'down'\"\n (directionChange)=\"chevronDirectionChange($event)\"\n >\n </sky-chevron>\n </div>\n <!-- Used for when the chevron is hidden to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"!isCollapsible && !contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder\"\n ></div>\n <!-- Used to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder-with-context\"\n ></div>\n </div>\n <div\n class=\"sky-repeater-item-content\"\n [id]=\"contentId\"\n [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\n >\n <ng-content select=\"sky-repeater-item-content\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["sky-repeater-item .sky-repeater-item{display:flex;border-bottom:1px dotted #cdcfd2;padding-top:0;position:relative;transition:box-shadow .15s;align-items:flex-start}sky-repeater-item .sky-repeater-item sky-inline-form{display:block;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form>:first-child,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-first,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{display:flex;flex:1 0 auto;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:10px}sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:#eeeeef;color:#212327;padding-left:6px;border-left:4px solid #00b4f1}sky-repeater-item .sky-repeater-item.sky-repeater-item-active .sky-inline-delete{margin-left:-4px;width:calc(100% + 4px)}sky-repeater-item .sky-repeater-item-left{display:flex;padding-top:10px;align-items:center}sky-repeater-item .sky-repeater-item-left sky-checkbox{display:flex}sky-repeater-item .sky-repeater-item-right{max-width:100%;flex-grow:1;align-self:center}sky-repeater-item .sky-repeater-item-header{align-items:center;display:flex;padding-top:10px}sky-repeater-item .sky-repeater-item-chevron{margin-left:10px}sky-repeater-item .sky-repeater-item-chevron-placeholder{height:24px}sky-repeater-item .sky-repeater-item-chevron-placeholder-with-context{height:29px}sky-repeater-item .sky-repeater-item-context-menu{padding:0 10px 0 0}sky-repeater-item .sky-repeater-item-checkbox{padding:0 5px 0 0}sky-repeater-item .sky-repeater-item-selected{background-color:#f1eef6;transition:background-color .15s}sky-repeater-item .sky-repeater-item-title{margin:0;flex-grow:1;line-height:1.1;color:#212327}sky-repeater-item sky-repeater-item-content{display:block;margin:10px 0 0}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-header{cursor:pointer}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-content{padding-right:34px}sky-repeater-item .sky-repeater-item-collapsed .sky-repeater-item-content{display:none}sky-repeater-item .sky-repeater-item-grab-handle{color:#cdcfd2;cursor:pointer;border:0;width:24px;height:24px;cursor:grab;cursor:-moz-grab;padding:0;margin-right:10px}sky-repeater-item .sky-repeater-item-grab-handle:hover{color:#979ba2;transition:color .15s}sky-repeater-item.sky-repeater-item-dragging.gu-mirror{opacity:initial;-ms-filter:initial;filter:initial;background-color:#fff;box-shadow:0 0 5px #0000004d}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item{background-color:#d8d8d8}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-left,sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-right{visibility:hidden}sky-repeater-item.sky-repeater-item-dragging .sky-repeater-item-grab-handle{cursor:grabbing;cursor:-webkit-grabbing}.sky-theme-modern sky-repeater-item .sky-repeater-item{padding-bottom:20px}.sky-theme-modern sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:transparent;border-left-color:#1870b8}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus,.sky-theme-modern sky-repeater-item .sky-repeater-item:active:focus{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern sky-repeater-item .sky-repeater-item-header[hidden]+.sky-repeater-item-content sky-repeater-item-content{margin:20px 0 0}.sky-theme-modern sky-repeater-item .sky-repeater-item-header,.sky-theme-modern sky-repeater-item .sky-repeater-item-left{padding-top:20px}.sky-theme-modern sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:20px}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item{border-bottom-color:#686c73}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item.sky-repeater-item-active{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item-title{color:#fbfcfe}\n"] }]
335
+ }], ctorParameters: function () { return [{ type: i1.SkyRepeaterService }, { type: i0.ChangeDetectorRef }, { type: i2.SkyRepeaterAdapterService }, { type: i0.ElementRef }, { type: i3.SkyLibResourcesService }]; }, propDecorators: { itemName: [{
336
+ type: Input
337
+ }], inlineFormConfig: [{
338
+ type: Input
339
+ }], inlineFormTemplate: [{
340
+ type: Input
341
+ }], isExpanded: [{
342
+ type: Input
343
+ }], isSelected: [{
344
+ type: Input
345
+ }], reorderable: [{
346
+ type: Input
347
+ }], selectable: [{
348
+ type: Input
349
+ }], showInlineForm: [{
350
+ type: Input
351
+ }], tag: [{
352
+ type: Input
353
+ }], collapse: [{
354
+ type: Output
355
+ }], expand: [{
356
+ type: Output
357
+ }], inlineFormClose: [{
358
+ type: Output
359
+ }], isSelectedChange: [{
360
+ type: Output
361
+ }], contextMenu: [{
362
+ type: ContentChild,
363
+ args: [SkyRepeaterItemContextMenuComponent, { read: ElementRef }]
364
+ }], repeaterGroupClass: [{
365
+ type: HostBinding,
366
+ args: ['class']
367
+ }], grabHandle: [{
368
+ type: ViewChild,
369
+ args: ['grabHandle', { read: ElementRef }]
370
+ }], itemContentRef: [{
371
+ type: ViewChild,
372
+ args: ['itemContentRef', { read: ElementRef }]
373
+ }], itemHeaderRef: [{
374
+ type: ViewChild,
375
+ args: ['itemHeaderRef', { read: ElementRef }]
376
+ }], itemRef: [{
377
+ type: ViewChild,
378
+ args: ['itemRef', { read: ElementRef }]
379
+ }], repeaterItemContentComponents: [{
380
+ type: ContentChildren,
381
+ args: [SkyRepeaterItemContentComponent]
382
+ }] } });
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXItaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbGlzdHMvc3JjL2xpYi9tb2R1bGVzL3JlcGVhdGVyL3JlcGVhdGVyLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3RzL3NyYy9saWIvbW9kdWxlcy9yZXBlYXRlci9yZXBlYXRlci1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBTXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7O0FBRXhELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUV0Qjs7R0FFRztBQVFILE1B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O2dCQU9BLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFJQSxXQUFXO3NCQURqQixZQUFZO3VCQUFDLG1DQUFtQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFtQ25FLGtCQUFrQjtzQkFEckIsV0FBVzt1QkFBQyxPQUFPO2dCQU1aLFVBQVU7c0JBRGpCLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJckMsY0FBYztzQkFEckIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSXpDLGFBQWE7c0JBRHBCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJeEMsT0FBTztzQkFEZCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWxDLDZCQUE2QjtzQkFEcEMsZUFBZTt1QkFBQywrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc2t5QW5pbWF0aW9uU2xpZGUgfSBmcm9tICdAc2t5dXgvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBTa3lDaGVja2JveENoYW5nZSB9IGZyb20gJ0Bza3l1eC9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2kxOG4nO1xuaW1wb3J0IHtcbiAgU2t5SW5saW5lRm9ybUNsb3NlQXJncyxcbiAgU2t5SW5saW5lRm9ybUNvbmZpZyxcbn0gZnJvbSAnQHNreXV4L2lubGluZS1mb3JtJztcblxuaW1wb3J0IHsgU3ViamVjdCwgZm9ya0pvaW4gYXMgb2JzZXJ2YWJsZUZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreVJlcGVhdGVyQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3JlcGVhdGVyLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lSZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFNreVJlcGVhdGVySXRlbUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yZXBlYXRlci5zZXJ2aWNlJztcblxubGV0IG5leHRDb250ZW50SWQgPSAwO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW5kaXZpZHVhbCByZXBlYXRlciBpdGVtLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktcmVwZWF0ZXItaXRlbScsXG4gIHN0eWxlVXJsczogWycuL3JlcGVhdGVyLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcGVhdGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBhbmltYXRpb25zOiBbc2t5QW5pbWF0aW9uU2xpZGVdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lSZXBlYXRlckl0ZW1Db21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdFxue1xuICAvKipcbiAgICogU3BlY2lmaWVzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHJlcGVhdGVyIGl0ZW0gdGhhdCBpcyBhdmFpbGFibGUgZm9yIG11bHRpcGxlIHB1cnBvc2VzLFxuICAgKiBzdWNoIGFzIGFjY2Vzc2liaWxpdHkgYW5kIGluc3RydW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBjb21wb25lbnQgdXNlcyB0aGUgbmFtZSB0b1xuICAgKiBjb25zdHJ1Y3QgQVJJQSBsYWJlbHMgZm9yIHRoZSByZXBlYXRlciBpdGVtIGNvbnRyb2xzXG4gICAqIHRvIFtzdXBwb3J0IGFjY2Vzc2liaWxpdHldKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vYWNjZXNzaWJpbGl0eSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXRlbU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGJ1dHRvbnMgdG8gZGlzcGxheSBvbiBhbiBpbmxpbmUgZm9ybVxuICAgKiB3aXRoaW4gdGhlIHJlcGVhdGVyLiBUaGlzIHByb3BlcnR5IGFjY2VwdHNcbiAgICogW2EgYFNreUlubGluZUZvcm1Db25maWdgIG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2lubGluZS1mb3JtI3NreWlubGluZWZvcm1jb25maWctcHJvcGVydGllcykuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaW5saW5lRm9ybUNvbmZpZzogU2t5SW5saW5lRm9ybUNvbmZpZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIFthbiBBbmd1bGFyIGBUZW1wbGF0ZVJlZmBdKGh0dHBzOi8vYW5ndWxhci5pby9hcGkvY29yZS9UZW1wbGF0ZVJlZikgdG8gdXNlXG4gICAqIGFzIGEgdGVtcGxhdGUgdG8gaW5zdGFudGlhdGUgYW4gaW5saW5lIGZvcm0gd2l0aGluIHRoZSByZXBlYXRlci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpbmxpbmVGb3JtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSByZXBlYXRlciBpdGVtIGlzIGV4cGFuZGVkLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlzRXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZUZvckV4cGFuZGVkKHZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFeHBhbmRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVwZWF0ZXIgaXRlbSdzIGNoZWNrYm94IGlzIHNlbGVjdGVkLlxuICAgKiBXaGVuIHVzZXJzIHNlbGVjdCB0aGUgcmVwZWF0ZXIgaXRlbSwgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBvbiB5b3VyIG1vZGVsIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlzU2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2lzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuX2lzU2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuaXNTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuX2lzU2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNTZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB1c2VycyBjYW4gY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcmVwZWF0ZXIgaXRlbS5cbiAgICogVGhlIHJlcGVhdGVyIGNvbXBvbmVudCdzIGByZW9yZGVyYWJsZWAgcHJvcGVydHkgbXVzdCBhbHNvIGJlIHNldCB0byBgdHJ1ZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcmVvcmRlcmFibGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSBhIGNoZWNrYm94IGluIHRoZSBsZWZ0IG9mIHRoZSByZXBlYXRlciBpdGVtLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNlbGVjdGFibGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSBhbiBpbmxpbmUgZm9ybSB3aXRoaW4gdGhlIHJlcGVhdGVyLlxuICAgKiBVc2VycyBjYW4gdG9nZ2xlIGJldHdlZW4gZGlzcGxheWluZyBhbmQgaGlkaW5nIHRoZSBpbmxpbmUgZm9ybS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93SW5saW5lRm9ybSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gb2JqZWN0IHRoYXQgdGhlIHJlcGVhdGVyIGNvbXBvbmVudCByZXR1cm5zIGZvciB0aGlzIHJlcGVhdGVyIGl0ZW1cbiAgICogd2hlbiB0aGUgYG9yZGVyQ2hhbmdlYCBldmVudCBmaXJlcy4gVGhpcyBpcyByZXF1aXJlZFxuICAgKiBpZiB5b3Ugc2V0IHRoZSBgcmVvcmRlcmFibGVgIHByb3BlcnR5IHRvIGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0YWc6IGFueTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjb2xsYXBzZSB0aGUgcmVwZWF0ZXIgaXRlbS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY29sbGFwc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgZXhwYW5kIHRoZSByZXBlYXRlciBpdGVtLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBleHBhbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHJlcGVhdGVyIGluY2x1ZGVzIGFuIGlubGluZSBmb3JtIGFuZCB1c2VycyBjbG9zZSBpdC4gVGhpcyBldmVudCBlbWl0c1xuICAgKiBbYSBgU2t5SW5saW5lRm9ybUNsb3NlQXJnc2AgdHlwZV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2lubGluZS1mb3JtI3NreWlubGluZWZvcm1jbG9zZWFyZ3MtcHJvcGVydGllcykuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGlubGluZUZvcm1DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5SW5saW5lRm9ybUNsb3NlQXJncz4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3Qgb3IgY2xlYXIgdGhlIGNoZWNrYm94IGZvciB0aGUgcmVwZWF0ZXIgaXRlbS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgaXNTZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAQ29udGVudENoaWxkKFNreVJlcGVhdGVySXRlbUNvbnRleHRNZW51Q29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHVibGljIGNvbnRleHRNZW51OiBFbGVtZW50UmVmO1xuXG4gIHB1YmxpYyBjb250ZW50SWQgPSBgc2t5LXJlcGVhdGVyLWl0ZW0tY29udGVudC0keysrbmV4dENvbnRlbnRJZH1gO1xuXG4gIHB1YmxpYyBoYXNJdGVtQ29udGVudCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBzZXQgaXNDb2xsYXBzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2libGUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9pc0NvbGxhcHNpYmxlID0gdmFsdWU7XG5cbiAgICAgIC8qaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JFeHBhbmRlZCh0cnVlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb2xsYXBzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNDb2xsYXBzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlib2FyZFJlb3JkZXJpbmdFbmFibGVkID0gZmFsc2U7XG5cbiAgcHVibGljIHJlb3JkZXJCdXR0b25MYWJlbDogc3RyaW5nO1xuXG4gIHB1YmxpYyByZW9yZGVyU3RhdGU6IHN0cmluZztcblxuICBwdWJsaWMgc2xpZGVEaXJlY3Rpb246IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IHJlcGVhdGVyR3JvdXBDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnc2t5LXJlcGVhdGVyLWl0ZW0tZ3JvdXAtJyArIHRoaXMucmVwZWF0ZXJTZXJ2aWNlLnJlcGVhdGVyR3JvdXBJZDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2dyYWJIYW5kbGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBncmFiSGFuZGxlOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2l0ZW1Db250ZW50UmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaXRlbUNvbnRlbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnaXRlbUhlYWRlclJlZicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIGl0ZW1IZWFkZXJSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnaXRlbVJlZicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIGl0ZW1SZWY6IEVsZW1lbnRSZWY7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lSZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50KVxuICBwcml2YXRlIHJlcGVhdGVySXRlbUNvbnRlbnRDb21wb25lbnRzOiBRdWVyeUxpc3Q8U2t5UmVwZWF0ZXJJdGVtQ29udGVudENvbXBvbmVudD47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlb3JkZXJDYW5jZWxUZXh0OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZW9yZGVyQ3VycmVudEluZGV4OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSByZW9yZGVyRmluaXNoVGV4dDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVvcmRlckluc3RydWN0aW9uczogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVvcmRlck1vdmVkVGV4dDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVvcmRlclN0YXRlRGVzY3JpcHRpb246IHN0cmluZztcblxuICBwcml2YXRlIHJlb3JkZXJTdGVwczogbnVtYmVyO1xuXG4gIHByaXZhdGUgX2lzQ29sbGFwc2libGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgX2lzRXhwYW5kZWQgPSB0cnVlO1xuXG4gIHByaXZhdGUgX2lzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlcGVhdGVyU2VydmljZTogU2t5UmVwZWF0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgYWRhcHRlclNlcnZpY2U6IFNreVJlcGVhdGVyQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVzb3VyY2VTZXJ2aWNlOiBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2xpZGVGb3JFeHBhbmRlZChmYWxzZSk7XG5cbiAgICBvYnNlcnZhYmxlRm9ya0pvaW4oW1xuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9yZXBlYXRlcl9pdGVtX3Jlb3JkZXJfY2FuY2VsJyksXG4gICAgICB0aGlzLnJlc291cmNlU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X3JlcGVhdGVyX2l0ZW1fcmVvcmRlcl9maW5pc2gnKSxcbiAgICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLmdldFN0cmluZyhcbiAgICAgICAgJ3NreXV4X3JlcGVhdGVyX2l0ZW1fcmVvcmRlcl9pbnN0cnVjdGlvbnMnXG4gICAgICApLFxuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9yZXBlYXRlcl9pdGVtX3Jlb3JkZXJfb3BlcmF0aW9uJyksXG4gICAgICB0aGlzLnJlc291cmNlU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X3JlcGVhdGVyX2l0ZW1fcmVvcmRlcl9tb3ZlZCcpLFxuICAgIF0pLnN1YnNjcmliZSgodHJhbnNsYXRlZFN0cmluZ3M6IHN0cmluZ1tdKSA9PiB7XG4gICAgICB0aGlzLnJlb3JkZXJDYW5jZWxUZXh0ID0gdHJhbnNsYXRlZFN0cmluZ3NbMF07XG4gICAgICB0aGlzLnJlb3JkZXJGaW5pc2hUZXh0ID0gdHJhbnNsYXRlZFN0cmluZ3NbMV07XG4gICAgICB0aGlzLnJlb3JkZXJTdGF0ZURlc2NyaXB0aW9uID0gdHJhbnNsYXRlZFN0cmluZ3NbMl07XG4gICAgICB0aGlzLnJlb3JkZXJJbnN0cnVjdGlvbnMgPSB0cmFuc2xhdGVkU3RyaW5nc1szXTtcbiAgICAgIHRoaXMucmVvcmRlck1vdmVkVGV4dCA9IHRyYW5zbGF0ZWRTdHJpbmdzWzRdO1xuICAgICAgdGhpcy5yZW9yZGVyQnV0dG9uTGFiZWwgPSB0aGlzLnJlb3JkZXJJbnN0cnVjdGlvbnM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXBlYXRlclNlcnZpY2UucmVnaXN0ZXJJdGVtKHRoaXMpO1xuICAgIHRoaXMucmVwZWF0ZXJTZXJ2aWNlLmFjdGl2ZUl0ZW1DaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoaXRlbTogU2t5UmVwZWF0ZXJJdGVtQ29tcG9uZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0lzQWN0aXZlVmFsdWUgPSB0aGlzID09PSBpdGVtO1xuICAgICAgICBpZiAobmV3SXNBY3RpdmVWYWx1ZSAhPT0gdGhpcy5pc0FjdGl2ZSkge1xuICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSBuZXdJc0FjdGl2ZVZhbHVlO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhc0l0ZW1Db250ZW50ID0gdGhpcy5yZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50cy5sZW5ndGggPiAwO1xuICAgIHRoaXMudXBkYXRlRXhwYW5kT25Db250ZW50Q2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb2xsYXBzZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZXhwYW5kLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5pbmxpbmVGb3JtQ2xvc2UuY29tcGxldGUoKTtcbiAgICB0aGlzLmlzU2VsZWN0ZWRDaGFuZ2UuY29tcGxldGUoKTtcblxuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLnJlcGVhdGVyU2VydmljZS51bnJlZ2lzdGVySXRlbSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBoZWFkZXJDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNpYmxlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvckV4cGFuZGVkKCF0aGlzLmlzRXhwYW5kZWQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGV2cm9uRGlyZWN0aW9uQ2hhbmdlKGRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVGb3JFeHBhbmRlZChkaXJlY3Rpb24gPT09ICd1cCcsIHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVwZWF0ZXJJdGVtQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBPbmx5IGFjdGl2YXRlIGl0ZW0gaWYgY2xpY2tpbmcgb24gdGhlIHRpdGxlLCBjb250ZW50LCBvciBwYXJlbnQgaXRlbSBkaXYuXG4gICAgLy8gVGhpcyB3aWxsIGF2b2lkIGFjY2lkZW50YWwgYWN0aXZhdGlvbnMgd2hlbiBjbGlja2luZyBpbnNpZGUgaW50ZXJhY3RpdmUgZWxlbWVudHMgbGlrZVxuICAgIC8vIHRoZSBleHBhbmQvY29sbGFwc2UgY2hldnJvbiwgZHJvcGRvd24sIGlubGluZS1kZWxldGUsIGV0Yy4uLlxuICAgIGlmIChcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5pdGVtUmVmLm5hdGl2ZUVsZW1lbnQgfHxcbiAgICAgIHRoaXMuaXRlbUNvbnRlbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpIHx8XG4gICAgICB0aGlzLml0ZW1IZWFkZXJSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLnJlcGVhdGVyU2VydmljZS5hY3RpdmF0ZUl0ZW0odGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUZvckV4cGFuZGVkKHZhbHVlOiBib29sZWFuLCBhbmltYXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzaWJsZSA9PT0gZmFsc2UgJiYgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTZXR0aW5nIGlzRXhwYW5kZWQgdG8gZmFsc2Ugd2hlbiB0aGUgcmVwZWF0ZXIgaXRlbSBpcyBub3QgY29sbGFwc2libGVcbiAgICAgICAgd2lsbCBoYXZlIG5vIGVmZmVjdC5gXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faXNFeHBhbmRlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2lzRXhwYW5kZWQgPSB2YWx1ZTtcblxuICAgICAgaWYgKHRoaXMuX2lzRXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5leHBhbmQuZW1pdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2xsYXBzZS5lbWl0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVwZWF0ZXJTZXJ2aWNlLm9uSXRlbUNvbGxhcHNlU3RhdGVDaGFuZ2UodGhpcyk7XG4gICAgICB0aGlzLnNsaWRlRm9yRXhwYW5kZWQoYW5pbWF0ZSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNoZWNrYm94Q2hhbmdlKHZhbHVlOiBTa3lDaGVja2JveENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuaXNTZWxlY3RlZCA9IHZhbHVlLmNoZWNrZWQ7XG4gIH1cblxuICBwdWJsaWMgb25JbmxpbmVGb3JtQ2xvc2UoaW5saW5lRm9ybUNsb3NlQXJnczogU2t5SW5saW5lRm9ybUNsb3NlQXJncyk6IHZvaWQge1xuICAgIHRoaXMuaW5saW5lRm9ybUNsb3NlLmVtaXQoaW5saW5lRm9ybUNsb3NlQXJncyk7XG4gIH1cblxuICBwdWJsaWMgbW92ZVRvVG9wKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UubW92ZUl0ZW1VcCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdHJ1ZSk7XG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5mb2N1c0VsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB0aGlzLnJlcGVhdGVyU2VydmljZS5yZWdpc3Rlck9yZGVyQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgb25SZW9yZGVySGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXZlbnQua2V5KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgICAgdGhpcy5rZXlib2FyZFRvZ2dsZVJlb3JkZXIoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VzY2FwZSc6XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAodGhpcy5rZXlib2FyZFJlb3JkZXJpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkUmVvcmRlcmluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmV2ZXJ0UmVvcmRlclN0ZXBzKCk7XG4gICAgICAgICAgICB0aGlzLnJlb3JkZXJCdXR0b25MYWJlbCA9XG4gICAgICAgICAgICAgIHRoaXMucmVvcmRlckNhbmNlbFRleHQgKyAnICcgKyB0aGlzLnJlb3JkZXJJbnN0cnVjdGlvbnM7XG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmZvY3VzRWxlbWVudChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcnJvd3VwJzpcbiAgICAgICAgICBpZiAodGhpcy5rZXlib2FyZFJlb3JkZXJpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkUmVvcmRlclVwKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlcGVhdGVyU2VydmljZS5yZWdpc3Rlck9yZGVyQ2hhbmdlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAodGhpcy5rZXlib2FyZFJlb3JkZXJpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkUmVvcmRlckRvd24oKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVwZWF0ZXJTZXJ2aWNlLnJlZ2lzdGVyT3JkZXJDaGFuZ2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYXJyb3dsZWZ0JzpcbiAgICAgICAgY2FzZSAnYXJyb3dyaWdodCc6XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAodGhpcy5rZXlib2FyZFJlb3JkZXJpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUmVvcmRlckhhbmRsZUJsdXIoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMua2V5Ym9hcmRSZW9yZGVyaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMucmV2ZXJ0UmVvcmRlclN0ZXBzKCk7XG4gICAgdGhpcy5yZW9yZGVyQnV0dG9uTGFiZWwgPSB0aGlzLnJlb3JkZXJJbnN0cnVjdGlvbnM7XG4gICAgdGhpcy5yZW9yZGVyU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgb25JdGVtS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXZlbnQua2V5KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgICAvLyBTcGFjZS9lbnRlciBzaG91bGQgbmV2ZXIgZXhlY3V0ZSB1bmxlc3MgZm9jdXNlZCBvbiB0aGUgcGFyZW50IGl0ZW0gZWxlbWVudC5cbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLml0ZW1SZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICB0aGlzLmlzU2VsZWN0ZWQgPSAhdGhpcy5pc1NlbGVjdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXBlYXRlclNlcnZpY2UuYWN0aXZhdGVJdGVtKHRoaXMpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNsaWRlRm9yRXhwYW5kZWQoYW5pbWF0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2xpZGVEaXJlY3Rpb24gPSB0aGlzLmlzRXhwYW5kZWQgPyAnZG93bicgOiAndXAnO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlib2FyZFJlb3JkZXJVcCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlb3JkZXJDdXJyZW50SW5kZXggPSB0aGlzLmFkYXB0ZXJTZXJ2aWNlLm1vdmVJdGVtVXAoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICk7XG4gICAgdGhpcy5yZW9yZGVyU3RlcHMtLTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmZvY3VzRWxlbWVudCh0aGlzLmdyYWJIYW5kbGUpO1xuICAgIHRoaXMua2V5Ym9hcmRSZW9yZGVyaW5nRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5yZW9yZGVyQnV0dG9uTGFiZWwgPSBgJHt0aGlzLnJlb3JkZXJNb3ZlZFRleHR9ICR7XG4gICAgICB0aGlzLnJlb3JkZXJDdXJyZW50SW5kZXggKyAxXG4gICAgfWA7XG4gIH1cblxuICBwcml2YXRlIGtleWJvYXJkUmVvcmRlckRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5yZW9yZGVyQ3VycmVudEluZGV4ID0gdGhpcy5hZGFwdGVyU2VydmljZS5tb3ZlSXRlbURvd24oXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICk7XG4gICAgdGhpcy5yZW9yZGVyU3RlcHMrKztcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmZvY3VzRWxlbWVudCh0aGlzLmdyYWJIYW5kbGUpO1xuICAgIHRoaXMua2V5Ym9hcmRSZW9yZGVyaW5nRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5yZW9yZGVyQnV0dG9uTGFiZWwgPSBgJHt0aGlzLnJlb3JkZXJNb3ZlZFRleHR9ICR7XG4gICAgICB0aGlzLnJlb3JkZXJDdXJyZW50SW5kZXggKyAxXG4gICAgfWA7XG4gIH1cblxuICBwcml2YXRlIGtleWJvYXJkVG9nZ2xlUmVvcmRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmtleWJvYXJkUmVvcmRlcmluZ0VuYWJsZWQgPSAhdGhpcy5rZXlib2FyZFJlb3JkZXJpbmdFbmFibGVkO1xuICAgIHRoaXMucmVvcmRlclN0ZXBzID0gMDtcblxuICAgIGlmICh0aGlzLmtleWJvYXJkUmVvcmRlcmluZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMucmVvcmRlclN0YXRlID0gdGhpcy5yZW9yZGVyU3RhdGVEZXNjcmlwdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW9yZGVyU3RhdGUgPSBgJHt0aGlzLnJlb3JkZXJGaW5pc2hUZXh0fSAke1xuICAgICAgICB0aGlzLnJlb3JkZXJDdXJyZW50SW5kZXggKyAxXG4gICAgICB9ICR7dGhpcy5yZW9yZGVySW5zdHJ1Y3Rpb25zfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXZlcnRSZW9yZGVyU3RlcHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVvcmRlclN0ZXBzIDwgMCkge1xuICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5tb3ZlSXRlbURvd24oXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICBNYXRoLmFicyh0aGlzLnJlb3JkZXJTdGVwcylcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlb3JkZXJTdGVwcyA+IDApIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UubW92ZUl0ZW1VcChcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnJlb3JkZXJTdGVwc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZXBlYXRlclNlcnZpY2UucmVnaXN0ZXJPcmRlckNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVFeHBhbmRPbkNvbnRlbnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmhhc0l0ZW1Db250ZW50ID0gdGhpcy5yZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50cy5sZW5ndGggPiAwO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICB0aGlzLmlzQ29sbGFwc2libGUgPVxuICAgICAgICAgIHRoaXMuaGFzSXRlbUNvbnRlbnQgJiYgdGhpcy5yZXBlYXRlclNlcnZpY2UuZXhwYW5kTW9kZSAhPT0gJ25vbmUnO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5yZXBlYXRlclNlcnZpY2UuZXhwYW5kTW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICB0aGlzLnJlcGVhdGVyU2VydmljZS5vbkl0ZW1Db2xsYXBzZVN0YXRlQ2hhbmdlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInNreS1yZXBlYXRlci1pdGVtIHNreS1wYWRkaW5nLWV2ZW4tZGVmYXVsdFwiXG4gIHJvbGU9XCJvcHRpb25cIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cIml0ZW1OYW1lXCJcbiAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzZWxlY3RhYmxlID8gaXNTZWxlY3RlZCA6IG51bGxcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3NreS1yZXBlYXRlci1pdGVtLWFjdGl2ZSc6IGlzQWN0aXZlLFxuICAgICdza3ktcmVwZWF0ZXItaXRlbS1jb2xsYXBzaWJsZSc6IGlzQ29sbGFwc2libGUsXG4gICAgJ3NreS1yZXBlYXRlci1pdGVtLXNlbGVjdGVkJzogaXNTZWxlY3RlZFxuICB9XCJcbiAgKGNsaWNrKT1cIm9uUmVwZWF0ZXJJdGVtQ2xpY2soJGV2ZW50KVwiXG4gIChrZXlkb3duKT1cIm9uSXRlbUtleURvd24oJGV2ZW50KVwiXG4gICNpdGVtUmVmXG4+XG4gIDxkaXYgI2lubGluZURlbGV0ZT5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJza3ktaW5saW5lLWRlbGV0ZVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlubGluZUZvcm1UZW1wbGF0ZVwiPlxuICAgIDxza3ktaW5saW5lLWZvcm1cbiAgICAgIFtjb25maWddPVwiaW5saW5lRm9ybUNvbmZpZ1wiXG4gICAgICBbc2hvd0Zvcm1dPVwic2hvd0lubGluZUZvcm1cIlxuICAgICAgW3RlbXBsYXRlXT1cImlubGluZUZvcm1UZW1wbGF0ZVwiXG4gICAgICAoY2xvc2UpPVwib25JbmxpbmVGb3JtQ2xvc2UoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNreVJlcGVhdGVySXRlbUxlZnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJza3lSZXBlYXRlckl0ZW1SaWdodFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc2t5LWlubGluZS1mb3JtPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlubGluZUZvcm1UZW1wbGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJza3lSZXBlYXRlckl0ZW1MZWZ0XCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNreVJlcGVhdGVySXRlbVJpZ2h0XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjc2t5UmVwZWF0ZXJJdGVtTGVmdD5cbiAgPGRpdiBjbGFzcz1cInNreS1yZXBlYXRlci1pdGVtLWxlZnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVvcmRlcmFibGVcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiXG4gICAgICAgIGNsYXNzPVwic2t5LXNjcmVlbi1yZWFkZXItb25seVwiXG4gICAgICAgIFtpZF09XCJjb250ZW50SWQgKyAnLXJlb3JkZXItc3RhdGUnXCJcbiAgICAgID5cbiAgICAgICAge3sgcmVvcmRlclN0YXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cInNreS1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgICBbaWRdPVwiY29udGVudElkICsgJy1yZW9yZGVyLWluc3RydWN0aW9ucydcIlxuICAgICAgICA+e3sgcmVvcmRlckJ1dHRvbkxhYmVsIH19PC9zcGFuXG4gICAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktdGlsZS10b29scy1jb250cm9sIHNreS1yZXBlYXRlci1pdGVtLWdyYWItaGFuZGxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiY29udGVudElkICsgJy1yZW9yZGVyLWluc3RydWN0aW9ucydcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgIGl0ZW1OYW1lXG4gICAgICAgICAgICA/ICgnc2t5dXhfcmVwZWF0ZXJfaXRlbV9yZW9yZGVyX2xhYmVsJyB8IHNreUxpYlJlc291cmNlczogaXRlbU5hbWUpXG4gICAgICAgICAgICA6ICgnc2t5dXhfcmVwZWF0ZXJfaXRlbV9yZW9yZGVyX2xhYmVsX2RlZmF1bHQnIHwgc2t5TGliUmVzb3VyY2VzKVxuICAgICAgICBcIlxuICAgICAgICAoYmx1cik9XCJvblJlb3JkZXJIYW5kbGVCbHVyKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblJlb3JkZXJIYW5kbGVLZXlEb3duKCRldmVudClcIlxuICAgICAgICAjZ3JhYkhhbmRsZVxuICAgICAgPlxuICAgICAgICA8c2t5LWljb24gaWNvbj1cImFycm93cy12XCI+PC9za3ktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxza3ktY2hlY2tib3hcbiAgICAgICpuZ0lmPVwic2VsZWN0YWJsZVwiXG4gICAgICBjbGFzcz1cInNreS1yZXBlYXRlci1pdGVtLWNoZWNrYm94XCJcbiAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgW2xhYmVsXT1cIlxuICAgICAgICBpdGVtTmFtZVxuICAgICAgICAgID8gKCdza3l1eF9yZXBlYXRlcl9pdGVtX2NoZWNrYm94X2xhYmVsJyB8IHNreUxpYlJlc291cmNlczogaXRlbU5hbWUpXG4gICAgICAgICAgOiAoJ3NreXV4X3JlcGVhdGVyX2l0ZW1fY2hlY2tib3hfbGFiZWxfZGVmYXVsdCcgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICBcIlxuICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8L3NreS1jaGVja2JveD5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNreS1yZXBlYXRlci1pdGVtLWNvbnRleHQtbWVudVwiXG4gICAgICBbaGlkZGVuXT1cImNvbnRleHRNZW51RWwuY2hpbGRyZW4ubGVuZ3RoID09PSAwXCJcbiAgICAgICNjb250ZXh0TWVudUVsXG4gICAgPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2t5LXJlcGVhdGVyLWl0ZW0tY29udGV4dC1tZW51XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2t5UmVwZWF0ZXJJdGVtUmlnaHQ+XG4gIDxkaXYgY2xhc3M9XCJza3ktcmVwZWF0ZXItaXRlbS1yaWdodFwiICNpdGVtSGVhZGVyUmVmPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2t5LXJlcGVhdGVyLWl0ZW0taGVhZGVyXCJcbiAgICAgIFtoaWRkZW5dPVwidGl0bGVSZWYuY2hpbGRyZW4ubGVuZ3RoID09PSAwXCJcbiAgICAgIChjbGljayk9XCJoZWFkZXJDbGljaygpXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwic2t5LXJlcGVhdGVyLWl0ZW0tdGl0bGUgc2t5LWVtcGhhc2l6ZWRcIiAjdGl0bGVSZWY+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cInNreS1yZXBlYXRlci1pdGVtLXRpdGxlXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwicmVvcmRlcmFibGVcIlxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1yZXBlYXRlci1pdGVtLXJlb3JkZXItdG9wXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgaXRlbU5hbWVcbiAgICAgICAgICAgID8gKCdza3l1eF9yZXBlYXRlcl9pdGVtX3Jlb3JkZXJfdG9wX2xhYmVsJ1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlczogaXRlbU5hbWUpXG4gICAgICAgICAgICA6ICgnc2t5dXhfcmVwZWF0ZXJfaXRlbV9yZW9yZGVyX3RvcF9sYWJlbF9kZWZhdWx0J1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgXCJcbiAgICAgICAgKGNsaWNrKT1cIm1vdmVUb1RvcCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPHNreS1pY29uIGljb249XCJhcnJvdy1jaXJjbGUtdXBcIj48L3NreS1pY29uPlxuICAgICAgICB7eyAnc2t5dXhfcmVwZWF0ZXJfaXRlbV9yZW9yZGVyX3RvcCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImlzQ29sbGFwc2libGVcIiBjbGFzcz1cInNreS1yZXBlYXRlci1pdGVtLWNoZXZyb25cIj5cbiAgICAgICAgPHNreS1jaGV2cm9uXG4gICAgICAgICAgW2FyaWFDb250cm9sc109XCJjb250ZW50SWRcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiXG4gICAgICAgICAgICBpdGVtTmFtZVxuICAgICAgICAgICAgICA/ICgnc2t5dXhfcmVwZWF0ZXJfaXRlbV9leHBhbmQnIHwgc2t5TGliUmVzb3VyY2VzOiBpdGVtTmFtZSlcbiAgICAgICAgICAgICAgOiAoJ3NreXV4X3JlcGVhdGVyX2l0ZW1fZXhwYW5kX2RlZmF1bHQnIHwgc2t5TGliUmVzb3VyY2VzKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2RpcmVjdGlvbl09XCJpc0V4cGFuZGVkID8gJ3VwJyA6ICdkb3duJ1wiXG4gICAgICAgICAgKGRpcmVjdGlvbkNoYW5nZSk9XCJjaGV2cm9uRGlyZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvc2t5LWNoZXZyb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gVXNlZCBmb3Igd2hlbiB0aGUgY2hldnJvbiBpcyBoaWRkZW4gdG8gZW5zdXJlIHRoYXQgdGhlIHJpZ2h0IHNpZGUgaXMgdGhlIHNhbWUgaGVpZ2h0IGFzIHRoZSBsZWZ0Li0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIiFpc0NvbGxhcHNpYmxlICYmICFjb250ZXh0TWVudVwiXG4gICAgICAgIGNsYXNzPVwic2t5LXJlcGVhdGVyLWl0ZW0tY2hldnJvbi1wbGFjZWhvbGRlclwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8IS0tIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHJpZ2h0IHNpZGUgaXMgdGhlIHNhbWUgaGVpZ2h0IGFzIHRoZSBsZWZ0Li0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImNvbnRleHRNZW51XCJcbiAgICAgICAgY2xhc3M9XCJza3ktcmVwZWF0ZXItaXRlbS1jaGV2cm9uLXBsYWNlaG9sZGVyLXdpdGgtY29udGV4dFwiXG4gICAgICA+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJza3ktcmVwZWF0ZXItaXRlbS1jb250ZW50XCJcbiAgICAgIFtpZF09XCJjb250ZW50SWRcIlxuICAgICAgW0Bza3lBbmltYXRpb25TbGlkZV09XCJzbGlkZURpcmVjdGlvblwiXG4gICAgICAjaXRlbUNvbnRlbnRSZWZcbiAgICA+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJza3ktcmVwZWF0ZXItaXRlbS1jb250ZW50XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=