@angular/material-experimental 14.0.0-rc.0 → 14.0.0

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 (247) hide show
  1. package/esm2020/column-resize/column-resize-directives/column-resize-flex.mjs +4 -4
  2. package/esm2020/column-resize/column-resize-directives/column-resize.mjs +4 -4
  3. package/esm2020/column-resize/column-resize-directives/default-enabled-column-resize-flex.mjs +4 -4
  4. package/esm2020/column-resize/column-resize-directives/default-enabled-column-resize.mjs +4 -4
  5. package/esm2020/column-resize/column-resize-module.mjs +13 -13
  6. package/esm2020/column-resize/overlay-handle.mjs +4 -4
  7. package/esm2020/column-resize/resizable-directives/default-enabled-resizable.mjs +4 -4
  8. package/esm2020/column-resize/resizable-directives/resizable.mjs +4 -4
  9. package/esm2020/column-resize/resize-strategy.mjs +4 -4
  10. package/esm2020/mdc-autocomplete/autocomplete-origin.mjs +4 -4
  11. package/esm2020/mdc-autocomplete/autocomplete-trigger.mjs +4 -4
  12. package/esm2020/mdc-autocomplete/autocomplete.mjs +4 -4
  13. package/esm2020/mdc-autocomplete/module.mjs +5 -5
  14. package/esm2020/mdc-button/button-base.mjs +7 -7
  15. package/esm2020/mdc-button/button.mjs +9 -9
  16. package/esm2020/mdc-button/fab.mjs +17 -17
  17. package/esm2020/mdc-button/icon-button.mjs +9 -9
  18. package/esm2020/mdc-button/module.mjs +5 -5
  19. package/esm2020/mdc-card/card.mjs +43 -43
  20. package/esm2020/mdc-card/module.mjs +5 -5
  21. package/esm2020/mdc-checkbox/checkbox.mjs +29 -283
  22. package/esm2020/mdc-checkbox/module.mjs +5 -5
  23. package/esm2020/mdc-chips/chip-action.mjs +43 -77
  24. package/esm2020/mdc-chips/chip-edit-input.mjs +4 -4
  25. package/esm2020/mdc-chips/chip-grid.mjs +59 -70
  26. package/esm2020/mdc-chips/chip-icons.mjs +27 -41
  27. package/esm2020/mdc-chips/chip-input.mjs +5 -8
  28. package/esm2020/mdc-chips/chip-listbox.mjs +24 -66
  29. package/esm2020/mdc-chips/chip-option.mjs +38 -83
  30. package/esm2020/mdc-chips/chip-row.mjs +51 -75
  31. package/esm2020/mdc-chips/chip-set.mjs +117 -118
  32. package/esm2020/mdc-chips/chip.mjs +81 -166
  33. package/esm2020/mdc-chips/module.mjs +6 -6
  34. package/esm2020/mdc-chips/public-api.mjs +2 -2
  35. package/esm2020/mdc-chips/tokens.mjs +33 -0
  36. package/esm2020/mdc-core/option/index.mjs +5 -5
  37. package/esm2020/mdc-core/option/optgroup.mjs +4 -4
  38. package/esm2020/mdc-core/option/option.mjs +4 -4
  39. package/esm2020/mdc-dialog/dialog-container.mjs +4 -4
  40. package/esm2020/mdc-dialog/dialog-content-directives.mjs +13 -13
  41. package/esm2020/mdc-dialog/dialog.mjs +4 -4
  42. package/esm2020/mdc-dialog/module.mjs +5 -5
  43. package/esm2020/mdc-form-field/directives/error.mjs +4 -4
  44. package/esm2020/mdc-form-field/directives/floating-label.mjs +26 -6
  45. package/esm2020/mdc-form-field/directives/hint.mjs +4 -4
  46. package/esm2020/mdc-form-field/directives/label.mjs +4 -4
  47. package/esm2020/mdc-form-field/directives/line-ripple.mjs +32 -11
  48. package/esm2020/mdc-form-field/directives/notched-outline.mjs +25 -46
  49. package/esm2020/mdc-form-field/directives/prefix.mjs +4 -4
  50. package/esm2020/mdc-form-field/directives/suffix.mjs +4 -4
  51. package/esm2020/mdc-form-field/form-field.mjs +11 -95
  52. package/esm2020/mdc-form-field/module.mjs +5 -5
  53. package/esm2020/mdc-input/input.mjs +4 -4
  54. package/esm2020/mdc-input/module.mjs +5 -5
  55. package/esm2020/mdc-list/action-list.mjs +5 -5
  56. package/esm2020/mdc-list/list-base.mjs +7 -15
  57. package/esm2020/mdc-list/list-item-sections.mjs +19 -19
  58. package/esm2020/mdc-list/list-option.mjs +39 -21
  59. package/esm2020/mdc-list/list.mjs +8 -8
  60. package/esm2020/mdc-list/module.mjs +5 -5
  61. package/esm2020/mdc-list/nav-list.mjs +5 -5
  62. package/esm2020/mdc-list/selection-list.mjs +124 -124
  63. package/esm2020/mdc-list/subheader.mjs +4 -4
  64. package/esm2020/mdc-menu/directives.mjs +7 -7
  65. package/esm2020/mdc-menu/menu-item.mjs +4 -4
  66. package/esm2020/mdc-menu/menu.mjs +4 -4
  67. package/esm2020/mdc-menu/module.mjs +5 -5
  68. package/esm2020/mdc-paginator/module.mjs +5 -5
  69. package/esm2020/mdc-paginator/paginator.mjs +4 -4
  70. package/esm2020/mdc-progress-bar/module.mjs +5 -5
  71. package/esm2020/mdc-progress-bar/progress-bar.mjs +39 -103
  72. package/esm2020/mdc-progress-spinner/module.mjs +5 -5
  73. package/esm2020/mdc-progress-spinner/progress-spinner.mjs +13 -60
  74. package/esm2020/mdc-radio/module.mjs +5 -5
  75. package/esm2020/mdc-radio/radio.mjs +9 -43
  76. package/esm2020/mdc-select/module.mjs +5 -5
  77. package/esm2020/mdc-select/select.mjs +7 -7
  78. package/esm2020/mdc-slide-toggle/module.mjs +5 -5
  79. package/esm2020/mdc-slide-toggle/slide-toggle.mjs +16 -178
  80. package/esm2020/mdc-slider/global-change-and-input-listener.mjs +4 -4
  81. package/esm2020/mdc-slider/module.mjs +5 -5
  82. package/esm2020/mdc-slider/slider.mjs +10 -10
  83. package/esm2020/mdc-snack-bar/module.mjs +5 -5
  84. package/esm2020/mdc-snack-bar/simple-snack-bar.mjs +4 -4
  85. package/esm2020/mdc-snack-bar/snack-bar-container.mjs +5 -5
  86. package/esm2020/mdc-snack-bar/snack-bar-content.mjs +10 -10
  87. package/esm2020/mdc-snack-bar/snack-bar.mjs +4 -4
  88. package/esm2020/mdc-table/cell.mjs +22 -22
  89. package/esm2020/mdc-table/module.mjs +5 -5
  90. package/esm2020/mdc-table/row.mjs +22 -22
  91. package/esm2020/mdc-table/table.mjs +9 -9
  92. package/esm2020/mdc-table/text-column.mjs +4 -4
  93. package/esm2020/mdc-tabs/ink-bar.mjs +93 -114
  94. package/esm2020/mdc-tabs/module.mjs +5 -5
  95. package/esm2020/mdc-tabs/tab-body.mjs +7 -7
  96. package/esm2020/mdc-tabs/tab-content.mjs +4 -4
  97. package/esm2020/mdc-tabs/tab-group.mjs +4 -4
  98. package/esm2020/mdc-tabs/tab-header.mjs +4 -4
  99. package/esm2020/mdc-tabs/tab-label-wrapper.mjs +10 -34
  100. package/esm2020/mdc-tabs/tab-label.mjs +4 -4
  101. package/esm2020/mdc-tabs/tab-nav-bar/tab-nav-bar.mjs +16 -25
  102. package/esm2020/mdc-tabs/tab.mjs +4 -4
  103. package/esm2020/mdc-tooltip/module.mjs +5 -5
  104. package/esm2020/mdc-tooltip/tooltip.mjs +8 -8
  105. package/esm2020/menubar/menubar-item.mjs +4 -4
  106. package/esm2020/menubar/menubar-module.mjs +5 -5
  107. package/esm2020/menubar/menubar.mjs +5 -5
  108. package/esm2020/popover-edit/lens-directives.mjs +10 -10
  109. package/esm2020/popover-edit/popover-edit-module.mjs +5 -5
  110. package/esm2020/popover-edit/table-directives.mjs +13 -13
  111. package/esm2020/selection/row-selection.mjs +4 -4
  112. package/esm2020/selection/select-all.mjs +4 -4
  113. package/esm2020/selection/selection-column.mjs +5 -5
  114. package/esm2020/selection/selection-module.mjs +5 -5
  115. package/esm2020/selection/selection-toggle.mjs +4 -4
  116. package/esm2020/selection/selection.mjs +4 -4
  117. package/esm2020/version.mjs +1 -1
  118. package/fesm2015/column-resize.mjs +36 -36
  119. package/fesm2015/column-resize.mjs.map +1 -1
  120. package/fesm2015/material-experimental.mjs +1 -1
  121. package/fesm2015/material-experimental.mjs.map +1 -1
  122. package/fesm2015/mdc-autocomplete.mjs +13 -13
  123. package/fesm2015/mdc-autocomplete.mjs.map +1 -1
  124. package/fesm2015/mdc-button.mjs +42 -42
  125. package/fesm2015/mdc-button.mjs.map +1 -1
  126. package/fesm2015/mdc-card.mjs +46 -46
  127. package/fesm2015/mdc-card.mjs.map +1 -1
  128. package/fesm2015/mdc-checkbox.mjs +34 -287
  129. package/fesm2015/mdc-checkbox.mjs.map +1 -1
  130. package/fesm2015/mdc-chips.mjs +529 -785
  131. package/fesm2015/mdc-chips.mjs.map +1 -1
  132. package/fesm2015/mdc-core.mjs +10 -10
  133. package/fesm2015/mdc-core.mjs.map +1 -1
  134. package/fesm2015/mdc-dialog.mjs +22 -22
  135. package/fesm2015/mdc-dialog.mjs.map +1 -1
  136. package/fesm2015/mdc-form-field.mjs +118 -173
  137. package/fesm2015/mdc-form-field.mjs.map +1 -1
  138. package/fesm2015/mdc-input.mjs +7 -7
  139. package/fesm2015/mdc-input.mjs.map +1 -1
  140. package/fesm2015/mdc-list.mjs +209 -395
  141. package/fesm2015/mdc-list.mjs.map +1 -1
  142. package/fesm2015/mdc-menu.mjs +16 -16
  143. package/fesm2015/mdc-menu.mjs.map +1 -1
  144. package/fesm2015/mdc-paginator.mjs +7 -7
  145. package/fesm2015/mdc-paginator.mjs.map +1 -1
  146. package/fesm2015/mdc-progress-bar.mjs +41 -105
  147. package/fesm2015/mdc-progress-bar.mjs.map +1 -1
  148. package/fesm2015/mdc-progress-spinner.mjs +16 -63
  149. package/fesm2015/mdc-progress-spinner.mjs.map +1 -1
  150. package/fesm2015/mdc-radio.mjs +13 -47
  151. package/fesm2015/mdc-radio.mjs.map +1 -1
  152. package/fesm2015/mdc-select.mjs +10 -10
  153. package/fesm2015/mdc-select.mjs.map +1 -1
  154. package/fesm2015/mdc-slide-toggle.mjs +20 -184
  155. package/fesm2015/mdc-slide-toggle.mjs.map +1 -1
  156. package/fesm2015/mdc-slider.mjs +16 -16
  157. package/fesm2015/mdc-slider.mjs.map +1 -1
  158. package/fesm2015/mdc-snack-bar.mjs +23 -23
  159. package/fesm2015/mdc-snack-bar.mjs.map +1 -1
  160. package/fesm2015/mdc-table.mjs +57 -57
  161. package/fesm2015/mdc-table.mjs.map +1 -1
  162. package/fesm2015/mdc-tabs.mjs +140 -192
  163. package/fesm2015/mdc-tabs.mjs.map +1 -1
  164. package/fesm2015/mdc-tooltip.mjs +11 -11
  165. package/fesm2015/mdc-tooltip.mjs.map +1 -1
  166. package/fesm2015/menubar.mjs +10 -10
  167. package/fesm2015/menubar.mjs.map +1 -1
  168. package/fesm2015/popover-edit.mjs +25 -25
  169. package/fesm2015/popover-edit.mjs.map +1 -1
  170. package/fesm2015/selection.mjs +20 -20
  171. package/fesm2015/selection.mjs.map +1 -1
  172. package/fesm2020/column-resize.mjs +36 -36
  173. package/fesm2020/column-resize.mjs.map +1 -1
  174. package/fesm2020/material-experimental.mjs +1 -1
  175. package/fesm2020/material-experimental.mjs.map +1 -1
  176. package/fesm2020/mdc-autocomplete.mjs +13 -13
  177. package/fesm2020/mdc-autocomplete.mjs.map +1 -1
  178. package/fesm2020/mdc-button.mjs +42 -42
  179. package/fesm2020/mdc-button.mjs.map +1 -1
  180. package/fesm2020/mdc-card.mjs +46 -46
  181. package/fesm2020/mdc-card.mjs.map +1 -1
  182. package/fesm2020/mdc-checkbox.mjs +34 -287
  183. package/fesm2020/mdc-checkbox.mjs.map +1 -1
  184. package/fesm2020/mdc-chips.mjs +442 -701
  185. package/fesm2020/mdc-chips.mjs.map +1 -1
  186. package/fesm2020/mdc-core.mjs +10 -10
  187. package/fesm2020/mdc-core.mjs.map +1 -1
  188. package/fesm2020/mdc-dialog.mjs +22 -22
  189. package/fesm2020/mdc-dialog.mjs.map +1 -1
  190. package/fesm2020/mdc-form-field.mjs +110 -172
  191. package/fesm2020/mdc-form-field.mjs.map +1 -1
  192. package/fesm2020/mdc-input.mjs +7 -7
  193. package/fesm2020/mdc-input.mjs.map +1 -1
  194. package/fesm2020/mdc-list.mjs +208 -384
  195. package/fesm2020/mdc-list.mjs.map +1 -1
  196. package/fesm2020/mdc-menu.mjs +16 -16
  197. package/fesm2020/mdc-menu.mjs.map +1 -1
  198. package/fesm2020/mdc-paginator.mjs +7 -7
  199. package/fesm2020/mdc-paginator.mjs.map +1 -1
  200. package/fesm2020/mdc-progress-bar.mjs +41 -104
  201. package/fesm2020/mdc-progress-bar.mjs.map +1 -1
  202. package/fesm2020/mdc-progress-spinner.mjs +16 -63
  203. package/fesm2020/mdc-progress-spinner.mjs.map +1 -1
  204. package/fesm2020/mdc-radio.mjs +13 -47
  205. package/fesm2020/mdc-radio.mjs.map +1 -1
  206. package/fesm2020/mdc-select.mjs +10 -10
  207. package/fesm2020/mdc-select.mjs.map +1 -1
  208. package/fesm2020/mdc-slide-toggle.mjs +20 -183
  209. package/fesm2020/mdc-slide-toggle.mjs.map +1 -1
  210. package/fesm2020/mdc-slider.mjs +16 -16
  211. package/fesm2020/mdc-slider.mjs.map +1 -1
  212. package/fesm2020/mdc-snack-bar.mjs +23 -23
  213. package/fesm2020/mdc-snack-bar.mjs.map +1 -1
  214. package/fesm2020/mdc-table.mjs +57 -57
  215. package/fesm2020/mdc-table.mjs.map +1 -1
  216. package/fesm2020/mdc-tabs.mjs +138 -190
  217. package/fesm2020/mdc-tabs.mjs.map +1 -1
  218. package/fesm2020/mdc-tooltip.mjs +11 -11
  219. package/fesm2020/mdc-tooltip.mjs.map +1 -1
  220. package/fesm2020/menubar.mjs +10 -10
  221. package/fesm2020/menubar.mjs.map +1 -1
  222. package/fesm2020/popover-edit.mjs +25 -25
  223. package/fesm2020/popover-edit.mjs.map +1 -1
  224. package/fesm2020/selection.mjs +20 -20
  225. package/fesm2020/selection.mjs.map +1 -1
  226. package/mdc-checkbox/_checkbox-private.scss +10 -3
  227. package/mdc-checkbox/_checkbox-theme.scss +3 -3
  228. package/mdc-checkbox/index.d.ts +17 -138
  229. package/mdc-chips/index.d.ts +102 -162
  230. package/mdc-form-field/index.d.ts +12 -20
  231. package/mdc-list/_list-option-theme.scss +2 -2
  232. package/mdc-list/_list-theme.scss +3 -3
  233. package/mdc-list/index.d.ts +42 -66
  234. package/mdc-progress-bar/index.d.ts +14 -17
  235. package/mdc-progress-spinner/index.d.ts +5 -18
  236. package/mdc-radio/_radio-theme.scss +8 -2
  237. package/mdc-radio/index.d.ts +1 -17
  238. package/mdc-slide-toggle/index.d.ts +12 -73
  239. package/mdc-tabs/index.d.ts +14 -62
  240. package/mdc-theming/prebuilt/deeppurple-amber.css +1 -1
  241. package/mdc-theming/prebuilt/indigo-pink.css +1 -1
  242. package/mdc-theming/prebuilt/pink-bluegrey.css +1 -1
  243. package/mdc-theming/prebuilt/purple-green.css +1 -1
  244. package/package.json +55 -55
  245. package/esm2020/mdc-chips/chip-default-options.mjs +0 -11
  246. package/esm2020/mdc-chips/emit-event.mjs +0 -27
  247. package/esm2020/mdc-list/interactive-list-base.mjs +0 -196
@@ -5,18 +5,16 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
- import { LiveAnnouncer } from '@angular/cdk/a11y';
8
+ import { FocusKeyManager } from '@angular/cdk/a11y';
9
+ import { Directionality } from '@angular/cdk/bidi';
9
10
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
10
- import { DOCUMENT } from '@angular/common';
11
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, Inject, Input, QueryList, ViewEncapsulation, } from '@angular/core';
11
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, Input, Optional, QueryList, ViewEncapsulation, } from '@angular/core';
12
12
  import { mixinTabIndex } from '@angular/material-experimental/mdc-core';
13
- import { MDCChipSetFoundation, MDCChipEvents, MDCChipActionType, } from '@material/chips';
14
13
  import { merge, Subject } from 'rxjs';
15
14
  import { startWith, switchMap, takeUntil } from 'rxjs/operators';
16
15
  import { MatChip } from './chip';
17
- import { emitCustomEvent } from './emit-event';
18
16
  import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/cdk/a11y";
17
+ import * as i1 from "@angular/cdk/bidi";
20
18
  /**
21
19
  * Boilerplate for applying mixins to MatChipSet.
22
20
  * @docs-private
@@ -31,84 +29,25 @@ const _MatChipSetMixinBase = mixinTabIndex(MatChipSetBase);
31
29
  * Extended by MatChipListbox and MatChipGrid for different interaction patterns.
32
30
  */
33
31
  export class MatChipSet extends _MatChipSetMixinBase {
34
- constructor(_liveAnnouncer, _document, _elementRef, _changeDetectorRef) {
32
+ constructor(_elementRef, _changeDetectorRef, _dir) {
35
33
  super(_elementRef);
36
- this._liveAnnouncer = _liveAnnouncer;
37
- this._document = _document;
38
34
  this._elementRef = _elementRef;
39
35
  this._changeDetectorRef = _changeDetectorRef;
40
- /**
41
- * When a chip is destroyed, we store the index of the destroyed chip until the chips
42
- * query list notifies about the update. This is necessary because we cannot determine an
43
- * appropriate chip that should receive focus until the array of chips updated completely.
44
- */
45
- this._lastDestroyedChipIndex = null;
36
+ this._dir = _dir;
37
+ /** Index of the last destroyed chip that had focus. */
38
+ this._lastDestroyedFocusedChipIndex = null;
46
39
  /** Subject that emits when the component has been destroyed. */
47
40
  this._destroyed = new Subject();
48
41
  /** Role to use if it hasn't been overwritten by the user. */
49
42
  this._defaultRole = 'presentation';
50
- /**
51
- * Implementation of the MDC chip-set adapter interface.
52
- * These methods are called by the chip set foundation.
53
- */
54
- this._chipSetAdapter = {
55
- announceMessage: message => this._liveAnnouncer.announce(message),
56
- emitEvent: (eventName, eventDetail) => {
57
- emitCustomEvent(this._elementRef.nativeElement, this._document, eventName, eventDetail, true);
58
- },
59
- getAttribute: name => this._elementRef.nativeElement.getAttribute(name),
60
- getChipActionsAtIndex: index => this._chipFoundation(index)?.getActions() || [],
61
- getChipCount: () => this._chips.length,
62
- getChipIdAtIndex: index => this._chipFoundation(index)?.getElementID() || '',
63
- getChipIndexById: id => {
64
- return this._chips.toArray().findIndex(chip => chip._getFoundation().getElementID() === id);
65
- },
66
- isChipFocusableAtIndex: (index, actionType) => {
67
- return this._chipFoundation(index)?.isActionFocusable(actionType) || false;
68
- },
69
- isChipSelectableAtIndex: (index, actionType) => {
70
- return this._chipFoundation(index)?.isActionSelectable(actionType) || false;
71
- },
72
- isChipSelectedAtIndex: (index, actionType) => {
73
- return this._chipFoundation(index)?.isActionSelected(actionType) || false;
74
- },
75
- removeChipAtIndex: index => this._chips.toArray()[index]?.remove(),
76
- setChipFocusAtIndex: (index, action, behavior) => {
77
- this._chipFoundation(index)?.setActionFocus(action, behavior);
78
- },
79
- setChipSelectedAtIndex: (index, actionType, isSelected) => {
80
- // Setting the trailing action as deselected ends up deselecting the entire chip.
81
- // This is working as expected, but it's not something we want so we only apply the
82
- // selected state to the primary chip.
83
- if (actionType === MDCChipActionType.PRIMARY) {
84
- this._chipFoundation(index)?.setActionSelected(actionType, isSelected);
85
- }
86
- },
87
- startChipAnimationAtIndex: (index, animation) => {
88
- this._chipFoundation(index)?.startAnimation(animation);
89
- },
90
- };
91
- /**
92
- * Map from class to whether the class is enabled.
93
- * Enabled classes are set on the MDC chip-set div.
94
- */
95
- this._mdcClasses = {};
96
43
  this._disabled = false;
97
44
  this._explicitRole = null;
98
- this._handleChipAnimation = (event) => {
99
- this._chipSetFoundation.handleChipAnimation(event);
100
- };
101
- this._handleChipInteraction = (event) => {
102
- this._chipSetFoundation.handleChipInteraction(event);
103
- };
104
- this._handleChipNavigation = (event) => {
105
- this._chipSetFoundation.handleChipNavigation(event);
106
- };
107
- const element = _elementRef.nativeElement;
108
- this._chipSetFoundation = new MDCChipSetFoundation(this._chipSetAdapter);
109
- element.addEventListener(MDCChipEvents.ANIMATION, this._handleChipAnimation);
110
- element.addEventListener(MDCChipEvents.INTERACTION, this._handleChipInteraction);
111
- element.addEventListener(MDCChipEvents.NAVIGATION, this._handleChipNavigation);
45
+ /** Flat list of all the actions contained within the chips. */
46
+ this._chipActions = new QueryList();
47
+ }
48
+ /** Combined stream of all of the child chips' focus events. */
49
+ get chipFocusChanges() {
50
+ return this._getChipStream(chip => chip._onFocus);
112
51
  }
113
52
  /** Combined stream of all of the child chips' remove events. */
114
53
  get chipDestroyedChanges() {
@@ -141,37 +80,14 @@ export class MatChipSet extends _MatChipSetMixinBase {
141
80
  return this._hasFocusedChip();
142
81
  }
143
82
  ngAfterViewInit() {
144
- this._chipSetFoundation.init();
145
- }
146
- ngAfterContentInit() {
147
- this._chips.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {
148
- if (this.disabled) {
149
- // Since this happens after the content has been
150
- // checked, we need to defer it to the next tick.
151
- Promise.resolve().then(() => {
152
- this._syncChipsState();
153
- });
154
- }
155
- });
156
- this.chipDestroyedChanges.pipe(takeUntil(this._destroyed)).subscribe((event) => {
157
- const chip = event.chip;
158
- const chipIndex = this._chips.toArray().indexOf(event.chip);
159
- // In case the chip that will be removed is currently focused, we temporarily store
160
- // the index in order to be able to determine an appropriate sibling chip that will
161
- // receive focus.
162
- if (this._isValidIndex(chipIndex) && chip._hasFocus()) {
163
- this._lastDestroyedChipIndex = chipIndex;
164
- }
165
- });
83
+ this._setUpFocusManagement();
84
+ this._trackChipSetChanges();
85
+ this._trackDestroyedFocusedChip();
166
86
  }
167
87
  ngOnDestroy() {
168
- const element = this._elementRef.nativeElement;
169
- element.removeEventListener(MDCChipEvents.ANIMATION, this._handleChipAnimation);
170
- element.removeEventListener(MDCChipEvents.INTERACTION, this._handleChipInteraction);
171
- element.removeEventListener(MDCChipEvents.NAVIGATION, this._handleChipNavigation);
88
+ this._chipActions.destroy();
172
89
  this._destroyed.next();
173
90
  this._destroyed.complete();
174
- this._chipSetFoundation.destroy();
175
91
  }
176
92
  /** Checks whether any of the chips is focused. */
177
93
  _hasFocusedChip() {
@@ -188,6 +104,12 @@ export class MatChipSet extends _MatChipSetMixinBase {
188
104
  }
189
105
  /** Dummy method for subclasses to override. Base chip set cannot be focused. */
190
106
  focus() { }
107
+ /** Handles keyboard events on the chip set. */
108
+ _handleKeydown(event) {
109
+ if (this._originatesFromChip(event)) {
110
+ this._keyManager.onKeydown(event);
111
+ }
112
+ }
191
113
  /**
192
114
  * Utility to ensure all indexes are valid.
193
115
  *
@@ -197,10 +119,6 @@ export class MatChipSet extends _MatChipSetMixinBase {
197
119
  _isValidIndex(index) {
198
120
  return index >= 0 && index < this._chips.length;
199
121
  }
200
- /** Checks whether an event comes from inside a chip element. */
201
- _originatesFromChip(event) {
202
- return this._checkForClassInHierarchy(event, 'mdc-evolution-chip');
203
- }
204
122
  /**
205
123
  * Removes the `tabindex` from the chip grid and resets it back afterwards, allowing the
206
124
  * user to tab out of it. This prevents the grid from capturing focus and redirecting
@@ -223,28 +141,109 @@ export class MatChipSet extends _MatChipSetMixinBase {
223
141
  _getChipStream(mappingFunction) {
224
142
  return this._chips.changes.pipe(startWith(null), switchMap(() => merge(...this._chips.map(mappingFunction))));
225
143
  }
226
- _checkForClassInHierarchy(event, className) {
144
+ /** Checks whether an event comes from inside a chip element. */
145
+ _originatesFromChip(event) {
227
146
  let currentElement = event.target;
228
147
  while (currentElement && currentElement !== this._elementRef.nativeElement) {
229
148
  // Null check the classList, because IE and Edge don't support it on all elements.
230
- if (currentElement.classList && currentElement.classList.contains(className)) {
149
+ if (currentElement.classList && currentElement.classList.contains('mdc-evolution-chip')) {
231
150
  return true;
232
151
  }
233
152
  currentElement = currentElement.parentElement;
234
153
  }
235
154
  return false;
236
155
  }
237
- _chipFoundation(index) {
238
- return this._chips.toArray()[index]?._getFoundation();
156
+ /** Sets up the chip set's focus management logic. */
157
+ _setUpFocusManagement() {
158
+ // Create a flat `QueryList` containing the actions of all of the chips.
159
+ // This allows us to navigate both within the chip and move to the next/previous
160
+ // one using the existing `ListKeyManager`.
161
+ this._chips.changes.pipe(startWith(this._chips)).subscribe((chips) => {
162
+ const actions = [];
163
+ chips.forEach(chip => chip._getActions().forEach(action => actions.push(action)));
164
+ this._chipActions.reset(actions);
165
+ this._chipActions.notifyOnChanges();
166
+ });
167
+ this._keyManager = new FocusKeyManager(this._chipActions)
168
+ .withVerticalOrientation()
169
+ .withHorizontalOrientation(this._dir ? this._dir.value : 'ltr')
170
+ .withHomeAndEnd()
171
+ // Skip non-interactive and disabled actions since the user can't do anything with them.
172
+ .skipPredicate(action => !action.isInteractive || action.disabled);
173
+ // Keep the manager active index in sync so that navigation picks
174
+ // up from the current chip if the user clicks into the list directly.
175
+ this.chipFocusChanges.pipe(takeUntil(this._destroyed)).subscribe(({ chip }) => {
176
+ const action = chip._getSourceAction(document.activeElement);
177
+ if (action) {
178
+ this._keyManager.updateActiveItem(action);
179
+ }
180
+ });
181
+ this._dir?.change
182
+ .pipe(takeUntil(this._destroyed))
183
+ .subscribe(direction => this._keyManager.withHorizontalOrientation(direction));
184
+ }
185
+ /** Listens to changes in the chip set and syncs up the state of the individual chips. */
186
+ _trackChipSetChanges() {
187
+ this._chips.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {
188
+ if (this.disabled) {
189
+ // Since this happens after the content has been
190
+ // checked, we need to defer it to the next tick.
191
+ Promise.resolve().then(() => this._syncChipsState());
192
+ }
193
+ this._redirectDestroyedChipFocus();
194
+ });
195
+ }
196
+ /** Starts tracking the destroyed chips in order to capture the focused one. */
197
+ _trackDestroyedFocusedChip() {
198
+ this.chipDestroyedChanges.pipe(takeUntil(this._destroyed)).subscribe((event) => {
199
+ const chipArray = this._chips.toArray();
200
+ const chipIndex = chipArray.indexOf(event.chip);
201
+ // If the focused chip is destroyed, save its index so that we can move focus to the next
202
+ // chip. We only save the index here, rather than move the focus immediately, because we want
203
+ // to wait until the chip is removed from the chip list before focusing the next one. This
204
+ // allows us to keep focus on the same index if the chip gets swapped out.
205
+ if (this._isValidIndex(chipIndex) && event.chip._hasFocus()) {
206
+ this._lastDestroyedFocusedChipIndex = chipIndex;
207
+ }
208
+ });
209
+ }
210
+ /**
211
+ * Finds the next appropriate chip to move focus to,
212
+ * if the currently-focused chip is destroyed.
213
+ */
214
+ _redirectDestroyedChipFocus() {
215
+ if (this._lastDestroyedFocusedChipIndex == null) {
216
+ return;
217
+ }
218
+ if (this._chips.length) {
219
+ const newIndex = Math.min(this._lastDestroyedFocusedChipIndex, this._chips.length - 1);
220
+ const chipToFocus = this._chips.toArray()[newIndex];
221
+ if (chipToFocus.disabled) {
222
+ // If we're down to one disabled chip, move focus back to the set.
223
+ if (this._chips.length === 1) {
224
+ this.focus();
225
+ }
226
+ else {
227
+ this._keyManager.setPreviousItemActive();
228
+ }
229
+ }
230
+ else {
231
+ chipToFocus.focus();
232
+ }
233
+ }
234
+ else {
235
+ this.focus();
236
+ }
237
+ this._lastDestroyedFocusedChipIndex = null;
239
238
  }
240
239
  }
241
- MatChipSet.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.16", ngImport: i0, type: MatChipSet, deps: [{ token: i1.LiveAnnouncer }, { token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
242
- MatChipSet.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0-next.16", type: MatChipSet, selector: "mat-chip-set", inputs: { disabled: "disabled", role: "role" }, host: { properties: { "attr.role": "role" }, classAttribute: "mat-mdc-chip-set mdc-evolution-chip-set" }, queries: [{ propertyName: "_chips", predicate: MatChip, descendants: true }], usesInheritance: true, ngImport: i0, template: `
240
+ MatChipSet.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: MatChipSet, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });
241
+ MatChipSet.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0-rc.1", type: MatChipSet, selector: "mat-chip-set", inputs: { disabled: "disabled", role: "role" }, host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "attr.role": "role" }, classAttribute: "mat-mdc-chip-set mdc-evolution-chip-set" }, queries: [{ propertyName: "_chips", predicate: MatChip, descendants: true }], usesInheritance: true, ngImport: i0, template: `
243
242
  <span class="mdc-evolution-chip-set__chips" role="presentation">
244
243
  <ng-content></ng-content>
245
244
  </span>
246
245
  `, isInline: true, styles: [".mdc-evolution-chip-set{display:flex}.mdc-evolution-chip-set:focus{outline:none}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mdc-evolution-chip-set--overflow .mdc-evolution-chip-set__chips{flex-flow:nowrap}.mdc-evolution-chip-set .mdc-evolution-chip-set__chips{margin-left:-8px;margin-right:0}[dir=rtl] .mdc-evolution-chip-set .mdc-evolution-chip-set__chips,.mdc-evolution-chip-set .mdc-evolution-chip-set__chips[dir=rtl]{margin-left:0;margin-right:-8px}.mdc-evolution-chip-set .mdc-evolution-chip{margin-left:8px;margin-right:0}[dir=rtl] .mdc-evolution-chip-set .mdc-evolution-chip,.mdc-evolution-chip-set .mdc-evolution-chip[dir=rtl]{margin-left:0;margin-right:8px}.mdc-evolution-chip-set .mdc-evolution-chip{margin-top:4px;margin-bottom:4px}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
247
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.16", ngImport: i0, type: MatChipSet, decorators: [{
246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: MatChipSet, decorators: [{
248
247
  type: Component,
249
248
  args: [{ selector: 'mat-chip-set', template: `
250
249
  <span class="mdc-evolution-chip-set__chips" role="presentation">
@@ -252,12 +251,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.16",
252
251
  </span>
253
252
  `, host: {
254
253
  'class': 'mat-mdc-chip-set mdc-evolution-chip-set',
254
+ '(keydown)': '_handleKeydown($event)',
255
255
  '[attr.role]': 'role',
256
256
  }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".mdc-evolution-chip-set{display:flex}.mdc-evolution-chip-set:focus{outline:none}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mdc-evolution-chip-set--overflow .mdc-evolution-chip-set__chips{flex-flow:nowrap}.mdc-evolution-chip-set .mdc-evolution-chip-set__chips{margin-left:-8px;margin-right:0}[dir=rtl] .mdc-evolution-chip-set .mdc-evolution-chip-set__chips,.mdc-evolution-chip-set .mdc-evolution-chip-set__chips[dir=rtl]{margin-left:0;margin-right:-8px}.mdc-evolution-chip-set .mdc-evolution-chip{margin-left:8px;margin-right:0}[dir=rtl] .mdc-evolution-chip-set .mdc-evolution-chip,.mdc-evolution-chip-set .mdc-evolution-chip[dir=rtl]{margin-left:0;margin-right:8px}.mdc-evolution-chip-set .mdc-evolution-chip{margin-top:4px;margin-bottom:4px}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}"] }]
257
- }], ctorParameters: function () { return [{ type: i1.LiveAnnouncer }, { type: undefined, decorators: [{
258
- type: Inject,
259
- args: [DOCUMENT]
260
- }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{
257
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.Directionality, decorators: [{
258
+ type: Optional
259
+ }] }]; }, propDecorators: { disabled: [{
261
260
  type: Input
262
261
  }], role: [{
263
262
  type: Input
@@ -269,4 +268,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.16",
269
268
  descendants: true,
270
269
  }]
271
270
  }] } });
272
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1zZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwtZXhwZXJpbWVudGFsL21kYy1jaGlwcy9jaGlwLXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFlLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFHTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsYUFBYSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUNMLG9CQUFvQixFQUdwQixhQUFhLEVBSWIsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFDLEtBQUssRUFBYyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBZSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDOzs7QUFFN0M7OztHQUdHO0FBQ0gsTUFBZSxjQUFjO0lBRTNCLFlBQVksV0FBdUIsSUFBRyxDQUFDO0NBQ3hDO0FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFM0Q7Ozs7R0FJRztBQWdCSCxNQUFNLE9BQU8sVUFDWCxTQUFRLG9CQUFvQjtJQW9INUIs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Q0FBQyxhQUFhLENBQUM7U0FDL0M7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYTtRQUNuQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDeEQsQ0FBQzs7K0dBMVBVLFVBQVUsK0NBdUhYLFFBQVE7bUdBdkhQLFVBQVUscU9BOEdKLE9BQU8sdUVBM0hkOzs7O0dBSVQ7bUdBU1UsVUFBVTtrQkFmdEIsU0FBUzsrQkFDRSxjQUFjLFlBQ2Q7Ozs7R0FJVCxRQUVLO3dCQUNKLE9BQU8sRUFBRSx5Q0FBeUM7d0JBQ2xELGFBQWEsRUFBRSxNQUFNO3FCQUN0QixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzswQkF5SDVDLE1BQU07MkJBQUMsUUFBUTtxR0E1Q2QsUUFBUTtzQkFEWCxLQUFLO2dCQWlCRixJQUFJO3NCQURQLEtBQUs7Z0JBeUJOLE1BQU07c0JBTEwsZUFBZTt1QkFBQyxPQUFPLEVBQUU7d0JBQ3hCLHVFQUF1RTt3QkFDdkUsOENBQThDO3dCQUM5QyxXQUFXLEVBQUUsSUFBSTtxQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtMaXZlQW5ub3VuY2VyfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge0Jvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUXVlcnlMaXN0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0hhc1RhYkluZGV4LCBtaXhpblRhYkluZGV4fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1leHBlcmltZW50YWwvbWRjLWNvcmUnO1xuaW1wb3J0IHtcbiAgTURDQ2hpcFNldEZvdW5kYXRpb24sXG4gIE1EQ0NoaXBTZXRBZGFwdGVyLFxuICBNRENDaGlwRm91bmRhdGlvbixcbiAgTURDQ2hpcEV2ZW50cyxcbiAgQ2hpcEFuaW1hdGlvbkV2ZW50LFxuICBDaGlwSW50ZXJhY3Rpb25FdmVudCxcbiAgQ2hpcE5hdmlnYXRpb25FdmVudCxcbiAgTURDQ2hpcEFjdGlvblR5cGUsXG59IGZyb20gJ0BtYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQge21lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7c3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtNYXRDaGlwLCBNYXRDaGlwRXZlbnR9IGZyb20gJy4vY2hpcCc7XG5pbXBvcnQge2VtaXRDdXN0b21FdmVudH0gZnJvbSAnLi9lbWl0LWV2ZW50JztcblxuLyoqXG4gKiBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdENoaXBTZXQuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmFic3RyYWN0IGNsYXNzIE1hdENoaXBTZXRCYXNlIHtcbiAgYWJzdHJhY3QgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxufVxuY29uc3QgX01hdENoaXBTZXRNaXhpbkJhc2UgPSBtaXhpblRhYkluZGV4KE1hdENoaXBTZXRCYXNlKTtcblxuLyoqXG4gKiBCYXNpYyBjb250YWluZXIgY29tcG9uZW50IGZvciB0aGUgTWF0Q2hpcCBjb21wb25lbnQuXG4gKlxuICogRXh0ZW5kZWQgYnkgTWF0Q2hpcExpc3Rib3ggYW5kIE1hdENoaXBHcmlkIGZvciBkaWZmZXJlbnQgaW50ZXJhY3Rpb24gcGF0dGVybnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1jaGlwLXNldCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gY2xhc3M9XCJtZGMtZXZvbHV0aW9uLWNoaXAtc2V0X19jaGlwc1wiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3NwYW4+XG4gIGAsXG4gIHN0eWxlVXJsczogWydjaGlwLXNldC5jc3MnXSxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdtYXQtbWRjLWNoaXAtc2V0IG1kYy1ldm9sdXRpb24tY2hpcC1zZXQnLFxuICAgICdbYXR0ci5yb2xlXSc6ICdyb2xlJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdENoaXBTZXRcbiAgZXh0ZW5kcyBfTWF0Q2hpcFNldE1peGluQmFzZVxuICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIEhhc1RhYkluZGV4LCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIFdoZW4gYSBjaGlwIGlzIGRlc3Ryb3llZCwgd2Ugc3RvcmUgdGhlIGluZGV4IG9mIHRoZSBkZXN0cm95ZWQgY2hpcCB1bnRpbCB0aGUgY2hpcHNcbiAgICogcXVlcnkgbGlzdCBub3RpZmllcyBhYm91dCB0aGUgdXBkYXRlLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCBkZXRlcm1pbmUgYW5cbiAgICogYXBwcm9wcmlhdGUgY2hpcCB0aGF0IHNob3VsZCByZWNlaXZlIGZvY3VzIHVudGlsIHRoZSBhcnJheSBvZiBjaGlwcyB1cGRhdGVkIGNvbXBsZXRlbHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2xhc3REZXN0cm95ZWRDaGlwSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgTURDIGZvdW5kYXRpb24gY29udGFpbmluZyBidXNpbmVzcyBsb2dpYyBmb3IgTURDIGNoaXAtc2V0LiAqL1xuICBwcm90ZWN0ZWQgX2NoaXBTZXRGb3VuZGF0aW9uOiBNRENDaGlwU2V0Rm91bmRhdGlvbjtcblxuICAvKiogU3ViamVjdCB0aGF0IGVtaXRzIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWQuICovXG4gIHByb3RlY3RlZCBfZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogUm9sZSB0byB1c2UgaWYgaXQgaGFzbid0IGJlZW4gb3ZlcndyaXR0ZW4gYnkgdGhlIHVzZXIuICovXG4gIHByb3RlY3RlZCBfZGVmYXVsdFJvbGUgPSAncHJlc2VudGF0aW9uJztcblxuICAvKiogQ29tYmluZWQgc3RyZWFtIG9mIGFsbCBvZiB0aGUgY2hpbGQgY2hpcHMnIHJlbW92ZSBldmVudHMuICovXG4gIGdldCBjaGlwRGVzdHJveWVkQ2hhbmdlcygpOiBPYnNlcnZhYmxlPE1hdENoaXBFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlwU3RyZWFtKGNoaXAgPT4gY2hpcC5kZXN0cm95ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBNREMgY2hpcC1zZXQgYWRhcHRlciBpbnRlcmZhY2UuXG4gICAqIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSB0aGUgY2hpcCBzZXQgZm91bmRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBfY2hpcFNldEFkYXB0ZXI6IE1EQ0NoaXBTZXRBZGFwdGVyID0ge1xuICAgIGFubm91bmNlTWVzc2FnZTogbWVzc2FnZSA9PiB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UpLFxuICAgIGVtaXRFdmVudDogKGV2ZW50TmFtZSwgZXZlbnREZXRhaWwpID0+IHtcbiAgICAgIGVtaXRDdXN0b21FdmVudCh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2RvY3VtZW50LCBldmVudE5hbWUsIGV2ZW50RGV0YWlsLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldEF0dHJpYnV0ZTogbmFtZSA9PiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpLFxuICAgIGdldENoaXBBY3Rpb25zQXRJbmRleDogaW5kZXggPT4gdGhpcy5fY2hpcEZvdW5kYXRpb24oaW5kZXgpPy5nZXRBY3Rpb25zKCkgfHwgW10sXG4gICAgZ2V0Q2hpcENvdW50OiAoKSA9PiB0aGlzLl9jaGlwcy5sZW5ndGgsXG4gICAgZ2V0Q2hpcElkQXRJbmRleDogaW5kZXggPT4gdGhpcy5fY2hpcEZvdW5kYXRpb24oaW5kZXgpPy5nZXRFbGVtZW50SUQoKSB8fCAnJyxcbiAgICBnZXRDaGlwSW5kZXhCeUlkOiBpZCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hpcHMudG9BcnJheSgpLmZpbmRJbmRleChjaGlwID0+IGNoaXAuX2dldEZvdW5kYXRpb24oKS5nZXRFbGVtZW50SUQoKSA9PT0gaWQpO1xuICAgIH0sXG4gICAgaXNDaGlwRm9jdXNhYmxlQXRJbmRleDogKGluZGV4LCBhY3Rpb25UeXBlKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hpcEZvdW5kYXRpb24oaW5kZXgpPy5pc0FjdGlvbkZvY3VzYWJsZShhY3Rpb25UeXBlKSB8fCBmYWxzZTtcbiAgICB9LFxuICAgIGlzQ2hpcFNlbGVjdGFibGVBdEluZGV4OiAoaW5kZXgsIGFjdGlvblR5cGUpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGlwRm91bmRhdGlvbihpbmRleCk/LmlzQWN0aW9uU2VsZWN0YWJsZShhY3Rpb25UeXBlKSB8fCBmYWxzZTtcbiAgICB9LFxuICAgIGlzQ2hpcFNlbGVjdGVkQXRJbmRleDogKGluZGV4LCBhY3Rpb25UeXBlKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hpcEZvdW5kYXRpb24oaW5kZXgpPy5pc0FjdGlvblNlbGVjdGVkKGFjdGlvblR5cGUpIHx8IGZhbHNlO1xuICAgIH0sXG4gICAgcmVtb3ZlQ2hpcEF0SW5kZXg6IGluZGV4ID0+IHRoaXMuX2NoaXBzLnRvQXJyYXkoKVtpbmRleF0/LnJlbW92ZSgpLFxuICAgIHNldENoaXBGb2N1c0F0SW5kZXg6IChpbmRleCwgYWN0aW9uLCBiZWhhdmlvcikgPT4ge1xuICAgICAgdGhpcy5fY2hpcEZvdW5kYXRpb24oaW5kZXgpPy5zZXRBY3Rpb25Gb2N1cyhhY3Rpb24sIGJlaGF2aW9yKTtcbiAgICB9LFxuICAgIHNldENoaXBTZWxlY3RlZEF0SW5kZXg6IChpbmRleCwgYWN0aW9uVHlwZSwgaXNTZWxlY3RlZCkgPT4ge1xuICAgICAgLy8gU2V0dGluZyB0aGUgdHJhaWxpbmcgYWN0aW9uIGFzIGRlc2VsZWN0ZWQgZW5kcyB1cCBkZXNlbGVjdGluZyB0aGUgZW50aXJlIGNoaXAuXG4gICAgICAvLyBUaGlzIGlzIHdvcmtpbmcgYXMgZXhwZWN0ZWQsIGJ1dCBpdCdzIG5vdCBzb21ldGhpbmcgd2Ugd2FudCBzbyB3ZSBvbmx5IGFwcGx5IHRoZVxuICAgICAgLy8gc2VsZWN0ZWQgc3RhdGUgdG8gdGhlIHByaW1hcnkgY2hpcC5cbiAgICAgIGlmIChhY3Rpb25UeXBlID09PSBNRENDaGlwQWN0aW9uVHlwZS5QUklNQVJZKSB7XG4gICAgICAgIHRoaXMuX2NoaXBGb3VuZGF0aW9uKGluZGV4KT8uc2V0QWN0aW9uU2VsZWN0ZWQoYWN0aW9uVHlwZSwgaXNTZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdGFydENoaXBBbmltYXRpb25BdEluZGV4OiAoaW5kZXgsIGFuaW1hdGlvbikgPT4ge1xuICAgICAgdGhpcy5fY2hpcEZvdW5kYXRpb24oaW5kZXgpPy5zdGFydEFuaW1hdGlvbihhbmltYXRpb24pO1xuICAgIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcCBmcm9tIGNsYXNzIHRvIHdoZXRoZXIgdGhlIGNsYXNzIGlzIGVuYWJsZWQuXG4gICAqIEVuYWJsZWQgY2xhc3NlcyBhcmUgc2V0IG9uIHRoZSBNREMgY2hpcC1zZXQgZGl2LlxuICAgKi9cbiAgX21kY0NsYXNzZXM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjaGlwIHNldCBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLl9zeW5jQ2hpcHNTdGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0aGUgY2hpcCBsaXN0IGNvbnRhaW5zIGNoaXBzIG9yIG5vdC4gKi9cbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jaGlwcy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKiogVGhlIEFSSUEgcm9sZSBhcHBsaWVkIHRvIHRoZSBjaGlwIHNldC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvbGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX2V4cGxpY2l0Um9sZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cGxpY2l0Um9sZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbXB0eSA/IG51bGwgOiB0aGlzLl9kZWZhdWx0Um9sZTtcbiAgfVxuXG4gIHNldCByb2xlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fZXhwbGljaXRSb2xlID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfZXhwbGljaXRSb2xlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogV2hldGhlciBhbnkgb2YgdGhlIGNoaXBzIGluc2lkZSBvZiB0aGlzIGNoaXAtc2V0IGhhcyBmb2N1cy4gKi9cbiAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZvY3VzZWRDaGlwKCk7XG4gIH1cblxuICAvKiogVGhlIGNoaXBzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBjaGlwIHNldC4gKi9cbiAgQENvbnRlbnRDaGlsZHJlbihNYXRDaGlwLCB7XG4gICAgLy8gV2UgbmVlZCB0byB1c2UgYGRlc2NlbmRhbnRzOiB0cnVlYCwgYmVjYXVzZSBJdnkgd2lsbCBubyBsb25nZXIgbWF0Y2hcbiAgICAvLyBpbmRpcmVjdCBkZXNjZW5kYW50cyBpZiBpdCdzIGxlZnQgYXMgZmFsc2UuXG4gICAgZGVzY2VuZGFudHM6IHRydWUsXG4gIH0pXG4gIF9jaGlwczogUXVlcnlMaXN0PE1hdENoaXA+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2xpdmVBbm5vdW5jZXI6IExpdmVBbm5vdW5jZXIsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSxcbiAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByb3RlY3RlZCBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBzdXBlcihfZWxlbWVudFJlZik7XG4gICAgY29uc3QgZWxlbWVudCA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5fY2hpcFNldEZvdW5kYXRpb24gPSBuZXcgTURDQ2hpcFNldEZvdW5kYXRpb24odGhpcy5fY2hpcFNldEFkYXB0ZXIpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihNRENDaGlwRXZlbnRzLkFOSU1BVElPTiwgdGhpcy5faGFuZGxlQ2hpcEFuaW1hdGlvbik7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKE1EQ0NoaXBFdmVudHMuSU5URVJBQ1RJT04sIHRoaXMuX2hhbmRsZUNoaXBJbnRlcmFjdGlvbik7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKE1EQ0NoaXBFdmVudHMuTkFWSUdBVElPTiwgdGhpcy5faGFuZGxlQ2hpcE5hdmlnYXRpb24pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX2NoaXBTZXRGb3VuZGF0aW9uLmluaXQoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9jaGlwcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIFNpbmNlIHRoaXMgaGFwcGVucyBhZnRlciB0aGUgY29udGVudCBoYXMgYmVlblxuICAgICAgICAvLyBjaGVja2VkLCB3ZSBuZWVkIHRvIGRlZmVyIGl0IHRvIHRoZSBuZXh0IHRpY2suXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3N5bmNDaGlwc1N0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jaGlwRGVzdHJveWVkQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKGV2ZW50OiBNYXRDaGlwRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNoaXAgPSBldmVudC5jaGlwO1xuICAgICAgY29uc3QgY2hpcEluZGV4ID0gdGhpcy5fY2hpcHMudG9BcnJheSgpLmluZGV4T2YoZXZlbnQuY2hpcCk7XG5cbiAgICAgIC8vIEluIGNhc2UgdGhlIGNoaXAgdGhhdCB3aWxsIGJlIHJlbW92ZWQgaXMgY3VycmVudGx5IGZvY3VzZWQsIHdlIHRlbXBvcmFyaWx5IHN0b3JlXG4gICAgICAvLyB0aGUgaW5kZXggaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgc2libGluZyBjaGlwIHRoYXQgd2lsbFxuICAgICAgLy8gcmVjZWl2ZSBmb2N1cy5cbiAgICAgIGlmICh0aGlzLl9pc1ZhbGlkSW5kZXgoY2hpcEluZGV4KSAmJiBjaGlwLl9oYXNGb2N1cygpKSB7XG4gICAgICAgIHRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXggPSBjaGlwSW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihNRENDaGlwRXZlbnRzLkFOSU1BVElPTiwgdGhpcy5faGFuZGxlQ2hpcEFuaW1hdGlvbik7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKE1EQ0NoaXBFdmVudHMuSU5URVJBQ1RJT04sIHRoaXMuX2hhbmRsZUNoaXBJbnRlcmFjdGlvbik7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKE1EQ0NoaXBFdmVudHMuTkFWSUdBVElPTiwgdGhpcy5faGFuZGxlQ2hpcE5hdmlnYXRpb24pO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2hpcFNldEZvdW5kYXRpb24uZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqIENoZWNrcyB3aGV0aGVyIGFueSBvZiB0aGUgY2hpcHMgaXMgZm9jdXNlZC4gKi9cbiAgcHJvdGVjdGVkIF9oYXNGb2N1c2VkQ2hpcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpcHMgJiYgdGhpcy5fY2hpcHMuc29tZShjaGlwID0+IGNoaXAuX2hhc0ZvY3VzKCkpO1xuICB9XG5cbiAgLyoqIFN5bmNzIHRoZSBjaGlwLXNldCdzIHN0YXRlIHdpdGggdGhlIGluZGl2aWR1YWwgY2hpcHMuICovXG4gIHByb3RlY3RlZCBfc3luY0NoaXBzU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2NoaXBzKSB7XG4gICAgICB0aGlzLl9jaGlwcy5mb3JFYWNoKGNoaXAgPT4ge1xuICAgICAgICBjaGlwLmRpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIGNoaXAuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIER1bW15IG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZS4gQmFzZSBjaGlwIHNldCBjYW5ub3QgYmUgZm9jdXNlZC4gKi9cbiAgZm9jdXMoKSB7fVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IHRvIGVuc3VyZSBhbGwgaW5kZXhlcyBhcmUgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gYmUgY2hlY2tlZC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgaW5kZXggaXMgdmFsaWQgZm9yIG91ciBsaXN0IG9mIGNoaXBzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9pc1ZhbGlkSW5kZXgoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5fY2hpcHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIENoZWNrcyB3aGV0aGVyIGFuIGV2ZW50IGNvbWVzIGZyb20gaW5zaWRlIGEgY2hpcCBlbGVtZW50LiAqL1xuICBwcm90ZWN0ZWQgX29yaWdpbmF0ZXNGcm9tQ2hpcChldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tGb3JDbGFzc0luSGllcmFyY2h5KGV2ZW50LCAnbWRjLWV2b2x1dGlvbi1jaGlwJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYHRhYmluZGV4YCBmcm9tIHRoZSBjaGlwIGdyaWQgYW5kIHJlc2V0cyBpdCBiYWNrIGFmdGVyd2FyZHMsIGFsbG93aW5nIHRoZVxuICAgKiB1c2VyIHRvIHRhYiBvdXQgb2YgaXQuIFRoaXMgcHJldmVudHMgdGhlIGdyaWQgZnJvbSBjYXB0dXJpbmcgZm9jdXMgYW5kIHJlZGlyZWN0aW5nXG4gICAqIGl0IGJhY2sgdG8gdGhlIGZpcnN0IGNoaXAsIGNyZWF0aW5nIGEgZm9jdXMgdHJhcCwgaWYgaXQgdXNlciB0cmllcyB0byB0YWIgYXdheS5cbiAgICovXG4gIHByb3RlY3RlZCBfYWxsb3dGb2N1c0VzY2FwZSgpIHtcbiAgICBjb25zdCBwcmV2aW91c1RhYkluZGV4ID0gdGhpcy50YWJJbmRleDtcblxuICAgIGlmICh0aGlzLnRhYkluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy50YWJJbmRleCA9IC0xO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IHByZXZpb3VzVGFiSW5kZXg7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzdHJlYW0gb2YgZXZlbnRzIGZyb20gYWxsIHRoZSBjaGlwcyB3aXRoaW4gdGhlIHNldC5cbiAgICogVGhlIHN0cmVhbSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jb3Jwb3JhdGUgYW55IG5ld2x5LWFkZGVkIGNoaXBzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRDaGlwU3RyZWFtPFQsIEMgZXh0ZW5kcyBNYXRDaGlwID0gTWF0Q2hpcD4oXG4gICAgbWFwcGluZ0Z1bmN0aW9uOiAoY2hpcDogQykgPT4gT2JzZXJ2YWJsZTxUPixcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaXBzLmNoYW5nZXMucGlwZShcbiAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBtZXJnZSguLi4odGhpcy5fY2hpcHMgYXMgUXVlcnlMaXN0PEM+KS5tYXAobWFwcGluZ0Z1bmN0aW9uKSkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NoZWNrRm9yQ2xhc3NJbkhpZXJhcmNoeShldmVudDogRXZlbnQsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAvLyBOdWxsIGNoZWNrIHRoZSBjbGFzc0xpc3QsIGJlY2F1c2UgSUUgYW5kIEVkZ2UgZG9uJ3Qgc3VwcG9ydCBpdCBvbiBhbGwgZWxlbWVudHMuXG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0ICYmIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hpcEZvdW5kYXRpb24oaW5kZXg6IG51bWJlcik6IE1EQ0NoaXBGb3VuZGF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpcHMudG9BcnJheSgpW2luZGV4XT8uX2dldEZvdW5kYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNoaXBBbmltYXRpb24gPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgdGhpcy5fY2hpcFNldEZvdW5kYXRpb24uaGFuZGxlQ2hpcEFuaW1hdGlvbihldmVudCBhcyBDaGlwQW5pbWF0aW9uRXZlbnQpO1xuICB9O1xuXG4gIHByaXZhdGUgX2hhbmRsZUNoaXBJbnRlcmFjdGlvbiA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICB0aGlzLl9jaGlwU2V0Rm91bmRhdGlvbi5oYW5kbGVDaGlwSW50ZXJhY3Rpb24oZXZlbnQgYXMgQ2hpcEludGVyYWN0aW9uRXZlbnQpO1xuICB9O1xuXG4gIHByaXZhdGUgX2hhbmRsZUNoaXBOYXZpZ2F0aW9uID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIHRoaXMuX2NoaXBTZXRGb3VuZGF0aW9uLmhhbmRsZUNoaXBOYXZpZ2F0aW9uKGV2ZW50IGFzIENoaXBOYXZpZ2F0aW9uRXZlbnQpO1xuICB9O1xufVxuIl19
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1zZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwtZXhwZXJpbWVudGFsL21kYy1jaGlwcy9jaGlwLXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBZSxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLEtBQUssRUFFTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsYUFBYSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFDLEtBQUssRUFBYyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBZSxNQUFNLFFBQVEsQ0FBQzs7O0FBRzdDOzs7R0FHRztBQUNILE1BQWUsY0FBYztJQUUzQixZQUFZLFdBQXVCLElBQUcsQ0FBQztDQUN4QztBQUNELE1BQU0sb0JBQW9CLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTNEOzs7O0dBSUc7QUFpQkgsTUFBTSxPQUFPLFVBQ1gsU0FBUSxvQkFBb0I7SUF3RTVCLFlBQ1ksV0FBb0MsRUFDcEMsa0JBQXFDLEVBQzNCLElBQW9CO1FBRXhDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUpULGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyx1QkFBa0IsR0FB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S0FBSyxDQUFDLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDZDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7aUJBQzFDO2FBQ0Y7aUJBQU07Z0JBQ0wsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3JCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNkO1FBRUQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQztJQUM3QyxDQUFDOzs0R0F4UVUsVUFBVTtnR0FBVixVQUFVLHlSQStESixPQUFPLHVFQTdFZDs7OztHQUlUO2dHQVVVLFVBQVU7a0JBaEJ0QixTQUFTOytCQUNFLGNBQWMsWUFDZDs7OztHQUlULFFBRUs7d0JBQ0osT0FBTyxFQUFFLHlDQUF5Qzt3QkFDbEQsV0FBVyxFQUFFLHdCQUF3Qjt3QkFDckMsYUFBYSxFQUFFLE1BQU07cUJBQ3RCLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07OzBCQThFNUMsUUFBUTs0Q0FoRFAsUUFBUTtzQkFEWCxLQUFLO2dCQWlCRixJQUFJO3NCQURQLEtBQUs7Z0JBeUJOLE1BQU07c0JBTEwsZUFBZTt1QkFBQyxPQUFPLEVBQUU7d0JBQ3hCLHVFQUF1RTt3QkFDdkUsOENBQThDO3dCQUM5QyxXQUFXLEVBQUUsSUFBSTtxQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtGb2N1c0tleU1hbmFnZXJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7Qm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0hhc1RhYkluZGV4LCBtaXhpblRhYkluZGV4fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1leHBlcmltZW50YWwvbWRjLWNvcmUnO1xuaW1wb3J0IHttZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3N0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWF0Q2hpcCwgTWF0Q2hpcEV2ZW50fSBmcm9tICcuL2NoaXAnO1xuaW1wb3J0IHtNYXRDaGlwQWN0aW9ufSBmcm9tICcuL2NoaXAtYWN0aW9uJztcblxuLyoqXG4gKiBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdENoaXBTZXQuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmFic3RyYWN0IGNsYXNzIE1hdENoaXBTZXRCYXNlIHtcbiAgYWJzdHJhY3QgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxufVxuY29uc3QgX01hdENoaXBTZXRNaXhpbkJhc2UgPSBtaXhpblRhYkluZGV4KE1hdENoaXBTZXRCYXNlKTtcblxuLyoqXG4gKiBCYXNpYyBjb250YWluZXIgY29tcG9uZW50IGZvciB0aGUgTWF0Q2hpcCBjb21wb25lbnQuXG4gKlxuICogRXh0ZW5kZWQgYnkgTWF0Q2hpcExpc3Rib3ggYW5kIE1hdENoaXBHcmlkIGZvciBkaWZmZXJlbnQgaW50ZXJhY3Rpb24gcGF0dGVybnMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1jaGlwLXNldCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gY2xhc3M9XCJtZGMtZXZvbHV0aW9uLWNoaXAtc2V0X19jaGlwc1wiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3NwYW4+XG4gIGAsXG4gIHN0eWxlVXJsczogWydjaGlwLXNldC5jc3MnXSxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdtYXQtbWRjLWNoaXAtc2V0IG1kYy1ldm9sdXRpb24tY2hpcC1zZXQnLFxuICAgICcoa2V5ZG93biknOiAnX2hhbmRsZUtleWRvd24oJGV2ZW50KScsXG4gICAgJ1thdHRyLnJvbGVdJzogJ3JvbGUnLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0Q2hpcFNldFxuICBleHRlbmRzIF9NYXRDaGlwU2V0TWl4aW5CYXNlXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgSGFzVGFiSW5kZXgsIE9uRGVzdHJveVxue1xuICAvKiogSW5kZXggb2YgdGhlIGxhc3QgZGVzdHJveWVkIGNoaXAgdGhhdCBoYWQgZm9jdXMuICovXG4gIHByaXZhdGUgX2xhc3REZXN0cm95ZWRGb2N1c2VkQ2hpcEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlZCB0byBtYW5hZ2UgZm9jdXMgd2l0aGluIHRoZSBjaGlwIGxpc3QuICovXG4gIHByb3RlY3RlZCBfa2V5TWFuYWdlcjogRm9jdXNLZXlNYW5hZ2VyPE1hdENoaXBBY3Rpb24+O1xuXG4gIC8qKiBTdWJqZWN0IHRoYXQgZW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGRlc3Ryb3llZC4gKi9cbiAgcHJvdGVjdGVkIF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBSb2xlIHRvIHVzZSBpZiBpdCBoYXNuJ3QgYmVlbiBvdmVyd3JpdHRlbiBieSB0aGUgdXNlci4gKi9cbiAgcHJvdGVjdGVkIF9kZWZhdWx0Um9sZSA9ICdwcmVzZW50YXRpb24nO1xuXG4gIC8qKiBDb21iaW5lZCBzdHJlYW0gb2YgYWxsIG9mIHRoZSBjaGlsZCBjaGlwcycgZm9jdXMgZXZlbnRzLiAqL1xuICBnZXQgY2hpcEZvY3VzQ2hhbmdlcygpOiBPYnNlcnZhYmxlPE1hdENoaXBFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlwU3RyZWFtKGNoaXAgPT4gY2hpcC5fb25Gb2N1cyk7XG4gIH1cblxuICAvKiogQ29tYmluZWQgc3RyZWFtIG9mIGFsbCBvZiB0aGUgY2hpbGQgY2hpcHMnIHJlbW92ZSBldmVudHMuICovXG4gIGdldCBjaGlwRGVzdHJveWVkQ2hhbmdlcygpOiBPYnNlcnZhYmxlPE1hdENoaXBFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlwU3RyZWFtKGNoaXAgPT4gY2hpcC5kZXN0cm95ZWQpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNoaXAgc2V0IGlzIGRpc2FibGVkLiAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuX3N5bmNDaGlwc1N0YXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjaGlwIGxpc3QgY29udGFpbnMgY2hpcHMgb3Igbm90LiAqL1xuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaXBzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIC8qKiBUaGUgQVJJQSByb2xlIGFwcGxpZWQgdG8gdGhlIGNoaXAgc2V0LiAqL1xuICBASW5wdXQoKVxuICBnZXQgcm9sZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fZXhwbGljaXRSb2xlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwbGljaXRSb2xlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVtcHR5ID8gbnVsbCA6IHRoaXMuX2RlZmF1bHRSb2xlO1xuICB9XG5cbiAgc2V0IHJvbGUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9leHBsaWNpdFJvbGUgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9leHBsaWNpdFJvbGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIGFueSBvZiB0aGUgY2hpcHMgaW5zaWRlIG9mIHRoaXMgY2hpcC1zZXQgaGFzIGZvY3VzLiAqL1xuICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFzRm9jdXNlZENoaXAoKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2hpcHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIGNoaXAgc2V0LiAqL1xuICBAQ29udGVudENoaWxkcmVuKE1hdENoaXAsIHtcbiAgICAvLyBXZSBuZWVkIHRvIHVzZSBgZGVzY2VuZGFudHM6IHRydWVgLCBiZWNhdXNlIEl2eSB3aWxsIG5vIGxvbmdlciBtYXRjaFxuICAgIC8vIGluZGlyZWN0IGRlc2NlbmRhbnRzIGlmIGl0J3MgbGVmdCBhcyBmYWxzZS5cbiAgICBkZXNjZW5kYW50czogdHJ1ZSxcbiAgfSlcbiAgX2NoaXBzOiBRdWVyeUxpc3Q8TWF0Q2hpcD47XG5cbiAgLyoqIEZsYXQgbGlzdCBvZiBhbGwgdGhlIGFjdGlvbnMgY29udGFpbmVkIHdpdGhpbiB0aGUgY2hpcHMuICovXG4gIF9jaGlwQWN0aW9ucyA9IG5ldyBRdWVyeUxpc3Q8TWF0Q2hpcEFjdGlvbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByb3RlY3RlZCBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2RpcjogRGlyZWN0aW9uYWxpdHksXG4gICkge1xuICAgIHN1cGVyKF9lbGVtZW50UmVmKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9zZXRVcEZvY3VzTWFuYWdlbWVudCgpO1xuICAgIHRoaXMuX3RyYWNrQ2hpcFNldENoYW5nZXMoKTtcbiAgICB0aGlzLl90cmFja0Rlc3Ryb3llZEZvY3VzZWRDaGlwKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9jaGlwQWN0aW9ucy5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBDaGVja3Mgd2hldGhlciBhbnkgb2YgdGhlIGNoaXBzIGlzIGZvY3VzZWQuICovXG4gIHByb3RlY3RlZCBfaGFzRm9jdXNlZENoaXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaXBzICYmIHRoaXMuX2NoaXBzLnNvbWUoY2hpcCA9PiBjaGlwLl9oYXNGb2N1cygpKTtcbiAgfVxuXG4gIC8qKiBTeW5jcyB0aGUgY2hpcC1zZXQncyBzdGF0ZSB3aXRoIHRoZSBpbmRpdmlkdWFsIGNoaXBzLiAqL1xuICBwcm90ZWN0ZWQgX3N5bmNDaGlwc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLl9jaGlwcykge1xuICAgICAgdGhpcy5fY2hpcHMuZm9yRWFjaChjaGlwID0+IHtcbiAgICAgICAgY2hpcC5kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBjaGlwLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEdW1teSBtZXRob2QgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUuIEJhc2UgY2hpcCBzZXQgY2Fubm90IGJlIGZvY3VzZWQuICovXG4gIGZvY3VzKCkge31cblxuICAvKiogSGFuZGxlcyBrZXlib2FyZCBldmVudHMgb24gdGhlIGNoaXAgc2V0LiAqL1xuICBfaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLl9vcmlnaW5hdGVzRnJvbUNoaXAoZXZlbnQpKSB7XG4gICAgICB0aGlzLl9rZXlNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgdG8gZW5zdXJlIGFsbCBpbmRleGVzIGFyZSB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBiZSBjaGVja2VkLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpbmRleCBpcyB2YWxpZCBmb3Igb3VyIGxpc3Qgb2YgY2hpcHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2lzVmFsaWRJbmRleChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9jaGlwcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYHRhYmluZGV4YCBmcm9tIHRoZSBjaGlwIGdyaWQgYW5kIHJlc2V0cyBpdCBiYWNrIGFmdGVyd2FyZHMsIGFsbG93aW5nIHRoZVxuICAgKiB1c2VyIHRvIHRhYiBvdXQgb2YgaXQuIFRoaXMgcHJldmVudHMgdGhlIGdyaWQgZnJvbSBjYXB0dXJpbmcgZm9jdXMgYW5kIHJlZGlyZWN0aW5nXG4gICAqIGl0IGJhY2sgdG8gdGhlIGZpcnN0IGNoaXAsIGNyZWF0aW5nIGEgZm9jdXMgdHJhcCwgaWYgaXQgdXNlciB0cmllcyB0byB0YWIgYXdheS5cbiAgICovXG4gIHByb3RlY3RlZCBfYWxsb3dGb2N1c0VzY2FwZSgpIHtcbiAgICBjb25zdCBwcmV2aW91c1RhYkluZGV4ID0gdGhpcy50YWJJbmRleDtcblxuICAgIGlmICh0aGlzLnRhYkluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy50YWJJbmRleCA9IC0xO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IHByZXZpb3VzVGFiSW5kZXg7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzdHJlYW0gb2YgZXZlbnRzIGZyb20gYWxsIHRoZSBjaGlwcyB3aXRoaW4gdGhlIHNldC5cbiAgICogVGhlIHN0cmVhbSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jb3Jwb3JhdGUgYW55IG5ld2x5LWFkZGVkIGNoaXBzLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRDaGlwU3RyZWFtPFQsIEMgZXh0ZW5kcyBNYXRDaGlwID0gTWF0Q2hpcD4oXG4gICAgbWFwcGluZ0Z1bmN0aW9uOiAoY2hpcDogQykgPT4gT2JzZXJ2YWJsZTxUPixcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaXBzLmNoYW5nZXMucGlwZShcbiAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBtZXJnZSguLi4odGhpcy5fY2hpcHMgYXMgUXVlcnlMaXN0PEM+KS5tYXAobWFwcGluZ0Z1bmN0aW9uKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogQ2hlY2tzIHdoZXRoZXIgYW4gZXZlbnQgY29tZXMgZnJvbSBpbnNpZGUgYSBjaGlwIGVsZW1lbnQuICovXG4gIHByb3RlY3RlZCBfb3JpZ2luYXRlc0Zyb21DaGlwKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgLy8gTnVsbCBjaGVjayB0aGUgY2xhc3NMaXN0LCBiZWNhdXNlIElFIGFuZCBFZGdlIGRvbid0IHN1cHBvcnQgaXQgb24gYWxsIGVsZW1lbnRzLlxuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdCAmJiBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21kYy1ldm9sdXRpb24tY2hpcCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogU2V0cyB1cCB0aGUgY2hpcCBzZXQncyBmb2N1cyBtYW5hZ2VtZW50IGxvZ2ljLiAqL1xuICBwcml2YXRlIF9zZXRVcEZvY3VzTWFuYWdlbWVudCgpIHtcbiAgICAvLyBDcmVhdGUgYSBmbGF0IGBRdWVyeUxpc3RgIGNvbnRhaW5pbmcgdGhlIGFjdGlvbnMgb2YgYWxsIG9mIHRoZSBjaGlwcy5cbiAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBuYXZpZ2F0ZSBib3RoIHdpdGhpbiB0aGUgY2hpcCBhbmQgbW92ZSB0byB0aGUgbmV4dC9wcmV2aW91c1xuICAgIC8vIG9uZSB1c2luZyB0aGUgZXhpc3RpbmcgYExpc3RLZXlNYW5hZ2VyYC5cbiAgICB0aGlzLl9jaGlwcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuX2NoaXBzKSkuc3Vic2NyaWJlKChjaGlwczogUXVlcnlMaXN0PE1hdENoaXA+KSA9PiB7XG4gICAgICBjb25zdCBhY3Rpb25zOiBNYXRDaGlwQWN0aW9uW10gPSBbXTtcbiAgICAgIGNoaXBzLmZvckVhY2goY2hpcCA9PiBjaGlwLl9nZXRBY3Rpb25zKCkuZm9yRWFjaChhY3Rpb24gPT4gYWN0aW9ucy5wdXNoKGFjdGlvbikpKTtcbiAgICAgIHRoaXMuX2NoaXBBY3Rpb25zLnJlc2V0KGFjdGlvbnMpO1xuICAgICAgdGhpcy5fY2hpcEFjdGlvbnMubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLl9jaGlwQWN0aW9ucylcbiAgICAgIC53aXRoVmVydGljYWxPcmllbnRhdGlvbigpXG4gICAgICAud2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0aGlzLl9kaXIgPyB0aGlzLl9kaXIudmFsdWUgOiAnbHRyJylcbiAgICAgIC53aXRoSG9tZUFuZEVuZCgpXG4gICAgICAvLyBTa2lwIG5vbi1pbnRlcmFjdGl2ZSBhbmQgZGlzYWJsZWQgYWN0aW9ucyBzaW5jZSB0aGUgdXNlciBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZW0uXG4gICAgICAuc2tpcFByZWRpY2F0ZShhY3Rpb24gPT4gIWFjdGlvbi5pc0ludGVyYWN0aXZlIHx8IGFjdGlvbi5kaXNhYmxlZCk7XG5cbiAgICAvLyBLZWVwIHRoZSBtYW5hZ2VyIGFjdGl2ZSBpbmRleCBpbiBzeW5jIHNvIHRoYXQgbmF2aWdhdGlvbiBwaWNrc1xuICAgIC8vIHVwIGZyb20gdGhlIGN1cnJlbnQgY2hpcCBpZiB0aGUgdXNlciBjbGlja3MgaW50byB0aGUgbGlzdCBkaXJlY3RseS5cbiAgICB0aGlzLmNoaXBGb2N1c0NoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh7Y2hpcH0pID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNoaXAuX2dldFNvdXJjZUFjdGlvbihkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEVsZW1lbnQpO1xuXG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbShhY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fZGlyPy5jaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZShkaXJlY3Rpb24gPT4gdGhpcy5fa2V5TWFuYWdlci53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKGRpcmVjdGlvbikpO1xuICB9XG5cbiAgLyoqIExpc3RlbnMgdG8gY2hhbmdlcyBpbiB0aGUgY2hpcCBzZXQgYW5kIHN5bmNzIHVwIHRoZSBzdGF0ZSBvZiB0aGUgaW5kaXZpZHVhbCBjaGlwcy4gKi9cbiAgcHJpdmF0ZSBfdHJhY2tDaGlwU2V0Q2hhbmdlcygpIHtcbiAgICB0aGlzLl9jaGlwcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIFNpbmNlIHRoaXMgaGFwcGVucyBhZnRlciB0aGUgY29udGVudCBoYXMgYmVlblxuICAgICAgICAvLyBjaGVja2VkLCB3ZSBuZWVkIHRvIGRlZmVyIGl0IHRvIHRoZSBuZXh0IHRpY2suXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5fc3luY0NoaXBzU3RhdGUoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlZGlyZWN0RGVzdHJveWVkQ2hpcEZvY3VzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU3RhcnRzIHRyYWNraW5nIHRoZSBkZXN0cm95ZWQgY2hpcHMgaW4gb3JkZXIgdG8gY2FwdHVyZSB0aGUgZm9jdXNlZCBvbmUuICovXG4gIHByaXZhdGUgX3RyYWNrRGVzdHJveWVkRm9jdXNlZENoaXAoKSB7XG4gICAgdGhpcy5jaGlwRGVzdHJveWVkQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKGV2ZW50OiBNYXRDaGlwRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNoaXBBcnJheSA9IHRoaXMuX2NoaXBzLnRvQXJyYXkoKTtcbiAgICAgIGNvbnN0IGNoaXBJbmRleCA9IGNoaXBBcnJheS5pbmRleE9mKGV2ZW50LmNoaXApO1xuXG4gICAgICAvLyBJZiB0aGUgZm9jdXNlZCBjaGlwIGlzIGRlc3Ryb3llZCwgc2F2ZSBpdHMgaW5kZXggc28gdGhhdCB3ZSBjYW4gbW92ZSBmb2N1cyB0byB0aGUgbmV4dFxuICAgICAgLy8gY2hpcC4gV2Ugb25seSBzYXZlIHRoZSBpbmRleCBoZXJlLCByYXRoZXIgdGhhbiBtb3ZlIHRoZSBmb2N1cyBpbW1lZGlhdGVseSwgYmVjYXVzZSB3ZSB3YW50XG4gICAgICAvLyB0byB3YWl0IHVudGlsIHRoZSBjaGlwIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2hpcCBsaXN0IGJlZm9yZSBmb2N1c2luZyB0aGUgbmV4dCBvbmUuIFRoaXNcbiAgICAgIC8vIGFsbG93cyB1cyB0byBrZWVwIGZvY3VzIG9uIHRoZSBzYW1lIGluZGV4IGlmIHRoZSBjaGlwIGdldHMgc3dhcHBlZCBvdXQuXG4gICAgICBpZiAodGhpcy5faXNWYWxpZEluZGV4KGNoaXBJbmRleCkgJiYgZXZlbnQuY2hpcC5faGFzRm9jdXMoKSkge1xuICAgICAgICB0aGlzLl9sYXN0RGVzdHJveWVkRm9jdXNlZENoaXBJbmRleCA9IGNoaXBJbmRleDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgbmV4dCBhcHByb3ByaWF0ZSBjaGlwIHRvIG1vdmUgZm9jdXMgdG8sXG4gICAqIGlmIHRoZSBjdXJyZW50bHktZm9jdXNlZCBjaGlwIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHByaXZhdGUgX3JlZGlyZWN0RGVzdHJveWVkQ2hpcEZvY3VzKCkge1xuICAgIGlmICh0aGlzLl9sYXN0RGVzdHJveWVkRm9jdXNlZENoaXBJbmRleCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NoaXBzLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmV3SW5kZXggPSBNYXRoLm1pbih0aGlzLl9sYXN0RGVzdHJveWVkRm9jdXNlZENoaXBJbmRleCwgdGhpcy5fY2hpcHMubGVuZ3RoIC0gMSk7XG4gICAgICBjb25zdCBjaGlwVG9Gb2N1cyA9IHRoaXMuX2NoaXBzLnRvQXJyYXkoKVtuZXdJbmRleF07XG5cbiAgICAgIGlmIChjaGlwVG9Gb2N1cy5kaXNhYmxlZCkge1xuICAgICAgICAvLyBJZiB3ZSdyZSBkb3duIHRvIG9uZSBkaXNhYmxlZCBjaGlwLCBtb3ZlIGZvY3VzIGJhY2sgdG8gdGhlIHNldC5cbiAgICAgICAgaWYgKHRoaXMuX2NoaXBzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlwVG9Gb2N1cy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdERlc3Ryb3llZEZvY3VzZWRDaGlwSW5kZXggPSBudWxsO1xuICB9XG59XG4iXX0=