@gravitee/ui-components 3.24.5-renovate-github-markdown-css-5-x-6cd8067 → 3.25.1
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.
- package/assets/css/github-markdown-css/github-markdown.css +545 -500
- package/assets/i18n/en.json +3 -0
- package/assets/i18n/fr.json +3 -0
- package/assets/icons/design.svg +1 -1
- package/package.json +2 -9
- package/src/atoms/gv-autocomplete.js +132 -156
- package/src/atoms/gv-button.js +73 -248
- package/src/atoms/gv-checkbox.js +45 -103
- package/src/atoms/gv-date-picker-calendar.js +312 -393
- package/src/atoms/gv-date-picker-cell.js +57 -81
- package/src/atoms/gv-date-picker.js +180 -319
- package/src/atoms/gv-file-upload.js +85 -195
- package/src/atoms/gv-icon.js +13 -34
- package/src/atoms/gv-image.js +31 -66
- package/src/atoms/gv-input-message.js +12 -37
- package/src/atoms/gv-input.js +117 -148
- package/src/atoms/gv-link.js +47 -125
- package/src/atoms/gv-message.js +18 -69
- package/src/atoms/gv-metric.js +19 -68
- package/src/atoms/gv-relative-time.js +67 -38
- package/src/atoms/gv-select-native.js +96 -215
- package/src/atoms/gv-select.js +110 -230
- package/src/atoms/gv-spinner.js +5 -26
- package/src/atoms/gv-state.js +25 -66
- package/src/atoms/gv-switch.js +40 -160
- package/src/atoms/gv-tag.js +26 -78
- package/src/atoms/gv-text.js +22 -83
- package/src/charts/gv-chart-bar.js +22 -18
- package/src/charts/gv-chart-gauge.js +28 -31
- package/src/charts/gv-chart-histogram.js +18 -10
- package/src/charts/gv-chart-line.js +70 -59
- package/src/charts/gv-chart-map.js +44 -42
- package/src/charts/gv-chart-pie.js +18 -14
- package/src/index.js +1 -0
- package/src/lib/cron-expression.js +40 -35
- package/src/lib/date.js +10 -1
- package/src/lib/events.js +3 -1
- package/src/lib/http-client-schema-form.js +13 -12
- package/src/lib/http.js +57 -56
- package/src/lib/i18n.js +30 -22
- package/src/lib/item.js +13 -12
- package/src/lib/properties.js +77 -42
- package/src/lib/schema-form.js +4 -5
- package/src/lib/studio.js +13 -60
- package/src/lib/style.js +8 -8
- package/src/lib/text-format.js +14 -7
- package/src/lib/theme.js +8 -5
- package/src/lib/utils.js +17 -18
- package/src/mixins/chart-element.js +31 -54
- package/src/mixins/input-element.js +60 -47
- package/src/mixins/item-resource.js +34 -32
- package/src/mixins/keyboard-element.js +6 -5
- package/src/mixins/update-after-browser.js +4 -1
- package/src/mixins/with-resize-observer.js +23 -13
- package/src/mixins/with-skeleton-attribute.js +54 -48
- package/src/molecules/gv-card-full.js +26 -147
- package/src/molecules/gv-card-list.js +13 -42
- package/src/molecules/gv-card.js +17 -91
- package/src/molecules/gv-category-list.js +6 -17
- package/src/molecules/gv-category.js +23 -103
- package/src/molecules/gv-code.js +81 -143
- package/src/molecules/gv-confirm.js +41 -71
- package/src/molecules/gv-cron-editor.js +143 -389
- package/src/molecules/gv-dropdown-menu.js +14 -46
- package/src/molecules/gv-expandable.js +31 -59
- package/src/molecules/gv-expression-language.js +176 -138
- package/src/molecules/gv-identity-picture.js +42 -65
- package/src/molecules/gv-list.js +42 -134
- package/src/molecules/gv-metrics.js +37 -49
- package/src/molecules/gv-modal.js +28 -95
- package/src/molecules/gv-nav.js +49 -75
- package/src/molecules/gv-option.js +57 -130
- package/src/molecules/gv-plans.js +86 -209
- package/src/molecules/gv-popover.js +57 -177
- package/src/molecules/gv-promote.js +28 -146
- package/src/molecules/gv-rating-list.js +69 -195
- package/src/molecules/gv-rating.js +52 -105
- package/src/molecules/gv-row-expandable.js +5 -11
- package/src/molecules/gv-row.js +21 -147
- package/src/molecules/gv-stats.js +23 -48
- package/src/molecules/gv-stepper.js +43 -187
- package/src/molecules/gv-table.js +199 -309
- package/src/molecules/gv-tree.js +33 -156
- package/src/organisms/gv-documentation.js +45 -128
- package/src/organisms/gv-header.js +37 -195
- package/src/organisms/gv-http-client.js +32 -168
- package/src/organisms/gv-menu.js +37 -158
- package/src/organisms/gv-newsletter-subscription.js +48 -189
- package/src/organisms/gv-pagination.js +49 -77
- package/src/organisms/gv-properties.js +271 -492
- package/src/organisms/gv-resizable-views.js +41 -259
- package/src/organisms/gv-resources.js +168 -275
- package/src/organisms/gv-schema-form-array.js +49 -159
- package/src/organisms/gv-schema-form-control-object.js +59 -73
- package/src/organisms/gv-schema-form-control.js +107 -134
- package/src/organisms/gv-schema-form.js +219 -280
- package/src/organisms/gv-tabs.js +66 -98
- package/src/organisms/gv-user-menu.js +36 -201
- package/src/organisms/gv-vertical-menu.js +20 -61
- package/src/policy-studio/gv-flow-step.js +106 -245
- package/src/policy-studio/gv-flow.js +125 -304
- package/src/policy-studio/gv-policy-studio-menu.js +157 -471
- package/src/policy-studio/gv-policy-studio.js +714 -760
- package/src/styles/empty.js +3 -20
- package/src/styles/input.js +3 -247
- package/src/styles/link.js +3 -16
- package/src/styles/shapes.js +1 -0
- package/src/styles/skeleton.js +3 -37
- package/src/styles/zoom.js +3 -24
- package/src/theme/gv-theme.js +21 -60
- package/CHANGELOG.md +0 -1260
- package/LICENSE.txt +0 -202
- package/README.md +0 -195
- package/src/.eslintrc.js +0 -19
- package/src/theme/definition.json +0 -1762
|
@@ -20,7 +20,6 @@ import '../atoms/gv-image';
|
|
|
20
20
|
import { appendDraggableImage, uuid } from '../lib/utils';
|
|
21
21
|
import { PolicyDraggable } from './gv-flow-step';
|
|
22
22
|
import { getFlowName, methods } from '../lib/studio';
|
|
23
|
-
|
|
24
23
|
/**
|
|
25
24
|
* Flow component
|
|
26
25
|
*
|
|
@@ -36,19 +35,44 @@ import { getFlowName, methods } from '../lib/studio';
|
|
|
36
35
|
* @attr {Boolean} disabled - true for disabled
|
|
37
36
|
* @attr {Boolean} readonly - true if readonly
|
|
38
37
|
*/
|
|
38
|
+
|
|
39
39
|
export class GvFlow extends LitElement {
|
|
40
40
|
static get properties() {
|
|
41
41
|
return {
|
|
42
|
-
flow: {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
flow: {
|
|
43
|
+
type: Object
|
|
44
|
+
},
|
|
45
|
+
plan: {
|
|
46
|
+
type: Object
|
|
47
|
+
},
|
|
48
|
+
policies: {
|
|
49
|
+
type: Object
|
|
50
|
+
},
|
|
51
|
+
selectedStepId: {
|
|
52
|
+
type: String
|
|
53
|
+
},
|
|
54
|
+
dragPolicy: {
|
|
55
|
+
type: Object
|
|
56
|
+
},
|
|
57
|
+
dropPolicy: {
|
|
58
|
+
type: Object
|
|
59
|
+
},
|
|
60
|
+
disabled: {
|
|
61
|
+
type: Boolean,
|
|
62
|
+
reflect: true
|
|
63
|
+
},
|
|
64
|
+
hasPolicyFilter: {
|
|
65
|
+
type: Boolean,
|
|
66
|
+
attribute: 'has-policy-filter'
|
|
67
|
+
},
|
|
68
|
+
flowsTitle: {
|
|
69
|
+
type: String,
|
|
70
|
+
attribute: 'flows-title'
|
|
71
|
+
},
|
|
72
|
+
readonly: {
|
|
73
|
+
type: Boolean,
|
|
74
|
+
reflect: true
|
|
75
|
+
}
|
|
52
76
|
};
|
|
53
77
|
}
|
|
54
78
|
|
|
@@ -73,15 +97,18 @@ export class GvFlow extends LitElement {
|
|
|
73
97
|
|
|
74
98
|
getOrCreateCandidate() {
|
|
75
99
|
let candidate = this.getCandidate();
|
|
100
|
+
|
|
76
101
|
if (!candidate) {
|
|
77
102
|
candidate = document.createElement('gv-flow-step');
|
|
78
103
|
candidate.setAttribute('empty', true);
|
|
79
104
|
}
|
|
105
|
+
|
|
80
106
|
return candidate;
|
|
81
107
|
}
|
|
82
108
|
|
|
83
109
|
removeCandidate() {
|
|
84
110
|
const candidate = this.getCandidate();
|
|
111
|
+
|
|
85
112
|
if (candidate) {
|
|
86
113
|
candidate.remove();
|
|
87
114
|
}
|
|
@@ -91,6 +118,7 @@ export class GvFlow extends LitElement {
|
|
|
91
118
|
if (this.disabled || this.readonly) {
|
|
92
119
|
return false;
|
|
93
120
|
}
|
|
121
|
+
|
|
94
122
|
if (policy != null) {
|
|
95
123
|
if (flowKey === 'pre') {
|
|
96
124
|
return this.hasPolicyFilter !== true || policy.onRequest === true;
|
|
@@ -100,6 +128,7 @@ export class GvFlow extends LitElement {
|
|
|
100
128
|
throw new Error(`The flowkey [${flowKey}] parameter must be "pre" or "post"`);
|
|
101
129
|
}
|
|
102
130
|
}
|
|
131
|
+
|
|
103
132
|
return false;
|
|
104
133
|
}
|
|
105
134
|
|
|
@@ -108,21 +137,21 @@ export class GvFlow extends LitElement {
|
|
|
108
137
|
if (e.dataTransfer.items.length > 0) {
|
|
109
138
|
e.preventDefault();
|
|
110
139
|
e.stopPropagation();
|
|
140
|
+
|
|
111
141
|
if (this.dropPolicy == null) {
|
|
112
142
|
this.dropPolicy = this.dragPolicy;
|
|
113
143
|
} else {
|
|
114
144
|
this.dragPolicy = this.dropPolicy;
|
|
115
145
|
}
|
|
116
146
|
|
|
117
|
-
if (
|
|
118
|
-
this.dropPolicy != null &&
|
|
119
|
-
this._canDropPolicy(flowKey, this.dropPolicy.policy) &&
|
|
120
|
-
!e.target.classList.contains('candidate') &&
|
|
121
|
-
!e.target.hasAttribute('dragging')
|
|
122
|
-
) {
|
|
147
|
+
if (this.dropPolicy != null && this._canDropPolicy(flowKey, this.dropPolicy.policy) && !e.target.classList.contains('candidate') && !e.target.hasAttribute('dragging')) {
|
|
123
148
|
if (e.target.tagName.toLowerCase() === 'gv-flow-step') {
|
|
124
|
-
const {
|
|
149
|
+
const {
|
|
150
|
+
x,
|
|
151
|
+
width
|
|
152
|
+
} = e.target.getBoundingClientRect();
|
|
125
153
|
const condition = flowKey === 'post' ? e.clientX - x <= width / 2 : e.clientX - x >= width / 2;
|
|
154
|
+
|
|
126
155
|
if (condition && !(e.target.nextElementSibling && e.target.nextElementSibling.hasAttribute('dragging'))) {
|
|
127
156
|
e.target.insertAdjacentElement('afterend', this.getOrCreateCandidate());
|
|
128
157
|
} else if (!(e.target.previousElementSibling && e.target.previousElementSibling.hasAttribute('dragging'))) {
|
|
@@ -130,6 +159,7 @@ export class GvFlow extends LitElement {
|
|
|
130
159
|
}
|
|
131
160
|
} else if (e.target.classList && e.target.classList.contains('drop-area-grid')) {
|
|
132
161
|
const dropAreas = e.target.querySelectorAll('gv-flow-step');
|
|
162
|
+
|
|
133
163
|
if (dropAreas.length === 0) {
|
|
134
164
|
e.target.prepend(this.getOrCreateCandidate());
|
|
135
165
|
}
|
|
@@ -145,8 +175,10 @@ export class GvFlow extends LitElement {
|
|
|
145
175
|
if (!this.disabled && !this.readonly) {
|
|
146
176
|
if (this._draggablePolicyImage) {
|
|
147
177
|
this._draggablePolicyImage.remove();
|
|
178
|
+
|
|
148
179
|
this._draggablePolicyImage = null;
|
|
149
180
|
}
|
|
181
|
+
|
|
150
182
|
this.dragPolicy = null;
|
|
151
183
|
this.dropPolicy = null;
|
|
152
184
|
}
|
|
@@ -155,6 +187,7 @@ export class GvFlow extends LitElement {
|
|
|
155
187
|
_onDragStart(sourceFlowKey, flowStep, sourcePosition, e) {
|
|
156
188
|
if (!this.disabled && !this.readonly) {
|
|
157
189
|
const policy = this.findPolicy(flowStep.policy);
|
|
190
|
+
|
|
158
191
|
if (policy != null) {
|
|
159
192
|
// Simulate click on window for close all dropdown menu
|
|
160
193
|
const windowClick = document.createEvent('Events');
|
|
@@ -162,21 +195,22 @@ export class GvFlow extends LitElement {
|
|
|
162
195
|
window.dispatchEvent(windowClick);
|
|
163
196
|
e.target.setAttribute('dragging', true);
|
|
164
197
|
this.shadowRoot.querySelector('.drop-area-grid').classList.add('dragging');
|
|
165
|
-
|
|
166
198
|
this.dropPolicy = new PolicyDraggable(policy, sourcePosition, sourceFlowKey, this.flow._id, flowStep);
|
|
167
199
|
e.dataTransfer.setData('text/plain', this.dropPolicy.toString());
|
|
200
|
+
|
|
168
201
|
if (policy) {
|
|
169
202
|
const size = 100;
|
|
170
203
|
this._draggablePolicyImage = appendDraggableImage(policy.icon, size);
|
|
171
204
|
e.dataTransfer.setDragImage(this._draggablePolicyImage, size / 2, size / 2);
|
|
172
205
|
}
|
|
206
|
+
|
|
173
207
|
dispatchCustomEvent(this, 'drag-start', this.dropPolicy);
|
|
174
208
|
}
|
|
175
209
|
}
|
|
176
210
|
}
|
|
177
211
|
|
|
178
212
|
async performUpdate() {
|
|
179
|
-
this.getFlowSteps().forEach(
|
|
213
|
+
this.getFlowSteps().forEach(s => {
|
|
180
214
|
s.requestUpdate();
|
|
181
215
|
});
|
|
182
216
|
super.performUpdate();
|
|
@@ -187,25 +221,35 @@ export class GvFlow extends LitElement {
|
|
|
187
221
|
}
|
|
188
222
|
|
|
189
223
|
_onDrop(flowKey, e) {
|
|
190
|
-
this.shadowRoot.querySelectorAll('gv-flow-step').forEach(
|
|
224
|
+
this.shadowRoot.querySelectorAll('gv-flow-step').forEach(step => step.resetConfirm());
|
|
191
225
|
e.preventDefault();
|
|
192
226
|
e.stopPropagation();
|
|
193
227
|
const box = e.target.closest('.drop-area-grid');
|
|
194
228
|
const candidate = this.getCandidate();
|
|
195
229
|
const draggingArea = this.draggingArea;
|
|
230
|
+
|
|
196
231
|
if (candidate) {
|
|
197
232
|
let position = 0;
|
|
198
|
-
[...box.querySelectorAll('gv-flow-step')].some(
|
|
233
|
+
[...box.querySelectorAll('gv-flow-step')].some(area => {
|
|
199
234
|
if (!area.hasAttribute('empty')) {
|
|
200
235
|
position++;
|
|
201
236
|
}
|
|
237
|
+
|
|
202
238
|
return area.hasAttribute('empty');
|
|
203
239
|
});
|
|
204
|
-
const {
|
|
240
|
+
const {
|
|
241
|
+
policy,
|
|
242
|
+
sourceFlowKey,
|
|
243
|
+
sourceFlowId,
|
|
244
|
+
sourcePosition,
|
|
245
|
+
flowStep
|
|
246
|
+
} = this.dropPolicy;
|
|
247
|
+
|
|
205
248
|
const move = () => {
|
|
206
249
|
if (draggingArea) {
|
|
207
250
|
draggingArea.removeAttribute('dragging');
|
|
208
251
|
}
|
|
252
|
+
|
|
209
253
|
candidate.remove();
|
|
210
254
|
dispatchCustomEvent(this, 'drop', {
|
|
211
255
|
flowId: this.flow._id,
|
|
@@ -215,7 +259,7 @@ export class GvFlow extends LitElement {
|
|
|
215
259
|
policy,
|
|
216
260
|
sourcePosition,
|
|
217
261
|
sourceFlowKey,
|
|
218
|
-
sourceFlowId
|
|
262
|
+
sourceFlowId
|
|
219
263
|
});
|
|
220
264
|
this.dragPolicy = null;
|
|
221
265
|
this.dropPolicy = null;
|
|
@@ -233,10 +277,9 @@ export class GvFlow extends LitElement {
|
|
|
233
277
|
position,
|
|
234
278
|
policy,
|
|
235
279
|
flowStep,
|
|
236
|
-
cancelEdit: true
|
|
280
|
+
cancelEdit: true
|
|
237
281
|
});
|
|
238
282
|
});
|
|
239
|
-
|
|
240
283
|
candidate.addEventListener('gv-flow-step:move', () => {
|
|
241
284
|
candidate.remove();
|
|
242
285
|
move();
|
|
@@ -255,21 +298,34 @@ export class GvFlow extends LitElement {
|
|
|
255
298
|
return this.flow[flowKey][position];
|
|
256
299
|
}
|
|
257
300
|
|
|
258
|
-
_onEditStep({
|
|
259
|
-
|
|
301
|
+
_onEditStep({
|
|
302
|
+
detail: {
|
|
303
|
+
step,
|
|
304
|
+
policy,
|
|
305
|
+
group
|
|
306
|
+
}
|
|
307
|
+
}) {
|
|
308
|
+
dispatchCustomEvent(this, 'edit', {
|
|
309
|
+
flow: this.flow,
|
|
310
|
+
step,
|
|
311
|
+
policy,
|
|
312
|
+
group
|
|
313
|
+
});
|
|
260
314
|
}
|
|
261
315
|
|
|
262
316
|
_onDuplicateStep(flowKey, position) {
|
|
263
317
|
const step = this.getFlowStep(flowKey, position);
|
|
264
318
|
const duplicatePosition = position + 1;
|
|
265
319
|
const policy = this.findPolicy(step.policy);
|
|
266
|
-
const duplicateStep = { ...step,
|
|
320
|
+
const duplicateStep = { ...step,
|
|
321
|
+
_id: uuid()
|
|
322
|
+
};
|
|
267
323
|
dispatchCustomEvent(this, 'drop', {
|
|
268
324
|
flowId: this.flow._id,
|
|
269
325
|
flowKey,
|
|
270
326
|
position: duplicatePosition,
|
|
271
327
|
flowStep: duplicateStep,
|
|
272
|
-
policy
|
|
328
|
+
policy
|
|
273
329
|
});
|
|
274
330
|
}
|
|
275
331
|
|
|
@@ -278,32 +334,28 @@ export class GvFlow extends LitElement {
|
|
|
278
334
|
}
|
|
279
335
|
|
|
280
336
|
_onDeleteStep(flowKey, position, e) {
|
|
281
|
-
dispatchCustomEvent(this, 'delete', {
|
|
337
|
+
dispatchCustomEvent(this, 'delete', {
|
|
338
|
+
flowKey,
|
|
339
|
+
position,
|
|
340
|
+
flowId: this.flow._id,
|
|
341
|
+
target: e.target
|
|
342
|
+
});
|
|
282
343
|
}
|
|
283
344
|
|
|
284
|
-
_onChangeStepState(flowKey, position, {
|
|
285
|
-
|
|
345
|
+
_onChangeStepState(flowKey, position, {
|
|
346
|
+
detail
|
|
347
|
+
}) {
|
|
348
|
+
dispatchCustomEvent(this, 'change-state', {
|
|
349
|
+
flowKey,
|
|
350
|
+
position,
|
|
351
|
+
flowId: this.flow._id,
|
|
352
|
+
...detail
|
|
353
|
+
});
|
|
286
354
|
}
|
|
287
355
|
|
|
288
356
|
_renderDropStep(group, step, position) {
|
|
289
357
|
if (step) {
|
|
290
|
-
return html`<gv-flow-step
|
|
291
|
-
.step="${step}"
|
|
292
|
-
.policy="${this.findPolicy(step.policy)}"
|
|
293
|
-
.id="${step._id}"
|
|
294
|
-
.group="${group}"
|
|
295
|
-
.parent="${this.flow._id}"
|
|
296
|
-
?disabled="${this.disabled}"
|
|
297
|
-
?readonly="${this.readonly}"
|
|
298
|
-
.draggable="${!this.disabled && !this.readonly}"
|
|
299
|
-
?editing="${this._isEditable(step)}"
|
|
300
|
-
@dragstart="${this._onDragStart.bind(this, group, step, position)}"
|
|
301
|
-
@dragend="${this._onDragEnd}"
|
|
302
|
-
@gv-flow-step:edit="${this._onEditStep}"
|
|
303
|
-
@gv-flow-step:change-state="${this._onChangeStepState.bind(this, group, position)}"
|
|
304
|
-
@gv-flow-step:delete="${this._onDeleteStep.bind(this, group, position)}"
|
|
305
|
-
@gv-flow-step:duplicate="${this._onDuplicateStep.bind(this, group, position)}"
|
|
306
|
-
></gv-flow-step>`;
|
|
358
|
+
return html`<gv-flow-step .step="${step}" .policy="${this.findPolicy(step.policy)}" .id="${step._id}" .group="${group}" .parent="${this.flow._id}" ?disabled="${this.disabled}" ?readonly="${this.readonly}" .draggable="${!this.disabled && !this.readonly}" ?editing="${this._isEditable(step)}" @dragstart="${this._onDragStart.bind(this, group, step, position)}" @dragend="${this._onDragEnd}" @gv-flow-step:edit="${this._onEditStep}" @gv-flow-step:change-state="${this._onChangeStepState.bind(this, group, position)}" @gv-flow-step:delete="${this._onDeleteStep.bind(this, group, position)}" @gv-flow-step:duplicate="${this._onDuplicateStep.bind(this, group, position)}"></gv-flow-step>`;
|
|
307
359
|
} else {
|
|
308
360
|
return html``;
|
|
309
361
|
}
|
|
@@ -311,13 +363,14 @@ export class GvFlow extends LitElement {
|
|
|
311
363
|
|
|
312
364
|
async getUpdateComplete() {
|
|
313
365
|
await super.getUpdateComplete();
|
|
314
|
-
await Promise.all(this.getFlowSteps().map(
|
|
366
|
+
await Promise.all(this.getFlowSteps().map(e => e.updateComplete));
|
|
315
367
|
}
|
|
316
368
|
|
|
317
369
|
updated(properties) {
|
|
318
370
|
if (properties.has('data')) {
|
|
319
371
|
this.onDragEnd();
|
|
320
372
|
}
|
|
373
|
+
|
|
321
374
|
if (properties.has('dropPolicy') || properties.has('dragPolicy')) {
|
|
322
375
|
if (this.dropPolicy == null && this.dragPolicy == null) {
|
|
323
376
|
this.removeCandidate();
|
|
@@ -330,6 +383,7 @@ export class GvFlow extends LitElement {
|
|
|
330
383
|
this.shadowRoot.querySelector('.drop-area-grid').classList.remove('dragging');
|
|
331
384
|
this.removeCandidate();
|
|
332
385
|
const draggingArea = this.draggingArea;
|
|
386
|
+
|
|
333
387
|
if (draggingArea) {
|
|
334
388
|
draggingArea.removeAttribute('dragging');
|
|
335
389
|
}
|
|
@@ -338,15 +392,13 @@ export class GvFlow extends LitElement {
|
|
|
338
392
|
|
|
339
393
|
_getLabel(flowKey) {
|
|
340
394
|
if (this.flow.type) {
|
|
341
|
-
return html`
|
|
342
|
-
<div class="drop-box-type">${flowKey}</div>
|
|
343
|
-
<div>${this.flow.type.toUpperCase() === 'ROOT' ? 'flow' : this.flow.type}</div>
|
|
344
|
-
`;
|
|
395
|
+
return html` <div class="drop-box-type">${flowKey}</div> <div>${this.flow.type.toUpperCase() === 'ROOT' ? 'flow' : this.flow.type}</div> `;
|
|
345
396
|
} else if (flowKey === 'pre') {
|
|
346
397
|
return 'request';
|
|
347
398
|
} else if (flowKey === 'post') {
|
|
348
399
|
return 'response';
|
|
349
400
|
}
|
|
401
|
+
|
|
350
402
|
return '';
|
|
351
403
|
}
|
|
352
404
|
|
|
@@ -357,265 +409,34 @@ export class GvFlow extends LitElement {
|
|
|
357
409
|
render() {
|
|
358
410
|
const preTarget = this.dragPolicy && (this.hasPolicyFilter !== true || this.dragPolicy.policy.onRequest);
|
|
359
411
|
const postTarget = this.dragPolicy && (this.hasPolicyFilter !== true || this.dragPolicy.policy.onResponse);
|
|
360
|
-
|
|
361
412
|
const preForbidden = this.dragPolicy && this.hasPolicyFilter === true && !this.dragPolicy.policy.onRequest;
|
|
362
413
|
const postForbidden = this.dragPolicy && this.hasPolicyFilter === true && !this.dragPolicy.policy.onResponse;
|
|
363
|
-
const hasPost = this.flow.type == null ||
|
|
364
|
-
return html`<div class="box">
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
<div
|
|
374
|
-
class="drop-box"
|
|
375
|
-
@drop="${this._onDrop.bind(this, 'pre')}"
|
|
376
|
-
@dragend="${this.onDragEnd}"
|
|
377
|
-
@dragover="${this._onDragOver.bind(this, 'pre')}"
|
|
378
|
-
>
|
|
379
|
-
<div class="drop-box-title">${preTarget ? 'drop here' : this._getLabel('pre')}</div>
|
|
380
|
-
<div class="drop-area-grid">${this.flow.pre.map((flowStep, i) => this._renderDropStep('pre', flowStep, i))}</div>
|
|
381
|
-
</div>
|
|
382
|
-
</div>
|
|
383
|
-
|
|
384
|
-
${hasPost
|
|
385
|
-
? html`
|
|
386
|
-
<div class="${classMap({ post: true, targeted: postTarget, forbidden: postForbidden })}">
|
|
387
|
-
<div class='arrow arrow-left'> </div>
|
|
388
|
-
<div class="drop-box"
|
|
389
|
-
@drop="${this._onDrop.bind(this, 'post')}"
|
|
390
|
-
@dragend="${this.onDragEnd}"
|
|
391
|
-
@dragover="${this._onDragOver.bind(this, 'post')}">
|
|
392
|
-
<div class="drop-area-grid drop-area-grid-reverse">
|
|
393
|
-
${this.flow.post.map((flowStep, i) => this._renderDropStep('post', flowStep, i))}
|
|
394
|
-
</div>
|
|
395
|
-
<div class="drop-box-title">${postTarget ? 'drop here' : this._getLabel('post')}</div>
|
|
396
|
-
</div>
|
|
397
|
-
</div>
|
|
398
|
-
</div>`
|
|
399
|
-
: ''}
|
|
400
|
-
</div>
|
|
401
|
-
</div>
|
|
402
|
-
</div>
|
|
403
|
-
</div>`;
|
|
414
|
+
const hasPost = this.flow.type == null || this.flow.type && this.flow.type.toLowerCase() !== 'root';
|
|
415
|
+
return html`<div class="box"> <div class="container"> <div class="header"> <div class="title">${getFlowName(this.flow, this.collectionName)}</div> </div> <div class="content"> <div class="flow"> <div class="${classMap({
|
|
416
|
+
pre: true,
|
|
417
|
+
targeted: preTarget,
|
|
418
|
+
forbidden: preForbidden
|
|
419
|
+
})}"> <div class="arrow arrow-right"></div> <div class="drop-box" @drop="${this._onDrop.bind(this, 'pre')}" @dragend="${this.onDragEnd}" @dragover="${this._onDragOver.bind(this, 'pre')}"> <div class="drop-box-title">${preTarget ? 'drop here' : this._getLabel('pre')}</div> <div class="drop-area-grid">${this.flow.pre.map((flowStep, i) => this._renderDropStep('pre', flowStep, i))}</div> </div> </div> ${hasPost ? html` <div class="${classMap({
|
|
420
|
+
post: true,
|
|
421
|
+
targeted: postTarget,
|
|
422
|
+
forbidden: postForbidden
|
|
423
|
+
})}"> <div class="arrow arrow-left"> </div> <div class="drop-box" @drop="${this._onDrop.bind(this, 'post')}" @dragend="${this.onDragEnd}" @dragover="${this._onDragOver.bind(this, 'post')}"> <div class="drop-area-grid drop-area-grid-reverse"> ${this.flow.post.map((flowStep, i) => this._renderDropStep('post', flowStep, i))} </div> <div class="drop-box-title">${postTarget ? 'drop here' : this._getLabel('post')}</div> </div> </div> ` : ''} </div> </div> </div> </div>`;
|
|
404
424
|
}
|
|
405
425
|
|
|
406
426
|
findPolicy(policyId) {
|
|
407
|
-
const policy = this.policies.find(
|
|
408
|
-
|
|
409
|
-
|
|
427
|
+
const policy = this.policies.find(p => p.id === policyId);
|
|
428
|
+
|
|
429
|
+
if (policy == null) {// throw new Error(`Policy ${policyId} not found`);
|
|
410
430
|
}
|
|
431
|
+
|
|
411
432
|
return policy;
|
|
412
433
|
}
|
|
413
434
|
|
|
414
435
|
static get styles() {
|
|
415
|
-
return [
|
|
416
|
-
|
|
417
|
-
// language=CSS
|
|
418
|
-
css`
|
|
419
|
-
:host {
|
|
420
|
-
box-sizing: border-box;
|
|
421
|
-
position: relative;
|
|
422
|
-
display: block;
|
|
423
|
-
height: 100%;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
.flow {
|
|
427
|
-
padding-left: 20px;
|
|
428
|
-
display: flex;
|
|
429
|
-
height: 100%;
|
|
430
|
-
flex-direction: column;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
.drop-area-grid {
|
|
434
|
-
flex: 1;
|
|
435
|
-
border: 1px dashed transparent;
|
|
436
|
-
transition: all 350ms ease-in-out;
|
|
437
|
-
position: relative;
|
|
438
|
-
display: flex;
|
|
439
|
-
flex-wrap: wrap;
|
|
440
|
-
max-width: calc(100% - 40px);
|
|
441
|
-
align-items: center;
|
|
442
|
-
min-height: 150px;
|
|
443
|
-
box-sizing: border-box;
|
|
444
|
-
padding: 0 30px;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
.targeted .drop-area-grid {
|
|
448
|
-
border: 1px dashed #d9d9d9;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
.forbidden .drop-area-grid {
|
|
452
|
-
background-color: #efefef;
|
|
453
|
-
opacity: 0.2;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
gv-flow-step {
|
|
457
|
-
flex: 1;
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
.message {
|
|
461
|
-
text-transform: uppercase;
|
|
462
|
-
color: #d9d9d9;
|
|
463
|
-
opacity: 0;
|
|
464
|
-
transition: opacity 350ms ease-in-out;
|
|
465
|
-
font-size: 18px;
|
|
466
|
-
text-align: center;
|
|
467
|
-
align-self: center;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
.message {
|
|
471
|
-
width: 100%;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
.targeted .message {
|
|
475
|
-
opacity: 1;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
.targeted .drop-area-empty {
|
|
479
|
-
opacity: 0;
|
|
480
|
-
transition: all 350ms ease-in-out;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
.pre,
|
|
484
|
-
.post {
|
|
485
|
-
position: relative;
|
|
486
|
-
flex: 1;
|
|
487
|
-
display: flex;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
.arrow {
|
|
491
|
-
background-color: #d9d9d9;
|
|
492
|
-
width: calc(100% - 50px * 2 - 1px);
|
|
493
|
-
text-align: center;
|
|
494
|
-
position: absolute;
|
|
495
|
-
margin: 0 30px;
|
|
496
|
-
color: #262626;
|
|
497
|
-
top: calc(50% - 20px);
|
|
498
|
-
height: 40px;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
.arrow-right::after {
|
|
502
|
-
width: 0;
|
|
503
|
-
height: 0;
|
|
504
|
-
border-top: 40px solid transparent;
|
|
505
|
-
border-bottom: 40px solid transparent;
|
|
506
|
-
border-left: 40px solid #d9d9d9;
|
|
507
|
-
content: ' ';
|
|
508
|
-
position: absolute;
|
|
509
|
-
right: -20px;
|
|
510
|
-
top: -20px;
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
.drop-box-type {
|
|
514
|
-
position: relative;
|
|
515
|
-
writing-mode: horizontal-tb;
|
|
516
|
-
margin-bottom: 10px;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
.drop-box-title {
|
|
520
|
-
position: relative;
|
|
521
|
-
writing-mode: vertical-lr;
|
|
522
|
-
text-orientation: upright;
|
|
523
|
-
text-transform: uppercase;
|
|
524
|
-
color: #bfbfbf;
|
|
525
|
-
font-size: 13px;
|
|
526
|
-
font-weight: 500;
|
|
527
|
-
text-align: center;
|
|
528
|
-
max-height: 145px;
|
|
529
|
-
line-height: 13px;
|
|
530
|
-
display: flex;
|
|
531
|
-
align-items: center;
|
|
532
|
-
min-width: 30px;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
.pre .drop-box-title {
|
|
536
|
-
position: absolute;
|
|
537
|
-
left: -30px;
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
.arrow-left::after {
|
|
541
|
-
width: 0;
|
|
542
|
-
height: 0;
|
|
543
|
-
border-top: 40px solid transparent;
|
|
544
|
-
border-bottom: 40px solid transparent;
|
|
545
|
-
border-right: 40px solid #d9d9d9;
|
|
546
|
-
content: ' ';
|
|
547
|
-
position: absolute;
|
|
548
|
-
left: -20px;
|
|
549
|
-
top: -20px;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
.drop-box {
|
|
553
|
-
display: flex;
|
|
554
|
-
border: 1px solid transparent;
|
|
555
|
-
margin: 0 30px;
|
|
556
|
-
align-items: center;
|
|
557
|
-
position: relative;
|
|
558
|
-
width: 100%;
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
.drop-area-grid-reverse {
|
|
562
|
-
flex-direction: row-reverse;
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
.header {
|
|
566
|
-
border-bottom: 1px solid #d9d9d9;
|
|
567
|
-
display: flex;
|
|
568
|
-
min-height: 45px;
|
|
569
|
-
margin-bottom: 0.5rem;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
.header .title {
|
|
573
|
-
color: #28444f;
|
|
574
|
-
font-size: 18px;
|
|
575
|
-
display: flex;
|
|
576
|
-
align-items: center;
|
|
577
|
-
margin: 0 0.5rem;
|
|
578
|
-
width: 100%;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
.header .title .flow-path {
|
|
582
|
-
flex: 1;
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
.box {
|
|
586
|
-
position: absolute;
|
|
587
|
-
display: flex;
|
|
588
|
-
flex-direction: column;
|
|
589
|
-
width: 100%;
|
|
590
|
-
top: 0;
|
|
591
|
-
bottom: 0;
|
|
592
|
-
left: 0;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
.container {
|
|
596
|
-
flex-grow: 1;
|
|
597
|
-
|
|
598
|
-
display: flex;
|
|
599
|
-
flex-direction: column;
|
|
600
|
-
|
|
601
|
-
/* for Firefox */
|
|
602
|
-
min-height: 0;
|
|
603
|
-
height: 100%;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
.content {
|
|
607
|
-
background: white;
|
|
608
|
-
flex-grow: 1;
|
|
609
|
-
|
|
610
|
-
overflow: auto;
|
|
611
|
-
|
|
612
|
-
/* for Firefox */
|
|
613
|
-
min-height: 0;
|
|
614
|
-
padding: 0.5rem;
|
|
615
|
-
}
|
|
616
|
-
`,
|
|
617
|
-
];
|
|
436
|
+
return [methods, // language=CSS
|
|
437
|
+
css`:host{box-sizing:border-box;position:relative;display:block;height:100%}.flow{padding-left:20px;display:flex;height:100%;flex-direction:column}.drop-area-grid{flex:1;border:1px dashed transparent;transition:all 350ms ease-in-out;position:relative;display:flex;flex-wrap:wrap;max-width:calc(100% - 40px);align-items:center;min-height:150px;box-sizing:border-box;padding:0 30px}.targeted .drop-area-grid{border:1px dashed #d9d9d9}.forbidden .drop-area-grid{background-color:#efefef;opacity:.2}gv-flow-step{flex:1}.message{text-transform:uppercase;color:#d9d9d9;opacity:0;transition:opacity 350ms ease-in-out;font-size:18px;text-align:center;align-self:center}.message{width:100%}.targeted .message{opacity:1}.targeted .drop-area-empty{opacity:0;transition:all 350ms ease-in-out}.post,.pre{position:relative;flex:1;display:flex}.arrow{background-color:#d9d9d9;width:calc(100% - 50px * 2 - 1px);text-align:center;position:absolute;margin:0 30px;color:#262626;top:calc(50% - 20px);height:40px}.arrow-right::after{width:0;height:0;border-top:40px solid transparent;border-bottom:40px solid transparent;border-left:40px solid #d9d9d9;content:' ';position:absolute;right:-20px;top:-20px}.drop-box-type{position:relative;writing-mode:horizontal-tb;margin-bottom:10px}.drop-box-title{position:relative;writing-mode:vertical-lr;text-orientation:upright;text-transform:uppercase;color:#bfbfbf;font-size:13px;font-weight:500;text-align:center;max-height:145px;line-height:13px;display:flex;align-items:center;min-width:30px}.pre .drop-box-title{position:absolute;left:-30px}.arrow-left::after{width:0;height:0;border-top:40px solid transparent;border-bottom:40px solid transparent;border-right:40px solid #d9d9d9;content:' ';position:absolute;left:-20px;top:-20px}.drop-box{display:flex;border:1px solid transparent;margin:0 30px;align-items:center;position:relative;width:100%}.drop-area-grid-reverse{flex-direction:row-reverse}.header{border-bottom:1px solid #d9d9d9;display:flex;min-height:45px;margin-bottom:.5rem}.header .title{color:#28444f;font-size:18px;display:flex;align-items:center;margin:0 .5rem;width:100%}.header .title .flow-path{flex:1}.box{position:absolute;display:flex;flex-direction:column;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;display:flex;flex-direction:column;min-height:0;height:100%}.content{background:#fff;flex-grow:1;overflow:auto;min-height:0;padding:.5rem}`];
|
|
618
438
|
}
|
|
619
|
-
}
|
|
620
439
|
|
|
440
|
+
}
|
|
621
441
|
window.customElements.define('gv-flow', GvFlow);
|
|
442
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL3BvbGljeS1zdHVkaW8vZ3YtZmxvdy5qcyJdLCJuYW1lcyI6WyJMaXRFbGVtZW50IiwiaHRtbCIsImNzcyIsImNsYXNzTWFwIiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsImFwcGVuZERyYWdnYWJsZUltYWdlIiwidXVpZCIsIlBvbGljeURyYWdnYWJsZSIsImdldEZsb3dOYW1lIiwibWV0aG9kcyIsIkd2RmxvdyIsInByb3BlcnRpZXMiLCJmbG93IiwidHlwZSIsIk9iamVjdCIsInBsYW4iLCJwb2xpY2llcyIsInNlbGVjdGVkU3RlcElkIiwiU3RyaW5nIiwiZHJhZ1BvbGljeSIsImRyb3BQb2xpY3kiLCJkaXNhYmxlZCIsIkJvb2xlYW4iLCJyZWZsZWN0IiwiaGFzUG9saWN5RmlsdGVyIiwiYXR0cmlidXRlIiwiZmxvd3NUaXRsZSIsInJlYWRvbmx5IiwiY29uc3RydWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiX29uTW91c2VMZWF2ZSIsImdldENhbmRpZGF0ZSIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0Rmxvd1N0ZXBzIiwiQXJyYXkiLCJmcm9tIiwicXVlcnlTZWxlY3RvckFsbCIsImdldE9yQ3JlYXRlQ2FuZGlkYXRlIiwiY2FuZGlkYXRlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQ2FuZGlkYXRlIiwicmVtb3ZlIiwiX2NhbkRyb3BQb2xpY3kiLCJmbG93S2V5IiwicG9saWN5Iiwib25SZXF1ZXN0Iiwib25SZXNwb25zZSIsIkVycm9yIiwiX29uRHJhZ092ZXIiLCJlIiwiZGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJsZW5ndGgiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInRhcmdldCIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiaGFzQXR0cmlidXRlIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwieCIsIndpZHRoIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY29uZGl0aW9uIiwiY2xpZW50WCIsIm5leHRFbGVtZW50U2libGluZyIsImluc2VydEFkamFjZW50RWxlbWVudCIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJkcm9wQXJlYXMiLCJwcmVwZW5kIiwiX29uRHJhZ0VuZCIsIl9kcmFnZ2FibGVQb2xpY3lJbWFnZSIsIl9vbkRyYWdTdGFydCIsInNvdXJjZUZsb3dLZXkiLCJmbG93U3RlcCIsInNvdXJjZVBvc2l0aW9uIiwiZmluZFBvbGljeSIsIndpbmRvd0NsaWNrIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJ3aW5kb3ciLCJkaXNwYXRjaEV2ZW50IiwiYWRkIiwiX2lkIiwic2V0RGF0YSIsInRvU3RyaW5nIiwic2l6ZSIsImljb24iLCJzZXREcmFnSW1hZ2UiLCJwZXJmb3JtVXBkYXRlIiwiZm9yRWFjaCIsInMiLCJyZXF1ZXN0VXBkYXRlIiwiZHJhZ2dpbmdBcmVhIiwiX29uRHJvcCIsInN0ZXAiLCJyZXNldENvbmZpcm0iLCJib3giLCJjbG9zZXN0IiwicG9zaXRpb24iLCJzb21lIiwiYXJlYSIsInNvdXJjZUZsb3dJZCIsIm1vdmUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJmbG93SWQiLCJjYW5jZWxFZGl0IiwiZ2V0Rmxvd1N0ZXAiLCJfb25FZGl0U3RlcCIsImRldGFpbCIsImdyb3VwIiwiX29uRHVwbGljYXRlU3RlcCIsImR1cGxpY2F0ZVBvc2l0aW9uIiwiZHVwbGljYXRlU3RlcCIsIl9pc0VkaXRhYmxlIiwiX29uRGVsZXRlU3RlcCIsIl9vbkNoYW5nZVN0ZXBTdGF0ZSIsIl9yZW5kZXJEcm9wU3RlcCIsImJpbmQiLCJnZXRVcGRhdGVDb21wbGV0ZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJ1cGRhdGVDb21wbGV0ZSIsInVwZGF0ZWQiLCJoYXMiLCJvbkRyYWdFbmQiLCJzZXRUaW1lb3V0IiwiX2dldExhYmVsIiwidG9VcHBlckNhc2UiLCJjb2xsZWN0aW9uTmFtZSIsIm5hbWUiLCJyZW5kZXIiLCJwcmVUYXJnZXQiLCJwb3N0VGFyZ2V0IiwicHJlRm9yYmlkZGVuIiwicG9zdEZvcmJpZGRlbiIsImhhc1Bvc3QiLCJwcmUiLCJ0YXJnZXRlZCIsImZvcmJpZGRlbiIsImkiLCJwb3N0IiwicG9saWN5SWQiLCJmaW5kIiwicCIsImlkIiwic3R5bGVzIiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVQsRUFBcUJDLElBQXJCLEVBQTJCQyxHQUEzQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsZUFBcEM7QUFDQSxPQUFPLG1CQUFQO0FBQ0EsU0FBU0Msb0JBQVQsRUFBK0JDLElBQS9CLFFBQTJDLGNBQTNDO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxnQkFBaEM7QUFDQSxTQUFTQyxXQUFULEVBQXNCQyxPQUF0QixRQUFxQyxlQUFyQztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLE1BQU4sU0FBcUJWLFVBQXJCLENBQWdDO0FBQ2hCLGFBQVZXLFVBQVUsR0FBRztBQUN0QixXQUFPO0FBQ0xDLE1BQUFBLElBQUksRUFBRTtBQUFFQyxRQUFBQSxJQUFJLEVBQUVDO0FBQVIsT0FERDtBQUVMQyxNQUFBQSxJQUFJLEVBQUU7QUFBRUYsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BRkQ7QUFHTEUsTUFBQUEsUUFBUSxFQUFFO0FBQUVILFFBQUFBLElBQUksRUFBRUM7QUFBUixPQUhMO0FBSUxHLE1BQUFBLGNBQWMsRUFBRTtBQUFFSixRQUFBQSxJQUFJLEVBQUVLO0FBQVIsT0FKWDtBQUtMQyxNQUFBQSxVQUFV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QVFrQixLQUFLOUcsSUFBTCxDQUFVc0ksSUFBVixDQUFlcEIsR0FBZixDQUFtQixDQUFDaEQsUUFBRCxFQUFXbUUsQ0FBWCxLQUFpQixLQUFLeEIsZUFBTCxDQUFxQixNQUFyQixFQUE2QjNDLFFBQTdCLEVBQXVDbUUsQ0FBdkMsQ0FBcEMsQ0FSbEIsdUNBVTJDUCxVQUFVLEdBQUcsV0FBSCxHQUFpQixLQUFLTixTQUFMLENBQWUsTUFBZixDQVZ0RSx1QkFEQyxHQWVMLEVBbkNELDhCQUFYO0FBd0NEOztBQUVEcEQsRUFBQUEsVUFBVSxDQUFDbUUsUUFBRCxFQUFXO0FBQ25CLFVBQU1wRyxNQUFNLEdBQUcsS0FBSy9CLFFBQUwsQ0FBY29JLElBQWQsQ0FBb0JDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxFQUFGLEtBQVNILFFBQW5DLENBQWY7O0FBQ0EsUUFBSXBHLE1BQU0sSUFBSSxJQUFkLEVBQW9CLENBQ2xCO0FBQ0Q7O0FBQ0QsV0FBT0EsTUFBUDtBQUNEOztBQUVnQixhQUFOd0csTUFBTSxHQUFHO0FBQ2xCLFdBQU8sQ0FDTDlJLE9BREssRUFFTDtBQUNBUCxJQUFBQSxHQUFHLDAxRUFIRSxDQUFQO0FBMk1EOztBQW5rQm9DO0FBc2tCdkNrRixNQUFNLENBQUNvRSxjQUFQLENBQXNCQyxNQUF0QixDQUE2QixTQUE3QixFQUF3Qy9JLE1BQXhDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwsIGNzcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWltYWdlJztcbmltcG9ydCB7IGFwcGVuZERyYWdnYWJsZUltYWdlLCB1dWlkIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IFBvbGljeURyYWdnYWJsZSB9IGZyb20gJy4vZ3YtZmxvdy1zdGVwJztcbmltcG9ydCB7IGdldEZsb3dOYW1lLCBtZXRob2RzIH0gZnJvbSAnLi4vbGliL3N0dWRpbyc7XG5cbi8qKlxuICogRmxvdyBjb21wb25lbnRcbiAqXG4gKiBAZmlyZXMgZ3YtZmxvdzpkcm9wIC0gRHJvcCBldmVudFxuICogQGZpcmVzIGd2LWZsb3c6ZWRpdCAtIEVkaXQgZXZlbnRcbiAqIEBmaXJlcyBndi1mbG93OmRlbGV0ZSAtIERlbGV0ZSBldmVudFxuICpcbiAqIEBhdHRyIHtPYmplY3R9IGZsb3cgLSB0aGUgZmxvdyB0byBkaXNwbGF5XG4gKiBAYXR0ciB7U3RyaW5nfSBzZWxlY3RlZFN0ZXBJZCAtIHRoZSBzZWxlY3RlZCBzdGVwIGlkXG4gKiBAYXR0ciB7T2JqZWN0fSB0YXJnZXRlZFBvbGljeSAtIHRydWUsIGlmIGZsb3cgaXMgdGFyZ2V0ZWQgZm9yIGRyb3AgYWN0aW9uXG4gKiBAYXR0ciB7Qm9vbGVhbn0gaGFzLXBvbGljeS1maWx0ZXIgLSB0cnVlIGlmIHBvbGljaWVzIGhhdmUgb25SZXF1ZXN0L29uUmVzcG9uc2UgcHJvcGVydGllc1xuICogQGF0dHIge1N0cmluZ30gZmxvd3NUaXRsZSAtIGZsb3dzIG1lbnUgdGl0bGVcbiAqIEBhdHRyIHtCb29sZWFufSBkaXNhYmxlZCAtIHRydWUgZm9yIGRpc2FibGVkXG4gKiBAYXR0ciB7Qm9vbGVhbn0gcmVhZG9ubHkgLSB0cnVlIGlmIHJlYWRvbmx5XG4gKi9cbmV4cG9ydCBjbGFzcyBHdkZsb3cgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmbG93OiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgcGxhbjogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHBvbGljaWVzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgc2VsZWN0ZWRTdGVwSWQ6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBkcmFnUG9saWN5OiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgZHJvcFBvbGljeTogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIGhhc1BvbGljeUZpbHRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtcG9saWN5LWZpbHRlcicgfSxcbiAgICAgIGZsb3dzVGl0bGU6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdmbG93cy10aXRsZScgfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZsb3dzVGl0bGUgPSAnRmxvd3MnO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuX29uTW91c2VMZWF2ZSk7XG4gIH1cblxuICBfb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuZHJhZ1BvbGljeSA9IG51bGw7XG4gICAgdGhpcy5kcm9wUG9saWN5ID0gbnVsbDtcbiAgfVxuXG4gIGdldENhbmRpZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LWZsb3ctc3RlcFtlbXB0eV0nKTtcbiAgfVxuXG4gIGdldEZsb3dTdGVwcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdy1zdGVwJykpO1xuICB9XG5cbiAgZ2V0T3JDcmVhdGVDYW5kaWRhdGUoKSB7XG4gICAgbGV0IGNhbmRpZGF0ZSA9IHRoaXMuZ2V0Q2FuZGlkYXRlKCk7XG4gICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgIGNhbmRpZGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2d2LWZsb3ctc3RlcCcpO1xuICAgICAgY2FuZGlkYXRlLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuXG4gIHJlbW92ZUNhbmRpZGF0ZSgpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLmdldENhbmRpZGF0ZSgpO1xuICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgIGNhbmRpZGF0ZS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBfY2FuRHJvcFBvbGljeShmbG93S2V5LCBwb2xpY3kpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChwb2xpY3kgIT0gbnVsbCkge1xuICAgICAgaWYgKGZsb3dLZXkgPT09ICdwcmUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BvbGljeUZpbHRlciAhPT0gdHJ1ZSB8fCBwb2xpY3kub25SZXF1ZXN0ID09PSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmbG93S2V5ID09PSAncG9zdCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUG9saWN5RmlsdGVyICE9PSB0cnVlIHx8IHBvbGljeS5vblJlc3BvbnNlID09PSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmxvd2tleSBbJHtmbG93S2V5fV0gcGFyYW1ldGVyIG11c3QgYmUgXCJwcmVcIiBvciBcInBvc3RcImApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfb25EcmFnT3ZlcihmbG93S2V5LCBlKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICBpZiAoZS5kYXRhVHJhbnNmZXIuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmRyb3BQb2xpY3kgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IHRoaXMuZHJhZ1BvbGljeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRyYWdQb2xpY3kgPSB0aGlzLmRyb3BQb2xpY3k7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5kcm9wUG9saWN5ICE9IG51bGwgJiZcbiAgICAgICAgICB0aGlzLl9jYW5Ecm9wUG9saWN5KGZsb3dLZXksIHRoaXMuZHJvcFBvbGljeS5wb2xpY3kpICYmXG4gICAgICAgICAgIWUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnY2FuZGlkYXRlJykgJiZcbiAgICAgICAgICAhZS50YXJnZXQuaGFzQXR0cmlidXRlKCdkcmFnZ2luZycpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdndi1mbG93LXN0ZXAnKSB7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHdpZHRoIH0gPSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGZsb3dLZXkgPT09ICdwb3N0JyA/IGUuY2xpZW50WCAtIHggPD0gd2lkdGggLyAyIDogZS5jbGllbnRYIC0geCA+PSB3aWR0aCAvIDI7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uICYmICEoZS50YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5oYXNBdHRyaWJ1dGUoJ2RyYWdnaW5nJykpKSB7XG4gICAgICAgICAgICAgIGUudGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLmdldE9yQ3JlYXRlQ2FuZGlkYXRlKCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKGUudGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgZS50YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZy5oYXNBdHRyaWJ1dGUoJ2RyYWdnaW5nJykpKSB7XG4gICAgICAgICAgICAgIGUudGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0aGlzLmdldE9yQ3JlYXRlQ2FuZGlkYXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZS50YXJnZXQuY2xhc3NMaXN0ICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZHJvcC1hcmVhLWdyaWQnKSkge1xuICAgICAgICAgICAgY29uc3QgZHJvcEFyZWFzID0gZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdy1zdGVwJyk7XG4gICAgICAgICAgICBpZiAoZHJvcEFyZWFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBlLnRhcmdldC5wcmVwZW5kKHRoaXMuZ2V0T3JDcmVhdGVDYW5kaWRhdGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2FuZGlkYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX29uRHJhZ0VuZCgpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgIGlmICh0aGlzLl9kcmFnZ2FibGVQb2xpY3lJbWFnZSkge1xuICAgICAgICB0aGlzLl9kcmFnZ2FibGVQb2xpY3lJbWFnZS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlUG9saWN5SW1hZ2UgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5kcmFnUG9saWN5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX29uRHJhZ1N0YXJ0KHNvdXJjZUZsb3dLZXksIGZsb3dTdGVwLCBzb3VyY2VQb3NpdGlvbiwgZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5maW5kUG9saWN5KGZsb3dTdGVwLnBvbGljeSk7XG4gICAgICBpZiAocG9saWN5ICE9IG51bGwpIHtcbiAgICAgICAgLy8gU2ltdWxhdGUgY2xpY2sgb24gd2luZG93IGZvciBjbG9zZSBhbGwgZHJvcGRvd24gbWVudVxuICAgICAgICBjb25zdCB3aW5kb3dDbGljayA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudHMnKTtcbiAgICAgICAgd2luZG93Q2xpY2suaW5pdEV2ZW50KCdjbGljaycsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQod2luZG93Q2xpY2spO1xuICAgICAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuZHJvcC1hcmVhLWdyaWQnKS5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO1xuXG4gICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG5ldyBQb2xpY3lEcmFnZ2FibGUocG9saWN5LCBzb3VyY2VQb3NpdGlvbiwgc291cmNlRmxvd0tleSwgdGhpcy5mbG93Ll9pZCwgZmxvd1N0ZXApO1xuICAgICAgICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJywgdGhpcy5kcm9wUG9saWN5LnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocG9saWN5KSB7XG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IDEwMDtcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVQb2xpY3lJbWFnZSA9IGFwcGVuZERyYWdnYWJsZUltYWdlKHBvbGljeS5pY29uLCBzaXplKTtcbiAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UodGhpcy5fZHJhZ2dhYmxlUG9saWN5SW1hZ2UsIHNpemUgLyAyLCBzaXplIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZHJhZy1zdGFydCcsIHRoaXMuZHJvcFBvbGljeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybVVwZGF0ZSgpIHtcbiAgICB0aGlzLmdldEZsb3dTdGVwcygpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBkcmFnZ2luZ0FyZWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1mbG93LXN0ZXBbZHJhZ2dpbmddJyk7XG4gIH1cblxuICBfb25Ecm9wKGZsb3dLZXksIGUpIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdy1zdGVwJykuZm9yRWFjaCgoc3RlcCkgPT4gc3RlcC5yZXNldENvbmZpcm0oKSk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgYm94ID0gZS50YXJnZXQuY2xvc2VzdCgnLmRyb3AtYXJlYS1ncmlkJyk7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gdGhpcy5nZXRDYW5kaWRhdGUoKTtcbiAgICBjb25zdCBkcmFnZ2luZ0FyZWEgPSB0aGlzLmRyYWdnaW5nQXJlYTtcbiAgICBpZiAoY2FuZGlkYXRlKSB7XG4gICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgWy4uLmJveC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93LXN0ZXAnKV0uc29tZSgoYXJlYSkgPT4ge1xuICAgICAgICBpZiAoIWFyZWEuaGFzQXR0cmlidXRlKCdlbXB0eScpKSB7XG4gICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJlYS5oYXNBdHRyaWJ1dGUoJ2VtcHR5Jyk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgcG9saWN5LCBzb3VyY2VGbG93S2V5LCBzb3VyY2VGbG93SWQsIHNvdXJjZVBvc2l0aW9uLCBmbG93U3RlcCB9ID0gdGhpcy5kcm9wUG9saWN5O1xuICAgICAgY29uc3QgbW92ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGRyYWdnaW5nQXJlYSkge1xuICAgICAgICAgIGRyYWdnaW5nQXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FuZGlkYXRlLnJlbW92ZSgpO1xuICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkcm9wJywge1xuICAgICAgICAgIGZsb3dJZDogdGhpcy5mbG93Ll9pZCxcbiAgICAgICAgICBmbG93S2V5LFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIGZsb3dTdGVwLFxuICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgICBzb3VyY2VGbG93S2V5LFxuICAgICAgICAgIHNvdXJjZUZsb3dJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZHJhZ1BvbGljeSA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBpZiAoc291cmNlRmxvd0lkICE9IG51bGwgJiYgdGhpcy5mbG93Ll9pZCAhPT0gc291cmNlRmxvd0lkKSB7XG4gICAgICAgIGNhbmRpZGF0ZS5zZXRBdHRyaWJ1dGUoJ2NvbmZpcm0nLCB0cnVlKTtcbiAgICAgICAgY2FuZGlkYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2d2LWZsb3ctc3RlcDpjb3B5JywgKCkgPT4ge1xuICAgICAgICAgIGNhbmRpZGF0ZS5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmRyYWdQb2xpY3kgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZHJvcCcsIHtcbiAgICAgICAgICAgIGZsb3dJZDogdGhpcy5mbG93Ll9pZCxcbiAgICAgICAgICAgIGZsb3dLZXksXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgIGZsb3dTdGVwLFxuICAgICAgICAgICAgY2FuY2VsRWRpdDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FuZGlkYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2d2LWZsb3ctc3RlcDptb3ZlJywgKCkgPT4ge1xuICAgICAgICAgIGNhbmRpZGF0ZS5yZW1vdmUoKTtcbiAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW92ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZHJhZ2dpbmdBcmVhKSB7XG4gICAgICBkcmFnZ2luZ0FyZWEucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgdGhpcy5kcmFnUG9saWN5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rmxvd1N0ZXAoZmxvd0tleSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5mbG93W2Zsb3dLZXldW3Bvc2l0aW9uXTtcbiAgfVxuXG4gIF9vbkVkaXRTdGVwKHsgZGV0YWlsOiB7IHN0ZXAsIHBvbGljeSwgZ3JvdXAgfSB9KSB7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZWRpdCcsIHsgZmxvdzogdGhpcy5mbG93LCBzdGVwLCBwb2xpY3ksIGdyb3VwIH0pO1xuICB9XG5cbiAgX29uRHVwbGljYXRlU3RlcChmbG93S2V5LCBwb3NpdGlvbikge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmdldEZsb3dTdGVwKGZsb3dLZXksIHBvc2l0aW9uKTtcbiAgICBjb25zdCBkdXBsaWNhdGVQb3NpdGlvbiA9IHBvc2l0aW9uICsgMTtcbiAgICBjb25zdCBwb2xpY3kgPSB0aGlzLmZpbmRQb2xpY3koc3RlcC5wb2xpY3kpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZVN0ZXAgPSB7IC4uLnN0ZXAsIF9pZDogdXVpZCgpIH07XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZHJvcCcsIHtcbiAgICAgIGZsb3dJZDogdGhpcy5mbG93Ll9pZCxcbiAgICAgIGZsb3dLZXksXG4gICAgICBwb3NpdGlvbjogZHVwbGljYXRlUG9zaXRpb24sXG4gICAgICBmbG93U3RlcDogZHVwbGljYXRlU3RlcCxcbiAgICAgIHBvbGljeSxcbiAgICB9KTtcbiAgfVxuXG4gIF9pc0VkaXRhYmxlKHN0ZXApIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0ZXBJZCAmJiB0aGlzLnNlbGVjdGVkU3RlcElkID09PSBzdGVwLl9pZDtcbiAgfVxuXG4gIF9vbkRlbGV0ZVN0ZXAoZmxvd0tleSwgcG9zaXRpb24sIGUpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkZWxldGUnLCB7IGZsb3dLZXksIHBvc2l0aW9uLCBmbG93SWQ6IHRoaXMuZmxvdy5faWQsIHRhcmdldDogZS50YXJnZXQgfSk7XG4gIH1cblxuICBfb25DaGFuZ2VTdGVwU3RhdGUoZmxvd0tleSwgcG9zaXRpb24sIHsgZGV0YWlsIH0pIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjaGFuZ2Utc3RhdGUnLCB7IGZsb3dLZXksIHBvc2l0aW9uLCBmbG93SWQ6IHRoaXMuZmxvdy5faWQsIC4uLmRldGFpbCB9KTtcbiAgfVxuXG4gIF9yZW5kZXJEcm9wU3RlcChncm91cCwgc3RlcCwgcG9zaXRpb24pIHtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgcmV0dXJuIGh0bWxgPGd2LWZsb3ctc3RlcFxuICAgICAgICAuc3RlcD1cIiR7c3RlcH1cIlxuICAgICAgICAucG9saWN5PVwiJHt0aGlzLmZpbmRQb2xpY3koc3RlcC5wb2xpY3kpfVwiXG4gICAgICAgIC5pZD1cIiR7c3RlcC5faWR9XCJcbiAgICAgICAgLmdyb3VwPVwiJHtncm91cH1cIlxuICAgICAgICAucGFyZW50PVwiJHt0aGlzLmZsb3cuX2lkfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLmRyYWdnYWJsZT1cIiR7IXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgP2VkaXRpbmc9XCIke3RoaXMuX2lzRWRpdGFibGUoc3RlcCl9XCJcbiAgICAgICAgQGRyYWdzdGFydD1cIiR7dGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzLCBncm91cCwgc3RlcCwgcG9zaXRpb24pfVwiXG4gICAgICAgIEBkcmFnZW5kPVwiJHt0aGlzLl9vbkRyYWdFbmR9XCJcbiAgICAgICAgQGd2LWZsb3ctc3RlcDplZGl0PVwiJHt0aGlzLl9vbkVkaXRTdGVwfVwiXG4gICAgICAgIEBndi1mbG93LXN0ZXA6Y2hhbmdlLXN0YXRlPVwiJHt0aGlzLl9vbkNoYW5nZVN0ZXBTdGF0ZS5iaW5kKHRoaXMsIGdyb3VwLCBwb3NpdGlvbil9XCJcbiAgICAgICAgQGd2LWZsb3ctc3RlcDpkZWxldGU9XCIke3RoaXMuX29uRGVsZXRlU3RlcC5iaW5kKHRoaXMsIGdyb3VwLCBwb3NpdGlvbil9XCJcbiAgICAgICAgQGd2LWZsb3ctc3RlcDpkdXBsaWNhdGU9XCIke3RoaXMuX29uRHVwbGljYXRlU3RlcC5iaW5kKHRoaXMsIGdyb3VwLCBwb3NpdGlvbil9XCJcbiAgICAgID48L2d2LWZsb3ctc3RlcD5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbGBgO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgIGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5nZXRGbG93U3RlcHMoKS5tYXAoKGUpID0+IGUudXBkYXRlQ29tcGxldGUpKTtcbiAgfVxuXG4gIHVwZGF0ZWQocHJvcGVydGllcykge1xuICAgIGlmIChwcm9wZXJ0aWVzLmhhcygnZGF0YScpKSB7XG4gICAgICB0aGlzLm9uRHJhZ0VuZCgpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydGllcy5oYXMoJ2Ryb3BQb2xpY3knKSB8fCBwcm9wZXJ0aWVzLmhhcygnZHJhZ1BvbGljeScpKSB7XG4gICAgICBpZiAodGhpcy5kcm9wUG9saWN5ID09IG51bGwgJiYgdGhpcy5kcmFnUG9saWN5ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDYW5kaWRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRyYWdFbmQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmRyb3AtYXJlYS1ncmlkJykuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIHRoaXMucmVtb3ZlQ2FuZGlkYXRlKCk7XG4gICAgICBjb25zdCBkcmFnZ2luZ0FyZWEgPSB0aGlzLmRyYWdnaW5nQXJlYTtcbiAgICAgIGlmIChkcmFnZ2luZ0FyZWEpIHtcbiAgICAgICAgZHJhZ2dpbmdBcmVhLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIF9nZXRMYWJlbChmbG93S2V5KSB7XG4gICAgaWYgKHRoaXMuZmxvdy50eXBlKSB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtYm94LXR5cGVcIj4ke2Zsb3dLZXl9PC9kaXY+XG4gICAgICAgIDxkaXY+JHt0aGlzLmZsb3cudHlwZS50b1VwcGVyQ2FzZSgpID09PSAnUk9PVCcgPyAnZmxvdycgOiB0aGlzLmZsb3cudHlwZX08L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChmbG93S2V5ID09PSAncHJlJykge1xuICAgICAgcmV0dXJuICdyZXF1ZXN0JztcbiAgICB9IGVsc2UgaWYgKGZsb3dLZXkgPT09ICdwb3N0Jykge1xuICAgICAgcmV0dXJuICdyZXNwb25zZSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGFuICE9IG51bGwgPyB0aGlzLnBsYW4ubmFtZSA6IHRoaXMuZmxvd3NUaXRsZTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBwcmVUYXJnZXQgPSB0aGlzLmRyYWdQb2xpY3kgJiYgKHRoaXMuaGFzUG9saWN5RmlsdGVyICE9PSB0cnVlIHx8IHRoaXMuZHJhZ1BvbGljeS5wb2xpY3kub25SZXF1ZXN0KTtcbiAgICBjb25zdCBwb3N0VGFyZ2V0ID0gdGhpcy5kcmFnUG9saWN5ICYmICh0aGlzLmhhc1BvbGljeUZpbHRlciAhPT0gdHJ1ZSB8fCB0aGlzLmRyYWdQb2xpY3kucG9saWN5Lm9uUmVzcG9uc2UpO1xuXG4gICAgY29uc3QgcHJlRm9yYmlkZGVuID0gdGhpcy5kcmFnUG9saWN5ICYmIHRoaXMuaGFzUG9saWN5RmlsdGVyID09PSB0cnVlICYmICF0aGlzLmRyYWdQb2xpY3kucG9saWN5Lm9uUmVxdWVzdDtcbiAgICBjb25zdCBwb3N0Rm9yYmlkZGVuID0gdGhpcy5kcmFnUG9saWN5ICYmIHRoaXMuaGFzUG9saWN5RmlsdGVyID09PSB0cnVlICYmICF0aGlzLmRyYWdQb2xpY3kucG9saWN5Lm9uUmVzcG9uc2U7XG4gICAgY29uc3QgaGFzUG9zdCA9IHRoaXMuZmxvdy50eXBlID09IG51bGwgfHwgKHRoaXMuZmxvdy50eXBlICYmIHRoaXMuZmxvdy50eXBlLnRvTG93ZXJDYXNlKCkgIT09ICdyb290Jyk7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHtnZXRGbG93TmFtZSh0aGlzLmZsb3csIHRoaXMuY29sbGVjdGlvbk5hbWUpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBwcmU6IHRydWUsIHRhcmdldGVkOiBwcmVUYXJnZXQsIGZvcmJpZGRlbjogcHJlRm9yYmlkZGVuIH0pfVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgYXJyb3ctcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcC1ib3hcIlxuICAgICAgICAgICAgICAgIEBkcm9wPVwiJHt0aGlzLl9vbkRyb3AuYmluZCh0aGlzLCAncHJlJyl9XCJcbiAgICAgICAgICAgICAgICBAZHJhZ2VuZD1cIiR7dGhpcy5vbkRyYWdFbmR9XCJcbiAgICAgICAgICAgICAgICBAZHJhZ292ZXI9XCIke3RoaXMuX29uRHJhZ092ZXIuYmluZCh0aGlzLCAncHJlJyl9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWJveC10aXRsZVwiPiR7cHJlVGFyZ2V0ID8gJ2Ryb3AgaGVyZScgOiB0aGlzLl9nZXRMYWJlbCgncHJlJyl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtYXJlYS1ncmlkXCI+JHt0aGlzLmZsb3cucHJlLm1hcCgoZmxvd1N0ZXAsIGkpID0+IHRoaXMuX3JlbmRlckRyb3BTdGVwKCdwcmUnLCBmbG93U3RlcCwgaSkpfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAke2hhc1Bvc3RcbiAgICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBwb3N0OiB0cnVlLCB0YXJnZXRlZDogcG9zdFRhcmdldCwgZm9yYmlkZGVuOiBwb3N0Rm9yYmlkZGVuIH0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdhcnJvdyBhcnJvdy1sZWZ0Jz4gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkcm9wPVwiJHt0aGlzLl9vbkRyb3AuYmluZCh0aGlzLCAncG9zdCcpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZHJhZ2VuZD1cIiR7dGhpcy5vbkRyYWdFbmR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkcmFnb3Zlcj1cIiR7dGhpcy5fb25EcmFnT3Zlci5iaW5kKHRoaXMsICdwb3N0Jyl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1hcmVhLWdyaWQgZHJvcC1hcmVhLWdyaWQtcmV2ZXJzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmZsb3cucG9zdC5tYXAoKGZsb3dTdGVwLCBpKSA9PiB0aGlzLl9yZW5kZXJEcm9wU3RlcCgncG9zdCcsIGZsb3dTdGVwLCBpKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWJveC10aXRsZVwiPiR7cG9zdFRhcmdldCA/ICdkcm9wIGhlcmUnIDogdGhpcy5fZ2V0TGFiZWwoJ3Bvc3QnKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBmaW5kUG9saWN5KHBvbGljeUlkKSB7XG4gICAgY29uc3QgcG9saWN5ID0gdGhpcy5wb2xpY2llcy5maW5kKChwKSA9PiBwLmlkID09PSBwb2xpY3lJZCk7XG4gICAgaWYgKHBvbGljeSA9PSBudWxsKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoYFBvbGljeSAke3BvbGljeUlkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbGljeTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtZXRob2RzLFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdyB7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuZHJvcC1hcmVhLWdyaWQge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkIHRyYW5zcGFyZW50O1xuICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAzNTBtcyBlYXNlLWluLW91dDtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA0MHB4KTtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDE1MHB4O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgcGFkZGluZzogMCAzMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnRhcmdldGVkIC5kcm9wLWFyZWEtZ3JpZCB7XG4gICAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9yYmlkZGVuIC5kcm9wLWFyZWEtZ3JpZCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjtcbiAgICAgICAgICBvcGFjaXR5OiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICBndi1mbG93LXN0ZXAge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAubWVzc2FnZSB7XG4gICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgICBjb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMzUwbXMgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAubWVzc2FnZSB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAudGFyZ2V0ZWQgLm1lc3NhZ2Uge1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAudGFyZ2V0ZWQgLmRyb3AtYXJlYS1lbXB0eSB7XG4gICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMzUwbXMgZWFzZS1pbi1vdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAucHJlLFxuICAgICAgICAucG9zdCB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcnJvdyB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNTBweCAqIDIgLSAxcHgpO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgbWFyZ2luOiAwIDMwcHg7XG4gICAgICAgICAgY29sb3I6ICMyNjI2MjY7XG4gICAgICAgICAgdG9wOiBjYWxjKDUwJSAtIDIwcHgpO1xuICAgICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcnJvdy1yaWdodDo6YWZ0ZXIge1xuICAgICAgICAgIHdpZHRoOiAwO1xuICAgICAgICAgIGhlaWdodDogMDtcbiAgICAgICAgICBib3JkZXItdG9wOiA0MHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICAgIGJvcmRlci1ib3R0b206IDQwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IDQwcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBjb250ZW50OiAnICc7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHJpZ2h0OiAtMjBweDtcbiAgICAgICAgICB0b3A6IC0yMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmRyb3AtYm94LXR5cGUge1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3cml0aW5nLW1vZGU6IGhvcml6b250YWwtdGI7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kcm9wLWJveC10aXRsZSB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdyaXRpbmctbW9kZTogdmVydGljYWwtbHI7XG4gICAgICAgICAgdGV4dC1vcmllbnRhdGlvbjogdXByaWdodDtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIGNvbG9yOiAjYmZiZmJmO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiAxNDVweDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMTNweDtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgbWluLXdpZHRoOiAzMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnByZSAuZHJvcC1ib3gtdGl0bGUge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICBsZWZ0OiAtMzBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcnJvdy1sZWZ0OjphZnRlciB7XG4gICAgICAgICAgd2lkdGg6IDA7XG4gICAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICAgIGJvcmRlci10b3A6IDQwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogNDBweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IDQwcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBjb250ZW50OiAnICc7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIGxlZnQ6IC0yMHB4O1xuICAgICAgICAgIHRvcDogLTIwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJvcC1ib3gge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgbWFyZ2luOiAwIDMwcHg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJvcC1hcmVhLWdyaWQtcmV2ZXJzZSB7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlciB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA0NXB4O1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLnRpdGxlIHtcbiAgICAgICAgICBjb2xvcjogIzI4NDQ0ZjtcbiAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIG1hcmdpbjogMCAwLjVyZW07XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSAuZmxvdy1wYXRoIHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICB0b3A6IDA7XG4gICAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgICBmbGV4LWdyb3c6IDE7XG5cbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRlbnQge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcblxuICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xuXG4gICAgICAgICAgLyogZm9yIEZpcmVmb3ggKi9cbiAgICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICAgIHBhZGRpbmc6IDAuNXJlbTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LWZsb3cnLCBHdkZsb3cpO1xuIl19
|