@angular/material 18.0.3 → 18.0.5

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 (136) hide show
  1. package/autocomplete/index.d.ts +3 -0
  2. package/bottom-sheet/index.d.ts +0 -1
  3. package/button/_button-base.scss +3 -1
  4. package/button/index.d.ts +7 -1
  5. package/button-toggle/index.d.ts +2 -2
  6. package/checkbox/index.d.ts +5 -3
  7. package/chips/index.d.ts +9 -5
  8. package/core/_core-theme.scss +8 -14
  9. package/core/_core.scss +18 -4
  10. package/core/style/_vendor-prefixes.scss +5 -0
  11. package/core/tokens/_density.scss +2 -1
  12. package/core/tokens/m2/_index.scss +2 -2
  13. package/core/tokens/m2/mat/_app.scss +13 -1
  14. package/core/tokens/m2/mat/_menu.scss +3 -0
  15. package/core/tokens/m2/mat/_paginator.scss +1 -0
  16. package/core/tokens/m2/mdc/{_tab.scss → _secondary-navigation-tab.scss} +1 -1
  17. package/core/tokens/m3/_index.scss +2 -2
  18. package/core/tokens/m3/mat/_app.scss +9 -0
  19. package/core/tokens/m3/mat/_menu.scss +3 -0
  20. package/core/tokens/m3/mdc/{_tab.scss → _secondary-navigation-tab.scss} +1 -1
  21. package/datepicker/index.d.ts +17 -1
  22. package/esm2022/autocomplete/autocomplete-trigger.mjs +28 -1
  23. package/esm2022/bottom-sheet/bottom-sheet-container.mjs +6 -7
  24. package/esm2022/button/button-base.mjs +1 -1
  25. package/esm2022/button/button.mjs +4 -4
  26. package/esm2022/button/fab.mjs +8 -8
  27. package/esm2022/button/icon-button.mjs +4 -4
  28. package/esm2022/button-toggle/button-toggle.mjs +30 -21
  29. package/esm2022/checkbox/checkbox.mjs +1 -1
  30. package/esm2022/chips/chip-grid.mjs +11 -4
  31. package/esm2022/chips/chip-row.mjs +8 -13
  32. package/esm2022/chips/chip-set.mjs +7 -3
  33. package/esm2022/chips/chip.mjs +1 -1
  34. package/esm2022/core/option/optgroup.mjs +2 -2
  35. package/esm2022/core/option/option.mjs +3 -3
  36. package/esm2022/core/version.mjs +1 -1
  37. package/esm2022/datepicker/calendar.mjs +6 -3
  38. package/esm2022/datepicker/date-range-input-parts.mjs +14 -10
  39. package/esm2022/datepicker/date-range-input.mjs +17 -7
  40. package/esm2022/datepicker/datepicker-base.mjs +5 -1
  41. package/esm2022/datepicker/datepicker-input.mjs +16 -5
  42. package/esm2022/form-field/form-field.mjs +12 -6
  43. package/esm2022/icon/icon.mjs +8 -2
  44. package/esm2022/list/list-option.mjs +10 -4
  45. package/esm2022/list/selection-list.mjs +9 -2
  46. package/esm2022/menu/menu.mjs +13 -4
  47. package/esm2022/paginator/paginator.mjs +3 -3
  48. package/esm2022/progress-bar/progress-bar.mjs +10 -4
  49. package/esm2022/progress-spinner/progress-spinner.mjs +8 -2
  50. package/esm2022/radio/radio.mjs +12 -6
  51. package/esm2022/sidenav/drawer.mjs +4 -1
  52. package/esm2022/slide-toggle/slide-toggle-config.mjs +1 -1
  53. package/esm2022/slide-toggle/slide-toggle.mjs +1 -1
  54. package/esm2022/slider/slider.mjs +1 -1
  55. package/esm2022/stepper/step-header.mjs +1 -1
  56. package/esm2022/stepper/stepper.mjs +1 -1
  57. package/esm2022/tabs/tab-group.mjs +9 -4
  58. package/esm2022/tabs/tab-header.mjs +3 -3
  59. package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +19 -7
  60. package/esm2022/toolbar/toolbar.mjs +1 -1
  61. package/esm2022/tooltip/tooltip.mjs +3 -3
  62. package/fesm2022/autocomplete.mjs +27 -0
  63. package/fesm2022/autocomplete.mjs.map +1 -1
  64. package/fesm2022/bottom-sheet.mjs +5 -6
  65. package/fesm2022/bottom-sheet.mjs.map +1 -1
  66. package/fesm2022/button-toggle.mjs +29 -20
  67. package/fesm2022/button-toggle.mjs.map +1 -1
  68. package/fesm2022/button.mjs +16 -16
  69. package/fesm2022/button.mjs.map +1 -1
  70. package/fesm2022/checkbox.mjs.map +1 -1
  71. package/fesm2022/chips.mjs +15 -9
  72. package/fesm2022/chips.mjs.map +1 -1
  73. package/fesm2022/core.mjs +5 -5
  74. package/fesm2022/core.mjs.map +1 -1
  75. package/fesm2022/datepicker.mjs +42 -10
  76. package/fesm2022/datepicker.mjs.map +1 -1
  77. package/fesm2022/form-field.mjs +9 -3
  78. package/fesm2022/form-field.mjs.map +1 -1
  79. package/fesm2022/icon.mjs +7 -1
  80. package/fesm2022/icon.mjs.map +1 -1
  81. package/fesm2022/list.mjs +17 -4
  82. package/fesm2022/list.mjs.map +1 -1
  83. package/fesm2022/menu.mjs +12 -3
  84. package/fesm2022/menu.mjs.map +1 -1
  85. package/fesm2022/paginator.mjs +2 -2
  86. package/fesm2022/paginator.mjs.map +1 -1
  87. package/fesm2022/progress-bar.mjs +9 -3
  88. package/fesm2022/progress-bar.mjs.map +1 -1
  89. package/fesm2022/progress-spinner.mjs +7 -1
  90. package/fesm2022/progress-spinner.mjs.map +1 -1
  91. package/fesm2022/radio.mjs +11 -5
  92. package/fesm2022/radio.mjs.map +1 -1
  93. package/fesm2022/sidenav.mjs +4 -1
  94. package/fesm2022/sidenav.mjs.map +1 -1
  95. package/fesm2022/slide-toggle.mjs.map +1 -1
  96. package/fesm2022/slider.mjs.map +1 -1
  97. package/fesm2022/stepper.mjs.map +1 -1
  98. package/fesm2022/tabs.mjs +28 -11
  99. package/fesm2022/tabs.mjs.map +1 -1
  100. package/fesm2022/toolbar.mjs.map +1 -1
  101. package/fesm2022/tooltip.mjs +2 -2
  102. package/fesm2022/tooltip.mjs.map +1 -1
  103. package/form-field/index.d.ts +12 -2
  104. package/icon/index.d.ts +14 -2
  105. package/list/_list-theme.scss +8 -5
  106. package/list/index.d.ts +15 -2
  107. package/package.json +2 -2
  108. package/paginator/index.d.ts +7 -1
  109. package/prebuilt-themes/azure-blue.css +1 -1
  110. package/prebuilt-themes/cyan-orange.css +1 -1
  111. package/prebuilt-themes/deeppurple-amber.css +1 -1
  112. package/prebuilt-themes/indigo-pink.css +1 -1
  113. package/prebuilt-themes/magenta-violet.css +1 -1
  114. package/prebuilt-themes/pink-bluegrey.css +1 -1
  115. package/prebuilt-themes/purple-green.css +1 -1
  116. package/prebuilt-themes/rose-red.css +1 -1
  117. package/progress-bar/_progress-bar-theme.scss +10 -7
  118. package/progress-bar/index.d.ts +14 -2
  119. package/progress-spinner/index.d.ts +14 -2
  120. package/radio/_radio-common.scss +238 -0
  121. package/radio/_radio-theme.scss +25 -32
  122. package/radio/index.d.ts +21 -2
  123. package/schematics/ng-add/index.js +1 -1
  124. package/schematics/ng-add/index.mjs +1 -1
  125. package/schematics/ng-generate/m3-theme/index_bundled.js +2 -2
  126. package/schematics/ng-generate/table/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template +1 -1
  127. package/schematics/ng-update/index_bundled.js +31 -31
  128. package/sidenav/index.d.ts +1 -0
  129. package/slide-toggle/index.d.ts +14 -2
  130. package/slider/index.d.ts +7 -1
  131. package/stepper/index.d.ts +21 -3
  132. package/tabs/_tabs-common.scss +94 -36
  133. package/tabs/_tabs-theme.scss +33 -25
  134. package/tabs/index.d.ts +27 -4
  135. package/toolbar/index.d.ts +7 -1
  136. package/tooltip/_tooltip-theme.scss +18 -16
@@ -5,7 +5,7 @@
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 { Directive, ElementRef, forwardRef, Inject, Input, Optional } from '@angular/core';
8
+ import { Directive, ElementRef, forwardRef, Inject, Input, Optional, signal, } from '@angular/core';
9
9
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
10
10
  import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
11
11
  import { MAT_FORM_FIELD } from '@angular/material/form-field';
@@ -32,7 +32,14 @@ export class MatDatepickerInput extends MatDatepickerInputBase {
32
32
  set matDatepicker(datepicker) {
33
33
  if (datepicker) {
34
34
  this._datepicker = datepicker;
35
- this._closedSubscription = datepicker.closedStream.subscribe(() => this._onTouched());
35
+ this._ariaOwns.set(datepicker.opened ? datepicker.id : null);
36
+ this._closedSubscription = datepicker.closedStream.subscribe(() => {
37
+ this._onTouched();
38
+ this._ariaOwns.set(null);
39
+ });
40
+ this._openedSubscription = datepicker.openedStream.subscribe(() => {
41
+ this._ariaOwns.set(datepicker.id);
42
+ });
36
43
  this._registerModel(datepicker.registerInput(this));
37
44
  }
38
45
  }
@@ -73,6 +80,9 @@ export class MatDatepickerInput extends MatDatepickerInputBase {
73
80
  super(elementRef, dateAdapter, dateFormats);
74
81
  this._formField = _formField;
75
82
  this._closedSubscription = Subscription.EMPTY;
83
+ this._openedSubscription = Subscription.EMPTY;
84
+ /** The id of the panel owned by this input. */
85
+ this._ariaOwns = signal(null);
76
86
  this._validator = Validators.compose(super._getValidators());
77
87
  }
78
88
  /**
@@ -100,6 +110,7 @@ export class MatDatepickerInput extends MatDatepickerInputBase {
100
110
  ngOnDestroy() {
101
111
  super.ngOnDestroy();
102
112
  this._closedSubscription.unsubscribe();
113
+ this._openedSubscription.unsubscribe();
103
114
  }
104
115
  /** Opens the associated datepicker. */
105
116
  _openPopup() {
@@ -131,7 +142,7 @@ export class MatDatepickerInput extends MatDatepickerInputBase {
131
142
  return event.source !== this;
132
143
  }
133
144
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: MatDatepickerInput, deps: [{ token: i0.ElementRef }, { token: i1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }, { token: MAT_FORM_FIELD, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
134
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0", type: MatDatepickerInput, isStandalone: true, selector: "input[matDatepicker]", inputs: { matDatepicker: "matDatepicker", min: "min", max: "max", dateFilter: ["matDatepickerFilter", "dateFilter"] }, host: { listeners: { "input": "_onInput($event.target.value)", "change": "_onChange()", "blur": "_onBlur()", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-haspopup": "_datepicker ? \"dialog\" : null", "attr.aria-owns": "(_datepicker?.opened && _datepicker.id) || null", "attr.min": "min ? _dateAdapter.toIso8601(min) : null", "attr.max": "max ? _dateAdapter.toIso8601(max) : null", "attr.data-mat-calendar": "_datepicker ? _datepicker.id : null", "disabled": "disabled" }, classAttribute: "mat-datepicker-input" }, providers: [
145
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.0", type: MatDatepickerInput, isStandalone: true, selector: "input[matDatepicker]", inputs: { matDatepicker: "matDatepicker", min: "min", max: "max", dateFilter: ["matDatepickerFilter", "dateFilter"] }, host: { listeners: { "input": "_onInput($event.target.value)", "change": "_onChange()", "blur": "_onBlur()", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-haspopup": "_datepicker ? \"dialog\" : null", "attr.aria-owns": "_ariaOwns()", "attr.min": "min ? _dateAdapter.toIso8601(min) : null", "attr.max": "max ? _dateAdapter.toIso8601(max) : null", "attr.data-mat-calendar": "_datepicker ? _datepicker.id : null", "disabled": "disabled" }, classAttribute: "mat-datepicker-input" }, providers: [
135
146
  MAT_DATEPICKER_VALUE_ACCESSOR,
136
147
  MAT_DATEPICKER_VALIDATORS,
137
148
  { provide: MAT_INPUT_VALUE_ACCESSOR, useExisting: MatDatepickerInput },
@@ -149,7 +160,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
149
160
  host: {
150
161
  'class': 'mat-datepicker-input',
151
162
  '[attr.aria-haspopup]': '_datepicker ? "dialog" : null',
152
- '[attr.aria-owns]': '(_datepicker?.opened && _datepicker.id) || null',
163
+ '[attr.aria-owns]': '_ariaOwns()',
153
164
  '[attr.min]': 'min ? _dateAdapter.toIso8601(min) : null',
154
165
  '[attr.max]': 'max ? _dateAdapter.toIso8601(max) : null',
155
166
  // Used by the test harness to tie this input to its calendar. We can't depend on
@@ -186,4 +197,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
186
197
  type: Input,
187
198
  args: ['matDatepickerFilter']
188
199
  }] } });
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL2RhdGVwaWNrZXItaW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQWUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBK0IsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUMsc0JBQXNCLEVBQXFDLE1BQU0seUJBQXlCLENBQUM7OztBQUluRyxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQVE7SUFDaEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBUTtJQUM1QyxPQUFPLEVBQUUsYUFBYTtJQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLDZEQUE2RDtBQTBCN0QsTUFBTSxPQUFPLGtCQUNYLFNB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QyxhQUFhO3NCQURoQixLQUFLO2dCQVlGLEdBQUc7c0JBRE4sS0FBSztnQkFnQkYsR0FBRztzQkFETixLQUFLO2dCQWdCRixVQUFVO3NCQURiLEtBQUs7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0RhdGVBZGFwdGVyLCBNQVRfREFURV9GT1JNQVRTLCBNYXREYXRlRm9ybWF0cywgVGhlbWVQYWxldHRlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7TUFUX0ZPUk1fRklFTER9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtNQVRfSU5QVVRfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7TWF0RGF0ZXBpY2tlcklucHV0QmFzZSwgRGF0ZUZpbHRlckZuLCBfTWF0Rm9ybUZpZWxkUGFydGlhbH0gZnJvbSAnLi9kYXRlcGlja2VyLWlucHV0LWJhc2UnO1xuaW1wb3J0IHtNYXREYXRlcGlja2VyQ29udHJvbCwgTWF0RGF0ZXBpY2tlclBhbmVsfSBmcm9tICcuL2RhdGVwaWNrZXItYmFzZSc7XG5pbXBvcnQge0RhdGVTZWxlY3Rpb25Nb2RlbENoYW5nZX0gZnJvbSAnLi9kYXRlLXNlbGVjdGlvbi1tb2RlbCc7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgY29uc3QgTUFUX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdERhdGVwaWNrZXJJbnB1dCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBNQVRfREFURVBJQ0tFUl9WQUxJREFUT1JTOiBhbnkgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdERhdGVwaWNrZXJJbnB1dCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqIERpcmVjdGl2ZSB1c2VkIHRvIGNvbm5lY3QgYW4gaW5wdXQgdG8gYSBNYXREYXRlcGlja2VyLiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbbWF0RGF0ZXBpY2tlcl0nLFxuICBwcm92aWRlcnM6IFtcbiAgICBNQVRfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUixcbiAgICBNQVRfREFURVBJQ0tFUl9WQUxJREFUT1JTLFxuICAgIHtwcm92aWRlOiBNQVRfSU5QVVRfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBNYXREYXRlcGlja2VySW5wdXR9LFxuICBdLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1kYXRlcGlja2VyLWlucHV0JyxcbiAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnX2RhdGVwaWNrZXIgPyBcImRpYWxvZ1wiIDogbnVsbCcsXG4gICAgJ1thdHRyLmFyaWEtb3duc10nOiAnKF9kYXRlcGlja2VyPy5vcGVuZWQgJiYgX2RhdGVwaWNrZXIuaWQpIHx8IG51bGwnLFxuICAgICdbYXR0ci5taW5dJzogJ21pbiA/IF9kYXRlQWRhcHRlci50b0lzbzg2MDEobWluKSA6IG51bGwnLFxuICAgICdbYXR0ci5tYXhdJzogJ21heCA/IF9kYXRlQWRhcHRlci50b0lzbzg2MDEobWF4KSA6IG51bGwnLFxuICAgIC8vIFVzZWQgYnkgdGhlIHRlc3QgaGFybmVzcyB0byB0aWUgdGhpcyBpbnB1dCB0byBpdHMgY2FsZW5kYXIuIFdlIGNhbid0IGRlcGVuZCBvblxuICAgIC8vIGBhcmlhLW93bnNgIGZvciB0aGlzLCBiZWNhdXNlIGl0J3Mgb25seSBkZWZpbmVkIHdoaWxlIHRoZSBjYWxlbmRhciBpcyBvcGVuLlxuICAgICdbYXR0ci5kYXRhLW1hdC1jYWxlbmRhcl0nOiAnX2RhdGVwaWNrZXIgPyBfZGF0ZXBpY2tlci5pZCA6IG51bGwnLFxuICAgICdbZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnKGlucHV0KSc6ICdfb25JbnB1dCgkZXZlbnQudGFyZ2V0LnZhbHVlKScsXG4gICAgJyhjaGFuZ2UpJzogJ19vbkNoYW5nZSgpJyxcbiAgICAnKGJsdXIpJzogJ19vbkJsdXIoKScsXG4gICAgJyhrZXlkb3duKSc6ICdfb25LZXlkb3duKCRldmVudCknLFxuICB9LFxuICBleHBvcnRBczogJ21hdERhdGVwaWNrZXJJbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVwaWNrZXJJbnB1dDxEPlxuICBleHRlbmRzIE1hdERhdGVwaWNrZXJJbnB1dEJhc2U8RCB8IG51bGwsIEQ+XG4gIGltcGxlbWVudHMgTWF0RGF0ZXBpY2tlckNvbnRyb2w8RCB8IG51bGw+LCBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBfY2xvc2VkU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIC8qKiBUaGUgZGF0ZXBpY2tlciB0aGF0IHRoaXMgaW5wdXQgaXMgYXNzb2NpYXRlZCB3aXRoLiAqL1xuICBASW5wdXQoKVxuICBzZXQgbWF0RGF0ZXBpY2tlcihkYXRlcGlja2VyOiBNYXREYXRlcGlja2VyUGFuZWw8TWF0RGF0ZXBpY2tlckNvbnRyb2w8RD4sIEQgfCBudWxsLCBEPikge1xuICAgIGlmIChkYXRlcGlja2VyKSB7XG4gICAgICB0aGlzLl9kYXRlcGlja2VyID0gZGF0ZXBpY2tlcjtcbiAgICAgIHRoaXMuX2Nsb3NlZFN1YnNjcmlwdGlvbiA9IGRhdGVwaWNrZXIuY2xvc2VkU3RyZWFtLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9vblRvdWNoZWQoKSk7XG4gICAgICB0aGlzLl9yZWdpc3Rlck1vZGVsKGRhdGVwaWNrZXIucmVnaXN0ZXJJbnB1dCh0aGlzKSk7XG4gICAgfVxuICB9XG4gIF9kYXRlcGlja2VyOiBNYXREYXRlcGlja2VyUGFuZWw8TWF0RGF0ZXBpY2tlckNvbnRyb2w8RD4sIEQgfCBudWxsLCBEPjtcblxuICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IG1pbigpOiBEIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuICBzZXQgbWluKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgIGNvbnN0IHZhbGlkVmFsdWUgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcblxuICAgIGlmICghdGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGUodmFsaWRWYWx1ZSwgdGhpcy5fbWluKSkge1xuICAgICAgdGhpcy5fbWluID0gdmFsaWRWYWx1ZTtcbiAgICAgIHRoaXMuX3ZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX21pbjogRCB8IG51bGw7XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBtYXgoKTogRCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbiAgc2V0IG1heCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICBjb25zdCB2YWxpZFZhbHVlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG5cbiAgICBpZiAoIXRoaXMuX2RhdGVBZGFwdGVyLnNhbWVEYXRlKHZhbGlkVmFsdWUsIHRoaXMuX21heCkpIHtcbiAgICAgIHRoaXMuX21heCA9IHZhbGlkVmFsdWU7XG4gICAgICB0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9tYXg6IEQgfCBudWxsO1xuXG4gIC8qKiBGdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBvdXQgZGF0ZXMgd2l0aGluIHRoZSBkYXRlcGlja2VyLiAqL1xuICBASW5wdXQoJ21hdERhdGVwaWNrZXJGaWx0ZXInKVxuICBnZXQgZGF0ZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUZpbHRlcjtcbiAgfVxuICBzZXQgZGF0ZUZpbHRlcih2YWx1ZTogRGF0ZUZpbHRlckZuPEQgfCBudWxsPikge1xuICAgIGNvbnN0IHdhc01hdGNoaW5nVmFsdWUgPSB0aGlzLl9tYXRjaGVzRmlsdGVyKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuX2RhdGVGaWx0ZXIgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLl9tYXRjaGVzRmlsdGVyKHRoaXMudmFsdWUpICE9PSB3YXNNYXRjaGluZ1ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kYXRlRmlsdGVyOiBEYXRlRmlsdGVyRm48RCB8IG51bGw+O1xuXG4gIC8qKiBUaGUgY29tYmluZWQgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhpcyBpbnB1dC4gKi9cbiAgcHJvdGVjdGVkIF92YWxpZGF0b3I6IFZhbGlkYXRvckZuIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIEBPcHRpb25hbCgpIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIGRhdGVGb3JtYXRzOiBNYXREYXRlRm9ybWF0cyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEKSBwcml2YXRlIF9mb3JtRmllbGQ/OiBfTWF0Rm9ybUZpZWxkUGFydGlhbCxcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgZGF0ZUFkYXB0ZXIsIGRhdGVGb3JtYXRzKTtcbiAgICB0aGlzLl92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2Uoc3VwZXIuX2dldFZhbGlkYXRvcnMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZWxlbWVudCB0aGF0IHRoZSBkYXRlcGlja2VyIHBvcHVwIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8uXG4gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgdG8gY29ubmVjdCB0aGUgcG9wdXAgdG8uXG4gICAqL1xuICBnZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiB0aGlzLl9mb3JtRmllbGQgPyB0aGlzLl9mb3JtRmllbGQuZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpIDogdGhpcy5fZWxlbWVudFJlZjtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBJRCBvZiBhbiBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIGNhbGVuZGFyIG92ZXJsYXkuICovXG4gIGdldE92ZXJsYXlMYWJlbElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLl9mb3JtRmllbGQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mb3JtRmllbGQuZ2V0TGFiZWxJZCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBwYWxldHRlIHVzZWQgYnkgdGhlIGlucHV0J3MgZm9ybSBmaWVsZCwgaWYgYW55LiAqL1xuICBnZXRUaGVtZVBhbGV0dGUoKTogVGhlbWVQYWxldHRlIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUZpZWxkID8gdGhpcy5fZm9ybUZpZWxkLmNvbG9yIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIHZhbHVlIGF0IHdoaWNoIHRoZSBjYWxlbmRhciBzaG91bGQgc3RhcnQuICovXG4gIGdldFN0YXJ0VmFsdWUoKTogRCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLl9jbG9zZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgYXNzb2NpYXRlZCBkYXRlcGlja2VyLiAqL1xuICBwcm90ZWN0ZWQgX29wZW5Qb3B1cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGF0ZXBpY2tlcikge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlci5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9nZXRWYWx1ZUZyb21Nb2RlbChtb2RlbFZhbHVlOiBEIHwgbnVsbCk6IEQgfCBudWxsIHtcbiAgICByZXR1cm4gbW9kZWxWYWx1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYXNzaWduVmFsdWVUb01vZGVsKHZhbHVlOiBEIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tb2RlbCkge1xuICAgICAgdGhpcy5fbW9kZWwudXBkYXRlU2VsZWN0aW9uKHZhbHVlLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKiogR2V0cyB0aGUgaW5wdXQncyBtaW5pbXVtIGRhdGUuICovXG4gIF9nZXRNaW5EYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICAvKiogR2V0cyB0aGUgaW5wdXQncyBtYXhpbXVtIGRhdGUuICovXG4gIF9nZXRNYXhEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgaW5wdXQncyBkYXRlIGZpbHRlcmluZyBmdW5jdGlvbi4gKi9cbiAgcHJvdGVjdGVkIF9nZXREYXRlRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRlRmlsdGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChldmVudDogRGF0ZVNlbGVjdGlvbk1vZGVsQ2hhbmdlPEQ+KSB7XG4gICAgcmV0dXJuIGV2ZW50LnNvdXJjZSAhPT0gdGhpcztcbiAgfVxufVxuIl19
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL2RhdGVwaWNrZXItaW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFlLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQStCLE1BQU0sd0JBQXdCLENBQUM7QUFDbkcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHbEMsT0FBTyxFQUFxQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDOzs7QUFFbkcsb0JBQW9CO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFRO0lBQ2hELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQVE7SUFDNUMsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRiw2REFBNkQ7QUEwQjdELE1BQU0sT0FB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b0JBQW9CLEVBQUM7cUJBQ3JFO29CQUNELElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsc0JBQXNCO3dCQUMvQixzQkFBc0IsRUFBRSwrQkFBK0I7d0JBQ3ZELGtCQUFrQixFQUFFLGFBQWE7d0JBQ2pDLFlBQVksRUFBRSwwQ0FBMEM7d0JBQ3hELFlBQVksRUFBRSwwQ0FBMEM7d0JBQ3hELGlGQUFpRjt3QkFDakYsOEVBQThFO3dCQUM5RSwwQkFBMEIsRUFBRSxxQ0FBcUM7d0JBQ2pFLFlBQVksRUFBRSxVQUFVO3dCQUN4QixTQUFTLEVBQUUsK0JBQStCO3dCQUMxQyxVQUFVLEVBQUUsYUFBYTt3QkFDekIsUUFBUSxFQUFFLFdBQVc7d0JBQ3JCLFdBQVcsRUFBRSxvQkFBb0I7cUJBQ2xDO29CQUNELFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBK0VJLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDbkMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjO3lDQXZFaEMsYUFBYTtzQkFEaEIsS0FBSztnQkFzQkYsR0FBRztzQkFETixLQUFLO2dCQWdCRixHQUFHO3NCQUROLEtBQUs7Z0JBZ0JGLFVBQVU7c0JBRGIsS0FBSzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7RGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0ZPUk1BVFMsIE1hdERhdGVGb3JtYXRzLCBUaGVtZVBhbGV0dGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtNQVRfRk9STV9GSUVMRH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQge01BVF9JTlBVVF9WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtEYXRlU2VsZWN0aW9uTW9kZWxDaGFuZ2V9IGZyb20gJy4vZGF0ZS1zZWxlY3Rpb24tbW9kZWwnO1xuaW1wb3J0IHtNYXREYXRlcGlja2VyQ29udHJvbCwgTWF0RGF0ZXBpY2tlclBhbmVsfSBmcm9tICcuL2RhdGVwaWNrZXItYmFzZSc7XG5pbXBvcnQge19NYXRGb3JtRmllbGRQYXJ0aWFsLCBEYXRlRmlsdGVyRm4sIE1hdERhdGVwaWNrZXJJbnB1dEJhc2V9IGZyb20gJy4vZGF0ZXBpY2tlci1pbnB1dC1iYXNlJztcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBNQVRfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZXBpY2tlcklucHV0KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IE1BVF9EQVRFUElDS0VSX1ZBTElEQVRPUlM6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZXBpY2tlcklucHV0KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG4vKiogRGlyZWN0aXZlIHVzZWQgdG8gY29ubmVjdCBhbiBpbnB1dCB0byBhIE1hdERhdGVwaWNrZXIuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbnB1dFttYXREYXRlcGlja2VyXScsXG4gIHByb3ZpZGVyczogW1xuICAgIE1BVF9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SLFxuICAgIE1BVF9EQVRFUElDS0VSX1ZBTElEQVRPUlMsXG4gICAge3Byb3ZpZGU6IE1BVF9JTlBVVF9WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IE1hdERhdGVwaWNrZXJJbnB1dH0sXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAnbWF0LWRhdGVwaWNrZXItaW5wdXQnLFxuICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdfZGF0ZXBpY2tlciA/IFwiZGlhbG9nXCIgOiBudWxsJyxcbiAgICAnW2F0dHIuYXJpYS1vd25zXSc6ICdfYXJpYU93bnMoKScsXG4gICAgJ1thdHRyLm1pbl0nOiAnbWluID8gX2RhdGVBZGFwdGVyLnRvSXNvODYwMShtaW4pIDogbnVsbCcsXG4gICAgJ1thdHRyLm1heF0nOiAnbWF4ID8gX2RhdGVBZGFwdGVyLnRvSXNvODYwMShtYXgpIDogbnVsbCcsXG4gICAgLy8gVXNlZCBieSB0aGUgdGVzdCBoYXJuZXNzIHRvIHRpZSB0aGlzIGlucHV0IHRvIGl0cyBjYWxlbmRhci4gV2UgY2FuJ3QgZGVwZW5kIG9uXG4gICAgLy8gYGFyaWEtb3duc2AgZm9yIHRoaXMsIGJlY2F1c2UgaXQncyBvbmx5IGRlZmluZWQgd2hpbGUgdGhlIGNhbGVuZGFyIGlzIG9wZW4uXG4gICAgJ1thdHRyLmRhdGEtbWF0LWNhbGVuZGFyXSc6ICdfZGF0ZXBpY2tlciA/IF9kYXRlcGlja2VyLmlkIDogbnVsbCcsXG4gICAgJ1tkaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICcoaW5wdXQpJzogJ19vbklucHV0KCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGNoYW5nZSknOiAnX29uQ2hhbmdlKCknLFxuICAgICcoYmx1ciknOiAnX29uQmx1cigpJyxcbiAgICAnKGtleWRvd24pJzogJ19vbktleWRvd24oJGV2ZW50KScsXG4gIH0sXG4gIGV4cG9ydEFzOiAnbWF0RGF0ZXBpY2tlcklucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0RGF0ZXBpY2tlcklucHV0PEQ+XG4gIGV4dGVuZHMgTWF0RGF0ZXBpY2tlcklucHV0QmFzZTxEIHwgbnVsbCwgRD5cbiAgaW1wbGVtZW50cyBNYXREYXRlcGlja2VyQ29udHJvbDxEIHwgbnVsbD4sIE9uRGVzdHJveVxue1xuICBwcml2YXRlIF9jbG9zZWRTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX29wZW5lZFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICAvKiogVGhlIGRhdGVwaWNrZXIgdGhhdCB0aGlzIGlucHV0IGlzIGFzc29jaWF0ZWQgd2l0aC4gKi9cbiAgQElucHV0KClcbiAgc2V0IG1hdERhdGVwaWNrZXIoZGF0ZXBpY2tlcjogTWF0RGF0ZXBpY2tlclBhbmVsPE1hdERhdGVwaWNrZXJDb250cm9sPEQ+LCBEIHwgbnVsbCwgRD4pIHtcbiAgICBpZiAoZGF0ZXBpY2tlcikge1xuICAgICAgdGhpcy5fZGF0ZXBpY2tlciA9IGRhdGVwaWNrZXI7XG4gICAgICB0aGlzLl9hcmlhT3ducy5zZXQoZGF0ZXBpY2tlci5vcGVuZWQgPyBkYXRlcGlja2VyLmlkIDogbnVsbCk7XG4gICAgICB0aGlzLl9jbG9zZWRTdWJzY3JpcHRpb24gPSBkYXRlcGlja2VyLmNsb3NlZFN0cmVhbS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5fYXJpYU93bnMuc2V0KG51bGwpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBkYXRlcGlja2VyLm9wZW5lZFN0cmVhbS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9hcmlhT3ducy5zZXQoZGF0ZXBpY2tlci5pZCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyTW9kZWwoZGF0ZXBpY2tlci5yZWdpc3RlcklucHV0KHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgX2RhdGVwaWNrZXI6IE1hdERhdGVwaWNrZXJQYW5lbDxNYXREYXRlcGlja2VyQ29udHJvbDxEPiwgRCB8IG51bGwsIEQ+O1xuXG4gIC8qKiBUaGUgaWQgb2YgdGhlIHBhbmVsIG93bmVkIGJ5IHRoaXMgaW5wdXQuICovXG4gIHByb3RlY3RlZCBfYXJpYU93bnMgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBtaW4oKTogRCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbiAgc2V0IG1pbih2YWx1ZTogRCB8IG51bGwpIHtcbiAgICBjb25zdCB2YWxpZFZhbHVlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG5cbiAgICBpZiAoIXRoaXMuX2RhdGVBZGFwdGVyLnNhbWVEYXRlKHZhbGlkVmFsdWUsIHRoaXMuX21pbikpIHtcbiAgICAgIHRoaXMuX21pbiA9IHZhbGlkVmFsdWU7XG4gICAgICB0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9taW46IEQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbWF4KCk6IEQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHNldCBtYXgodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgY29uc3QgdmFsaWRWYWx1ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuXG4gICAgaWYgKCF0aGlzLl9kYXRlQWRhcHRlci5zYW1lRGF0ZSh2YWxpZFZhbHVlLCB0aGlzLl9tYXgpKSB7XG4gICAgICB0aGlzLl9tYXggPSB2YWxpZFZhbHVlO1xuICAgICAgdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfbWF4OiBEIHwgbnVsbDtcblxuICAvKiogRnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGRhdGVzIHdpdGhpbiB0aGUgZGF0ZXBpY2tlci4gKi9cbiAgQElucHV0KCdtYXREYXRlcGlja2VyRmlsdGVyJylcbiAgZ2V0IGRhdGVGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGVGaWx0ZXI7XG4gIH1cbiAgc2V0IGRhdGVGaWx0ZXIodmFsdWU6IERhdGVGaWx0ZXJGbjxEIHwgbnVsbD4pIHtcbiAgICBjb25zdCB3YXNNYXRjaGluZ1ZhbHVlID0gdGhpcy5fbWF0Y2hlc0ZpbHRlcih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLl9kYXRlRmlsdGVyID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5fbWF0Y2hlc0ZpbHRlcih0aGlzLnZhbHVlKSAhPT0gd2FzTWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZGF0ZUZpbHRlcjogRGF0ZUZpbHRlckZuPEQgfCBudWxsPjtcblxuICAvKiogVGhlIGNvbWJpbmVkIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoaXMgaW5wdXQuICovXG4gIHByb3RlY3RlZCBfdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfREFURV9GT1JNQVRTKSBkYXRlRm9ybWF0czogTWF0RGF0ZUZvcm1hdHMsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRk9STV9GSUVMRCkgcHJpdmF0ZSBfZm9ybUZpZWxkPzogX01hdEZvcm1GaWVsZFBhcnRpYWwsXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGRhdGVBZGFwdGVyLCBkYXRlRm9ybWF0cyk7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKHN1cGVyLl9nZXRWYWxpZGF0b3JzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgZGF0ZXBpY2tlciBwb3B1cCBzaG91bGQgYmUgY29ubmVjdGVkIHRvLlxuICAgKiBAcmV0dXJuIFRoZSBlbGVtZW50IHRvIGNvbm5lY3QgdGhlIHBvcHVwIHRvLlxuICAgKi9cbiAgZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpOiBFbGVtZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUZpZWxkID8gdGhpcy5fZm9ybUZpZWxkLmdldENvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSA6IHRoaXMuX2VsZW1lbnRSZWY7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgSUQgb2YgYW4gZWxlbWVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGEgZGVzY3JpcHRpb24gZm9yIHRoZSBjYWxlbmRhciBvdmVybGF5LiAqL1xuICBnZXRPdmVybGF5TGFiZWxJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fZm9ybUZpZWxkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUZpZWxkLmdldExhYmVsSWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5Jyk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcGFsZXR0ZSB1c2VkIGJ5IHRoZSBpbnB1dCdzIGZvcm0gZmllbGQsIGlmIGFueS4gKi9cbiAgZ2V0VGhlbWVQYWxldHRlKCk6IFRoZW1lUGFsZXR0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1GaWVsZCA/IHRoaXMuX2Zvcm1GaWVsZC5jb2xvciA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSB2YWx1ZSBhdCB3aGljaCB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0LiAqL1xuICBnZXRTdGFydFZhbHVlKCk6IEQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5fY2xvc2VkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKiogT3BlbnMgdGhlIGFzc29jaWF0ZWQgZGF0ZXBpY2tlci4gKi9cbiAgcHJvdGVjdGVkIF9vcGVuUG9wdXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RhdGVwaWNrZXIpIHtcbiAgICAgIHRoaXMuX2RhdGVwaWNrZXIub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfZ2V0VmFsdWVGcm9tTW9kZWwobW9kZWxWYWx1ZTogRCB8IG51bGwpOiBEIHwgbnVsbCB7XG4gICAgcmV0dXJuIG1vZGVsVmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Fzc2lnblZhbHVlVG9Nb2RlbCh2YWx1ZTogRCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbW9kZWwpIHtcbiAgICAgIHRoaXMuX21vZGVsLnVwZGF0ZVNlbGVjdGlvbih2YWx1ZSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldHMgdGhlIGlucHV0J3MgbWluaW11bSBkYXRlLiAqL1xuICBfZ2V0TWluRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGlucHV0J3MgbWF4aW11bSBkYXRlLiAqL1xuICBfZ2V0TWF4RGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGlucHV0J3MgZGF0ZSBmaWx0ZXJpbmcgZnVuY3Rpb24uICovXG4gIHByb3RlY3RlZCBfZ2V0RGF0ZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUZpbHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc2hvdWxkSGFuZGxlQ2hhbmdlRXZlbnQoZXZlbnQ6IERhdGVTZWxlY3Rpb25Nb2RlbENoYW5nZTxEPikge1xuICAgIHJldHVybiBldmVudC5zb3VyY2UgIT09IHRoaXM7XG4gIH1cbn1cbiJdfQ==
@@ -6,9 +6,11 @@
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
8
  import { Directionality } from '@angular/cdk/bidi';
9
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
9
10
  import { Platform } from '@angular/cdk/platform';
10
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, Inject, InjectionToken, Injector, inject, Input, NgZone, Optional, QueryList, ViewChild, ViewEncapsulation, ANIMATION_MODULE_TYPE, afterRender, } from '@angular/core';
11
- import { merge, Subject } from 'rxjs';
11
+ import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
12
+ import { ANIMATION_MODULE_TYPE, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, Inject, InjectionToken, Injector, Input, NgZone, Optional, QueryList, ViewChild, ViewEncapsulation, afterRender, inject, } from '@angular/core';
13
+ import { Subject, merge } from 'rxjs';
12
14
  import { takeUntil } from 'rxjs/operators';
13
15
  import { MAT_ERROR } from './directives/error';
14
16
  import { FLOATING_LABEL_PARENT, MatFormFieldFloatingLabel, } from './directives/floating-label';
@@ -18,11 +20,9 @@ import { MatFormFieldLineRipple } from './directives/line-ripple';
18
20
  import { MatFormFieldNotchedOutline } from './directives/notched-outline';
19
21
  import { MAT_PREFIX } from './directives/prefix';
20
22
  import { MAT_SUFFIX } from './directives/suffix';
21
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
22
23
  import { matFormFieldAnimations } from './form-field-animations';
23
24
  import { MatFormFieldControl as _MatFormFieldControl } from './form-field-control';
24
25
  import { getMatFormFieldDuplicatedHintError, getMatFormFieldMissingControlError, } from './form-field-errors';
25
- import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
26
26
  import * as i0 from "@angular/core";
27
27
  import * as i1 from "@angular/cdk/bidi";
28
28
  import * as i2 from "@angular/cdk/platform";
@@ -140,7 +140,13 @@ export class MatFormField {
140
140
  this._defaults = _defaults;
141
141
  this._animationMode = _animationMode;
142
142
  this._hideRequiredMarker = false;
143
- /** The color palette for the form field. */
143
+ /**
144
+ * Theme color of the form field. This API is supported in M2 themes only, it
145
+ * has no effect in M3 themes.
146
+ *
147
+ * For information on applying color variants in M3, see
148
+ * https://material.angular.io/guide/theming#using-component-color-variants.
149
+ */
144
150
  this.color = 'primary';
145
151
  this._appearance = DEFAULT_APPEARANCE;
146
152
  this._subscriptSizing = null;
@@ -605,4 +611,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
605
611
  }], hintLabel: [{
606
612
  type: Input
607
613
  }] } });
608
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9mb3JtLWZpZWxkLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBSUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxTQUFTLEVBQVcsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLHlCQUF5QixHQUMxQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sOEJBQThCLENBQUM7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QUFLO2dCQWtCRixVQUFVO3NCQURiLEtBQUs7Z0JBOEJGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBV0YsU0FBUztzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEFOSU1BVElPTl9NT0RVTEVfVFlQRSxcbiAgYWZ0ZXJSZW5kZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VGhlbWVQYWxldHRlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7bWVyZ2UsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHt0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TUFUX0VSUk9SLCBNYXRFcnJvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL2Vycm9yJztcbmltcG9ydCB7XG4gIEZMT0FUSU5HX0xBQkVMX1BBUkVOVCxcbiAgRmxvYXRpbmdMYWJlbFBhcmVudCxcbiAgTWF0Rm9ybUZpZWxkRmxvYXRpbmdMYWJlbCxcbn0gZnJvbSAnLi9kaXJlY3RpdmVzL2Zsb2F0aW5nLWxhYmVsJztcbmltcG9ydCB7TWF0SGludH0gZnJvbSAnLi9kaXJlY3RpdmVzL2hpbnQnO1xuaW1wb3J0IHtNYXRMYWJlbH0gZnJvbSAnLi9kaXJlY3RpdmVzL2xhYmVsJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTGluZVJpcHBsZX0gZnJvbSAnLi9kaXJlY3RpdmVzL2xpbmUtcmlwcGxlJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTm90Y2hlZE91dGxpbmV9IGZyb20gJy4vZGlyZWN0aXZlcy9ub3RjaGVkLW91dGxpbmUnO1xuaW1wb3J0IHtNQVRfUFJFRklYLCBNYXRQcmVmaXh9IGZyb20gJy4vZGlyZWN0aXZlcy9wcmVmaXgnO1xuaW1wb3J0IHtNQVRfU1VGRklYLCBNYXRTdWZmaXh9IGZyb20gJy4vZGlyZWN0aXZlcy9zdWZmaXgnO1xuaW1wb3J0IHtCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7bWF0Rm9ybUZpZWxkQW5pbWF0aW9uc30gZnJvbSAnLi9mb3JtLWZpZWxkLWFuaW1hdGlvbnMnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRDb250cm9sIGFzIF9NYXRGb3JtRmllbGRDb250cm9sfSBmcm9tICcuL2Zvcm0tZmllbGQtY29udHJvbCc7XG5pbXBvcnQge1xuICBnZXRNYXRGb3JtRmllbGREdXBsaWNhdGVkSGludEVycm9yLFxuICBnZXRNYXRGb3JtRmllbGRNaXNzaW5nQ29udHJvbEVycm9yLFxufSBmcm9tICcuL2Zvcm0tZmllbGQtZXJyb3JzJztcbmltcG9ydCB7RE9DVU1FTlQsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKiBUeXBlIGZvciB0aGUgYXZhaWxhYmxlIGZsb2F0TGFiZWwgdmFsdWVzLiAqL1xuZXhwb3J0IHR5cGUgRmxvYXRMYWJlbFR5cGUgPSAnYWx3YXlzJyB8ICdhdXRvJztcblxuLyoqIFBvc3NpYmxlIGFwcGVhcmFuY2Ugc3R5bGVzIGZvciB0aGUgZm9ybSBmaWVsZC4gKi9cbmV4cG9ydCB0eXBlIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnZmlsbCcgfCAnb3V0bGluZSc7XG5cbi8qKiBCZWhhdmlvcnMgZm9yIGhvdyB0aGUgc3Vic2NyaXB0IGhlaWdodCBpcyBzZXQuICovXG5leHBvcnQgdHlwZSBTdWJzY3JpcHRTaXppbmcgPSAnZml4ZWQnIHwgJ2R5bmFtaWMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGZvcm0gZmllbGQgdGhhdCBjYW4gYmUgY29uZmlndXJlZFxuICogdXNpbmcgdGhlIGBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlNgIGluamVjdGlvbiB0b2tlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGZvcm0gZmllbGQgYXBwZWFyYW5jZSBzdHlsZS4gKi9cbiAgYXBwZWFyYW5jZT86IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIC8qKiBEZWZhdWx0IGNvbG9yIG9mIHRoZSBmb3JtIGZpZWxkLiAqL1xuICBjb2xvcj86IFRoZW1lUGFsZXR0ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHJlcXVpcmVkIG1hcmtlciBzaG91bGQgYmUgaGlkZGVuIGJ5IGRlZmF1bHQuICovXG4gIGhpZGVSZXF1aXJlZE1hcmtlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsYWJlbCBmb3IgZm9ybSBmaWVsZHMgc2hvdWxkIGJ5IGRlZmF1bHQgZmxvYXQgYGFsd2F5c2AsXG4gICAqIGBuZXZlcmAsIG9yIGBhdXRvYCAob25seSB3aGVuIG5lY2Vzc2FyeSkuXG4gICAqL1xuICBmbG9hdExhYmVsPzogRmxvYXRMYWJlbFR5cGU7XG4gIC8qKiBXaGV0aGVyIHRoZSBmb3JtIGZpZWxkIHNob3VsZCByZXNlcnZlIHNwYWNlIGZvciBvbmUgbGluZSBieSBkZWZhdWx0LiAqL1xuICBzdWJzY3JpcHRTaXppbmc/OiBTdWJzY3JpcHRTaXppbmc7XG59XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGFuIGluc3RhbmNlcyBvZiBgTWF0Rm9ybUZpZWxkYC4gSXQgc2VydmVzXG4gKiBhcyBhbHRlcm5hdGl2ZSB0b2tlbiB0byB0aGUgYWN0dWFsIGBNYXRGb3JtRmllbGRgIGNsYXNzIHdoaWNoIHdvdWxkIGNhdXNlIHVubmVjZXNzYXJ5XG4gKiByZXRlbnRpb24gb2YgdGhlIGBNYXRGb3JtRmllbGRgIGNsYXNzIGFuZCBpdHMgY29tcG9uZW50IG1ldGFkYXRhLlxuICovXG5leHBvcnQgY29uc3QgTUFUX0ZPUk1fRklFTEQgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWF0Rm9ybUZpZWxkPignTWF0Rm9ybUZpZWxkJyk7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICogZGVmYXVsdCBvcHRpb25zIGZvciBhbGwgZm9ybSBmaWVsZCB3aXRoaW4gYW4gYXBwLlxuICovXG5leHBvcnQgY29uc3QgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zPihcbiAgJ01BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUycsXG4pO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuLyoqIERlZmF1bHQgYXBwZWFyYW5jZSB1c2VkIGJ5IHRoZSBmb3JtIGZpZWxkLiAqL1xuY29uc3QgREVGQVVMVF9BUFBFQVJBTkNFOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ2ZpbGwnO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGxhYmVsIGZvciBmb3JtIGZpZWxkcyBzaG91bGQgYnkgZGVmYXVsdCBmbG9hdCBgYWx3YXlzYCxcbiAqIGBuZXZlcmAsIG9yIGBhdXRvYC5cbiAqL1xuY29uc3QgREVGQVVMVF9GTE9BVF9MQUJFTDogRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG5cbi8qKiBEZWZhdWx0IHdheSB0aGF0IHRoZSBzdWJzY3JpcHQgZWxlbWVudCBoZWlnaHQgaXMgc2V0LiAqL1xuY29uc3QgREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HOiBTdWJzY3JpcHRTaXppbmcgPSAnZml4ZWQnO1xuXG4vKipcbiAqIERlZmF1bHQgdHJhbnNmb3JtIGZvciBkb2NrZWQgZmxvYXRpbmcgbGFiZWxzIGluIGEgTURDIHRleHQtZmllbGQuIFRoaXMgdmFsdWUgaGFzIGJlZW5cbiAqIGV4dHJhY3RlZCBmcm9tIHRoZSBNREMgdGV4dC1maWVsZCBzdHlsZXMgYmVjYXVzZSB3ZSBwcm9ncmFtbWF0aWNhbGx5IG1vZGlmeSB0aGUgZG9ja2VkXG4gKiBsYWJlbCB0cmFuc2Zvcm0sIGJ1dCBkbyBub3Qgd2FudCB0byBhY2NpZGVudGFsbHkgZGlzY2FyZCB0aGUgZGVmYXVsdCBsYWJlbCB0cmFuc2Zvcm0uXG4gKi9cbmNvbnN0IEZMT0FUSU5HX0xBQkVMX0RFRkFVTFRfRE9DS0VEX1RSQU5TRk9STSA9IGB0cmFuc2xhdGVZKC01MCUpYDtcblxuLyoqXG4gKiBEZXNwaXRlIGBNYXRGb3JtRmllbGRDb250cm9sYCBiZWluZyBhbiBhYnN0cmFjdCBjbGFzcywgbW9zdCBvZiBvdXIgdXNhZ2VzIGVuZm9yY2UgaXRzIHNoYXBlXG4gKiB1c2luZyBgaW1wbGVtZW50c2AgaW5zdGVhZCBvZiBgZXh0ZW5kc2AuIFRoaXMgYXBwZWFycyB0byBiZSBwcm9ibGVtYXRpYyB3aGVuIENsb3N1cmUgY29tcGlsZXJcbiAqIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHR5cGUgaW5mb3JtYXRpb24gdG8gcmVuYW1lIHByb3BlcnRpZXMsIGJlY2F1c2UgaXQgY2FuJ3QgZmlndXJlIG91dCB3aGljaFxuICogY2xhc3MgcHJvcGVydGllcyBhcmUgY29taW5nIGZyb20uIFRoaXMgaW50ZXJmYWNlIHNlZW1zIHRvIHdvcmsgYXJvdW5kIHRoZSBpc3N1ZSB3aGlsZSBwcmVzZXJ2aW5nXG4gKiBvdXIgdHlwZSBzYWZldHkgKGFsdGVybmF0aXZlIGJlaW5nIHVzaW5nIGBhbnlgIGV2ZXJ5d2hlcmUpLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5pbnRlcmZhY2UgTWF0Rm9ybUZpZWxkQ29udHJvbDxUPiBleHRlbmRzIF9NYXRGb3JtRmllbGRDb250cm9sPFQ+IHt9XG5cbi8qKiBDb250YWluZXIgZm9yIGZvcm0gY29udHJvbHMgdGhhdCBhcHBsaWVzIE1hdGVyaWFsIERlc2lnbiBzdHlsaW5nIGFuZCBiZWhhdmlvci4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1mb3JtLWZpZWxkJyxcbiAgZXhwb3J0QXM6ICdtYXRGb3JtRmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1maWVsZC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Zvcm0tZmllbGQuY3NzJyxcbiAgYW5pbWF0aW9uczogW21hdEZvcm1GaWVsZEFuaW1hdGlvbnMudHJhbnNpdGlvbk1lc3NhZ2VzXSxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdtYXQtbWRjLWZvcm0tZmllbGQnLFxuICAgICdbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLWFsd2F5cy1mbG9hdF0nOiAnX3Nob3VsZEFsd2F5c0Zsb2F0KCknLFxuICAgICdbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXByZWZpeF0nOiAnX2hhc0ljb25QcmVmaXgnLFxuICAgICdbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXN1ZmZpeF0nOiAnX2hhc0ljb25TdWZmaXgnLFxuICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBjbGFzc2VzIHJldXNlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBub24tTURDIHZlcnNpb24sIGJlY2F1c2UgdGhleSBjYW4gYmVcbiAgICAvLyBjb25zaWRlcmVkIGEgcHVibGljIEFQSSBzaW5jZSBjdXN0b20gZm9ybSBjb250cm9scyBtYXkgdXNlIHRoZW0gdG8gc3R5bGUgdGhlbXNlbHZlcy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9wdWxsLzIwNTAyI2Rpc2N1c3Npb25fcjQ4NjEyNDkwMS5cbiAgICAnW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWludmFsaWRdJzogJ19jb250cm9sLmVycm9yU3RhdGUnLFxuICAgICdbY2xhc3MubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRdJzogJ19jb250cm9sLmRpc2FibGVkJyxcbiAgICAnW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWRdJzogJ19jb250cm9sLmF1dG9maWxsZWQnLFxuICAgICdbY2xhc3MubWF0LWZvcm0tZmllbGQtbm8tYW5pbWF0aW9uc10nOiAnX2FuaW1hdGlvbk1vZGUgPT09IFwiTm9vcEFuaW1hdGlvbnNcIicsXG4gICAgJ1tjbGFzcy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxdJzogJ2FwcGVhcmFuY2UgPT0gXCJmaWxsXCInLFxuICAgICdbY2xhc3MubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lXSc6ICdhcHBlYXJhbmNlID09IFwib3V0bGluZVwiJyxcbiAgICAnW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXJdJzogJ19oYXNGbG9hdGluZ0xhYmVsKCkgJiYgIV9zaG91bGRMYWJlbEZsb2F0KCknLFxuICAgICdbY2xhc3MubWF0LWZvY3VzZWRdJzogJ19jb250cm9sLmZvY3VzZWQnLFxuICAgICdbY2xhc3MubWF0LXByaW1hcnldJzogJ2NvbG9yICE9PSBcImFjY2VudFwiICYmIGNvbG9yICE9PSBcIndhcm5cIicsXG4gICAgJ1tjbGFzcy5tYXQtYWNjZW50XSc6ICdjb2xvciA9PT0gXCJhY2NlbnRcIicsXG4gICAgJ1tjbGFzcy5tYXQtd2Fybl0nOiAnY29sb3IgPT09IFwid2FyblwiJyxcbiAgICAnW2NsYXNzLm5nLXVudG91Y2hlZF0nOiAnX3Nob3VsZEZvcndhcmQoXCJ1bnRvdWNoZWRcIiknLFxuICAgICdbY2xhc3MubmctdG91Y2hlZF0nOiAnX3Nob3VsZEZvcndhcmQoXCJ0b3VjaGVkXCIpJyxcbiAgICAnW2NsYXNzLm5nLXByaXN0aW5lXSc6ICdfc2hvdWxkRm9yd2FyZChcInByaXN0aW5lXCIpJyxcbiAgICAnW2NsYXNzLm5nLWRpcnR5XSc6ICdfc2hvdWxkRm9yd2FyZChcImRpcnR5XCIpJyxcbiAgICAnW2NsYXNzLm5nLXZhbGlkXSc6ICdfc2hvdWxkRm9yd2FyZChcInZhbGlkXCIpJyxcbiAgICAnW2NsYXNzLm5nLWludmFsaWRdJzogJ19zaG91bGRGb3J3YXJkKFwiaW52YWxpZFwiKScsXG4gICAgJ1tjbGFzcy5uZy1wZW5kaW5nXSc6ICdfc2hvdWxkRm9yd2FyZChcInBlbmRpbmdcIiknLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IE1BVF9GT1JNX0ZJRUxELCB1c2VFeGlzdGluZzogTWF0Rm9ybUZpZWxkfSxcbiAgICB7cHJvdmlkZTogRkxPQVRJTkdfTEFCRUxfUEFSRU5ULCB1c2VFeGlzdGluZzogTWF0Rm9ybUZpZWxkfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEZvcm1GaWVsZEZsb2F0aW5nTGFiZWwsXG4gICAgTWF0Rm9ybUZpZWxkTm90Y2hlZE91dGxpbmUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBNYXRGb3JtRmllbGRMaW5lUmlwcGxlLFxuICAgIE1hdEhpbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdEZvcm1GaWVsZFxuICBpbXBsZW1lbnRzIEZsb2F0aW5nTGFiZWxQYXJlbnQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICBAVmlld0NoaWxkKCd0ZXh0RmllbGQnKSBfdGV4dEZpZWxkOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnaWNvblByZWZpeENvbnRhaW5lcicpIF9pY29uUHJlZml4Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndGV4dFByZWZpeENvbnRhaW5lcicpIF90ZXh0UHJlZml4Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChNYXRGb3JtRmllbGRGbG9hdGluZ0xhYmVsKSBfZmxvYXRpbmdMYWJlbDogTWF0Rm9ybUZpZWxkRmxvYXRpbmdMYWJlbCB8IHVuZGVmaW5lZDtcbiAgQFZpZXdDaGlsZChNYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZSkgX25vdGNoZWRPdXRsaW5lOiBNYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZSB8IHVuZGVmaW5lZDtcbiAgQFZpZXdDaGlsZChNYXRGb3JtRmllbGRMaW5lUmlwcGxlKSBfbGluZVJpcHBsZTogTWF0Rm9ybUZpZWxkTGluZVJpcHBsZSB8IHVuZGVmaW5lZDtcblxuICBAQ29udGVudENoaWxkKE1hdExhYmVsKSBfbGFiZWxDaGlsZE5vblN0YXRpYzogTWF0TGFiZWwgfCB1bmRlZmluZWQ7XG4gIEBDb250ZW50Q2hpbGQoTWF0TGFiZWwsIHtzdGF0aWM6IHRydWV9KSBfbGFiZWxDaGlsZFN0YXRpYzogTWF0TGFiZWwgfCB1bmRlZmluZWQ7XG4gIEBDb250ZW50Q2hpbGQoX01hdEZvcm1GaWVsZENvbnRyb2wpIF9mb3JtRmllbGRDb250cm9sOiBNYXRGb3JtRmllbGRDb250cm9sPGFueT47XG4gIEBDb250ZW50Q2hpbGRyZW4oTUFUX1BSRUZJWCwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX3ByZWZpeENoaWxkcmVuOiBRdWVyeUxpc3Q8TWF0UHJlZml4PjtcbiAgQENvbnRlbnRDaGlsZHJlbihNQVRfU1VGRklYLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfc3VmZml4Q2hpbGRyZW46IFF1ZXJ5TGlzdDxNYXRTdWZmaXg+O1xuICBAQ29udGVudENoaWxkcmVuKE1BVF9FUlJPUiwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX2Vycm9yQ2hpbGRyZW46IFF1ZXJ5TGlzdDxNYXRFcnJvcj47XG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0SGludCwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX2hpbnRDaGlsZHJlbjogUXVlcnlMaXN0PE1hdEhpbnQ+O1xuXG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1aXJlZCBtYXJrZXIgc2hvdWxkIGJlIGhpZGRlbi4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGhpZGVSZXF1aXJlZE1hcmtlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGlkZVJlcXVpcmVkTWFya2VyO1xuICB9XG4gIHNldCBoaWRlUmVxdWlyZWRNYXJrZXIodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfaGlkZVJlcXVpcmVkTWFya2VyID0gZmFsc2U7XG5cbiAgLyoqIFRoZSBjb2xvciBwYWxldHRlIGZvciB0aGUgZm9ybSBmaWVsZC4gKi9cbiAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZSA9ICdwcmltYXJ5JztcblxuICAvKiogV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGFsd2F5cyBmbG9hdCBvciBmbG9hdCBhcyB0aGUgdXNlciB0eXBlcy4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGZsb2F0TGFiZWwoKTogRmxvYXRMYWJlbFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9mbG9hdExhYmVsIHx8IHRoaXMuX2RlZmF1bHRzPy5mbG9hdExhYmVsIHx8IERFRkFVTFRfRkxPQVRfTEFCRUw7XG4gIH1cbiAgc2V0IGZsb2F0TGFiZWwodmFsdWU6IEZsb2F0TGFiZWxUeXBlKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9mbG9hdExhYmVsKSB7XG4gICAgICB0aGlzLl9mbG9hdExhYmVsID0gdmFsdWU7XG4gICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEN1c3RvbSBmb3JtIGZpZWxkIGNvbnRyb2xzIG9yIGRpcmVjdGl2ZXMgbWlnaHQgc2V0XG4gICAgICAvLyB0aGUgXCJmbG9hdExhYmVsXCIgaW5wdXQgYW5kIGV4cGVjdCB0aGUgZm9ybSBmaWVsZCB2aWV3IHRvIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgIC8vIGUuZy4gYXV0b2NvbXBsZXRlIHRyaWdnZXIuIElkZWFsbHkgd2UnZCBnZXQgcmlkIG9mIHRoaXMgYW5kIHRoZSBjb25zdW1lcnMgd291bGQganVzdFxuICAgICAgLy8gZW1pdCB0aGUgXCJzdGF0ZUNoYW5nZXNcIiBvYnNlcnZhYmxlLiBUT0RPKGRldnZlcnNpb24pOiBjb25zaWRlciByZW1vdmluZy5cbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9mbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZTtcblxuICAvKiogVGhlIGZvcm0gZmllbGQgYXBwZWFyYW5jZSBzdHlsZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGFwcGVhcmFuY2UoKTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGVhcmFuY2U7XG4gIH1cbiAgc2V0IGFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2FwcGVhcmFuY2U7XG4gICAgY29uc3QgbmV3QXBwZWFyYW5jZSA9IHZhbHVlIHx8IHRoaXMuX2RlZmF1bHRzPy5hcHBlYXJhbmNlIHx8IERFRkFVTFRfQVBQRUFSQU5DRTtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICBpZiAobmV3QXBwZWFyYW5jZSAhPT0gJ2ZpbGwnICYmIG5ld0FwcGVhcmFuY2UgIT09ICdvdXRsaW5lJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1hdEZvcm1GaWVsZDogSW52YWxpZCBhcHBlYXJhbmNlIFwiJHtuZXdBcHBlYXJhbmNlfVwiLCB2YWxpZCB2YWx1ZXMgYXJlIFwiZmlsbFwiIG9yIFwib3V0bGluZVwiLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2FwcGVhcmFuY2UgPSBuZXdBcHBlYXJhbmNlO1xuICAgIGlmICh0aGlzLl9hcHBlYXJhbmNlID09PSAnb3V0bGluZScgJiYgdGhpcy5fYXBwZWFyYW5jZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgIC8vIElmIHRoZSBhcHBlYXJhbmNlIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGBvdXRsaW5lYCwgdGhlIGxhYmVsIG9mZnNldCBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAgLy8gVGhlIHVwZGF0ZSBjYW4gaGFwcGVuIG9uY2UgdGhlIHZpZXcgaGFzIGJlZW4gcmUtY2hlY2tlZCwgYnV0IG5vdCBpbW1lZGlhdGVseSBiZWNhdXNlXG4gICAgICAvLyB0aGUgdmlldyBoYXMgbm90IGJlZW4gdXBkYXRlZCBhbmQgdGhlIG5vdGNoZWQtb3V0bGluZSBmbG9hdGluZyBsYWJlbCBpcyBub3QgcHJlc2VudC5cbiAgICAgIHRoaXMuX25lZWRzT3V0bGluZUxhYmVsT2Zmc2V0VXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSA9IERFRkFVTFRfQVBQRUFSQU5DRTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZm9ybSBmaWVsZCBzaG91bGQgcmVzZXJ2ZSBzcGFjZSBmb3Igb25lIGxpbmUgb2YgaGludC9lcnJvciB0ZXh0IChkZWZhdWx0KVxuICAgKiBvciB0byBoYXZlIHRoZSBzcGFjaW5nIGdyb3cgZnJvbSAwcHggYXMgbmVlZGVkIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBoaW50L2Vycm9yIGNvbnRlbnQuXG4gICAqIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGR5bmFtaWMgc2l6aW5nLCBsYXlvdXQgc2hpZnRzIHdpbGwgb2NjdXIgd2hlbiBoaW50L2Vycm9yIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzdWJzY3JpcHRTaXppbmcoKTogU3Vic2NyaXB0U2l6aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0U2l6aW5nIHx8IHRoaXMuX2RlZmF1bHRzPy5zdWJzY3JpcHRTaXppbmcgfHwgREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HO1xuICB9XG4gIHNldCBzdWJzY3JpcHRTaXppbmcodmFsdWU6IFN1YnNjcmlwdFNpemluZykge1xuICAgIHRoaXMuX3N1YnNjcmlwdFNpemluZyA9IHZhbHVlIHx8IHRoaXMuX2RlZmF1bHRzPy5zdWJzY3JpcHRTaXppbmcgfHwgREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HO1xuICB9XG4gIHByaXZhdGUgX3N1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBmb3JtIGZpZWxkIGhpbnQuICovXG4gIEBJbnB1dCgpXG4gIGdldCBoaW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGludExhYmVsO1xuICB9XG4gIHNldCBoaW50TGFiZWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2hpbnRMYWJlbCA9IHZhbHVlO1xuICAgIHRoaXMuX3Byb2Nlc3NIaW50cygpO1xuICB9XG4gIHByaXZhdGUgX2hpbnRMYWJlbCA9ICcnO1xuXG4gIF9oYXNJY29uUHJlZml4ID0gZmFsc2U7XG4gIF9oYXNUZXh0UHJlZml4ID0gZmFsc2U7XG4gIF9oYXNJY29uU3VmZml4ID0gZmFsc2U7XG4gIF9oYXNUZXh0U3VmZml4ID0gZmFsc2U7XG5cbiAgLy8gVW5pcXVlIGlkIGZvciB0aGUgaW50ZXJuYWwgZm9ybSBmaWVsZCBsYWJlbC5cbiAgcmVhZG9ubHkgX2xhYmVsSWQgPSBgbWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICAvLyBVbmlxdWUgaWQgZm9yIHRoZSBoaW50IGxhYmVsLlxuICByZWFkb25seSBfaGludExhYmVsSWQgPSBgbWF0LW1kYy1oaW50LSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICAvKiogU3RhdGUgb2YgdGhlIG1hdC1oaW50IGFuZCBtYXQtZXJyb3IgYW5pbWF0aW9ucy4gKi9cbiAgX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlID0gJyc7XG5cbiAgLyoqIEdldHMgdGhlIGN1cnJlbnQgZm9ybSBmaWVsZCBjb250cm9sICovXG4gIGdldCBfY29udHJvbCgpOiBNYXRGb3JtRmllbGRDb250cm9sPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9leHBsaWNpdEZvcm1GaWVsZENvbnRyb2wgfHwgdGhpcy5fZm9ybUZpZWxkQ29udHJvbDtcbiAgfVxuICBzZXQgX2NvbnRyb2wodmFsdWUpIHtcbiAgICB0aGlzLl9leHBsaWNpdEZvcm1GaWVsZENvbnRyb2wgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2lzRm9jdXNlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9leHBsaWNpdEZvcm1GaWVsZENvbnRyb2w6IE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PjtcbiAgcHJpdmF0ZSBfbmVlZHNPdXRsaW5lTGFiZWxPZmZzZXRVcGRhdGUgPSBmYWxzZTtcblxuICBwcml2YXRlIF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBub3QgbmVlZGVkLCB0byBiZSByZW1vdmVkLlxuICAgICAqIEBicmVha2luZy1jaGFuZ2UgMTkuMC4wIHJlbW92ZSB0aGlzIHBhcmFtXG4gICAgICovXG4gICAgX3VudXNlZE5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2RpcjogRGlyZWN0aW9uYWxpdHksXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMpXG4gICAgcHJpdmF0ZSBfZGVmYXVsdHM/OiBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSkgcHVibGljIF9hbmltYXRpb25Nb2RlPzogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIG5vdCBuZWVkZWQsIHRvIGJlIHJlbW92ZWQuXG4gICAgICogQGJyZWFraW5nLWNoYW5nZSAxNy4wLjAgcmVtb3ZlIHRoaXMgcGFyYW1cbiAgICAgKi9cbiAgICBASW5qZWN0KERPQ1VNRU5UKSBfdW51c2VkRG9jdW1lbnQ/OiBhbnksXG4gICkge1xuICAgIGlmIChfZGVmYXVsdHMpIHtcbiAgICAgIGlmIChfZGVmYXVsdHMuYXBwZWFyYW5jZSkge1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSBfZGVmYXVsdHMuYXBwZWFyYW5jZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlciA9IEJvb2xlYW4oX2RlZmF1bHRzPy5oaWRlUmVxdWlyZWRNYXJrZXIpO1xuICAgICAgaWYgKF9kZWZhdWx0cy5jb2xvcikge1xuICAgICAgICB0aGlzLmNvbG9yID0gX2RlZmF1bHRzLmNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBJbml0aWFsIGZvY3VzIHN0YXRlIHN5bmMuIFRoaXMgaGFwcGVucyByYXJlbHksIGJ1dCB3ZSB3YW50IHRvIGFjY291bnQgZm9yXG4gICAgLy8gaXQgaW4gY2FzZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGhhcyBcImZvY3VzZWRcIiBzZXQgdG8gdHJ1ZSBvbiBpbml0LlxuICAgIHRoaXMuX3VwZGF0ZUZvY3VzU3RhdGUoKTtcbiAgICAvLyBFbmFibGUgYW5pbWF0aW9ucyBub3cuIFRoaXMgZW5zdXJlcyB3ZSBkb24ndCBhbmltYXRlIG9uIGluaXRpYWwgcmVuZGVyLlxuICAgIHRoaXMuX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlID0gJ2VudGVyJztcbiAgICAvLyBCZWNhdXNlIHRoZSBhYm92ZSBjaGFuZ2VzIGEgdmFsdWUgdXNlZCBpbiB0aGUgdGVtcGxhdGUgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQsIHdlIG5lZWRcbiAgICAvLyB0byB0cmlnZ2VyIENEIG9yIHRoZSBjaGFuZ2UgbWlnaHQgbm90IGJlIHJlZmxlY3RlZCBpZiB0aGVyZSBpcyBubyBvdGhlciBDRCBzY2hlZHVsZWQuXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuX2Fzc2VydEZvcm1GaWVsZENvbnRyb2woKTtcbiAgICB0aGlzLl9pbml0aWFsaXplQ29udHJvbCgpO1xuICAgIHRoaXMuX2luaXRpYWxpemVTdWJzY3JpcHQoKTtcbiAgICB0aGlzLl9pbml0aWFsaXplUHJlZml4QW5kU3VmZml4KCk7XG4gICAgdGhpcy5faW5pdGlhbGl6ZU91dGxpbmVMYWJlbE9mZnNldFN1YnNjcmlwdGlvbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICB0aGlzLl9hc3NlcnRGb3JtRmllbGRDb250cm9sKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGlkIG9mIHRoZSBsYWJlbCBlbGVtZW50LiBJZiBubyBsYWJlbCBpcyBwcmVzZW50LCByZXR1cm5zIGBudWxsYC5cbiAgICovXG4gIGdldExhYmVsSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0Zsb2F0aW5nTGFiZWwoKSA/IHRoaXMuX2xhYmVsSWQgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gRWxlbWVudFJlZiBmb3IgdGhlIGVsZW1lbnQgdGhhdCBhIG92ZXJsYXkgYXR0YWNoZWQgdG8gdGhlIGZvcm0gZmllbGRcbiAgICogc2hvdWxkIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8uXG4gICAqL1xuICBnZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiB0aGlzLl90ZXh0RmllbGQgfHwgdGhpcy5fZWxlbWVudFJlZjtcbiAgfVxuXG4gIC8qKiBBbmltYXRlcyB0aGUgcGxhY2Vob2xkZXIgdXAgYW5kIGxvY2tzIGl0IGluIHBvc2l0aW9uLiAqL1xuICBfYW5pbWF0ZUFuZExvY2tMYWJlbCgpOiB2b2lkIHtcbiAgICAvLyBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5LiBDb25zdW1lcnMgb2YgdGhlIGZvcm0gZmllbGQgbWlnaHQgdXNlXG4gICAgLy8gdGhpcyBtZXRob2QuIGUuZy4gdGhlIGF1dG9jb21wbGV0ZSB0cmlnZ2VyLiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbm9uLU1EQ1xuICAgIC8vIGZvcm0gZmllbGQgYmVjYXVzZSBzZXR0aW5nIFwiZmxvYXRMYWJlbFwiIHRvIFwiYWx3YXlzXCIgY2F1c2VkIHRoZSBsYWJlbCB0byBmbG9hdCB3aXRob3V0XG4gICAgLy8gYW5pbWF0aW9uLiBUaGlzIGlzIGRpZmZlcmVudCBpbiBNREMgd2hlcmUgdGhlIGxhYmVsIGFsd2F5cyBhbmltYXRlcywgc28gdGhpcyBtZXRob2RcbiAgICAvLyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LiBUaGVyZSBkb2Vzbid0IHNlZW0gYW55IGJlbmVmaXQgaW4gYWRkaW5nIGxvZ2ljIHRvIGFsbG93IGNoYW5naW5nXG4gICAgLy8gdGhlIGZsb2F0aW5nIGxhYmVsIHN0YXRlIHdpdGhvdXQgYW5pbWF0aW9ucy4gVGhlIG5vbi1NREMgaW1wbGVtZW50YXRpb24gd2FzIGluY29uc2lzdGVudFxuICAgIC8vIGJlY2F1c2UgaXQgYWx3YXlzIGFuaW1hdGVzIGlmIFwiZmxvYXRMYWJlbFwiIGlzIHNldCBhd2F5IGZyb20gXCJhbHdheXNcIi5cbiAgICAvLyBUT0RPKGRldnZlcnNpb24pOiBjb25zaWRlciByZW1vdmluZyB0aGlzIG1ldGhvZCB3aGVuIHJlbGVhc2luZyB0aGUgTURDIGZvcm0gZmllbGQuXG4gICAgaWYgKHRoaXMuX2hhc0Zsb2F0aW5nTGFiZWwoKSkge1xuICAgICAgdGhpcy5mbG9hdExhYmVsID0gJ2Fsd2F5cyc7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSByZWdpc3RlcmVkIGZvcm0gZmllbGQgY29udHJvbC4gKi9cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZUNvbnRyb2woKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuX2NvbnRyb2w7XG5cbiAgICBpZiAoY29udHJvbC5jb250cm9sVHlwZSkge1xuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgIGBtYXQtbWRjLWZvcm0tZmllbGQtdHlwZS0ke2NvbnRyb2wuY29udHJvbFR5cGV9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gdGhlIGNoaWxkIGNvbnRyb2wgc3RhdGUgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBmb3JtIGZpZWxkIFVJLlxuICAgIGNvbnRyb2wuc3RhdGVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVGb2N1c1N0YXRlKCk7XG4gICAgICB0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgLy8gUnVuIGNoYW5nZSBkZXRlY3Rpb24gaWYgdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgaWYgKGNvbnRyb2wubmdDb250cm9sICYmIGNvbnRyb2wubmdDb250cm9sLnZhbHVlQ2hhbmdlcykge1xuICAgICAgY29udHJvbC5uZ0NvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja1ByZWZpeEFuZFN1ZmZpeFR5cGVzKCkge1xuICAgIHRoaXMuX2hhc0ljb25QcmVmaXggPSAhIXRoaXMuX3ByZWZpeENoaWxkcmVuLmZpbmQocCA9PiAhcC5faXNUZXh0KTtcbiAgICB0aGlzLl9oYXNUZXh0UHJlZml4ID0gISF0aGlzLl9wcmVmaXhDaGlsZHJlbi5maW5kKHAgPT4gcC5faXNUZXh0KTtcbiAgICB0aGlzLl9oYXNJY29uU3VmZml4ID0gISF0aGlzLl9zdWZmaXhDaGlsZHJlbi5maW5kKHMgPT4gIXMuX2lzVGV4dCk7XG4gICAgdGhpcy5faGFzVGV4dFN1ZmZpeCA9ICEhdGhpcy5fc3VmZml4Q2hpbGRyZW4uZmluZChzID0+IHMuX2lzVGV4dCk7XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgdGhlIHByZWZpeCBhbmQgc3VmZml4IGNvbnRhaW5lcnMuICovXG4gIHByaXZhdGUgX2luaXRpYWxpemVQcmVmaXhBbmRTdWZmaXgoKSB7XG4gICAgdGhpcy5fY2hlY2tQcmVmaXhBbmRTdWZmaXhUeXBlcygpO1xuICAgIC8vIE1hcmsgdGhlIGZvcm0gZmllbGQgYXMgZGlydHkgd2hlbmV2ZXIgdGhlIHByZWZpeCBvciBzdWZmaXggY2hpbGRyZW4gY2hhbmdlLiBUaGlzXG4gICAgLy8gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY29uZGl0aW9uYWxseSBkaXNwbGF5IHRoZSBwcmVmaXgvc3VmZml4IGNvbnRhaW5lcnMgYmFzZWRcbiAgICAvLyBvbiB3aGV0aGVyIHRoZXJlIGlzIHByb2plY3RlZCBjb250ZW50LlxuICAgIG1lcmdlKHRoaXMuX3ByZWZpeENoaWxkcmVuLmNoYW5nZXMsIHRoaXMuX3N1ZmZpeENoaWxkcmVuLmNoYW5nZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jaGVja1ByZWZpeEFuZFN1ZmZpeFR5cGVzKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgc3Vic2NyaXB0IGJ5IHZhbGlkYXRpbmcgaGludHMgYW5kIHN5bmNocm9uaXppbmcgXCJhcmlhLWRlc2NyaWJlZGJ5XCIgaWRzXG4gICAqIHdpdGggdGhlIGN1c3RvbSBmb3JtIGZpZWxkIGNvbnRyb2wuIEFsc28gc3Vic2NyaWJlcyB0byBoaW50IGFuZCBlcnJvciBjaGFuZ2VzIGluIG9yZGVyXG4gICAqIHRvIGJlIGFibGUgdG8gdmFsaWRhdGUgYW5kIHN5bmNocm9uaXplIGlkcyBvbiBjaGFuZ2UuXG4gICAqL1xuICBwcml2YXRlIF9pbml0aWFsaXplU3Vic2NyaXB0KCkge1xuICAgIC8vIFJlLXZhbGlkYXRlIHdoZW4gdGhlIG51bWJlciBvZiBoaW50cyBjaGFuZ2VzLlxuICAgIHRoaXMuX2hpbnRDaGlsZHJlbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9wcm9jZXNzSGludHMoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhcmlhLWRlc2NyaWJlZCBieSB3aGVuIHRoZSBudW1iZXIgb2YgZXJyb3JzIGNoYW5nZXMuXG4gICAgdGhpcy5fZXJyb3JDaGlsZHJlbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbCBtYXQtaGludCB2YWxpZGF0aW9uIGFuZCBzdWJzY3JpcHQgZGVzY3JpYmVkQnlJZHMgc3luYy5cbiAgICB0aGlzLl92YWxpZGF0ZUhpbnRzKCk7XG4gICAgdGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCk7XG4gIH1cblxuICAvKiogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBmb3JtIGZpZWxkJ3MgY29udHJvbCBpcyBtaXNzaW5nLiAqL1xuICBwcml2YXRlIF9hc3NlcnRGb3JtRmllbGRDb250cm9sKCkge1xuICAgIGlmICghdGhpcy5fY29udHJvbCAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkTWlzc2luZ0NvbnRyb2xFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUZvY3VzU3RhdGUoKSB7XG4gICAgLy8gVXN1YWxseSB0aGUgTURDIGZvdW5kYXRpb24gd291bGQgY2FsbCBcImFjdGl2YXRlRm9jdXNcIiBhbmQgXCJkZWFjdGl2YXRlRm9jdXNcIiB3aGVuZXZlclxuICAgIC8vIGNlcnRhaW4gRE9NIGV2ZW50cyBhcmUgZW1pdHRlZC4gVGhpcyBpcyBub3QgcG9zc2libGUgaW4gb3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZVxuICAgIC8vIGZvcm0gZmllbGQgYmVjYXVzZSB3ZSBzdXBwb3J0IGFic3RyYWN0IGZvcm0gZmllbGQgY29udHJvbHMgd2hpY2ggYXJlIG5vdCBuZWNlc3NhcmlseVxuICAgIC8vIG9mIHR5cGUgaW5wdXQsIG5vciBkbyB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgbmF0aXZlIGZvcm0gZmllbGQgY29udHJvbCBlbGVtZW50LiBJbnN0ZWFkXG4gICAgLy8gd2UgaGFuZGxlIHRoZSBmb2N1cyBieSBjaGVja2luZyBpZiB0aGUgYWJzdHJhY3QgZm9ybSBmaWVsZCBjb250cm9sIGZvY3VzZWQgc3RhdGUgY2hhbmdlcy5cbiAgICBpZiAodGhpcy5fY29udHJvbC5mb2N1c2VkICYmICF0aGlzLl9pc0ZvY3VzZWQpIHtcbiAgICAgIHRoaXMuX2lzRm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLl9saW5lUmlwcGxlPy5hY3RpdmF0ZSgpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NvbnRyb2wuZm9jdXNlZCAmJiAodGhpcy5faXNGb2N1c2VkIHx8IHRoaXMuX2lzRm9jdXNlZCA9PT0gbnVsbCkpIHtcbiAgICAgIHRoaXMuX2lzRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fbGluZVJpcHBsZT8uZGVhY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3RleHRGaWVsZD8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFxuICAgICAgJ21kYy10ZXh0LWZpZWxkLS1mb2N1c2VkJyxcbiAgICAgIHRoaXMuX2NvbnRyb2wuZm9jdXNlZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmbG9hdGluZyBsYWJlbCBpbiB0aGUgZG9ja2VkIHN0YXRlIG5lZWRzIHRvIGFjY291bnQgZm9yIHByZWZpeGVzLiBUaGUgaG9yaXpvbnRhbCBvZmZzZXRcbiAgICogaXMgY2FsY3VsYXRlZCB3aGVuZXZlciB0aGUgYXBwZWFyYW5jZSBjaGFuZ2VzIHRvIGBvdXRsaW5lYCwgdGhlIHByZWZpeGVzIGNoYW5nZSwgb3Igd2hlbiB0aGVcbiAgICogZm9ybSBmaWVsZCBpcyBhZGRlZCB0byB0aGUgRE9NLiBUaGlzIG1ldGhvZCBzZXRzIHVwIGFsbCBzdWJzY3JpcHRpb25zIHdoaWNoIGFyZSBuZWVkZWQgdG9cbiAgICogdHJpZ2dlciB0aGUgbGFiZWwgb2Zmc2V0IHVwZGF0ZS5cbiAgICovXG4gIHByaXZhdGUgX2luaXRpYWxpemVPdXRsaW5lTGFiZWxPZmZzZXRTdWJzY3JpcHRpb25zKCkge1xuICAgIC8vIFdoZW5ldmVyIHRoZSBwcmVmaXggY2hhbmdlcywgc2NoZWR1bGUgYW4gdXBkYXRlIG9mIHRoZSBsYWJlbCBvZmZzZXQuXG4gICAgLy8gVE9ETyhtbWFsZXJiYSk6IFVzZSBSZXNpemVPYnNlcnZlciB0byBiZXR0ZXIgc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyBwcmVmaXggY29udGVudC5cbiAgICB0aGlzLl9wcmVmaXhDaGlsZHJlbi5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiAodGhpcy5fbmVlZHNPdXRsaW5lTGFiZWxPZmZzZXRVcGRhdGUgPSB0cnVlKSk7XG5cbiAgICAvLyBUT0RPKG1tYWxlcmJhKTogU3BsaXQgdGhpcyBpbnRvIHNlcGFyYXRlIGBhZnRlclJlbmRlcmAgY2FsbHMgdXNpbmcgdGhlIGBFYXJseVJlYWRgIGFuZFxuICAgIC8vICBgV3JpdGVgIHBoYXNlcy5cbiAgICBhZnRlclJlbmRlcihcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX25lZWRzT3V0bGluZUxhYmVsT2Zmc2V0VXBkYXRlKSB7XG4gICAgICAgICAgdGhpcy5fbmVlZHNPdXRsaW5lTGFiZWxPZmZzZXRVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl91cGRhdGVPdXRsaW5lTGFiZWxPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5fZGlyLmNoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLl9uZWVkc091dGxpbmVMYWJlbE9mZnNldFVwZGF0ZSA9IHRydWUpKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBmbG9hdGluZyBsYWJlbCBzaG91bGQgYWx3YXlzIGZsb2F0IG9yIG5vdC4gKi9cbiAgX3Nob3VsZEFsd2F5c0Zsb2F0KCkge1xuICAgIHJldHVybiB0aGlzLmZsb2F0TGFiZWwgPT09ICdhbHdheXMnO1xuICB9XG5cbiAgX2hhc091dGxpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZWFyYW5jZSA9PT0gJ291dGxpbmUnO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBkaXNwbGF5IGluIHRoZSBpbmZpeC4gTGFiZWxzIGluIHRoZSBvdXRsaW5lIGFwcGVhcmFuY2UgYXJlXG4gICAqIGRpc3BsYXllZCBhcyBwYXJ0IG9mIHRoZSBub3RjaGVkLW91dGxpbmUgYW5kIGFyZSBob3Jpem9udGFsbHkgb2Zmc2V0IHRvIGFjY291bnQgZm9yXG4gICAqIGZvcm0gZmllbGQgcHJlZml4IGNvbnRlbnQuIFRoaXMgd29uJ3Qgd29yayBpbiBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcgc2luY2Ugd2UgY2Fubm90XG4gICAqIG1lYXN1cmUgdGhlIHdpZHRoIG9mIHRoZSBwcmVmaXggY29udGFpbmVyLiBUbyBtYWtlIHRoZSBkb2NrZWQgbGFiZWwgYXBwZWFyIGFzIGlmIHRoZVxuICAgKiByaWdodCBvZmZzZXQgaGFzIGJlZW4gY2FsY3VsYXRlZCwgd2UgZm9yY2libHkgcmVuZGVyIHRoZSBsYWJlbCBpbnNpZGUgdGhlIGluZml4LiBTaW5jZVxuICAgKiB0aGUgbGFiZWwgaXMgcGFydCBvZiB0aGUgaW5maXgsIHRoZSBsYWJlbCBjYW5ub3Qgb3ZlcmZsb3cgdGhlIHByZWZpeCBjb250ZW50LlxuICAgKi9cbiAgX2ZvcmNlRGlzcGxheUluZml4TGFiZWwoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIgJiYgdGhpcy5fcHJlZml4Q2hpbGRyZW4ubGVuZ3RoICYmICF0aGlzLl9zaG91bGRMYWJlbEZsb2F0KCk7XG4gIH1cblxuICBfaGFzRmxvYXRpbmdMYWJlbCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9sYWJlbENoaWxkTm9uU3RhdGljIHx8ICEhdGhpcy5fbGFiZWxDaGlsZFN0YXRpYztcbiAgfVxuXG4gIF9zaG91bGRMYWJlbEZsb2F0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb250cm9sLnNob3VsZExhYmVsRmxvYXQgfHwgdGhpcy5fc2hvdWxkQWx3YXlzRmxvYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjbGFzcyBmcm9tIHRoZSBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmVcbiAgICogc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0aGUgaG9zdCBlbGVtZW50LlxuICAgKi9cbiAgX3Nob3VsZEZvcndhcmQocHJvcDoga2V5b2YgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLm5nQ29udHJvbCA6IG51bGw7XG4gICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbFtwcm9wXTtcbiAgfVxuXG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSBoaW50cyBvciBlcnJvcnMuICovXG4gIF9nZXREaXNwbGF5ZWRNZXNzYWdlcygpOiAnZXJyb3InIHwgJ2hpbnQnIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDaGlsZHJlbiAmJiB0aGlzLl9lcnJvckNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgdGhpcy5fY29udHJvbC5lcnJvclN0YXRlXG4gICAgICA/ICdlcnJvcidcbiAgICAgIDogJ2hpbnQnO1xuICB9XG5cbiAgLyoqIEhhbmRsZSBsYWJlbCByZXNpemUgZXZlbnRzLiAqL1xuICBfaGFuZGxlTGFiZWxSZXNpemVkKCkge1xuICAgIHRoaXMuX3JlZnJlc2hPdXRsaW5lTm90Y2hXaWR0aCgpO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgd2lkdGggb2YgdGhlIG91dGxpbmUtbm90Y2gsIGlmIHByZXNlbnQuICovXG4gIF9yZWZyZXNoT3V0bGluZU5vdGNoV2lkdGgoKSB7XG4gICAgaWYgKCF0aGlzLl9oYXNPdXRsaW5lKCkgfHwgIXRoaXMuX2Zsb2F0aW5nTGFiZWwgfHwgIXRoaXMuX3Nob3VsZExhYmVsRmxvYXQoKSkge1xuICAgICAgdGhpcy5fbm90Y2hlZE91dGxpbmU/Ll9zZXROb3RjaFdpZHRoKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ub3RjaGVkT3V0bGluZT8uX3NldE5vdGNoV2lkdGgodGhpcy5fZmxvYXRpbmdMYWJlbC5nZXRXaWR0aCgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogRG9lcyBhbnkgZXh0cmEgcHJvY2Vzc2luZyB0aGF0IGlzIHJlcXVpcmVkIHdoZW4gaGFuZGxpbmcgdGhlIGhpbnRzLiAqL1xuICBwcml2YXRlIF9wcm9jZXNzSGludHMoKSB7XG4gICAgdGhpcy5fdmFsaWRhdGVIaW50cygpO1xuICAgIHRoaXMuX3N5bmNEZXNjcmliZWRCeUlkcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBvZiBvbmUgb2YgZWFjaCBcIm1hdC1oaW50XCIgYWxpZ25tZW50IHNwZWNpZmllZC4gVGhlIGhpbnRcbiAgICogbGFiZWwgc3BlY2lmaWVkIHNldCB0aHJvdWdoIHRoZSBpbnB1dCBpcyBiZWluZyBjb25zaWRlcmVkIGFzIFwic3RhcnRcIiBhbGlnbmVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBhIG5vb3AgaWYgQW5ndWxhciBydW5zIGluIHByb2R1Y3Rpb24gbW9kZS5cbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlSGludHMoKSB7XG4gICAgaWYgKHRoaXMuX2hpbnRDaGlsZHJlbiAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgbGV0IHN0YXJ0SGludDogTWF0SGludDtcbiAgICAgIGxldCBlbmRIaW50OiBNYXRIaW50O1xuICAgICAgdGhpcy5faGludENoaWxkcmVuLmZvckVhY2goKGhpbnQ6IE1hdEhpbnQpID0+IHtcbiAgICAgICAgaWYgKGhpbnQuYWxpZ24gPT09ICdzdGFydCcpIHtcbiAgICAgICAgICBpZiAoc3RhcnRIaW50IHx8IHRoaXMuaGludExhYmVsKSB7XG4gICAgICAgICAgICB0aHJvdyBnZXRNYXRGb3JtRmllbGREdXBsaWNhdGVkSGludEVycm9yKCdzdGFydCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFydEhpbnQgPSBoaW50O1xuICAgICAgICB9IGVsc2UgaWYgKGhpbnQuYWxpZ24gPT09ICdlbmQnKSB7XG4gICAgICAgICAgaWYgKGVuZEhpbnQpIHtcbiAgICAgICAgICAgIHRocm93IGdldE1hdEZvcm1GaWVsZER1cGxpY2F0ZWRIaW50RXJyb3IoJ2VuZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbmRIaW50ID0gaGludDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxpc3Qgb2YgZWxlbWVudCBJRHMgdGhhdCBkZXNjcmliZSB0aGUgY2hpbGQgY29udHJvbC4gVGhpcyBhbGxvd3MgdGhlIGNvbnRyb2wgdG8gdXBkYXRlXG4gICAqIGl0cyBgYXJpYS1kZXNjcmliZWRieWAgYXR0cmlidXRlIGFjY29yZGluZ2x5LlxuICAgKi9cbiAgcHJpdmF0ZSBfc3luY0Rlc2NyaWJlZEJ5SWRzKCkge1xuICAgIGlmICh0aGlzLl9jb250cm9sKSB7XG4gICAgICBsZXQgaWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAvLyBUT0RPKHdhZ25lcm1hY2llbCk6IFJlbW92ZSB0aGUgdHlwZSBjaGVjayB3aGVuIHdlIGZpbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhpcyBidWcuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2NvbnRyb2wudXNlckFyaWFEZXNjcmliZWRCeSAmJlxuICAgICAgICB0eXBlb2YgdGhpcy5fY29udHJvbC51c2VyQXJpYURlc2NyaWJlZEJ5ID09PSAnc3RyaW5nJ1xuICAgICAgKSB7XG4gICAgICAgIGlkcy5wdXNoKC4uLnRoaXMuX2NvbnRyb2wudXNlckFyaWFEZXNjcmliZWRCeS5zcGxpdCgnICcpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2dldERpc3BsYXllZE1lc3NhZ2VzKCkgPT09ICdoaW50Jykge1xuICAgICAgICBjb25zdCBzdGFydEhpbnQgPSB0aGlzLl9oaW50Q2hpbGRyZW5cbiAgICAgICAgICA/IHRoaXMuX2hpbnRDaGlsZHJlbi5maW5kKGhpbnQgPT4gaGludC5hbGlnbiA9PT0gJ3N0YXJ0JylcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IGVuZEhpbnQgPSB0aGlzLl9oaW50Q2hpbGRyZW5cbiAgICAgICAgICA/IHRoaXMuX2hpbnRDaGlsZHJlbi5maW5kKGhpbnQgPT4gaGludC5hbGlnbiA9PT0gJ2VuZCcpXG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGlmIChzdGFydEhpbnQpIHtcbiAgICAgICAgICBpZHMucHVzaChzdGFydEhpbnQuaWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpbnRMYWJlbCkge1xuICAgICAgICAgIGlkcy5wdXNoKHRoaXMuX2hpbnRMYWJlbElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRIaW50KSB7XG4gICAgICAgICAgaWRzLnB1c2goZW5kSGludC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fZXJyb3JDaGlsZHJlbikge1xuICAgICAgICBpZHMucHVzaCguLi50aGlzLl9lcnJvckNoaWxkcmVuLm1hcChlcnJvciA9PiBlcnJvci5pZCkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb250cm9sLnNldERlc2NyaWJlZEJ5SWRzKGlkcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBsYWJlbCBpbiB0aGUgb3V0bGluZSBhcHBlYXJhbmNlLiBJbiB0aGUgb3V0bGluZVxuICAgKiBhcHBlYXJhbmNlLCB0aGUgbm90Y2hlZC1vdXRsaW5lIGFuZCBsYWJlbCBhcmUgbm90IHJlbGF0aXZlIHRvIHRoZSBpbmZpeCBjb250YWluZXIgYmVjYXVzZVxuICAgKiB0aGUgb3V0bGluZSBpbnRlbmRzIHRvIHN1cnJvdW5kIHByZWZpeGVzLCBzdWZmaXhlcyBhbmQgdGhlIGluZml4LiBUaGlzIG1lYW5zIHRoYXQgdGhlXG4gICAqIGZsb2F0aW5nIGxhYmVsIGJ5IGRlZmF1bHQgb3ZlcmxhcHMgcHJlZml4ZXMgaW4gdGhlIGRvY2tlZCBzdGF0ZS4gVG8gYXZvaWQgdGhpcywgd2UgbmVlZCB0b1xuICAgKiBob3Jpem9udGFsbHkgb2Zmc2V0IHRoZSBsYWJlbCBieSB0aGUgd2lkdGggb2YgdGhlIHByZWZpeCBjb250YWluZXIuIFRoZSBNREMgdGV4dC1maWVsZCBkb2VzXG4gICAqIG5vdCBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGV5IHVzZSBhIGZpeGVkIHdpZHRoIGZvciBwcmVmaXhlcy4gSGVuY2UsIHRoZXkgY2FuIHNpbXBseVxuICAgKiBpbmNvcnBvcmF0ZSB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgaW50byB0aGVpciBkZWZhdWx0IHRleHQtZmllbGQgc3R5bGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlT3V0bGluZUxhYmVsT2Zmc2V0KCkge1xuICAgIGlmICghdGhpcy5faGFzT3V0bGluZSgpIHx8ICF0aGlzLl9mbG9hdGluZ0xhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZsb2F0aW5nTGFiZWwgPSB0aGlzLl9mbG9hdGluZ0xhYmVsLmVsZW1lbnQ7XG4gICAgLy8gSWYgbm8gcHJlZml4IGlzIGRpc3BsYXllZCwgcmVzZXQgdGhlIG91dGxpbmUgbGFiZWwgb2Zmc2V0IGZyb20gcG90ZW50aWFsXG4gICAgLy8gcHJldmlvdXMgbGFiZWwgb2Zmc2V0IHVwZGF0ZXMuXG4gICAgaWYgKCEodGhpcy5faWNvblByZWZpeENvbnRhaW5lciB8fCB0aGlzLl90ZXh0UHJlZml4Q29udGFpbmVyKSkge1xuICAgICAgZmxvYXRpbmdMYWJlbC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgdGhlIGZvcm0gZmllbGQgaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBET00geWV0IChlLmcuIGluIGEgdGFiKSwgd2UgZGVmZXJcbiAgICAvLyB0aGUgbGFiZWwgb2Zmc2V0IHVwZGF0ZSB1bnRpbCB0aGUgem9uZSBzdGFiaWxpemVzLlxuICAgIGlmICghdGhpcy5faXNBdHRhY2hlZFRvRG9tKCkpIHtcbiAgICAgIHRoaXMuX25lZWRzT3V0bGluZUxhYmVsT2Zmc2V0VXBkYXRlID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWNvblByZWZpeENvbnRhaW5lciA9IHRoaXMuX2ljb25QcmVmaXhDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGV4dFByZWZpeENvbnRhaW5lciA9IHRoaXMuX3RleHRQcmVmaXhDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaWNvblByZWZpeENvbnRhaW5lcldpZHRoID0gaWNvblByZWZpeENvbnRhaW5lcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPz8gMDtcbiAgICBjb25zdCB0ZXh0UHJlZml4Q29udGFpbmVyV2lkdGggPSB0ZXh0UHJlZml4Q29udGFpbmVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA/PyAwO1xuICAgIC8vIElmIHRoZSBkaXJlY3Rpb25hbGl0eSBpcyBSVEwsIHRoZSB4LWF4aXMgdHJhbnNmb3JtIG5lZWRzIHRvIGJlIGludmVydGVkLiBUaGlzXG4gICAgLy8gaXMgYmVjYXVzZSBgdHJhbnNmb3JtWGAgZG9lcyBub3QgY2hhbmdlIGJhc2VkIG9uIHRoZSBwYWdlIGRpcmVjdGlvbmFsaXR5LlxuICAgIGNvbnN0IG5lZ2F0ZSA9IHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcgPyAnLTEnIDogJzEnO1xuICAgIGNvbnN0IHByZWZpeFdpZHRoID0gYCR7aWNvblByZWZpeENvbnRhaW5lcldpZHRoICsgdGV4dFByZWZpeENvbnRhaW5lcldpZHRofXB4YDtcbiAgICBjb25zdCBsYWJlbE9mZnNldCA9IGB2YXIoLS1tYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwtb2Zmc2V0LXgsIDBweClgO1xuICAgIGNvbnN0IGxhYmVsSG9yaXpvbnRhbE9mZnNldCA9IGBjYWxjKCR7bmVnYXRlfSAqICgke3ByZWZpeFdpZHRofSArICR7bGFiZWxPZmZzZXR9KSlgO1xuXG4gICAgLy8gVXBkYXRlIHRoZSB0cmFuc2xhdGVYIG9mIHRoZSBmbG9hdGluZyBsYWJlbCB0byBhY2NvdW50IGZvciB0aGUgcHJlZml4IGNvbnRhaW5lcixcbiAgICAvLyBidXQgYWxsb3cgdGhlIENTUyB0byBvdmVycmlkZSB0aGlzIHNldHRpbmcgdmlhIGEgQ1NTIHZhcmlhYmxlIHdoZW4gdGhlIGxhYmVsIGlzXG4gICAgLy8gZmxvYXRpbmcuXG4gICAgZmxvYXRpbmdMYWJlbC5zdHlsZS50cmFuc2Zvcm0gPSBgdmFyKFxuICAgICAgICAtLW1hdC1tZGMtZm9ybS1maWVsZC1sYWJlbC10cmFuc2Zvcm0sXG4gICAgICAgICR7RkxPQVRJTkdfTEFCRUxfREVGQVVMVF9ET0NLRURfVFJBTlNGT1JNfSB0cmFuc2xhdGVYKCR7bGFiZWxIb3Jpem9udGFsT2Zmc2V0fSlcbiAgICApYDtcbiAgfVxuXG4gIC8qKiBDaGVja3Mgd2hldGhlciB0aGUgZm9ybSBmaWVsZCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NLiAqL1xuICBwcml2YXRlIF9pc0F0dGFjaGVkVG9Eb20oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGVsZW1lbnQuZ2V0Um9vdE5vZGUpIHtcbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSBET00gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIGVpdGhlciB0aGUgZG9jdW1lbnRcbiAgICAgIC8vIG9yIHRoZSBjbG9zZXN0IHNoYWRvdyByb290LCBvdGhlcndpc2UgaXQnbGwgYmUgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAgcmV0dXJuIHJvb3ROb2RlICYmIHJvb3ROb2RlICE9PSBlbGVtZW50O1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIGNoZWNraW5nIGlmIGl0J3MgaW4gdGhlIGRvY3VtZW50LiBUaGlzIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAvLyBzaGFkb3cgRE9NLCBob3dldmVyIGJyb3dzZXIgdGhhdCBzdXBwb3J0IHNoYWRvdyBET00gc2hvdWxkIHN1cHBvcnQgYGdldFJvb3ROb2RlYCBhcyB3ZWxsLlxuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQhLmNvbnRhaW5zKGVsZW1lbnQpO1xuICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gIDwhLS1cbiAgICBNREMgcmVjb21tZW5kcyB0aGF0IHRoZSB0ZXh0LWZpZWxkIGlzIGEgYDxsYWJlbD5gIGVsZW1lbnQuIFRoaXMgcmF0aGVyIGNvbXBsaWNhdGVzIHRoZVxuICAgIHNldHVwIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZSBldmVyeSBmb3JtLWZpZWxkIGNvbnRyb2wgdG8gZXhwbGljaXRseSBzZXQgYGFyaWEtbGFiZWxsZWRieWAuXG4gICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBgPGxhYmVsPmAgaXRzZWxmIGNvbnRhaW5zIG1vcmUgdGhhbiB0aGUgYWN0dWFsIGxhYmVsIChlLmcuIHByZWZpeCwgc3VmZml4XG4gICAgb3Igb3RoZXIgcHJvamVjdGVkIGNvbnRlbnQpLCBhbmQgc2NyZWVuIHJlYWRlcnMgY291bGQgcG90ZW50aWFsbHkgcmVhZCBvdXQgdW5kZXNpcmVkIGNvbnRlbnQuXG4gICAgRXhjbHVkaW5nIGVsZW1lbnRzIGZyb20gYmVpbmcgcHJpbnRlZCBvdXQgcmVxdWlyZXMgdGhlbSB0byBiZSBtYXJrZWQgd2l0aCBgYXJpYS1oaWRkZW5gLCBvclxuICAgIHRoZSBmb3JtIGNvbnRyb2wgaXMgc2V0IHRvIGEgc2NvcGVkIGVsZW1lbnQgZm9yIHRoZSBsYWJlbCAodXNpbmcgYGFyaWEtbGFiZWxsZWRieWApLiBCb3RoIG9mXG4gICAgdGhlc2Ugb3B0aW9ucyBzZWVtIHRvIGNvbXBsaWNhdGUgdGhlIHNldHVwIGJlY2F1c2Ugd2Uga25vdyBleGFjdGx5IHdoYXQgY29udGVudCBpcyByZW5kZXJlZFxuICAgIGFzIHBhcnQgb2YgdGhlIGxhYmVsLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzcGVuZCByZXNvdXJjZXMgb24gd2Fsa2luZyB0aHJvdWdoIHByb2plY3RlZCBjb250ZW50XG4gICAgdG8gc2V0IGBhcmlhLWhpZGRlbmAuIE5vciBkbyB3ZSB3YW50IHRvIHNldCBgYXJpYS1sYWJlbGxlZGJ5YCBvbiBldmVyeSBmb3JtIGNvbnRyb2wgaWYgd2UgY291bGRcbiAgICBzaW1wbHkgbGluayB0aGUgbGFiZWwgdG8gdGhlIGNvbnRyb2wgdXNpbmcgdGhlIGxhYmVsIGBmb3JgIGF0dHJpYnV0ZS5cbiAgLS0+XG4gIEBpZiAoX2hhc0Zsb2F0aW5nTGFiZWwoKSkge1xuICAgIDxsYWJlbCBtYXRGb3JtRmllbGRGbG9hdGluZ0xhYmVsXG4gICAgICAgICAgIFtmbG9hdGluZ109XCJfc2hvdWxkTGFiZWxGbG9hdCgpXCJcbiAgICAgICAgICAgW21vbml0b3JSZXNpemVdPVwiX2hhc091dGxpbmUoKVwiXG4gICAgICAgICAgIFtpZF09XCJfbGFiZWxJZFwiXG4gICAgICAgICAgIFthdHRyLmZvcl09XCJfY29udHJvbC5kaXNhYmxlQXV0b21hdGljTGFiZWxpbmcgPyBudWxsIDogX2NvbnRyb2wuaWRcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1sYWJlbFwiPjwvbmctY29udGVudD5cbiAgICAgIDwhLS1cbiAgICAgICAgV2Ugc2V0IHRoZSByZXF1aXJlZCBtYXJrZXIgYXMgYSBzZXBhcmF0ZSBlbGVtZW50LCBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciB0byB0YXJnZXQgaWZcbiAgICAgICAgYXBwcyB3YW50IHRvIG92ZXJyaWRlIGl0IGFuZCB0byBiZSBhYmxlIHRvIHNldCBgYXJpYS1oaWRkZW5gIHNvIHRoYXQgc2NyZWVuIHJlYWRlcnMgZG9uJ3RcbiAgICAgICAgcGljayBpdCB1cC5cbiAgICAgICAtLT5cbiAgICAgICBAaWYgKCFoaWRlUmVxdWlyZWRNYXJrZXIgJiYgX2NvbnRyb2wucmVxdWlyZWQpIHtcbiAgICAgICAgIDxzcGFuXG4gICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciBtZGMtZmxvYXRpbmctbGFiZWwtLXJlcXVpcmVkXCI+PC9zcGFuPlxuICAgICAgIH1cbiAgICA8L2xhYmVsPlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwibWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIgbWRjLXRleHQtZmllbGRcIiAjdGV4dEZpZWxkXG4gICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0tZmlsbGVkXT1cIiFfaGFzT3V0bGluZSgpXCJcbiAgICAgW2NsYXNzLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZF09XCJfaGFzT3V0bGluZSgpXCJcbiAgICAgW2NsYXNzLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbF09XCIhX2hhc0Zsb2F0aW5nTGFiZWwoKVwiXG4gICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWRdPVwiX2NvbnRyb2wuZGlzYWJsZWRcIlxuICAgICBbY2xhc3MubWRjLXRleHQtZmllbGQtLWludmFsaWRdPVwiX2NvbnRyb2wuZXJyb3JTdGF0ZVwiXG4gICAgIChjbGljayk9XCJfY29udHJvbC5vbkNvbnRhaW5lckNsaWNrKCRldmVudClcIj5cbiAgQGlmICghX2hhc091dGxpbmUoKSAmJiAhX2NvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWZvY3VzLW92ZXJsYXlcIj48L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWZsZXhcIj5cbiAgICBAaWYgKF9oYXNPdXRsaW5lKCkpIHtcbiAgICAgIDxkaXYgbWF0Rm9ybUZpZWxkTm90Y2hlZE91dGxpbmUgW21hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lT3Blbl09XCJfc2hvdWxkTGFiZWxGbG9hdCgpXCI+XG4gICAgICAgIEBpZiAoIV9mb3JjZURpc3BsYXlJbmZpeExhYmVsKCkpIHtcbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoX2hhc0ljb25QcmVmaXgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXhcIiAjaWNvblByZWZpeENvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF0sIFttYXRJY29uUHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoX2hhc1RleHRQcmVmaXgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtdGV4dC1wcmVmaXhcIiAjdGV4dFByZWZpeENvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFRleHRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeFwiPlxuICAgICAgQGlmICghX2hhc091dGxpbmUoKSB8fCBfZm9yY2VEaXNwbGF5SW5maXhMYWJlbCgpKSB7XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIH1cblxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChfaGFzVGV4dFN1ZmZpeCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC10ZXh0LXN1ZmZpeFwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0VGV4dFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKF9oYXNJY29uU3VmZml4KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4XCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdLCBbbWF0SWNvblN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIEBpZiAoIV9oYXNPdXRsaW5lKCkpIHtcbiAgICA8ZGl2IG1hdEZvcm1GaWVsZExpbmVSaXBwbGU+PC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIG1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ25cIlxuICAgICBbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC1keW5hbWljLXNpemVdPVwic3Vic2NyaXB0U2l6aW5nID09PSAnZHluYW1pYydcIj5cblxuICBAc3dpdGNoIChfZ2V0RGlzcGxheWVkTWVzc2FnZXMoKSkge1xuICAgIEBjYXNlICgnZXJyb3InKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWVycm9yLXdyYXBwZXJcIlxuICAgICAgICAgICBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJfc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yLCBbbWF0RXJyb3JdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGNhc2UgKCdoaW50Jykge1xuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIiBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJfc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGVcIj5cbiAgICAgICAgQGlmIChoaW50TGFiZWwpIHtcbiAgICAgICAgICA8bWF0LWhpbnQgW2lkXT1cIl9oaW50TGFiZWxJZFwiPnt7aGludExhYmVsfX08L21hdC1oaW50PlxuICAgICAgICB9XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFthbGlnbj0nZW5kJ11cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuIl19
614
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9mb3JtLWZpZWxkLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBZSxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHFCQUFxQixFQUlyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUVOLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsU0FBUyxFQUFXLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUNMLHFCQUFxQixFQUVyQix5QkFBeUIsR0FDMUIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG9C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YixLQUFLO2dCQWtCRixVQUFVO3NCQURiLEtBQUs7Z0JBOEJGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBV0YsU0FBUztzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge0Jvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7RE9DVU1FTlQsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBTklNQVRJT05fTU9EVUxFX1RZUEUsXG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYWZ0ZXJSZW5kZXIsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbERpcmVjdGl2ZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtUaGVtZVBhbGV0dGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtTdWJqZWN0LCBtZXJnZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtNQVRfRVJST1IsIE1hdEVycm9yfSBmcm9tICcuL2RpcmVjdGl2ZXMvZXJyb3InO1xuaW1wb3J0IHtcbiAgRkxPQVRJTkdfTEFCRUxfUEFSRU5ULFxuICBGbG9hdGluZ0xhYmVsUGFyZW50LFxuICBNYXRGb3JtRmllbGRGbG9hdGluZ0xhYmVsLFxufSBmcm9tICcuL2RpcmVjdGl2ZXMvZmxvYXRpbmctbGFiZWwnO1xuaW1wb3J0IHtNYXRIaW50fSBmcm9tICcuL2RpcmVjdGl2ZXMvaGludCc7XG5pbXBvcnQge01hdExhYmVsfSBmcm9tICcuL2RpcmVjdGl2ZXMvbGFiZWwnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRMaW5lUmlwcGxlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbGluZS1yaXBwbGUnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZX0gZnJvbSAnLi9kaXJlY3RpdmVzL25vdGNoZWQtb3V0bGluZSc7XG5pbXBvcnQge01BVF9QUkVGSVgsIE1hdFByZWZpeH0gZnJvbSAnLi9kaXJlY3RpdmVzL3ByZWZpeCc7XG5pbXBvcnQge01BVF9TVUZGSVgsIE1hdFN1ZmZpeH0gZnJvbSAnLi9kaXJlY3RpdmVzL3N1ZmZpeCc7XG5pbXBvcnQge21hdEZvcm1GaWVsZEFuaW1hdGlvbnN9IGZyb20gJy4vZm9ybS1maWVsZC1hbmltYXRpb25zJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQ29udHJvbCBhcyBfTWF0Rm9ybUZpZWxkQ29udHJvbH0gZnJvbSAnLi9mb3JtLWZpZWxkLWNvbnRyb2wnO1xuaW1wb3J0IHtcbiAgZ2V0TWF0Rm9ybUZpZWxkRHVwbGljYXRlZEhpbnRFcnJvcixcbiAgZ2V0TWF0Rm9ybUZpZWxkTWlzc2luZ0NvbnRyb2xFcnJvcixcbn0gZnJvbSAnLi9mb3JtLWZpZWxkLWVycm9ycyc7XG5cbi8qKiBUeXBlIGZvciB0aGUgYXZhaWxhYmxlIGZsb2F0TGFiZWwgdmFsdWVzLiAqL1xuZXhwb3J0IHR5cGUgRmxvYXRMYWJlbFR5cGUgPSAnYWx3YXlzJyB8ICdhdXRvJztcblxuLyoqIFBvc3NpYmxlIGFwcGVhcmFuY2Ugc3R5bGVzIGZvciB0aGUgZm9ybSBmaWVsZC4gKi9cbmV4cG9ydCB0eXBlIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnZmlsbCcgfCAnb3V0bGluZSc7XG5cbi8qKiBCZWhhdmlvcnMgZm9yIGhvdyB0aGUgc3Vic2NyaXB0IGhlaWdodCBpcyBzZXQuICovXG5leHBvcnQgdHlwZSBTdWJzY3JpcHRTaXppbmcgPSAnZml4ZWQnIHwgJ2R5bmFtaWMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGZvcm0gZmllbGQgdGhhdCBjYW4gYmUgY29uZmlndXJlZFxuICogdXNpbmcgdGhlIGBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlNgIGluamVjdGlvbiB0b2tlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGZvcm0gZmllbGQgYXBwZWFyYW5jZSBzdHlsZS4gKi9cbiAgYXBwZWFyYW5jZT86IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGNvbG9yIG9mIHRoZSBmb3JtIGZpZWxkLiBUaGlzIEFQSSBpcyBzdXBwb3J0ZWQgaW4gTTIgdGhlbWVzIG9ubHksIGl0IGhhcyBubyBlZmZlY3QgaW5cbiAgICogTTMgdGhlbWVzLiBGb3IgaW5mb3JtYXRpb24gb24gYXBwbHlpbmcgY29sb3IgdmFyaWFudHMgaW4gTTMsIHNlZVxuICAgKiBodHRwczovL21hdGVyaWFsLmFuZ3VsYXIuaW8vZ3VpZGUvdGhlbWluZyN1c2luZy1jb21wb25lbnQtY29sb3ItdmFyaWFudHNcbiAgICovXG4gIGNvbG9yPzogVGhlbWVQYWxldHRlO1xuICAvKiogV2hldGhlciB0aGUgcmVxdWlyZWQgbWFya2VyIHNob3VsZCBiZSBoaWRkZW4gYnkgZGVmYXVsdC4gKi9cbiAgaGlkZVJlcXVpcmVkTWFya2VyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxhYmVsIGZvciBmb3JtIGZpZWxkcyBzaG91bGQgYnkgZGVmYXVsdCBmbG9hdCBgYWx3YXlzYCxcbiAgICogYG5ldmVyYCwgb3IgYGF1dG9gIChvbmx5IHdoZW4gbmVjZXNzYXJ5KS5cbiAgICovXG4gIGZsb2F0TGFiZWw/OiBGbG9hdExhYmVsVHlwZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZvcm0gZmllbGQgc2hvdWxkIHJlc2VydmUgc3BhY2UgZm9yIG9uZSBsaW5lIGJ5IGRlZmF1bHQuICovXG4gIHN1YnNjcmlwdFNpemluZz86IFN1YnNjcmlwdFNpemluZztcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYW4gaW5zdGFuY2VzIG9mIGBNYXRGb3JtRmllbGRgLiBJdCBzZXJ2ZXNcbiAqIGFzIGFsdGVybmF0aXZlIHRva2VuIHRvIHRoZSBhY3R1YWwgYE1hdEZvcm1GaWVsZGAgY2xhc3Mgd2hpY2ggd291bGQgY2F1c2UgdW5uZWNlc3NhcnlcbiAqIHJldGVudGlvbiBvZiB0aGUgYE1hdEZvcm1GaWVsZGAgY2xhc3MgYW5kIGl0cyBjb21wb25lbnQgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVRfRk9STV9GSUVMRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNYXRGb3JtRmllbGQ+KCdNYXRGb3JtRmllbGQnKTtcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlXG4gKiBkZWZhdWx0IG9wdGlvbnMgZm9yIGFsbCBmb3JtIGZpZWxkIHdpdGhpbiBhbiBhcHAuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWF0Rm9ybUZpZWxkRGVmYXVsdE9wdGlvbnM+KFxuICAnTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TJyxcbik7XG5cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG4vKiogRGVmYXVsdCBhcHBlYXJhbmNlIHVzZWQgYnkgdGhlIGZvcm0gZmllbGQuICovXG5jb25zdCBERUZBVUxUX0FQUEVBUkFOQ0U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnZmlsbCc7XG5cbi8qKlxuICogV2hldGhlciB0aGUgbGFiZWwgZm9yIGZvcm0gZmllbGRzIHNob3VsZCBieSBkZWZhdWx0IGZsb2F0IGBhbHdheXNgLFxuICogYG5ldmVyYCwgb3IgYGF1dG9gLlxuICovXG5jb25zdCBERUZBVUxUX0ZMT0FUX0xBQkVMOiBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcblxuLyoqIERlZmF1bHQgd2F5IHRoYXQgdGhlIHN1YnNjcmlwdCBlbGVtZW50IGhlaWdodCBpcyBzZXQuICovXG5jb25zdCBERUZBVUxUX1NVQlNDUklQVF9TSVpJTkc6IFN1YnNjcmlwdFNpemluZyA9ICdmaXhlZCc7XG5cbi8qKlxuICogRGVmYXVsdCB0cmFuc2Zvcm0gZm9yIGRvY2tlZCBmbG9hdGluZyBsYWJlbHMgaW4gYSBNREMgdGV4dC1maWVsZC4gVGhpcyB2YWx1ZSBoYXMgYmVlblxuICogZXh0cmFjdGVkIGZyb20gdGhlIE1EQyB0ZXh0LWZpZWxkIHN0eWxlcyBiZWNhdXNlIHdlIHByb2dyYW1tYXRpY2FsbHkgbW9kaWZ5IHRoZSBkb2NrZWRcbiAqIGxhYmVsIHRyYW5zZm9ybSwgYnV0IGRvIG5vdCB3YW50IHRvIGFjY2lkZW50YWxseSBkaXNjYXJkIHRoZSBkZWZhdWx0IGxhYmVsIHRyYW5zZm9ybS5cbiAqL1xuY29uc3QgRkxPQVRJTkdfTEFCRUxfREVGQVVMVF9ET0NLRURfVFJBTlNGT1JNID0gYHRyYW5zbGF0ZVkoLTUwJSlgO1xuXG4vKipcbiAqIERlc3BpdGUgYE1hdEZvcm1GaWVsZENvbnRyb2xgIGJlaW5nIGFuIGFic3RyYWN0IGNsYXNzLCBtb3N0IG9mIG91ciB1c2FnZXMgZW5mb3JjZSBpdHMgc2hhcGVcbiAqIHVzaW5nIGBpbXBsZW1lbnRzYCBpbnN0ZWFkIG9mIGBleHRlbmRzYC4gVGhpcyBhcHBlYXJzIHRvIGJlIHByb2JsZW1hdGljIHdoZW4gQ2xvc3VyZSBjb21waWxlclxuICogaXMgY29uZmlndXJlZCB0byB1c2UgdHlwZSBpbmZvcm1hdGlvbiB0byByZW5hbWUgcHJvcGVydGllcywgYmVjYXVzZSBpdCBjYW4ndCBmaWd1cmUgb3V0IHdoaWNoXG4gKiBjbGFzcyBwcm9wZXJ0aWVzIGFyZSBjb21pbmcgZnJvbS4gVGhpcyBpbnRlcmZhY2Ugc2VlbXMgdG8gd29yayBhcm91bmQgdGhlIGlzc3VlIHdoaWxlIHByZXNlcnZpbmdcbiAqIG91ciB0eXBlIHNhZmV0eSAoYWx0ZXJuYXRpdmUgYmVpbmcgdXNpbmcgYGFueWAgZXZlcnl3aGVyZSkuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmludGVyZmFjZSBNYXRGb3JtRmllbGRDb250cm9sPFQ+IGV4dGVuZHMgX01hdEZvcm1GaWVsZENvbnRyb2w8VD4ge31cblxuLyoqIENvbnRhaW5lciBmb3IgZm9ybSBjb250cm9scyB0aGF0IGFwcGxpZXMgTWF0ZXJpYWwgRGVzaWduIHN0eWxpbmcgYW5kIGJlaGF2aW9yLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWZvcm0tZmllbGQnLFxuICBleHBvcnRBczogJ21hdEZvcm1GaWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWZpZWxkLmh0bWwnLFxuICBzdHlsZVVybDogJy4vZm9ybS1maWVsZC5jc3MnLFxuICBhbmltYXRpb25zOiBbbWF0Rm9ybUZpZWxkQW5pbWF0aW9ucy50cmFuc2l0aW9uTWVzc2FnZXNdLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1tZGMtZm9ybS1maWVsZCcsXG4gICAgJ1tjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwtYWx3YXlzLWZsb2F0XSc6ICdfc2hvdWxkQWx3YXlzRmxvYXQoKScsXG4gICAgJ1tjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tcHJlZml4XSc6ICdfaGFzSWNvblByZWZpeCcsXG4gICAgJ1tjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tc3VmZml4XSc6ICdfaGFzSWNvblN1ZmZpeCcsXG4gICAgLy8gTm90ZSB0aGF0IHRoZXNlIGNsYXNzZXMgcmV1c2UgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG5vbi1NREMgdmVyc2lvbiwgYmVjYXVzZSB0aGV5IGNhbiBiZVxuICAgIC8vIGNvbnNpZGVyZWQgYSBwdWJsaWMgQVBJIHNpbmNlIGN1c3RvbSBmb3JtIGNvbnRyb2xzIG1heSB1c2UgdGhlbSB0byBzdHlsZSB0aGVtc2VsdmVzLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL3B1bGwvMjA1MDIjZGlzY3Vzc2lvbl9yNDg2MTI0OTAxLlxuICAgICdbY2xhc3MubWF0LWZvcm0tZmllbGQtaW52YWxpZF0nOiAnX2NvbnRyb2wuZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZF0nOiAnX2NvbnRyb2wuZGlzYWJsZWQnLFxuICAgICdbY2xhc3MubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZF0nOiAnX2NvbnRyb2wuYXV0b2ZpbGxlZCcsXG4gICAgJ1tjbGFzcy5tYXQtZm9ybS1maWVsZC1uby1hbmltYXRpb25zXSc6ICdfYW5pbWF0aW9uTW9kZSA9PT0gXCJOb29wQW5pbWF0aW9uc1wiJyxcbiAgICAnW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbF0nOiAnYXBwZWFyYW5jZSA9PSBcImZpbGxcIicsXG4gICAgJ1tjbGFzcy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVdJzogJ2FwcGVhcmFuY2UgPT0gXCJvdXRsaW5lXCInLFxuICAgICdbY2xhc3MubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlcl0nOiAnX2hhc0Zsb2F0aW5nTGFiZWwoKSAmJiAhX3Nob3VsZExhYmVsRmxvYXQoKScsXG4gICAgJ1tjbGFzcy5tYXQtZm9jdXNlZF0nOiAnX2NvbnRyb2wuZm9jdXNlZCcsXG4gICAgJ1tjbGFzcy5tYXQtcHJpbWFyeV0nOiAnY29sb3IgIT09IFwiYWNjZW50XCIgJiYgY29sb3IgIT09IFwid2FyblwiJyxcbiAgICAnW2NsYXNzLm1hdC1hY2NlbnRdJzogJ2NvbG9yID09PSBcImFjY2VudFwiJyxcbiAgICAnW2NsYXNzLm1hdC13YXJuXSc6ICdjb2xvciA9PT0gXCJ3YXJuXCInLFxuICAgICdbY2xhc3MubmctdW50b3VjaGVkXSc6ICdfc2hvdWxkRm9yd2FyZChcInVudG91Y2hlZFwiKScsXG4gICAgJ1tjbGFzcy5uZy10b3VjaGVkXSc6ICdfc2hvdWxkRm9yd2FyZChcInRvdWNoZWRcIiknLFxuICAgICdbY2xhc3MubmctcHJpc3RpbmVdJzogJ19zaG91bGRGb3J3YXJkKFwicHJpc3RpbmVcIiknLFxuICAgICdbY2xhc3MubmctZGlydHldJzogJ19zaG91bGRGb3J3YXJkKFwiZGlydHlcIiknLFxuICAgICdbY2xhc3MubmctdmFsaWRdJzogJ19zaG91bGRGb3J3YXJkKFwidmFsaWRcIiknLFxuICAgICdbY2xhc3MubmctaW52YWxpZF0nOiAnX3Nob3VsZEZvcndhcmQoXCJpbnZhbGlkXCIpJyxcbiAgICAnW2NsYXNzLm5nLXBlbmRpbmddJzogJ19zaG91bGRGb3J3YXJkKFwicGVuZGluZ1wiKScsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogTUFUX0ZPUk1fRklFTEQsIHVzZUV4aXN0aW5nOiBNYXRGb3JtRmllbGR9LFxuICAgIHtwcm92aWRlOiBGTE9BVElOR19MQUJFTF9QQVJFTlQsIHVzZUV4aXN0aW5nOiBNYXRGb3JtRmllbGR9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0Rm9ybUZpZWxkRmxvYXRpbmdMYWJlbCxcbiAgICBNYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE1hdEZvcm1GaWVsZExpbmVSaXBwbGUsXG4gICAgTWF0SGludCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0Rm9ybUZpZWxkXG4gIGltcGxlbWVudHMgRmxvYXRpbmdMYWJlbFBhcmVudCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBWaWV3Q2hpbGQoJ3RleHRGaWVsZCcpIF90ZXh0RmllbGQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdpY29uUHJlZml4Q29udGFpbmVyJykgX2ljb25QcmVmaXhDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0ZXh0UHJlZml4Q29udGFpbmVyJykgX3RleHRQcmVmaXhDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKE1hdEZvcm1GaWVsZEZsb2F0aW5nTGFiZWwpIF9mbG9hdGluZ0xhYmVsOiBNYXRGb3JtRmllbGRGbG9hdGluZ0xhYmVsIHwgdW5kZWZpbmVkO1xuICBAVmlld0NoaWxkKE1hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lKSBfbm90Y2hlZE91dGxpbmU6IE1hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lIHwgdW5kZWZpbmVkO1xuICBAVmlld0NoaWxkKE1hdEZvcm1GaWVsZExpbmVSaXBwbGUpIF9saW5lUmlwcGxlOiBNYXRGb3JtRmllbGRMaW5lUmlwcGxlIHwgdW5kZWZpbmVkO1xuXG4gIEBDb250ZW50Q2hpbGQoTWF0TGFiZWwpIF9sYWJlbENoaWxkTm9uU3RhdGljOiBNYXRMYWJlbCB8IHVuZGVmaW5lZDtcbiAgQENvbnRlbnRDaGlsZChNYXRMYWJlbCwge3N0YXRpYzogdHJ1ZX0pIF9sYWJlbENoaWxkU3RhdGljOiBNYXRMYWJlbCB8IHVuZGVmaW5lZDtcbiAgQENvbnRlbnRDaGlsZChfTWF0Rm9ybUZpZWxkQ29udHJvbCkgX2Zvcm1GaWVsZENvbnRyb2w6IE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PjtcbiAgQENvbnRlbnRDaGlsZHJlbihNQVRfUFJFRklYLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfcHJlZml4Q2hpbGRyZW46IFF1ZXJ5TGlzdDxNYXRQcmVmaXg+O1xuICBAQ29udGVudENoaWxkcmVuKE1BVF9TVUZGSVgsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9zdWZmaXhDaGlsZHJlbjogUXVlcnlMaXN0PE1hdFN1ZmZpeD47XG4gIEBDb250ZW50Q2hpbGRyZW4oTUFUX0VSUk9SLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfZXJyb3JDaGlsZHJlbjogUXVlcnlMaXN0PE1hdEVycm9yPjtcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRIaW50LCB7ZGVzY2VuZGFudHM6IHRydWV9KSBfaGludENoaWxkcmVuOiBRdWVyeUxpc3Q8TWF0SGludD47XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHJlcXVpcmVkIG1hcmtlciBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICBASW5wdXQoKVxuICBnZXQgaGlkZVJlcXVpcmVkTWFya2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oaWRlUmVxdWlyZWRNYXJrZXI7XG4gIH1cbiAgc2V0IGhpZGVSZXF1aXJlZE1hcmtlcih2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5faGlkZVJlcXVpcmVkTWFya2VyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9oaWRlUmVxdWlyZWRNYXJrZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlbWUgY29sb3Igb2YgdGhlIGZvcm0gZmllbGQuIFRoaXMgQVBJIGlzIHN1cHBvcnRlZCBpbiBNMiB0aGVtZXMgb25seSwgaXRcbiAgICogaGFzIG5vIGVmZmVjdCBpbiBNMyB0aGVtZXMuXG4gICAqXG4gICAqIEZvciBpbmZvcm1hdGlvbiBvbiBhcHBseWluZyBjb2xvciB2YXJpYW50cyBpbiBNMywgc2VlXG4gICAqIGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9ndWlkZS90aGVtaW5nI3VzaW5nLWNvbXBvbmVudC1jb2xvci12YXJpYW50cy5cbiAgICovXG4gIEBJbnB1dCgpIGNvbG9yOiBUaGVtZVBhbGV0dGUgPSAncHJpbWFyeSc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBhbHdheXMgZmxvYXQgb3IgZmxvYXQgYXMgdGhlIHVzZXIgdHlwZXMuICovXG4gIEBJbnB1dCgpXG4gIGdldCBmbG9hdExhYmVsKCk6IEZsb2F0TGFiZWxUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmxvYXRMYWJlbCB8fCB0aGlzLl9kZWZhdWx0cz8uZmxvYXRMYWJlbCB8fCBERUZBVUxUX0ZMT0FUX0xBQkVMO1xuICB9XG4gIHNldCBmbG9hdExhYmVsKHZhbHVlOiBGbG9hdExhYmVsVHlwZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fZmxvYXRMYWJlbCkge1xuICAgICAgdGhpcy5fZmxvYXRMYWJlbCA9IHZhbHVlO1xuICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBDdXN0b20gZm9ybSBmaWVsZCBjb250cm9scyBvciBkaXJlY3RpdmVzIG1pZ2h0IHNldFxuICAgICAgLy8gdGhlIFwiZmxvYXRMYWJlbFwiIGlucHV0IGFuZCBleHBlY3QgdGhlIGZvcm0gZmllbGQgdmlldyB0byBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAvLyBlLmcuIGF1dG9jb21wbGV0ZSB0cmlnZ2VyLiBJZGVhbGx5IHdlJ2QgZ2V0IHJpZCBvZiB0aGlzIGFuZCB0aGUgY29uc3VtZXJzIHdvdWxkIGp1c3RcbiAgICAgIC8vIGVtaXQgdGhlIFwic3RhdGVDaGFuZ2VzXCIgb2JzZXJ2YWJsZS4gVE9ETyhkZXZ2ZXJzaW9uKTogY29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZmxvYXRMYWJlbDogRmxvYXRMYWJlbFR5cGU7XG5cbiAgLyoqIFRoZSBmb3JtIGZpZWxkIGFwcGVhcmFuY2Ugc3R5bGUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBhcHBlYXJhbmNlKCk6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2Uge1xuICAgIHJldHVybiB0aGlzLl9hcHBlYXJhbmNlO1xuICB9XG4gIHNldCBhcHBlYXJhbmNlKHZhbHVlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlKSB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9hcHBlYXJhbmNlO1xuICAgIGNvbnN0IG5ld0FwcGVhcmFuY2UgPSB2YWx1ZSB8fCB0aGlzLl9kZWZhdWx0cz8uYXBwZWFyYW5jZSB8fCBERUZBVUxUX0FQUEVBUkFOQ0U7XG4gICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgaWYgKG5ld0FwcGVhcmFuY2UgIT09ICdmaWxsJyAmJiBuZXdBcHBlYXJhbmNlICE9PSAnb3V0bGluZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNYXRGb3JtRmllbGQ6IEludmFsaWQgYXBwZWFyYW5jZSBcIiR7bmV3QXBwZWFyYW5jZX1cIiwgdmFsaWQgdmFsdWVzIGFyZSBcImZpbGxcIiBvciBcIm91dGxpbmVcIi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9hcHBlYXJhbmNlID0gbmV3QXBwZWFyYW5jZTtcbiAgICBpZiAodGhpcy5fYXBwZWFyYW5jZSA9PT0gJ291dGxpbmUnICYmIHRoaXMuX2FwcGVhcmFuY2UgIT09IG9sZFZhbHVlKSB7XG4gICAgICAvLyBJZiB0aGUgYXBwZWFyYW5jZSBoYXMgYmVlbiBzd2l0Y2hlZCB0byBgb3V0bGluZWAsIHRoZSBsYWJlbCBvZmZzZXQgbmVlZHMgdG8gYmUgdXBkYXRlZC5cbiAgICAgIC8vIFRoZSB1cGRhdGUgY2FuIGhhcHBlbiBvbmNlIHRoZSB2aWV3IGhhcyBiZWVuIHJlLWNoZWNrZWQsIGJ1dCBub3QgaW1tZWRpYXRlbHkgYmVjYXVzZVxuICAgICAgLy8gdGhlIHZpZXcgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgYW5kIHRoZSBub3RjaGVkLW91dGxpbmUgZmxvYXRpbmcgbGFiZWwgaXMgbm90IHByZXNlbnQuXG4gICAgICB0aGlzLl9uZWVkc091dGxpbmVMYWJlbE9mZnNldFVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSBERUZBVUxUX0FQUEVBUkFOQ0U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvcm0gZmllbGQgc2hvdWxkIHJlc2VydmUgc3BhY2UgZm9yIG9uZSBsaW5lIG9mIGhpbnQvZXJyb3IgdGV4dCAoZGVmYXVsdClcbiAgICogb3IgdG8gaGF2ZSB0aGUgc3BhY2luZyBncm93IGZyb20gMHB4IGFzIG5lZWRlZCBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgaGludC9lcnJvciBjb250ZW50LlxuICAgKiBOb3RlIHRoYXQgd2hlbiB1c2luZyBkeW5hbWljIHNpemluZywgbGF5b3V0IHNoaWZ0cyB3aWxsIG9jY3VyIHdoZW4gaGludC9lcnJvciB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc3Vic2NyaXB0U2l6aW5nKCk6IFN1YnNjcmlwdFNpemluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdFNpemluZyB8fCB0aGlzLl9kZWZhdWx0cz8uc3Vic2NyaXB0U2l6aW5nIHx8IERFRkFVTFRfU1VCU0NSSVBUX1NJWklORztcbiAgfVxuICBzZXQgc3Vic2NyaXB0U2l6aW5nKHZhbHVlOiBTdWJzY3JpcHRTaXppbmcpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRTaXppbmcgPSB2YWx1ZSB8fCB0aGlzLl9kZWZhdWx0cz8uc3Vic2NyaXB0U2l6aW5nIHx8IERFRkFVTFRfU1VCU0NSSVBUX1NJWklORztcbiAgfVxuICBwcml2YXRlIF9zdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUZXh0IGZvciB0aGUgZm9ybSBmaWVsZCBoaW50LiAqL1xuICBASW5wdXQoKVxuICBnZXQgaGludExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpbnRMYWJlbDtcbiAgfVxuICBzZXQgaGludExhYmVsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9oaW50TGFiZWwgPSB2YWx1ZTtcbiAgICB0aGlzLl9wcm9jZXNzSGludHMoKTtcbiAgfVxuICBwcml2YXRlIF9oaW50TGFiZWwgPSAnJztcblxuICBfaGFzSWNvblByZWZpeCA9IGZhbHNlO1xuICBfaGFzVGV4dFByZWZpeCA9IGZhbHNlO1xuICBfaGFzSWNvblN1ZmZpeCA9IGZhbHNlO1xuICBfaGFzVGV4dFN1ZmZpeCA9IGZhbHNlO1xuXG4gIC8vIFVuaXF1ZSBpZCBmb3IgdGhlIGludGVybmFsIGZvcm0gZmllbGQgbGFiZWwuXG4gIHJlYWRvbmx5IF9sYWJlbElkID0gYG1hdC1tZGMtZm9ybS1maWVsZC1sYWJlbC0ke25leHRVbmlxdWVJZCsrfWA7XG5cbiAgLy8gVW5pcXVlIGlkIGZvciB0aGUgaGludCBsYWJlbC5cbiAgcmVhZG9ubHkgX2hpbnRMYWJlbElkID0gYG1hdC1tZGMtaGludC0ke25leHRVbmlxdWVJZCsrfWA7XG5cbiAgLyoqIFN0YXRlIG9mIHRoZSBtYXQtaGludCBhbmQgbWF0LWVycm9yIGFuaW1hdGlvbnMuICovXG4gIF9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSA9ICcnO1xuXG4gIC8qKiBHZXRzIHRoZSBjdXJyZW50IGZvcm0gZmllbGQgY29udHJvbCAqL1xuICBnZXQgX2NvbnRyb2woKTogTWF0Rm9ybUZpZWxkQ29udHJvbDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZXhwbGljaXRGb3JtRmllbGRDb250cm9sIHx8IHRoaXMuX2Zvcm1GaWVsZENvbnRyb2w7XG4gIH1cbiAgc2V0IF9jb250cm9sKHZhbHVlKSB7XG4gICAgdGhpcy5fZXhwbGljaXRGb3JtRmllbGRDb250cm9sID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9pc0ZvY3VzZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZXhwbGljaXRGb3JtRmllbGRDb250cm9sOiBNYXRGb3JtRmllbGRDb250cm9sPGFueT47XG4gIHByaXZhdGUgX25lZWRzT3V0bGluZUxhYmVsT2Zmc2V0VXBkYXRlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgbm90IG5lZWRlZCwgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDE5LjAuMCByZW1vdmUgdGhpcyBwYXJhbVxuICAgICAqL1xuICAgIF91bnVzZWROZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgIHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TKVxuICAgIHByaXZhdGUgX2RlZmF1bHRzPzogTWF0Rm9ybUZpZWxkRGVmYXVsdE9wdGlvbnMsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIHB1YmxpYyBfYW5pbWF0aW9uTW9kZT86IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBub3QgbmVlZGVkLCB0byBiZSByZW1vdmVkLlxuICAgICAqIEBicmVha2luZy1jaGFuZ2UgMTcuMC4wIHJlbW92ZSB0aGlzIHBhcmFtXG4gICAgICovXG4gICAgQEluamVjdChET0NVTUVOVCkgX3VudXNlZERvY3VtZW50PzogYW55LFxuICApIHtcbiAgICBpZiAoX2RlZmF1bHRzKSB7XG4gICAgICBpZiAoX2RlZmF1bHRzLmFwcGVhcmFuY2UpIHtcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlID0gX2RlZmF1bHRzLmFwcGVhcmFuY2U7XG4gICAgICB9XG4gICAgICB0aGlzLl9oaWRlUmVxdWlyZWRNYXJrZXIgPSBCb29sZWFuKF9kZWZhdWx0cz8uaGlkZVJlcXVpcmVkTWFya2VyKTtcbiAgICAgIGlmIChfZGVmYXVsdHMuY29sb3IpIHtcbiAgICAgICAgdGhpcy5jb2xvciA9IF9kZWZhdWx0cy5jb2xvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gSW5pdGlhbCBmb2N1cyBzdGF0ZSBzeW5jLiBUaGlzIGhhcHBlbnMgcmFyZWx5LCBidXQgd2Ugd2FudCB0byBhY2NvdW50IGZvclxuICAgIC8vIGl0IGluIGNhc2UgdGhlIGZvcm0gZmllbGQgY29udHJvbCBoYXMgXCJmb2N1c2VkXCIgc2V0IHRvIHRydWUgb24gaW5pdC5cbiAgICB0aGlzLl91cGRhdGVGb2N1c1N0YXRlKCk7XG4gICAgLy8gRW5hYmxlIGFuaW1hdGlvbnMgbm93LiBUaGlzIGVuc3VyZXMgd2UgZG9uJ3QgYW5pbWF0ZSBvbiBpbml0aWFsIHJlbmRlci5cbiAgICB0aGlzLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSA9ICdlbnRlcic7XG4gICAgLy8gQmVjYXVzZSB0aGUgYWJvdmUgY2hhbmdlcyBhIHZhbHVlIHVzZWQgaW4gdGhlIHRlbXBsYXRlIGFmdGVyIGl0IHdhcyBjaGVja2VkLCB3ZSBuZWVkXG4gICAgLy8gdG8gdHJpZ2dlciBDRCBvciB0aGUgY2hhbmdlIG1pZ2h0IG5vdCBiZSByZWZsZWN0ZWQgaWYgdGhlcmUgaXMgbm8gb3RoZXIgQ0Qgc2NoZWR1bGVkLlxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9hc3NlcnRGb3JtRmllbGRDb250cm9sKCk7XG4gICAgdGhpcy5faW5pdGlhbGl6ZUNvbnRyb2woKTtcbiAgICB0aGlzLl9pbml0aWFsaXplU3Vic2NyaXB0KCk7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVByZWZpeEFuZFN1ZmZpeCgpO1xuICAgIHRoaXMuX2luaXRpYWxpemVPdXRsaW5lTGFiZWxPZmZzZXRTdWJzY3JpcHRpb25zKCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgdGhpcy5fYXNzZXJ0Rm9ybUZpZWxkQ29udHJvbCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpZCBvZiB0aGUgbGFiZWwgZWxlbWVudC4gSWYgbm8gbGFiZWwgaXMgcHJlc2VudCwgcmV0dXJucyBgbnVsbGAuXG4gICAqL1xuICBnZXRMYWJlbElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9oYXNGbG9hdGluZ0xhYmVsKCkgPyB0aGlzLl9sYWJlbElkIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIEVsZW1lbnRSZWYgZm9yIHRoZSBlbGVtZW50IHRoYXQgYSBvdmVybGF5IGF0dGFjaGVkIHRvIHRoZSBmb3JtIGZpZWxkXG4gICAqIHNob3VsZCBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpOiBFbGVtZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5fdGV4dEZpZWxkIHx8IHRoaXMuX2VsZW1lbnRSZWY7XG4gIH1cblxuICAvKiogQW5pbWF0ZXMgdGhlIHBsYWNlaG9sZGVyIHVwIGFuZCBsb2NrcyBpdCBpbiBwb3NpdGlvbi4gKi9cbiAgX2FuaW1hdGVBbmRMb2NrTGFiZWwoKTogdm9pZCB7XG4gICAgLy8gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seS4gQ29uc3VtZXJzIG9mIHRoZSBmb3JtIGZpZWxkIG1pZ2h0IHVzZVxuICAgIC8vIHRoaXMgbWV0aG9kLiBlLmcuIHRoZSBhdXRvY29tcGxldGUgdHJpZ2dlci4gVGhpcyBtZXRob2QgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIG5vbi1NRENcbiAgICAvLyBmb3JtIGZpZWxkIGJlY2F1c2Ugc2V0dGluZyBcImZsb2F0TGFiZWxcIiB0byBcImFsd2F5c1wiIGNhdXNlZCB0aGUgbGFiZWwgdG8gZmxvYXQgd2l0aG91dFxuICAgIC8vIGFuaW1hdGlvbi4gVGhpcyBpcyBkaWZmZXJlbnQgaW4gTURDIHdoZXJlIHRoZSBsYWJlbCBhbHdheXMgYW5pbWF0ZXMsIHNvIHRoaXMgbWV0aG9kXG4gICAgLy8gaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gVGhlcmUgZG9lc24ndCBzZWVtIGFueSBiZW5lZml0IGluIGFkZGluZyBsb2dpYyB0byBhbGxvdyBjaGFuZ2luZ1xuICAgIC8vIHRoZSBmbG9hdGluZyBsYWJlbCBzdGF0ZSB3aXRob3V0IGFuaW1hdGlvbnMuIFRoZSBub24tTURDIGltcGxlbWVudGF0aW9uIHdhcyBpbmNvbnNpc3RlbnRcbiAgICAvLyBiZWNhdXNlIGl0IGFsd2F5cyBhbmltYXRlcyBpZiBcImZsb2F0TGFiZWxcIiBpcyBzZXQgYXdheSBmcm9tIFwiYWx3YXlzXCIuXG4gICAgLy8gVE9ETyhkZXZ2ZXJzaW9uKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcyBtZXRob2Qgd2hlbiByZWxlYXNpbmcgdGhlIE1EQyBmb3JtIGZpZWxkLlxuICAgIGlmICh0aGlzLl9oYXNGbG9hdGluZ0xhYmVsKCkpIHtcbiAgICAgIHRoaXMuZmxvYXRMYWJlbCA9ICdhbHdheXMnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyB0aGUgcmVnaXN0ZXJlZCBmb3JtIGZpZWxkIGNvbnRyb2wuICovXG4gIHByaXZhdGUgX2luaXRpYWxpemVDb250cm9sKCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLl9jb250cm9sO1xuXG4gICAgaWYgKGNvbnRyb2wuY29udHJvbFR5cGUpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKFxuICAgICAgICBgbWF0LW1kYy1mb3JtLWZpZWxkLXR5cGUtJHtjb250cm9sLmNvbnRyb2xUeXBlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFN1YnNjcmliZSB0byBjaGFuZ2VzIGluIHRoZSBjaGlsZCBjb250cm9sIHN0YXRlIGluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgZm9ybSBmaWVsZCBVSS5cbiAgICBjb250cm9sLnN0YXRlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlRm9jdXNTdGF0ZSgpO1xuICAgICAgdGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIFJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGlmIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgIGlmIChjb250cm9sLm5nQ29udHJvbCAmJiBjb250cm9sLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMpIHtcbiAgICAgIGNvbnRyb2wubmdDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tQcmVmaXhBbmRTdWZmaXhUeXBlcygpIHtcbiAgICB0aGlzLl9oYXNJY29uUHJlZml4ID0gISF0aGlzLl9wcmVmaXhDaGlsZHJlbi5maW5kKHAgPT4gIXAuX2lzVGV4dCk7XG4gICAgdGhpcy5faGFzVGV4dFByZWZpeCA9ICEhdGhpcy5fcHJlZml4Q2hpbGRyZW4uZmluZChwID0+IHAuX2lzVGV4dCk7XG4gICAgdGhpcy5faGFzSWNvblN1ZmZpeCA9ICEhdGhpcy5fc3VmZml4Q2hpbGRyZW4uZmluZChzID0+ICFzLl9pc1RleHQpO1xuICAgIHRoaXMuX2hhc1RleHRTdWZmaXggPSAhIXRoaXMuX3N1ZmZpeENoaWxkcmVuLmZpbmQocyA9PiBzLl9pc1RleHQpO1xuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBjb250YWluZXJzLiAqL1xuICBwcml2YXRlIF9pbml0aWFsaXplUHJlZml4QW5kU3VmZml4KCkge1xuICAgIHRoaXMuX2NoZWNrUHJlZml4QW5kU3VmZml4VHlwZXMoKTtcbiAgICAvLyBNYXJrIHRoZSBmb3JtIGZpZWxkIGFzIGRpcnR5IHdoZW5ldmVyIHRoZSBwcmVmaXggb3Igc3VmZml4IGNoaWxkcmVuIGNoYW5nZS4gVGhpc1xuICAgIC8vIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNvbmRpdGlvbmFsbHkgZGlzcGxheSB0aGUgcHJlZml4L3N1ZmZpeCBjb250YWluZXJzIGJhc2VkXG4gICAgLy8gb24gd2hldGhlciB0aGVyZSBpcyBwcm9qZWN0ZWQgY29udGVudC5cbiAgICBtZXJnZSh0aGlzLl9wcmVmaXhDaGlsZHJlbi5jaGFuZ2VzLCB0aGlzLl9zdWZmaXhDaGlsZHJlbi5jaGFuZ2VzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2hlY2tQcmVmaXhBbmRTdWZmaXhUeXBlcygpO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHN1YnNjcmlwdCBieSB2YWxpZGF0aW5nIGhpbnRzIGFuZCBzeW5jaHJvbml6aW5nIFwiYXJpYS1kZXNjcmliZWRieVwiIGlkc1xuICAgKiB3aXRoIHRoZSBjdXN0b20gZm9ybSBmaWVsZCBjb250cm9sLiBBbHNvIHN1YnNjcmliZXMgdG8gaGludCBhbmQgZXJyb3IgY2hhbmdlcyBpbiBvcmRlclxuICAgKiB0byBiZSBhYmxlIHRvIHZhbGlkYXRlIGFuZCBzeW5jaHJvbml6ZSBpZHMgb24gY2hhbmdlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZVN1YnNjcmlwdCgpIHtcbiAgICAvLyBSZS12YWxpZGF0ZSB3aGVuIHRoZSBudW1iZXIgb2YgaGludHMgY2hhbmdlcy5cbiAgICB0aGlzLl9oaW50Q2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fcHJvY2Vzc0hpbnRzKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYXJpYS1kZXNjcmliZWQgYnkgd2hlbiB0aGUgbnVtYmVyIG9mIGVycm9ycyBjaGFuZ2VzLlxuICAgIHRoaXMuX2Vycm9yQ2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWwgbWF0LWhpbnQgdmFsaWRhdGlvbiBhbmQgc3Vic2NyaXB0IGRlc2NyaWJlZEJ5SWRzIHN5bmMuXG4gICAgdGhpcy5fdmFsaWRhdGVIaW50cygpO1xuICAgIHRoaXMuX3N5bmNEZXNjcmliZWRCeUlkcygpO1xuICB9XG5cbiAgLyoqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgZm9ybSBmaWVsZCdzIGNvbnRyb2wgaXMgbWlzc2luZy4gKi9cbiAgcHJpdmF0ZSBfYXNzZXJ0Rm9ybUZpZWxkQ29udHJvbCgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wgJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcbiAgICAgIHRocm93IGdldE1hdEZvcm1GaWVsZE1pc3NpbmdDb250cm9sRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVGb2N1c1N0YXRlKCkge1xuICAgIC8vIFVzdWFsbHkgdGhlIE1EQyBmb3VuZGF0aW9uIHdvdWxkIGNhbGwgXCJhY3RpdmF0ZUZvY3VzXCIgYW5kIFwiZGVhY3RpdmF0ZUZvY3VzXCIgd2hlbmV2ZXJcbiAgICAvLyBjZXJ0YWluIERPTSBldmVudHMgYXJlIGVtaXR0ZWQuIFRoaXMgaXMgbm90IHBvc3NpYmxlIGluIG91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGVcbiAgICAvLyBmb3JtIGZpZWxkIGJlY2F1c2Ugd2Ugc3VwcG9ydCBhYnN0cmFjdCBmb3JtIGZpZWxkIGNvbnRyb2xzIHdoaWNoIGFyZSBub3QgbmVjZXNzYXJpbHlcbiAgICAvLyBvZiB0eXBlIGlucHV0LCBub3IgZG8gd2UgaGF2ZSBhIHJlZmVyZW5jZSB0byBhIG5hdGl2ZSBmb3JtIGZpZWxkIGNvbnRyb2wgZWxlbWVudC4gSW5zdGVhZFxuICAgIC8vIHdlIGhhbmRsZSB0aGUgZm9jdXMgYnkgY2hlY2tpbmcgaWYgdGhlIGFic3RyYWN0IGZvcm0gZmllbGQgY29udHJvbCBmb2N1c2VkIHN0YXRlIGNoYW5nZXMuXG4gICAgaWYgKHRoaXMuX2NvbnRyb2wuZm9jdXNlZCAmJiAhdGhpcy5faXNGb2N1c2VkKSB7XG4gICAgICB0aGlzLl9pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fbGluZVJpcHBsZT8uYWN0aXZhdGUoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9jb250cm9sLmZvY3VzZWQgJiYgKHRoaXMuX2lzRm9jdXNlZCB8fCB0aGlzLl9pc0ZvY3VzZWQgPT09IG51bGwpKSB7XG4gICAgICB0aGlzLl9pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2xpbmVSaXBwbGU/LmRlYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90ZXh0RmllbGQ/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAgICdtZGMtdGV4dC1maWVsZC0tZm9jdXNlZCcsXG4gICAgICB0aGlzLl9jb250cm9sLmZvY3VzZWQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZmxvYXRpbmcgbGFiZWwgaW4gdGhlIGRvY2tlZCBzdGF0ZSBuZWVkcyB0byBhY2NvdW50IGZvciBwcmVmaXhlcy4gVGhlIGhvcml6b250YWwgb2Zmc2V0XG4gICAqIGlzIGNhbGN1bGF0ZWQgd2hlbmV2ZXIgdGhlIGFwcGVhcmFuY2UgY2hhbmdlcyB0byBgb3V0bGluZWAsIHRoZSBwcmVmaXhlcyBjaGFuZ2UsIG9yIHdoZW4gdGhlXG4gICAqIGZvcm0gZmllbGQgaXMgYWRkZWQgdG8gdGhlIERPTS4gVGhpcyBtZXRob2Qgc2V0cyB1cCBhbGwgc3Vic2NyaXB0aW9ucyB3aGljaCBhcmUgbmVlZGVkIHRvXG4gICAqIHRyaWdnZXIgdGhlIGxhYmVsIG9mZnNldCB1cGRhdGUuXG4gICAqL1xuICBwcml2YXRlIF9pbml0aWFsaXplT3V0bGluZUxhYmVsT2Zmc2V0U3Vic2NyaXB0aW9ucygpIHtcbiAgICAvLyBXaGVuZXZlciB0aGUgcHJlZml4IGNoYW5nZXMsIHNjaGVkdWxlIGFuIHVwZGF0ZSBvZiB0aGUgbGFiZWwgb2Zmc2V0LlxuICAgIC8vIFRPRE8obW1hbGVyYmEpOiBVc2UgUmVzaXplT2JzZXJ2ZXIgdG8gYmV0dGVyIHN1cHBvcnQgZHluYW1pY2FsbHkgY2hhbmdpbmcgcHJlZml4IGNvbnRlbnQuXG4gICAgdGhpcy5fcHJlZml4Q2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gKHRoaXMuX25lZWRzT3V0bGluZUxhYmVsT2Zmc2V0VXBkYXRlID0gdHJ1ZSkpO1xuXG4gICAgLy8gVE9ETyhtbWFsZXJiYSk6IFNwbGl0IHRoaXMgaW50byBzZXBhcmF0ZSBgYWZ0ZXJSZW5kZXJgIGNhbGxzIHVzaW5nIHRoZSBgRWFybHlSZWFkYCBhbmRcbiAgICAvLyAgYFdyaXRlYCBwaGFzZXMuXG4gICAgYWZ0ZXJSZW5kZXIoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9uZWVkc091dGxpbmVMYWJlbE9mZnNldFVwZGF0ZSkge1xuICAgICAgICAgIHRoaXMuX25lZWRzT3V0bGluZUxhYmVsT2Zmc2V0VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlT3V0bGluZUxhYmVsT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGluamVjdG9yOiB0aGlzLl9pbmplY3RvcixcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuX2Rpci5jaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiAodGhpcy5fbmVlZHNPdXRsaW5lTGFiZWxPZmZzZXRVcGRhdGUgPSB0cnVlKSk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgZmxvYXRpbmcgbGFiZWwgc2hvdWxkIGFsd2F5cyBmbG9hdCBvciBub3QuICovXG4gIF9zaG91bGRBbHdheXNGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5mbG9hdExhYmVsID09PSAnYWx3YXlzJztcbiAgfVxuXG4gIF9oYXNPdXRsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVhcmFuY2UgPT09ICdvdXRsaW5lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgZGlzcGxheSBpbiB0aGUgaW5maXguIExhYmVscyBpbiB0aGUgb3V0bGluZSBhcHBlYXJhbmNlIGFyZVxuICAgKiBkaXNwbGF5ZWQgYXMgcGFydCBvZiB0aGUgbm90Y2hlZC1vdXRsaW5lIGFuZCBhcmUgaG9yaXpvbnRhbGx5IG9mZnNldCB0byBhY2NvdW50IGZvclxuICAgKiBmb3JtIGZpZWxkIHByZWZpeCBjb250ZW50LiBUaGlzIHdvbid0IHdvcmsgaW4gc2VydmVyIHNpZGUgcmVuZGVyaW5nIHNpbmNlIHdlIGNhbm5vdFxuICAgKiBtZWFzdXJlIHRoZSB3aWR0aCBvZiB0aGUgcHJlZml4IGNvbnRhaW5lci4gVG8gbWFrZSB0aGUgZG9ja2VkIGxhYmVsIGFwcGVhciBhcyBpZiB0aGVcbiAgICogcmlnaHQgb2Zmc2V0IGhhcyBiZWVuIGNhbGN1bGF0ZWQsIHdlIGZvcmNpYmx5IHJlbmRlciB0aGUgbGFiZWwgaW5zaWRlIHRoZSBpbmZpeC4gU2luY2VcbiAgICogdGhlIGxhYmVsIGlzIHBhcnQgb2YgdGhlIGluZml4LCB0aGUgbGFiZWwgY2Fubm90IG92ZXJmbG93IHRoZSBwcmVmaXggY29udGVudC5cbiAgICovXG4gIF9mb3JjZURpc3BsYXlJbmZpeExhYmVsKCkge1xuICAgIHJldHVybiAhdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyICYmIHRoaXMuX3ByZWZpeENoaWxkcmVuLmxlbmd0aCAmJiAhdGhpcy5fc2hvdWxkTGFiZWxGbG9hdCgpO1xuICB9XG5cbiAgX2hhc0Zsb2F0aW5nTGFiZWwoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fbGFiZWxDaGlsZE5vblN0YXRpYyB8fCAhIXRoaXMuX2xhYmVsQ2hpbGRTdGF0aWM7XG4gIH1cblxuICBfc2hvdWxkTGFiZWxGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbC5zaG91bGRMYWJlbEZsb2F0IHx8IHRoaXMuX3Nob3VsZEFsd2F5c0Zsb2F0KCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY2xhc3MgZnJvbSB0aGUgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlXG4gICAqIHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gdGhlIGhvc3QgZWxlbWVudC5cbiAgICovXG4gIF9zaG91bGRGb3J3YXJkKHByb3A6IGtleW9mIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLl9jb250cm9sID8gdGhpcy5fY29udHJvbC5uZ0NvbnRyb2wgOiBudWxsO1xuICAgIHJldHVybiBjb250cm9sICYmIGNvbnRyb2xbcHJvcF07XG4gIH1cblxuICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGRpc3BsYXkgaGludHMgb3IgZXJyb3JzLiAqL1xuICBfZ2V0RGlzcGxheWVkTWVzc2FnZXMoKTogJ2Vycm9yJyB8ICdoaW50JyB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9yQ2hpbGRyZW4gJiYgdGhpcy5fZXJyb3JDaGlsZHJlbi5sZW5ndGggPiAwICYmIHRoaXMuX2NvbnRyb2wuZXJyb3JTdGF0ZVxuICAgICAgPyAnZXJyb3InXG4gICAgICA6ICdoaW50JztcbiAgfVxuXG4gIC8qKiBIYW5kbGUgbGFiZWwgcmVzaXplIGV2ZW50cy4gKi9cbiAgX2hhbmRsZUxhYmVsUmVzaXplZCgpIHtcbiAgICB0aGlzLl9yZWZyZXNoT3V0bGluZU5vdGNoV2lkdGgoKTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoZXMgdGhlIHdpZHRoIG9mIHRoZSBvdXRsaW5lLW5vdGNoLCBpZiBwcmVzZW50LiAqL1xuICBfcmVmcmVzaE91dGxpbmVOb3RjaFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5faGFzT3V0bGluZSgpIHx8ICF0aGlzLl9mbG9hdGluZ0xhYmVsIHx8ICF0aGlzLl9zaG91bGRMYWJlbEZsb2F0KCkpIHtcbiAgICAgIHRoaXMuX25vdGNoZWRPdXRsaW5lPy5fc2V0Tm90Y2hXaWR0aCgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbm90Y2hlZE91dGxpbmU/Ll9zZXROb3RjaFdpZHRoKHRoaXMuX2Zsb2F0aW5nTGFiZWwuZ2V0V2lkdGgoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERvZXMgYW55IGV4dHJhIHByb2Nlc3NpbmcgdGhhdCBpcyByZXF1aXJlZCB3aGVuIGhhbmRsaW5nIHRoZSBoaW50cy4gKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0hpbnRzKCkge1xuICAgIHRoaXMuX3ZhbGlkYXRlSGludHMoKTtcbiAgICB0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gb2Ygb25lIG9mIGVhY2ggXCJtYXQtaGludFwiIGFsaWdubWVudCBzcGVjaWZpZWQuIFRoZSBoaW50XG4gICAqIGxhYmVsIHNwZWNpZmllZCBzZXQgdGhyb3VnaCB0aGUgaW5wdXQgaXMgYmVpbmcgY29uc2lkZXJlZCBhcyBcInN0YXJ0XCIgYWxpZ25lZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgYSBub29wIGlmIEFuZ3VsYXIgcnVucyBpbiBwcm9kdWN0aW9uIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZUhpbnRzKCkge1xuICAgIGlmICh0aGlzLl9oaW50Q2hpbGRyZW4gJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcbiAgICAgIGxldCBzdGFydEhpbnQ6IE1hdEhpbnQ7XG4gICAgICBsZXQgZW5kSGludDogTWF0SGludDtcbiAgICAgIHRoaXMuX2hpbnRDaGlsZHJlbi5mb3JFYWNoKChoaW50OiBNYXRIaW50KSA9PiB7XG4gICAgICAgIGlmIChoaW50LmFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0SGludCB8fCB0aGlzLmhpbnRMYWJlbCkge1xuICAgICAgICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkRHVwbGljYXRlZEhpbnRFcnJvcignc3RhcnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhcnRIaW50ID0gaGludDtcbiAgICAgICAgfSBlbHNlIGlmIChoaW50LmFsaWduID09PSAnZW5kJykge1xuICAgICAgICAgIGlmIChlbmRIaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBnZXRNYXRGb3JtRmllbGREdXBsaWNhdGVkSGludEVycm9yKCdlbmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5kSGludCA9IGhpbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsaXN0IG9mIGVsZW1lbnQgSURzIHRoYXQgZGVzY3JpYmUgdGhlIGNoaWxkIGNvbnRyb2wuIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sIHRvIHVwZGF0ZVxuICAgKiBpdHMgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZSBhY2NvcmRpbmdseS5cbiAgICovXG4gIHByaXZhdGUgX3N5bmNEZXNjcmliZWRCeUlkcygpIHtcbiAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgbGV0IGlkczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgLy8gVE9ETyh3YWduZXJtYWNpZWwpOiBSZW1vdmUgdGhlIHR5cGUgY2hlY2sgd2hlbiB3ZSBmaW5kIHRoZSByb290IGNhdXNlIG9mIHRoaXMgYnVnLlxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jb250cm9sLnVzZXJBcmlhRGVzY3JpYmVkQnkgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuX2NvbnRyb2wudXNlckFyaWFEZXNjcmliZWRCeSA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBpZHMucHVzaCguLi50aGlzLl9jb250cm9sLnVzZXJBcmlhRGVzY3JpYmVkQnkuc3BsaXQoJyAnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9nZXREaXNwbGF5ZWRNZXNzYWdlcygpID09PSAnaGludCcpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRIaW50ID0gdGhpcy5faGludENoaWxkcmVuXG4gICAgICAgICAgPyB0aGlzLl9oaW50Q2hpbGRyZW4uZmluZChoaW50ID0+IGhpbnQuYWxpZ24gPT09ICdzdGFydCcpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCBlbmRIaW50ID0gdGhpcy5faGludENoaWxkcmVuXG4gICAgICAgICAgPyB0aGlzLl9oaW50Q2hpbGRyZW4uZmluZChoaW50ID0+IGhpbnQuYWxpZ24gPT09ICdlbmQnKVxuICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBpZiAoc3RhcnRIaW50KSB7XG4gICAgICAgICAgaWRzLnB1c2goc3RhcnRIaW50LmlkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oaW50TGFiZWwpIHtcbiAgICAgICAgICBpZHMucHVzaCh0aGlzLl9oaW50TGFiZWxJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kSGludCkge1xuICAgICAgICAgIGlkcy5wdXNoKGVuZEhpbnQuaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2Vycm9yQ2hpbGRyZW4pIHtcbiAgICAgICAgaWRzLnB1c2goLi4udGhpcy5fZXJyb3JDaGlsZHJlbi5tYXAoZXJyb3IgPT4gZXJyb3IuaWQpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29udHJvbC5zZXREZXNjcmliZWRCeUlkcyhpZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgbGFiZWwgaW4gdGhlIG91dGxpbmUgYXBwZWFyYW5jZS4gSW4gdGhlIG91dGxpbmVcbiAgICogYXBwZWFyYW5jZSwgdGhlIG5vdGNoZWQtb3V0bGluZSBhbmQgbGFiZWwgYXJlIG5vdCByZWxhdGl2ZSB0byB0aGUgaW5maXggY29udGFpbmVyIGJlY2F1c2VcbiAgICogdGhlIG91dGxpbmUgaW50ZW5kcyB0byBzdXJyb3VuZCBwcmVmaXhlcywgc3VmZml4ZXMgYW5kIHRoZSBpbmZpeC4gVGhpcyBtZWFucyB0aGF0IHRoZVxuICAgKiBmbG9hdGluZyBsYWJlbCBieSBkZWZhdWx0IG92ZXJsYXBzIHByZWZpeGVzIGluIHRoZSBkb2NrZWQgc3RhdGUuIFRvIGF2b2lkIHRoaXMsIHdlIG5lZWQgdG9cbiAgICogaG9yaXpvbnRhbGx5IG9mZnNldCB0aGUgbGFiZWwgYnkgdGhlIHdpZHRoIG9mIHRoZSBwcmVmaXggY29udGFpbmVyLiBUaGUgTURDIHRleHQtZmllbGQgZG9lc1xuICAgKiBub3QgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhleSB1c2UgYSBmaXhlZCB3aWR0aCBmb3IgcHJlZml4ZXMuIEhlbmNlLCB0aGV5IGNhbiBzaW1wbHlcbiAgICogaW5jb3Jwb3JhdGUgdGhlIGhvcml6b250YWwgb2Zmc2V0IGludG8gdGhlaXIgZGVmYXVsdCB0ZXh0LWZpZWxkIHN0eWxlcy5cbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZU91dGxpbmVMYWJlbE9mZnNldCgpIHtcbiAgICBpZiAoIXRoaXMuX2hhc091dGxpbmUoKSB8fCAhdGhpcy5fZmxvYXRpbmdMYWJlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmbG9hdGluZ0xhYmVsID0gdGhpcy5fZmxvYXRpbmdMYWJlbC5lbGVtZW50O1xuICAgIC8vIElmIG5vIHByZWZpeCBpcyBkaXNwbGF5ZWQsIHJlc2V0IHRoZSBvdXRsaW5lIGxhYmVsIG9mZnNldCBmcm9tIHBvdGVudGlhbFxuICAgIC8vIHByZXZpb3VzIGxhYmVsIG9mZnNldCB1cGRhdGVzLlxuICAgIGlmICghKHRoaXMuX2ljb25QcmVmaXhDb250YWluZXIgfHwgdGhpcy5fdGV4dFByZWZpeENvbnRhaW5lcikpIHtcbiAgICAgIGZsb2F0aW5nTGFiZWwuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElmIHRoZSBmb3JtIGZpZWxkIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgRE9NIHlldCAoZS5nLiBpbiBhIHRhYiksIHdlIGRlZmVyXG4gICAgLy8gdGhlIGxhYmVsIG9mZnNldCB1cGRhdGUgdW50aWwgdGhlIHpvbmUgc3RhYmlsaXplcy5cbiAgICBpZiAoIXRoaXMuX2lzQXR0YWNoZWRUb0RvbSgpKSB7XG4gICAgICB0aGlzLl9uZWVkc091dGxpbmVMYWJlbE9mZnNldFVwZGF0ZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGljb25QcmVmaXhDb250YWluZXIgPSB0aGlzLl9pY29uUHJlZml4Q29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHRleHRQcmVmaXhDb250YWluZXIgPSB0aGlzLl90ZXh0UHJlZml4Q29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGljb25QcmVmaXhDb250YWluZXJXaWR0aCA9IGljb25QcmVmaXhDb250YWluZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID8/IDA7XG4gICAgY29uc3QgdGV4dFByZWZpeENvbnRhaW5lcldpZHRoID0gdGV4dFByZWZpeENvbnRhaW5lcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPz8gMDtcbiAgICAvLyBJZiB0aGUgZGlyZWN0aW9uYWxpdHkgaXMgUlRMLCB0aGUgeC1heGlzIHRyYW5zZm9ybSBuZWVkcyB0byBiZSBpbnZlcnRlZC4gVGhpc1xuICAgIC8vIGlzIGJlY2F1c2UgYHRyYW5zZm9ybVhgIGRvZXMgbm90IGNoYW5nZSBiYXNlZCBvbiB0aGUgcGFnZSBkaXJlY3Rpb25hbGl0eS5cbiAgICBjb25zdCBuZWdhdGUgPSB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnID8gJy0xJyA6ICcxJztcbiAgICBjb25zdCBwcmVmaXhXaWR0aCA9IGAke2ljb25QcmVmaXhDb250YWluZXJXaWR0aCArIHRleHRQcmVmaXhDb250YWluZXJXaWR0aH1weGA7XG4gICAgY29uc3QgbGFiZWxPZmZzZXQgPSBgdmFyKC0tbWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLW9mZnNldC14LCAwcHgpYDtcbiAgICBjb25zdCBsYWJlbEhvcml6b250YWxPZmZzZXQgPSBgY2FsYygke25lZ2F0ZX0gKiAoJHtwcmVmaXhXaWR0aH0gKyAke2xhYmVsT2Zmc2V0fSkpYDtcblxuICAgIC8vIFVwZGF0ZSB0aGUgdHJhbnNsYXRlWCBvZiB0aGUgZmxvYXRpbmcgbGFiZWwgdG8gYWNjb3VudCBmb3IgdGhlIHByZWZpeCBjb250YWluZXIsXG4gICAgLy8gYnV0IGFsbG93IHRoZSBDU1MgdG8gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIHZpYSBhIENTUyB2YXJpYWJsZSB3aGVuIHRoZSBsYWJlbCBpc1xuICAgIC8vIGZsb2F0aW5nLlxuICAgIGZsb2F0aW5nTGFiZWwuc3R5bGUudHJhbnNmb3JtID0gYHZhcihcbiAgICAgICAgLS1tYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwtdHJhbnNmb3JtLFxuICAgICAgICAke0ZMT0FUSU5HX0xBQkVMX0RFRkFVTFRfRE9DS0VEX1RSQU5TRk9STX0gdHJhbnNsYXRlWCgke2xhYmVsSG9yaXpvbnRhbE9mZnNldH0pXG4gICAgKWA7XG4gIH1cblxuICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGZvcm0gZmllbGQgaXMgYXR0YWNoZWQgdG8gdGhlIERPTS4gKi9cbiAgcHJpdmF0ZSBfaXNBdHRhY2hlZFRvRG9tKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbGVtZW50LmdldFJvb3ROb2RlKSB7XG4gICAgICBjb25zdCByb290Tm9kZSA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGluc2lkZSB0aGUgRE9NIHRoZSByb290IG5vZGUgd2lsbCBiZSBlaXRoZXIgdGhlIGRvY3VtZW50XG4gICAgICAvLyBvciB0aGUgY2xvc2VzdCBzaGFkb3cgcm9vdCwgb3RoZXJ3aXNlIGl0J2xsIGJlIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgIHJldHVybiByb290Tm9kZSAmJiByb290Tm9kZSAhPT0gZWxlbWVudDtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byBjaGVja2luZyBpZiBpdCdzIGluIHRoZSBkb2N1bWVudC4gVGhpcyBkb2Vzbid0IGFjY291bnQgZm9yXG4gICAgLy8gc2hhZG93IERPTSwgaG93ZXZlciBicm93c2VyIHRoYXQgc3VwcG9ydCBzaGFkb3cgRE9NIHNob3VsZCBzdXBwb3J0IGBnZXRSb290Tm9kZWAgYXMgd2VsbC5cbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IS5jb250YWlucyhlbGVtZW50KTtcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNsYWJlbFRlbXBsYXRlPlxuICA8IS0tXG4gICAgTURDIHJlY29tbWVuZHMgdGhhdCB0aGUgdGV4dC1maWVsZCBpcyBhIGA8bGFiZWw+YCBlbGVtZW50LiBUaGlzIHJhdGhlciBjb21wbGljYXRlcyB0aGVcbiAgICBzZXR1cCBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUgZXZlcnkgZm9ybS1maWVsZCBjb250cm9sIHRvIGV4cGxpY2l0bHkgc2V0IGBhcmlhLWxhYmVsbGVkYnlgLlxuICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgYDxsYWJlbD5gIGl0c2VsZiBjb250YWlucyBtb3JlIHRoYW4gdGhlIGFjdHVhbCBsYWJlbCAoZS5nLiBwcmVmaXgsIHN1ZmZpeFxuICAgIG9yIG90aGVyIHByb2plY3RlZCBjb250ZW50KSwgYW5kIHNjcmVlbiByZWFkZXJzIGNvdWxkIHBvdGVudGlhbGx5IHJlYWQgb3V0IHVuZGVzaXJlZCBjb250ZW50LlxuICAgIEV4Y2x1ZGluZyBlbGVtZW50cyBmcm9tIGJlaW5nIHByaW50ZWQgb3V0IHJlcXVpcmVzIHRoZW0gdG8gYmUgbWFya2VkIHdpdGggYGFyaWEtaGlkZGVuYCwgb3JcbiAgICB0aGUgZm9ybSBjb250cm9sIGlzIHNldCB0byBhIHNjb3BlZCBlbGVtZW50IGZvciB0aGUgbGFiZWwgKHVzaW5nIGBhcmlhLWxhYmVsbGVkYnlgKS4gQm90aCBvZlxuICAgIHRoZXNlIG9wdGlvbnMgc2VlbSB0byBjb21wbGljYXRlIHRoZSBzZXR1cCBiZWNhdXNlIHdlIGtub3cgZXhhY3RseSB3aGF0IGNvbnRlbnQgaXMgcmVuZGVyZWRcbiAgICBhcyBwYXJ0IG9mIHRoZSBsYWJlbCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gc3BlbmQgcmVzb3VyY2VzIG9uIHdhbGtpbmcgdGhyb3VnaCBwcm9qZWN0ZWQgY29udGVudFxuICAgIHRvIHNldCBgYXJpYS1oaWRkZW5gLiBOb3IgZG8gd2Ugd2FudCB0byBzZXQgYGFyaWEtbGFiZWxsZWRieWAgb24gZXZlcnkgZm9ybSBjb250cm9sIGlmIHdlIGNvdWxkXG4gICAgc2ltcGx5IGxpbmsgdGhlIGxhYmVsIHRvIHRoZSBjb250cm9sIHVzaW5nIHRoZSBsYWJlbCBgZm9yYCBhdHRyaWJ1dGUuXG4gIC0tPlxuICBAaWYgKF9oYXNGbG9hdGluZ0xhYmVsKCkpIHtcbiAgICA8bGFiZWwgbWF0Rm9ybUZpZWxkRmxvYXRpbmdMYWJlbFxuICAgICAgICAgICBbZmxvYXRpbmddPVwiX3Nob3VsZExhYmVsRmxvYXQoKVwiXG4gICAgICAgICAgIFttb25pdG9yUmVzaXplXT1cIl9oYXNPdXRsaW5lKClcIlxuICAgICAgICAgICBbaWRdPVwiX2xhYmVsSWRcIlxuICAgICAgICAgICBbYXR0ci5mb3JdPVwiX2NvbnRyb2wuZGlzYWJsZUF1dG9tYXRpY0xhYmVsaW5nID8gbnVsbCA6IF9jb250cm9sLmlkXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtbGFiZWxcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8IS0tXG4gICAgICAgIFdlIHNldCB0aGUgcmVxdWlyZWQgbWFya2VyIGFzIGEgc2VwYXJhdGUgZWxlbWVudCwgaW4gb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdGFyZ2V0IGlmXG4gICAgICAgIGFwcHMgd2FudCB0byBvdmVycmlkZSBpdCBhbmQgdG8gYmUgYWJsZSB0byBzZXQgYGFyaWEtaGlkZGVuYCBzbyB0aGF0IHNjcmVlbiByZWFkZXJzIGRvbid0XG4gICAgICAgIHBpY2sgaXQgdXAuXG4gICAgICAgLS0+XG4gICAgICAgQGlmICghaGlkZVJlcXVpcmVkTWFya2VyICYmIF9jb250cm9sLnJlcXVpcmVkKSB7XG4gICAgICAgICA8c3BhblxuICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIgbWRjLWZsb2F0aW5nLWxhYmVsLS1yZXF1aXJlZFwiPjwvc3Bhbj5cbiAgICAgICB9XG4gICAgPC9sYWJlbD5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cIm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIG1kYy10ZXh0LWZpZWxkXCIgI3RleHRGaWVsZFxuICAgICBbY2xhc3MubWRjLXRleHQtZmllbGQtLWZpbGxlZF09XCIhX2hhc091dGxpbmUoKVwiXG4gICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWRdPVwiX2hhc091dGxpbmUoKVwiXG4gICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWxdPVwiIV9oYXNGbG9hdGluZ0xhYmVsKClcIlxuICAgICBbY2xhc3MubWRjLXRleHQtZmllbGQtLWRpc2FibGVkXT1cIl9jb250cm9sLmRpc2FibGVkXCJcbiAgICAgW2NsYXNzLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkXT1cIl9jb250cm9sLmVycm9yU3RhdGVcIlxuICAgICAoY2xpY2spPVwiX2NvbnRyb2wub25Db250YWluZXJDbGljaygkZXZlbnQpXCI+XG4gIEBpZiAoIV9oYXNPdXRsaW5lKCkgJiYgIV9jb250cm9sLmRpc2FibGVkKSB7XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XG4gIH1cbiAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1mbGV4XCI+XG4gICAgQGlmIChfaGFzT3V0bGluZSgpKSB7XG4gICAgICA8ZGl2IG1hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lIFttYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZU9wZW5dPVwiX3Nob3VsZExhYmVsRmxvYXQoKVwiPlxuICAgICAgICBAaWYgKCFfZm9yY2VEaXNwbGF5SW5maXhMYWJlbCgpKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKF9oYXNJY29uUHJlZml4KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWljb24tcHJlZml4XCIgI2ljb25QcmVmaXhDb250YWluZXI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdLCBbbWF0SWNvblByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKF9oYXNUZXh0UHJlZml4KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLXRleHQtcHJlZml4XCIgI3RleHRQcmVmaXhDb250YWluZXI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRUZXh0UHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaW5maXhcIj5cbiAgICAgIEBpZiAoIV9oYXNPdXRsaW5lKCkgfHwgX2ZvcmNlRGlzcGxheUluZml4TGFiZWwoKSkge1xuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICB9XG5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoX2hhc1RleHRTdWZmaXgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtdGV4dC1zdWZmaXhcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFRleHRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChfaGFzSWNvblN1ZmZpeCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeFwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XSwgW21hdEljb25TdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICBAaWYgKCFfaGFzT3V0bGluZSgpKSB7XG4gICAgPGRpdiBtYXRGb3JtRmllbGRMaW5lUmlwcGxlPjwvZGl2PlxuICB9XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciBtYXQtbWRjLWZvcm0tZmllbGQtYm90dG9tLWFsaWduXCJcbiAgICAgW2NsYXNzLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtZHluYW1pYy1zaXplXT1cInN1YnNjcmlwdFNpemluZyA9PT0gJ2R5bmFtaWMnXCI+XG5cbiAgQHN3aXRjaCAoX2dldERpc3BsYXllZE1lc3NhZ2VzKCkpIHtcbiAgICBAY2FzZSAoJ2Vycm9yJykge1xuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvci13cmFwcGVyXCJcbiAgICAgICAgICAgW0B0cmFuc2l0aW9uTWVzc2FnZXNdPVwiX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvciwgW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBjYXNlICgnaGludCcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC13cmFwcGVyXCIgW0B0cmFuc2l0aW9uTWVzc2FnZXNdPVwiX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlXCI+XG4gICAgICAgIEBpZiAoaGludExhYmVsKSB7XG4gICAgICAgICAgPG1hdC1oaW50IFtpZF09XCJfaGludExhYmVsSWRcIj57e2hpbnRMYWJlbH19PC9tYXQtaGludD5cbiAgICAgICAgfVxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludDpub3QoW2FsaWduPSdlbmQnXSlcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnRbYWxpZ249J2VuZCddXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L2Rpdj5cbiJdfQ==