@gravitee/ui-components 3.24.4 → 3.24.5-renovate-github-markdown-css-5-x-d2ffdad

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 (117) hide show
  1. package/CHANGELOG.md +1260 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/css/github-markdown-css/github-markdown.css +500 -545
  5. package/assets/i18n/en.json +0 -3
  6. package/assets/i18n/fr.json +0 -3
  7. package/package.json +19 -21
  8. package/src/.eslintrc.js +19 -0
  9. package/src/atoms/gv-autocomplete.js +156 -132
  10. package/src/atoms/gv-button.js +248 -73
  11. package/src/atoms/gv-checkbox.js +103 -45
  12. package/src/atoms/gv-date-picker-calendar.js +393 -312
  13. package/src/atoms/gv-date-picker-cell.js +81 -57
  14. package/src/atoms/gv-date-picker.js +319 -180
  15. package/src/atoms/gv-file-upload.js +195 -85
  16. package/src/atoms/gv-icon.js +34 -13
  17. package/src/atoms/gv-image.js +66 -31
  18. package/src/atoms/gv-input-message.js +37 -12
  19. package/src/atoms/gv-input.js +169 -139
  20. package/src/atoms/gv-link.js +125 -47
  21. package/src/atoms/gv-message.js +69 -18
  22. package/src/atoms/gv-metric.js +68 -19
  23. package/src/atoms/gv-relative-time.js +38 -67
  24. package/src/atoms/gv-select-native.js +215 -96
  25. package/src/atoms/gv-select.js +230 -110
  26. package/src/atoms/gv-spinner.js +26 -5
  27. package/src/atoms/gv-state.js +66 -25
  28. package/src/atoms/gv-switch.js +160 -40
  29. package/src/atoms/gv-tag.js +78 -26
  30. package/src/atoms/gv-text.js +83 -22
  31. package/src/charts/gv-chart-bar.js +18 -22
  32. package/src/charts/gv-chart-gauge.js +31 -28
  33. package/src/charts/gv-chart-histogram.js +10 -18
  34. package/src/charts/gv-chart-line.js +59 -70
  35. package/src/charts/gv-chart-map.js +42 -44
  36. package/src/charts/gv-chart-pie.js +14 -18
  37. package/src/index.js +0 -2
  38. package/src/lib/cron-expression.js +35 -40
  39. package/src/lib/date.js +1 -10
  40. package/src/lib/events.js +1 -3
  41. package/src/lib/http-client-schema-form.js +12 -13
  42. package/src/lib/http.js +56 -57
  43. package/src/lib/i18n.js +22 -30
  44. package/src/lib/item.js +12 -13
  45. package/src/lib/properties.js +42 -77
  46. package/src/lib/schema-form.js +5 -4
  47. package/src/lib/studio.js +60 -13
  48. package/src/lib/style.js +8 -8
  49. package/src/lib/text-format.js +7 -14
  50. package/src/lib/theme.js +5 -8
  51. package/src/lib/utils.js +18 -17
  52. package/src/mixins/chart-element.js +54 -31
  53. package/src/mixins/input-element.js +49 -60
  54. package/src/mixins/item-resource.js +32 -34
  55. package/src/mixins/keyboard-element.js +5 -6
  56. package/src/mixins/update-after-browser.js +1 -4
  57. package/src/mixins/with-resize-observer.js +13 -23
  58. package/src/mixins/with-skeleton-attribute.js +48 -54
  59. package/src/molecules/gv-card-full.js +147 -26
  60. package/src/molecules/gv-card-list.js +42 -13
  61. package/src/molecules/gv-card.js +91 -17
  62. package/src/molecules/gv-category-list.js +17 -6
  63. package/src/molecules/gv-category.js +103 -23
  64. package/src/molecules/gv-code.js +263 -189
  65. package/src/molecules/gv-confirm.js +71 -41
  66. package/src/molecules/gv-cron-editor.js +389 -143
  67. package/src/molecules/gv-dropdown-menu.js +46 -14
  68. package/src/molecules/gv-expandable.js +59 -31
  69. package/src/molecules/gv-expression-language.js +208 -552
  70. package/src/molecules/gv-identity-picture.js +65 -42
  71. package/src/molecules/gv-list.js +134 -42
  72. package/src/molecules/gv-metrics.js +49 -37
  73. package/src/molecules/gv-modal.js +95 -28
  74. package/src/molecules/gv-nav.js +75 -49
  75. package/src/molecules/gv-option.js +130 -57
  76. package/src/molecules/gv-plans.js +209 -86
  77. package/src/molecules/gv-popover.js +177 -57
  78. package/src/molecules/gv-promote.js +146 -28
  79. package/src/molecules/gv-rating-list.js +195 -69
  80. package/src/molecules/gv-rating.js +105 -52
  81. package/src/molecules/gv-row-expandable.js +11 -5
  82. package/src/molecules/gv-row.js +147 -21
  83. package/src/molecules/gv-stats.js +48 -23
  84. package/src/molecules/gv-stepper.js +187 -43
  85. package/src/molecules/gv-table.js +309 -199
  86. package/src/molecules/gv-tree.js +156 -33
  87. package/src/organisms/gv-documentation.js +127 -44
  88. package/src/organisms/gv-header.js +195 -37
  89. package/src/organisms/gv-http-client.js +168 -32
  90. package/src/organisms/gv-menu.js +158 -37
  91. package/src/organisms/gv-newsletter-subscription.js +189 -48
  92. package/src/organisms/gv-pagination.js +77 -49
  93. package/src/organisms/gv-properties.js +492 -271
  94. package/src/organisms/gv-resizable-views.js +259 -41
  95. package/src/organisms/gv-resources.js +275 -168
  96. package/src/organisms/gv-schema-form-array.js +159 -49
  97. package/src/organisms/gv-schema-form-control-object.js +73 -59
  98. package/src/organisms/gv-schema-form-control.js +134 -107
  99. package/src/organisms/gv-schema-form.js +280 -195
  100. package/src/organisms/gv-tabs.js +98 -66
  101. package/src/organisms/gv-user-menu.js +201 -36
  102. package/src/organisms/gv-vertical-menu.js +61 -20
  103. package/src/policy-studio/gv-flow-step.js +245 -105
  104. package/src/policy-studio/gv-flow.js +304 -125
  105. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  106. package/src/policy-studio/gv-policy-studio.js +761 -692
  107. package/src/styles/empty.js +20 -3
  108. package/src/styles/input.js +247 -3
  109. package/src/styles/link.js +16 -3
  110. package/src/styles/shapes.js +0 -1
  111. package/src/styles/skeleton.js +37 -3
  112. package/src/styles/zoom.js +24 -3
  113. package/src/theme/definition.json +1762 -0
  114. package/src/theme/gv-theme.js +60 -21
  115. package/assets/css/codemirror/all.css +0 -476
  116. package/src/molecules/gv-code-hint.js +0 -49
  117. package/wc/gv-code-hint.js +0 -1
@@ -18,10 +18,12 @@ import { dispatchCustomEvent } from '../lib/events';
18
18
  import { repeat } from 'lit/directives/repeat';
19
19
  import { classMap } from 'lit/directives/class-map';
20
20
  import { styleMap } from 'lit/directives/style-map';
21
+
21
22
  const ENTER_KEY_CODE = 13;
22
23
  const DOWN_ARROW_KEY_CODE = 40;
23
24
  const UP_ARROW_KEY_CODE = 38;
24
25
  const ESCAPE_KEY_CODE = 27;
26
+
25
27
  /**
26
28
  * Autocomplete input wrapper
27
29
  *
@@ -50,44 +52,99 @@ const ESCAPE_KEY_CODE = 27;
50
52
  * @cssprop {Color} [--gv-autocomplete--bgc=var(--gv-theme-neutral-color-lightest, #ffffff)] - Background color
51
53
  * @cssprop {Color} [--gv-autocomplete--c=var(--gv-theme-font-color, #262626)] - Color
52
54
  */
53
-
54
55
  export class GvAutocomplete extends LitElement {
55
56
  static get properties() {
56
57
  return {
57
- options: {
58
- type: Array,
59
- reflect: true
60
- },
61
- value: {
62
- type: String,
63
- reflect: true
64
- },
65
- style: {
66
- type: String
67
- },
68
- minChars: {
69
- type: Number
70
- },
71
- filter: {
72
- type: Boolean | Function
73
- },
74
- size: {
75
- type: Number
76
- },
77
- _options: {
78
- type: Array,
79
- attribute: false
80
- },
81
- _forceOpen: {
82
- type: Boolean,
83
- attribute: false
84
- }
58
+ options: { type: Array, reflect: true },
59
+ value: { type: String, reflect: true },
60
+ style: { type: String },
61
+ minChars: { type: Number },
62
+ filter: { type: Boolean | Function },
63
+ size: { type: Number },
64
+ _options: { type: Array, attribute: false },
65
+ _forceOpen: { type: Boolean, attribute: false },
85
66
  };
86
67
  }
87
68
 
88
69
  static get styles() {
89
- return [// language=CSS
90
- css`:host{box-sizing:border-box;display:inline-block;width:100%}::slotted(*){width:100%}.container{position:relative}.container .options.open{display:block;visibility:visible;opacity:1;-webkit-transform:-webkit-translateY(0);transform:translateY(0);z-index:100}.options{background-color:var(--gv-autocomplete--bgc,var(--gv-theme-neutral-color-lightest,#fff));color:var(--gv-autocomplete--c,var(--gv-theme-font-color,#262626));margin:.2rem;position:absolute;box-shadow:0 0 0 1px var(--gv-theme-neutral-color,#f5f5f5),0 1px 3px var(--gv-theme-neutral-color-dark,#bfbfbf);border-radius:2px;display:block;width:100%;cursor:pointer;left:0;right:0;visibility:hidden;opacity:0;-webkit-transform:-webkit-translateY(-2em);transform:translateY(-2em);-webkit-transition:-webkit-transform 150ms ease-in-out,opacity 150ms ease-in-out;-moz-transition:all 150ms ease-in-out;-ms-transition:all 150ms ease-in-out;-o-transition:all 150ms ease-in-out;overflow:auto}.option{padding:.2rem;min-height:30px;word-break:break-all}.option.match~.option.match{background-color:transparent}.keyboard .option.hover:hover,.option.hover,.option:hover{background-color:var(--gv-autocomplete-hover--bgc,var(--gv-theme-neutral-color-lighter,#fafafa))}.keyboard .option:hover{background-color:transparent}.show{display:block}.hide{display:none}`];
70
+ return [
71
+ // language=CSS
72
+ css`
73
+ :host {
74
+ box-sizing: border-box;
75
+ display: inline-block;
76
+ width: 100%;
77
+ }
78
+
79
+ ::slotted(*) {
80
+ width: 100%;
81
+ }
82
+
83
+ .container {
84
+ position: relative;
85
+ }
86
+
87
+ .container .options.open {
88
+ display: block;
89
+ visibility: visible;
90
+ opacity: 1;
91
+ -webkit-transform: -webkit-translateY(0%);
92
+ transform: translateY(0%);
93
+ z-index: 100;
94
+ }
95
+
96
+ .options {
97
+ background-color: var(--gv-autocomplete--bgc, var(--gv-theme-neutral-color-lightest, #ffffff));
98
+ color: var(--gv-autocomplete--c, var(--gv-theme-font-color, #262626));
99
+ margin: 0.2rem;
100
+ position: absolute;
101
+ box-shadow: 0 0 0 1px var(--gv-theme-neutral-color, #f5f5f5), 0 1px 3px var(--gv-theme-neutral-color-dark, #bfbfbf);
102
+ border-radius: 2px;
103
+ display: block;
104
+ width: 100%;
105
+ cursor: pointer;
106
+ left: 0;
107
+ right: 0;
108
+ visibility: hidden;
109
+ opacity: 0;
110
+ -webkit-transform: -webkit-translateY(-2em);
111
+ transform: translateY(-2em);
112
+ -webkit-transition: -webkit-transform 150ms ease-in-out, opacity 150ms ease-in-out;
113
+ -moz-transition: all 150ms ease-in-out;
114
+ -ms-transition: all 150ms ease-in-out;
115
+ -o-transition: all 150ms ease-in-out;
116
+ overflow: auto;
117
+ }
118
+
119
+ .option {
120
+ padding: 0.2rem;
121
+ min-height: 30px;
122
+ word-break: break-all;
123
+ }
124
+
125
+ .option.match ~ .option.match {
126
+ background-color: transparent;
127
+ }
128
+
129
+ .option:hover,
130
+ .option.hover,
131
+ .keyboard .option.hover:hover {
132
+ background-color: var(--gv-autocomplete-hover--bgc, var(--gv-theme-neutral-color-lighter, #fafafa));
133
+ }
134
+
135
+ .keyboard .option:hover {
136
+ background-color: transparent;
137
+ }
138
+
139
+ .show {
140
+ display: block;
141
+ }
142
+
143
+ .hide {
144
+ display: none;
145
+ }
146
+ `,
147
+ ];
91
148
  }
92
149
 
93
150
  constructor() {
@@ -112,18 +169,17 @@ export class GvAutocomplete extends LitElement {
112
169
 
113
170
  reset() {
114
171
  this._getInput().reset();
115
-
116
172
  this._options = [];
117
173
  }
118
174
 
119
175
  _getFilteredOptions() {
120
176
  if (this.filter && this.value && this.value.length >= this.minChars && this.value !== '*') {
121
177
  if (typeof this.filter === 'function') {
122
- return this._options.filter(option => {
178
+ return this._options.filter((option) => {
123
179
  return this.filter(this.value, option);
124
180
  });
125
181
  } else {
126
- return this._options.filter(option => {
182
+ return this._options.filter((option) => {
127
183
  return option.value.indexOf(this.value) !== -1;
128
184
  });
129
185
  }
@@ -135,11 +191,9 @@ export class GvAutocomplete extends LitElement {
135
191
  _onInput(event) {
136
192
  clearTimeout(this._cancellableTimeout);
137
193
  this.value = event.target.value;
138
-
139
194
  if (this.value != null && this.value.trim().length >= this.minChars) {
140
195
  this._cancellableTimeout = setTimeout(() => {
141
196
  this._open();
142
-
143
197
  dispatchCustomEvent(this, 'search', this.value);
144
198
  }, 200);
145
199
  } else {
@@ -149,23 +203,18 @@ export class GvAutocomplete extends LitElement {
149
203
 
150
204
  _onSelect(value, option) {
151
205
  if (option == null) {
152
- option = this._options.find(option => {
206
+ option = this._options.find((option) => {
153
207
  return option.value === value;
154
208
  });
155
209
  }
156
-
157
210
  this.value = this._getInput().value = value;
158
-
159
211
  this._close();
160
-
161
212
  dispatchCustomEvent(this, 'select', option);
162
213
  }
163
214
 
164
215
  _onMouseOver() {
165
216
  this.shadowRoot.firstElementChild.classList.remove('keyboard');
166
-
167
217
  this._clearHover();
168
-
169
218
  this._shouldSelect = true;
170
219
  }
171
220
 
@@ -177,13 +226,11 @@ export class GvAutocomplete extends LitElement {
177
226
  if (option.element) {
178
227
  return option.element;
179
228
  }
180
-
181
229
  if (option.innerHTML) {
182
230
  const wrapper = document.createElement('div');
183
231
  wrapper.innerHTML = option.innerHTML;
184
232
  return wrapper;
185
233
  }
186
-
187
234
  return option.value;
188
235
  }
189
236
 
@@ -193,7 +240,6 @@ export class GvAutocomplete extends LitElement {
193
240
  wrapper.innerHTML = unsafeCSS(this.style);
194
241
  return wrapper;
195
242
  }
196
-
197
243
  return '';
198
244
  }
199
245
 
@@ -203,13 +249,11 @@ export class GvAutocomplete extends LitElement {
203
249
  return true;
204
250
  }
205
251
  }
206
-
207
252
  return false;
208
253
  }
209
254
 
210
255
  render() {
211
256
  const options = this._getFilteredOptions();
212
-
213
257
  let open = false;
214
258
 
215
259
  if (options && options.length > 0 && this._forceOpen) {
@@ -217,44 +261,55 @@ export class GvAutocomplete extends LitElement {
217
261
  }
218
262
 
219
263
  const input = this._getInput();
220
-
221
264
  let top = 0;
222
-
223
265
  if (input != null) {
224
266
  top = input.offsetHeight;
225
267
  }
226
268
 
227
269
  const classes = {
228
270
  options: true,
229
- open
271
+ open,
230
272
  };
231
- return html` <div class="container"> ${this._renderStyle()} <slot></slot> ${this._hasNoOptionSlot() && this._forceOpen ? html`<div class="options open" style="${styleMap({
232
- top: `${top}px`
233
- })}"> <slot name="noOption" class="${!options || options.length === 0 ? 'show' : 'hide'}"></slot> </div>` : ''} <div class="${classMap(classes)}" @mouseleave="${this._onMouseLeave}" style="${styleMap({
234
- top: `${top}px`
235
- })}"> ${repeat(options, option => option, (option, index) => html` <div class="${classMap({
236
- option: true
237
- })}" data-value="${option.value}" @mouseover="${() => this._onMouseOver(option, index)}" @click="${() => this._onSelect(option.value, option)}"> ${this._renderOption(option)} </div> `)} </div> </div>`;
273
+
274
+ return html` <div class="container">
275
+ ${this._renderStyle()}
276
+ <slot></slot>
277
+ ${this._hasNoOptionSlot() && this._forceOpen
278
+ ? html`<div class="options open" style="${styleMap({ top: `${top}px` })}">
279
+ <slot name="noOption" class="${!options || options.length === 0 ? 'show' : 'hide'}"></slot>
280
+ </div>`
281
+ : ''}
282
+ <div class="${classMap(classes)}" @mouseleave="${this._onMouseLeave}" style="${styleMap({ top: `${top}px` })}">
283
+ ${repeat(
284
+ options,
285
+ (option) => option,
286
+ (option, index) => html`
287
+ <div
288
+ class="${classMap({ option: true })}"
289
+ data-value="${option.value}"
290
+ @mouseover="${() => this._onMouseOver(option, index)}"
291
+ @click="${() => this._onSelect(option.value, option)}"
292
+ >
293
+ ${this._renderOption(option)}
294
+ </div>
295
+ `,
296
+ )}
297
+ </div>
298
+ </div>`;
238
299
  }
239
300
 
240
301
  _clearHover() {
241
- this.shadowRoot.querySelectorAll('.option.hover').forEach(o => o.classList.remove('hover'));
302
+ this.shadowRoot.querySelectorAll('.option.hover').forEach((o) => o.classList.remove('hover'));
242
303
  }
243
304
 
244
305
  _updateHover() {
245
306
  this._clearHover();
246
-
247
307
  if (this._candidateIndex > -1) {
248
308
  this.shadowRoot.firstElementChild.classList.add('keyboard');
249
-
250
309
  const candidate = this.shadowRoot.querySelectorAll('.option')[this._candidateIndex];
251
-
252
310
  if (candidate) {
253
311
  const options = this.shadowRoot.querySelector('.options');
254
- const {
255
- top,
256
- left
257
- } = candidate.getBoundingClientRect();
312
+ const { top, left } = candidate.getBoundingClientRect();
258
313
  const container = options.getBoundingClientRect();
259
314
  const scrollLeft = left - container.left;
260
315
  const scrollTop = top - container.top;
@@ -266,77 +321,57 @@ export class GvAutocomplete extends LitElement {
266
321
 
267
322
  _onKeydown(e) {
268
323
  switch (e.keyCode) {
269
- case ENTER_KEY_CODE:
270
- {
271
- const options = this.shadowRoot.querySelectorAll('.option');
272
- const candidate = options[this._candidateIndex];
273
-
274
- if (candidate) {
275
- e.preventDefault();
276
- e.stopPropagation();
277
- this._candidateIndex = -1;
278
-
279
- this._onSelect(candidate.getAttribute('data-value'));
280
-
281
- this._updateHover();
282
- }
283
-
284
- this._close();
285
-
286
- break;
287
- }
288
-
289
- case DOWN_ARROW_KEY_CODE:
290
- {
291
- if (this._candidateIndex < this.shadowRoot.querySelectorAll('.option').length - 1) {
292
- e.preventDefault();
293
- e.stopPropagation();
294
- this._candidateIndex += 1;
295
-
296
- this._updateHover();
297
- }
298
-
299
- break;
324
+ case ENTER_KEY_CODE: {
325
+ const options = this.shadowRoot.querySelectorAll('.option');
326
+ const candidate = options[this._candidateIndex];
327
+ if (candidate) {
328
+ e.preventDefault();
329
+ e.stopPropagation();
330
+ this._candidateIndex = -1;
331
+ this._onSelect(candidate.getAttribute('data-value'));
332
+ this._updateHover();
300
333
  }
334
+ this._close();
335
+ break;
336
+ }
301
337
 
302
- case UP_ARROW_KEY_CODE:
303
- {
304
- if (this._candidateIndex > 0) {
305
- e.preventDefault();
306
- e.stopPropagation();
307
- this._candidateIndex -= 1;
308
-
309
- this._updateHover();
310
- }
311
-
312
- break;
338
+ case DOWN_ARROW_KEY_CODE: {
339
+ if (this._candidateIndex < this.shadowRoot.querySelectorAll('.option').length - 1) {
340
+ e.preventDefault();
341
+ e.stopPropagation();
342
+ this._candidateIndex += 1;
343
+ this._updateHover();
313
344
  }
345
+ break;
346
+ }
314
347
 
315
- case ESCAPE_KEY_CODE:
316
- {
348
+ case UP_ARROW_KEY_CODE: {
349
+ if (this._candidateIndex > 0) {
317
350
  e.preventDefault();
318
351
  e.stopPropagation();
319
- this._candidateIndex = -1;
320
-
352
+ this._candidateIndex -= 1;
321
353
  this._updateHover();
322
-
323
- break;
324
354
  }
355
+ break;
356
+ }
325
357
 
358
+ case ESCAPE_KEY_CODE: {
359
+ e.preventDefault();
360
+ e.stopPropagation();
361
+ this._candidateIndex = -1;
362
+ this._updateHover();
363
+ break;
364
+ }
326
365
  default:
327
366
  this.value = this._getInput().value;
328
367
  this._candidateIndex = -1;
329
-
330
368
  this._updateHover();
331
-
332
369
  }
333
370
  }
334
371
 
335
372
  _open() {
336
373
  this._forceOpen = true;
337
- dispatchCustomEvent(this, 'opened', {
338
- target: this
339
- });
374
+ dispatchCustomEvent(this, 'opened', { target: this });
340
375
  }
341
376
 
342
377
  _close() {
@@ -360,7 +395,6 @@ export class GvAutocomplete extends LitElement {
360
395
  return node;
361
396
  }
362
397
  }
363
-
364
398
  return this.firstElementChild;
365
399
  }
366
400
 
@@ -371,7 +405,6 @@ export class GvAutocomplete extends LitElement {
371
405
  updated() {
372
406
  setTimeout(() => {
373
407
  const firstOption = this.shadowRoot.querySelector('.option');
374
-
375
408
  if (firstOption) {
376
409
  const maxHeight = firstOption.clientHeight * parseInt(this.size, 10);
377
410
  const options = this.shadowRoot.querySelector('.options');
@@ -387,25 +420,20 @@ export class GvAutocomplete extends LitElement {
387
420
  focus: this._onFocus.bind(this),
388
421
  blur: this._onBlur.bind(this),
389
422
  keydown: this._onKeydown.bind(this),
390
- clear: this._onClear.bind(this)
423
+ clear: this._onClear.bind(this),
391
424
  };
392
425
  this.shadowRoot.addEventListener('input', this._handlers.input);
393
426
  this.shadowRoot.addEventListener('keydown', this._handlers.keydown);
394
-
395
427
  const input = this._getInput();
396
-
397
428
  input.addEventListener('focus', this._handlers.focus);
398
429
  input.addEventListener('blur', this._handlers.blur);
399
430
  input.addEventListener('gv-input:clear', this._handlers.clear);
400
-
401
431
  if (input.tagName.toLowerCase() === 'gv-input') {
402
432
  input.setAttribute('no-submit', true);
403
433
  }
404
434
  }
405
435
 
406
- _onOpened({
407
- detail
408
- }) {
436
+ _onOpened({ detail }) {
409
437
  if (detail.target !== this) {
410
438
  this._close();
411
439
  }
@@ -420,18 +448,14 @@ export class GvAutocomplete extends LitElement {
420
448
  if (this._handlers) {
421
449
  this.shadowRoot.removeEventListener('input', this._handlers.input);
422
450
  this.shadowRoot.removeEventListener('keydown', this._handlers.keydown);
423
-
424
451
  const input = this._getInput();
425
-
426
452
  input.removeEventListener('focus', this._handlers.focus);
427
453
  input.removeEventListener('blur', this._handlers.blur);
428
454
  input.removeEventListener('gv-input:clear', this._handlers.clear);
429
455
  }
430
-
431
456
  window.removeEventListener('gv-autocomplete:open', this._handleOpened);
432
457
  super.disconnectedCallback();
433
458
  }
434
-
435
459
  }
460
+
436
461
  window.customElements.define('gv-autocomplete', GvAutocomplete);
437
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL2F0b21zL2d2LWF1dG9jb21wbGV0ZS5qcyJdLCJuYW1lcyI6WyJjc3MiLCJMaXRFbGVtZW50IiwidW5zYWZlQ1NTIiwiaHRtbCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJyZXBlYXQiLCJjbGFzc01hcCIsInN0eWxlTWFwIiwiRU5URVJfS0VZX0NPREUiLCJET1dOX0FSUk9XX0tFWV9DT0RFIiwiVVBfQVJST1dfS0VZX0NPREUiLCJFU0NBUEVfS0VZX0NPREUiLCJHdkF1dG9jb21wbGV0ZSIsInByb3BlcnRpZXMiLCJvcHRpb25zIiwidHlwZSIsIkFycmF5IiwicmVmbGVjdCIsInZhbHVlIiwiU3RyaW5nIiwic3R5bGUiLCJtaW5DaGFycyIsIk51bWJlciIsImZpbHRlciIsIkJvb2xlYW4iLCJGdW5jdGlvbiIsInNpemUiLCJfb3B0aW9ucyIsImF0dHJpYnV0ZSIsIl9mb3JjZU9wZW4iLCJzdHlsZXMiLCJjb25zdHJ1Y3RvciIsIl9jYW5kaWRhdGVJbmRleCIsIl9oYW5kbGVPcGVuZWQiLCJfb25PcGVuZWQiLCJiaW5kIiwicmVzZXQiLCJfZ2V0SW5wdXQiLCJfZ2V0RmlsdGVyZWRPcHRpb25zIiwibGVuZ3RoIiwib3B0aW9uIiwiaW5kZXhPZiIsIl9vbklucHV0IiwiZXZlbnQiLCJjbGVhclRpbWVvdXQiLCJfY2FuY2VsbGFibGVUaW1lb3V0IiwidGFyZ2V0IiwidHJpbSIsInNldFRpbWVvdXQiLCJfb3BlbiIsIl9vblNlbGVjdCIsImZpbmQiLCJfY2xvc2UiLCJfb25Nb3VzZU92ZXIiLCJzaGFkb3dSb290IiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJjbGFzc0xpc3QiLCJyZW1vdmUiLCJfY2xlYXJIb3ZlciIsIl9zaG91bGRTZWxlY3QiLCJfb25Nb3VzZUxlYXZlIiwiX3JlbmRlck9wdGlvbiIsImVsZW1lbnQiLCJpbm5lckhUTUwiLCJ3cmFwcGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiX3JlbmRlclN0eWxlIiwiX2hhc05vT3B0aW9uU2xvdCIsIm5vZGUiLCJjaGlsZE5vZGVzIiwic2xvdCIsInJlbmRlciIsIm9wZW4iLCJpbnB1dCIsInRvcCIsIm9mZnNldEhlaWdodCIsImNsYXNzZXMiLCJpbmRleCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwibyIsIl91cGRhdGVIb3ZlciIsImFkZCIsImNhbmRpZGF0ZSIsInF1ZXJ5U2VsZWN0b3IiLCJsZWZ0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY29udGFpbmVyIiwic2Nyb2xsTGVmdCIsInNjcm9sbFRvcCIsInNjcm9sbFRvIiwiX29uS2V5ZG93biIsImUiLCJrZXlDb2RlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJnZXRBdHRyaWJ1dGUiLCJfb25Gb2N1cyIsIl9vbkJsdXIiLCJfb25DbGVhciIsInVwZGF0ZWQiLCJmaXJzdE9wdGlvbiIsIm1heEhlaWdodCIsImNsaWVudEhlaWdodCIsInBhcnNlSW50IiwiZmlyc3RVcGRhdGVkIiwiX2hhbmRsZXJzIiwiZm9jdXMiLCJibHVyIiwia2V5ZG93biIsImNsZWFyIiwiYWRkRXZlbnRMaXN0ZW5lciIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsInNldEF0dHJpYnV0ZSIsImRldGFpbCIsImNvbm5lY3RlZENhbGxiYWNrIiwid2luZG93IiwiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsVUFBZCxFQUEwQkMsU0FBMUIsRUFBcUNDLElBQXJDLFFBQWlELEtBQWpEO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsZUFBcEM7QUFDQSxTQUFTQyxNQUFULFFBQXVCLHVCQUF2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QixVQUFNQSxpQkFBTjtBQUNBQyxJQUFBQSxNQUFNLENBQUNOLGdCQUFQLENBQXdCLHdCQUF4QixFQUFrRCxLQUFLL0UsYUFBdkQ7QUFDRDs7QUFFRHNGLEVBQUFBLG9CQUFvQixHQUFHO0FBQ3JCLFFBQUksS0FBS1osU0FBVCxFQUFvQjtBQUNsQixXQUFLckQsVUFBTCxDQUFnQmtFLG1CQUFoQixDQUFvQyxPQUFwQyxFQUE2QyxLQUFLYixTQUFMLENBQWVqQyxLQUE1RDtBQUNBLFdBQUtwQixVQUFMLENBQWdCa0UsbUJBQWhCLENBQW9DLFNBQXBDLEVBQStDLEtBQUtiLFNBQUwsQ0FBZUcsT0FBOUQ7O0FBQ0EsWUFBTXBDLEtBQUssR0FBRyxLQUFLckMsU0FBTCxFQUFkOztBQUNBcUMsTUFBQUEsS0FBSyxDQUFDOEMsbUJBQU4sQ0FBMEIsT0FBMUIsRUFBbUMsS0FBS2IsU0FBTCxDQUFlQyxLQUFsRDtBQUNBbEMsTUFBQUEsS0FBSyxDQUFDOEMsbUJBQU4sQ0FBMEIsTUFBMUIsRUFBa0MsS0FBS2IsU0FBTCxDQUFlRSxJQUFqRDtBQUNBbkMsTUFBQUEsS0FBSyxDQUFDOEMsbUJBQU4sQ0FBMEIsZ0JBQTFCLEVBQTRDLEtBQUtiLFNBQUwsQ0FBZUksS0FBM0Q7QUFDRDs7QUFDRE8sSUFBQUEsTUFBTSxDQUFDRSxtQkFBUCxDQUEyQixzQkFBM0IsRUFBbUQsS0FBS3ZGLGFBQXhEO0FBQ0EsVUFBTXNGLG9CQUFOO0FBQ0Q7O0FBblo0QztBQXNaL0NELE1BQU0sQ0FBQ0csY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIsaUJBQTdCLEVBQWdEOUcsY0FBaEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50LCB1bnNhZmVDU1MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZGlzcGF0Y2hDdXN0b21FdmVudCB9IGZyb20gJy4uL2xpYi9ldmVudHMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwJztcblxuY29uc3QgRU5URVJfS0VZX0NPREUgPSAxMztcbmNvbnN0IERPV05fQVJST1dfS0VZX0NPREUgPSA0MDtcbmNvbnN0IFVQX0FSUk9XX0tFWV9DT0RFID0gMzg7XG5jb25zdCBFU0NBUEVfS0VZX0NPREUgPSAyNztcblxuLyoqXG4gKiBBdXRvY29tcGxldGUgaW5wdXQgd3JhcHBlclxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBmaXJlcyBndi1hdXRvY29tcGxldGU6c2VhcmNoIC0gQ3VzdG9tIGV2ZW50IHdoZW4gdXNlciBzZWFyY2ggdmFsdWVcbiAqIEBmaXJlcyBndi1hdXRvY29tcGxldGU6c2VsZWN0IC0gQ3VzdG9tIGV2ZW50IHdoZW4gdXNlciBzZWxlY3QgdmFsdWVcbiAqIEBmaXJlcyBndi1hdXRvY29tcGxldGU6b3BlbmVkIC0gQ3VzdG9tIGV2ZW50IGFmdGVyIG9wZW5lZCBhdXRvY29tcGxldGVcbiAqXG4gKiBAc2xvdCBzdHlsZSAtIFRoZSBvcHRpb25zIHN0eWxlXG4gKiBAc2xvdCBpbnB1dCAtIFRoZSBpbnB1dCB0byB3cmFwXG4gKiBAc2xvdCBub09wdGlvbiAtIFdoYXQgc2hvdWxkIGJlIHNob3duIHdoZW4gdGhlcmUgaXMgbm8gb3B0aW9ucyB0byBkaXNwbGF5XG4gKlxuICogQGF0dHIge0FycmF5Ljx7dmFsdWU6IFN0cmluZywgaW5uZXJIVE1MPzogU3RyaW5nfT59IG9wdGlvbnMgLSB0aGUgb3B0aW9ucyBmb3Igc2VhcmNoXG4gKiBAYXR0ciB7U3RyaW5nfSB2YWx1ZSAtIHNlbGVjdGVkIHZhbHVlXG4gKiBAYXR0ciB7U3RyaW5nfSBzdHlsZSAtIGNzcyBpZiB5b3Ugd2FudCBjdXN0b20gb3B0aW9ucyByZW5kZXJlZFxuICogQGF0dHIge051bWJlcn0gbWluQ2hhcnMgLSBtaW5pbXVtIG9mIGNoYXJhY3RlcnMgZm9yIGxhdW5jaCBzZWFyY2ggYW5kIHNob3cgcmVzdWx0c1xuICogQGF0dHIge051bWJlcn0gc2l6ZSAtIHJlc3VsdHMgc2l6ZSB0byBzaG93IGJlZm9yZSB1c2VyIG11c3Qgc2Nyb2xsXG4gKiBAYXR0ciB7Qm9vbGVhbnxGdW5jdGlvbih2YWx1ZSxvcHRpb24pfSBmaWx0ZXIgLSBJZiB0cnVlLCBmaWx0ZXIgb3B0aW9ucyBieSBpbnB1dCwgaWYgZnVuY3Rpb24sIGZpbHRlciBvcHRpb25zIGFnYWluc3QgaXQuIFRoZSBmdW5jdGlvbiB3aWxsXG4gKiByZWNlaXZlIHR3byBhcmd1bWVudHMsIGlucHV0VmFsdWUgYW5kIG9wdGlvbiwgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIG9wdGlvbiB3aWxsIGJlIGluY2x1ZGVkXG4gKiBpbiB0aGUgZmlsdGVyZWQgc2V0OyBPdGhlcndpc2UsIGl0IHdpbGwgYmUgZXhjbHVkZWQuXG4gKiB0aGUgb3B0aW9uIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbHRlcmVkIHNldDsgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGV4Y2x1ZGVkLlxuICpcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtYXV0b2NvbXBsZXRlLWhvdmVyLS1iZ2M9dmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1saWdodGVyLCAjZmFmYWZhKV0gLSBIb3ZlciBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LWF1dG9jb21wbGV0ZS0tYmdjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItbGlnaHRlc3QsICNmZmZmZmYpXSAtIEJhY2tncm91bmQgY29sb3JcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtYXV0b2NvbXBsZXRlLS1jPXZhcigtLWd2LXRoZW1lLWZvbnQtY29sb3IsICMyNjI2MjYpXSAtIENvbG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBHdkF1dG9jb21wbGV0ZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXksIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIHZhbHVlOiB7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgc3R5bGU6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBtaW5DaGFyczogeyB0eXBlOiBOdW1iZXIgfSxcbiAgICAgIGZpbHRlcjogeyB0eXBlOiBCb29sZWFuIHwgRnVuY3Rpb24gfSxcbiAgICAgIHNpemU6IHsgdHlwZTogTnVtYmVyIH0sXG4gICAgICBfb3B0aW9uczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2ZvcmNlT3BlbjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgOjpzbG90dGVkKCopIHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250YWluZXIge1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250YWluZXIgLm9wdGlvbnMub3BlbiB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiAtd2Via2l0LXRyYW5zbGF0ZVkoMCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwJSk7XG4gICAgICAgICAgei1pbmRleDogMTAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLm9wdGlvbnMge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LWF1dG9jb21wbGV0ZS0tYmdjLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXN0LCAjZmZmZmZmKSk7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWd2LWF1dG9jb21wbGV0ZS0tYywgdmFyKC0tZ3YtdGhlbWUtZm9udC1jb2xvciwgIzI2MjYyNikpO1xuICAgICAgICAgIG1hcmdpbjogMC4ycmVtO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggdmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvciwgI2Y1ZjVmNSksIDAgMXB4IDNweCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWRhcmssICNiZmJmYmYpO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogLXdlYmtpdC10cmFuc2xhdGVZKC0yZW0pO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMmVtKTtcbiAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGVhc2UtaW4tb3V0LCBvcGFjaXR5IDE1MG1zIGVhc2UtaW4tb3V0O1xuICAgICAgICAgIC1tb3otdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2UtaW4tb3V0O1xuICAgICAgICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgLW8tdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2UtaW4tb3V0O1xuICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgICB9XG5cbiAgICAgICAgLm9wdGlvbiB7XG4gICAgICAgICAgcGFkZGluZzogMC4ycmVtO1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDMwcHg7XG4gICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLm9wdGlvbi5tYXRjaCB+IC5vcHRpb24ubWF0Y2gge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLm9wdGlvbjpob3ZlcixcbiAgICAgICAgLm9wdGlvbi5ob3ZlcixcbiAgICAgICAgLmtleWJvYXJkIC5vcHRpb24uaG92ZXI6aG92ZXIge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LWF1dG9jb21wbGV0ZS1ob3Zlci0tYmdjLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXIsICNmYWZhZmEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5rZXlib2FyZCAub3B0aW9uOmhvdmVyIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zaG93IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIC5oaWRlIHtcbiAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIF07XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX29wdGlvbnMgPSBbXTtcbiAgICB0aGlzLl9jYW5kaWRhdGVJbmRleCA9IC0xO1xuICAgIHRoaXMubWluQ2hhcnMgPSAxO1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB0aGlzLnN0eWxlID0gJyc7XG4gICAgdGhpcy5maWx0ZXIgPSBmYWxzZTtcbiAgICB0aGlzLnNpemUgPSA1O1xuICAgIHRoaXMuX2hhbmRsZU9wZW5lZCA9IHRoaXMuX29uT3BlbmVkLmJpbmQodGhpcyk7XG4gIH1cblxuICBzZXQgb3B0aW9ucyhvcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX2dldElucHV0KCkucmVzZXQoKTtcbiAgICB0aGlzLl9vcHRpb25zID0gW107XG4gIH1cblxuICBfZ2V0RmlsdGVyZWRPcHRpb25zKCkge1xuICAgIGlmICh0aGlzLmZpbHRlciAmJiB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID49IHRoaXMubWluQ2hhcnMgJiYgdGhpcy52YWx1ZSAhPT0gJyonKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHRoaXMudmFsdWUsIG9wdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlLmluZGV4T2YodGhpcy52YWx1ZSkgIT09IC0xO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgX29uSW5wdXQoZXZlbnQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fY2FuY2VsbGFibGVUaW1lb3V0KTtcbiAgICB0aGlzLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwgJiYgdGhpcy52YWx1ZS50cmltKCkubGVuZ3RoID49IHRoaXMubWluQ2hhcnMpIHtcbiAgICAgIHRoaXMuX2NhbmNlbGxhYmxlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9vcGVuKCk7XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3NlYXJjaCcsIHRoaXMudmFsdWUpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zID0gW107XG4gICAgfVxuICB9XG5cbiAgX29uU2VsZWN0KHZhbHVlLCBvcHRpb24pIHtcbiAgICBpZiAob3B0aW9uID09IG51bGwpIHtcbiAgICAgIG9wdGlvbiA9IHRoaXMuX29wdGlvbnMuZmluZCgob3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB0aGlzLl9nZXRJbnB1dCgpLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdzZWxlY3QnLCBvcHRpb24pO1xuICB9XG5cbiAgX29uTW91c2VPdmVyKCkge1xuICAgIHRoaXMuc2hhZG93Um9vdC5maXJzdEVsZW1lbnRDaGlsZC5jbGFzc0xpc3QucmVtb3ZlKCdrZXlib2FyZCcpO1xuICAgIHRoaXMuX2NsZWFySG92ZXIoKTtcbiAgICB0aGlzLl9zaG91bGRTZWxlY3QgPSB0cnVlO1xuICB9XG5cbiAgX29uTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLl9zaG91bGRTZWxlY3QgPSBmYWxzZTtcbiAgfVxuXG4gIF9yZW5kZXJPcHRpb24ob3B0aW9uKSB7XG4gICAgaWYgKG9wdGlvbi5lbGVtZW50KSB7XG4gICAgICByZXR1cm4gb3B0aW9uLmVsZW1lbnQ7XG4gICAgfVxuICAgIGlmIChvcHRpb24uaW5uZXJIVE1MKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB3cmFwcGVyLmlubmVySFRNTCA9IG9wdGlvbi5pbm5lckhUTUw7XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbi52YWx1ZTtcbiAgfVxuXG4gIF9yZW5kZXJTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgd3JhcHBlci5pbm5lckhUTUwgPSB1bnNhZmVDU1ModGhpcy5zdHlsZSk7XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgX2hhc05vT3B0aW9uU2xvdCgpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5jaGlsZE5vZGVzKSB7XG4gICAgICBpZiAobm9kZS5zbG90ID09PSAnbm9PcHRpb24nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldEZpbHRlcmVkT3B0aW9ucygpO1xuICAgIGxldCBvcGVuID0gZmFsc2U7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDAgJiYgdGhpcy5fZm9yY2VPcGVuKSB7XG4gICAgICBvcGVuID0gdGhpcy5taW5DaGFycyA9PT0gMCB8fCB0aGlzLnZhbHVlLnRyaW0oKS5sZW5ndGggPj0gdGhpcy5taW5DaGFycztcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuX2dldElucHV0KCk7XG4gICAgbGV0IHRvcCA9IDA7XG4gICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgIHRvcCA9IGlucHV0Lm9mZnNldEhlaWdodDtcbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgb3B0aW9uczogdHJ1ZSxcbiAgICAgIG9wZW4sXG4gICAgfTtcblxuICAgIHJldHVybiBodG1sYCA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAke3RoaXMuX3JlbmRlclN0eWxlKCl9XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAke3RoaXMuX2hhc05vT3B0aW9uU2xvdCgpICYmIHRoaXMuX2ZvcmNlT3BlblxuICAgICAgICA/IGh0bWxgPGRpdiBjbGFzcz1cIm9wdGlvbnMgb3BlblwiIHN0eWxlPVwiJHtzdHlsZU1hcCh7IHRvcDogYCR7dG9wfXB4YCB9KX1cIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJub09wdGlvblwiIGNsYXNzPVwiJHshb3B0aW9ucyB8fCBvcHRpb25zLmxlbmd0aCA9PT0gMCA/ICdzaG93JyA6ICdoaWRlJ31cIj48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+YFxuICAgICAgICA6ICcnfVxuICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoY2xhc3Nlcyl9XCIgQG1vdXNlbGVhdmU9XCIke3RoaXMuX29uTW91c2VMZWF2ZX1cIiBzdHlsZT1cIiR7c3R5bGVNYXAoeyB0b3A6IGAke3RvcH1weGAgfSl9XCI+XG4gICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLFxuICAgICAgICAgIChvcHRpb24sIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBvcHRpb246IHRydWUgfSl9XCJcbiAgICAgICAgICAgICAgZGF0YS12YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiXG4gICAgICAgICAgICAgIEBtb3VzZW92ZXI9XCIkeygpID0+IHRoaXMuX29uTW91c2VPdmVyKG9wdGlvbiwgaW5kZXgpfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIiR7KCkgPT4gdGhpcy5fb25TZWxlY3Qob3B0aW9uLnZhbHVlLCBvcHRpb24pfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICR7dGhpcy5fcmVuZGVyT3B0aW9uKG9wdGlvbil9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgLFxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgfVxuXG4gIF9jbGVhckhvdmVyKCkge1xuICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCcub3B0aW9uLmhvdmVyJykuZm9yRWFjaCgobykgPT4gby5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcicpKTtcbiAgfVxuXG4gIF91cGRhdGVIb3ZlcigpIHtcbiAgICB0aGlzLl9jbGVhckhvdmVyKCk7XG4gICAgaWYgKHRoaXMuX2NhbmRpZGF0ZUluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuc2hhZG93Um9vdC5maXJzdEVsZW1lbnRDaGlsZC5jbGFzc0xpc3QuYWRkKCdrZXlib2FyZCcpO1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5vcHRpb24nKVt0aGlzLl9jYW5kaWRhdGVJbmRleF07XG4gICAgICBpZiAoY2FuZGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLm9wdGlvbnMnKTtcbiAgICAgICAgY29uc3QgeyB0b3AsIGxlZnQgfSA9IGNhbmRpZGF0ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gb3B0aW9ucy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGxlZnQgLSBjb250YWluZXIubGVmdDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gdG9wIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgb3B0aW9ucy5zY3JvbGxUbyhzY3JvbGxMZWZ0LCBzY3JvbGxUb3ApO1xuICAgICAgICBjYW5kaWRhdGUuY2xhc3NMaXN0LmFkZCgnaG92ZXInKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfb25LZXlkb3duKGUpIHtcbiAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgY2FzZSBFTlRFUl9LRVlfQ09ERToge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5vcHRpb24nKTtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gb3B0aW9uc1t0aGlzLl9jYW5kaWRhdGVJbmRleF07XG4gICAgICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLl9jYW5kaWRhdGVJbmRleCA9IC0xO1xuICAgICAgICAgIHRoaXMuX29uU2VsZWN0KGNhbmRpZGF0ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSk7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlSG92ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBET1dOX0FSUk9XX0tFWV9DT0RFOiB7XG4gICAgICAgIGlmICh0aGlzLl9jYW5kaWRhdGVJbmRleCA8IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCcub3B0aW9uJykubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuX2NhbmRpZGF0ZUluZGV4ICs9IDE7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlSG92ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBVUF9BUlJPV19LRVlfQ09ERToge1xuICAgICAgICBpZiAodGhpcy5fY2FuZGlkYXRlSW5kZXggPiAwKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5fY2FuZGlkYXRlSW5kZXggLT0gMTtcbiAgICAgICAgICB0aGlzLl91cGRhdGVIb3ZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEVTQ0FQRV9LRVlfQ09ERToge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX2NhbmRpZGF0ZUluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuX2dldElucHV0KCkudmFsdWU7XG4gICAgICAgIHRoaXMuX2NhbmRpZGF0ZUluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyKCk7XG4gICAgfVxuICB9XG5cbiAgX29wZW4oKSB7XG4gICAgdGhpcy5fZm9yY2VPcGVuID0gdHJ1ZTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdvcGVuZWQnLCB7IHRhcmdldDogdGhpcyB9KTtcbiAgfVxuXG4gIF9jbG9zZSgpIHtcbiAgICB0aGlzLl9mb3JjZU9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIF9vbkZvY3VzKCkge1xuICAgIHRoaXMuX29wZW4oKTtcbiAgfVxuXG4gIF9vbkJsdXIoKSB7XG4gICAgLy8gSW1wb3J0YW50IHdoZW4gdXNpbmcgY3VzdG9tIEhUTUwgaW4gb3B0aW9uc1xuICAgIGlmICh0aGlzLl9zaG91bGRTZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRJbnB1dCgpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5jaGlsZE5vZGVzKSB7XG4gICAgICBpZiAobm9kZS5zbG90ID09PSAnaW5wdXQnKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbiAgfVxuXG4gIF9vbkNsZWFyKGV2ZW50KSB7XG4gICAgdGhpcy52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIHVwZGF0ZWQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcub3B0aW9uJyk7XG4gICAgICBpZiAoZmlyc3RPcHRpb24pIHtcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gZmlyc3RPcHRpb24uY2xpZW50SGVpZ2h0ICogcGFyc2VJbnQodGhpcy5zaXplLCAxMCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLm9wdGlvbnMnKTtcbiAgICAgICAgb3B0aW9ucy5zdHlsZS5tYXhIZWlnaHQgPSBgJHttYXhIZWlnaHR9cHhgO1xuICAgICAgICBvcHRpb25zLnNjcm9sbFRvKDAsIDApO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgZmlyc3RVcGRhdGVkKCkge1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge1xuICAgICAgaW5wdXQ6IHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKSxcbiAgICAgIGZvY3VzOiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyksXG4gICAgICBibHVyOiB0aGlzLl9vbkJsdXIuYmluZCh0aGlzKSxcbiAgICAgIGtleWRvd246IHRoaXMuX29uS2V5ZG93bi5iaW5kKHRoaXMpLFxuICAgICAgY2xlYXI6IHRoaXMuX29uQ2xlYXIuYmluZCh0aGlzKSxcbiAgICB9O1xuICAgIHRoaXMuc2hhZG93Um9vdC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX2hhbmRsZXJzLmlucHV0KTtcbiAgICB0aGlzLnNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2hhbmRsZXJzLmtleWRvd24pO1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fZ2V0SW5wdXQoKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2hhbmRsZXJzLmZvY3VzKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5faGFuZGxlcnMuYmx1cik7XG4gICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignZ3YtaW5wdXQ6Y2xlYXInLCB0aGlzLl9oYW5kbGVycy5jbGVhcik7XG4gICAgaWYgKGlucHV0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2d2LWlucHV0Jykge1xuICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCduby1zdWJtaXQnLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBfb25PcGVuZWQoeyBkZXRhaWwgfSkge1xuICAgIGlmIChkZXRhaWwudGFyZ2V0ICE9PSB0aGlzKSB7XG4gICAgICB0aGlzLl9jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2d2LWF1dG9jb21wbGV0ZTpvcGVuZWQnLCB0aGlzLl9oYW5kbGVPcGVuZWQpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLl9oYW5kbGVycy5pbnB1dCk7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2hhbmRsZXJzLmtleWRvd24pO1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLl9nZXRJbnB1dCgpO1xuICAgICAgaW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9oYW5kbGVycy5mb2N1cyk7XG4gICAgICBpbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5faGFuZGxlcnMuYmx1cik7XG4gICAgICBpbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdndi1pbnB1dDpjbGVhcicsIHRoaXMuX2hhbmRsZXJzLmNsZWFyKTtcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2d2LWF1dG9jb21wbGV0ZTpvcGVuJywgdGhpcy5faGFuZGxlT3BlbmVkKTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LWF1dG9jb21wbGV0ZScsIEd2QXV0b2NvbXBsZXRlKTtcbiJdfQ==