@gravitee/ui-components 3.24.4 → 3.24.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/en.json +0 -3
- package/assets/i18n/fr.json +0 -3
- package/package.json +18 -20
- package/src/atoms/gv-input.js +31 -32
- package/src/index.js +1 -2
- package/src/mixins/input-element.js +5 -3
- package/src/molecules/gv-code.js +181 -169
- package/src/molecules/gv-expression-language.js +219 -525
- package/src/policy-studio/gv-policy-studio.js +2 -8
- package/src/styles/input.js +2 -2
- package/assets/css/codemirror/all.css +0 -476
- package/src/molecules/gv-code-hint.js +0 -49
- package/wc/gv-code-hint.js +0 -1
package/src/molecules/gv-code.js
CHANGED
|
@@ -13,35 +13,25 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { css,
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
import 'codemirror/
|
|
20
|
-
import 'codemirror/
|
|
21
|
-
import 'codemirror/
|
|
22
|
-
import 'codemirror/
|
|
23
|
-
import '
|
|
24
|
-
import 'codemirror/addon/search/search';
|
|
25
|
-
import 'codemirror/addon/search/searchcursor';
|
|
26
|
-
import 'codemirror/addon/search/jump-to-line';
|
|
27
|
-
import 'codemirror/addon/dialog/dialog';
|
|
28
|
-
import 'codemirror/addon/lint/lint';
|
|
29
|
-
import 'codemirror/addon/lint/json-lint';
|
|
30
|
-
import 'codemirror/addon/lint/yaml-lint';
|
|
31
|
-
import 'codemirror/addon/display/placeholder';
|
|
32
|
-
import { i18n } from '../lib/i18n';
|
|
33
|
-
import { shapeClipboard, shapeCopied } from '../styles/shapes';
|
|
34
|
-
import { skeleton } from '../styles/skeleton';
|
|
16
|
+
import { css, html } from 'lit';
|
|
17
|
+
import { EditorView, basicSetup } from '@codemirror/basic-setup';
|
|
18
|
+
import { EditorState, Compartment } from '@codemirror/state';
|
|
19
|
+
import { autocompletion } from '@codemirror/autocomplete';
|
|
20
|
+
import { json } from '@codemirror/lang-json';
|
|
21
|
+
import { languages } from '@codemirror/language-data';
|
|
22
|
+
import { placeholder } from '@codemirror/view';
|
|
23
|
+
import { shapeClipboard } from '../styles/shapes';
|
|
35
24
|
import { dispatchCustomEvent } from '../lib/events';
|
|
36
|
-
import { InputElement } from '../mixins/input-element';
|
|
37
25
|
import { uuid } from '../lib/utils';
|
|
38
|
-
import {
|
|
26
|
+
import { classMap } from 'lit-html/directives/class-map';
|
|
27
|
+
import { GvInput } from '../atoms/gv-input';
|
|
28
|
+
import { skeleton } from '../styles/skeleton';
|
|
39
29
|
import { empty } from '../styles/empty';
|
|
30
|
+
import { input } from '../styles/input';
|
|
40
31
|
/**
|
|
41
32
|
* Code component
|
|
42
33
|
*
|
|
43
34
|
* ## Details
|
|
44
|
-
* * This component requires that the "gravitee-ui-components/assets/css" folder be mounted on "/css" of your webapp
|
|
45
35
|
* * has @theme facet
|
|
46
36
|
*
|
|
47
37
|
* @fires gv-code:input - input events with the `value` on `detail`
|
|
@@ -50,7 +40,7 @@ import { empty } from '../styles/empty';
|
|
|
50
40
|
*
|
|
51
41
|
* @attr {String} label - code language
|
|
52
42
|
* @attr {String} value - code content to be highlighted
|
|
53
|
-
* @attr {options} Object - options based on codemirror
|
|
43
|
+
* @attr {options} Object - options based on codemirror
|
|
54
44
|
* @attr {String} placeholder - an example value to display in the input when empty
|
|
55
45
|
* @attr {Number} rows - number of rows of the text element
|
|
56
46
|
* @attr {Boolean} large - for a large input (only if the field has one row)
|
|
@@ -62,21 +52,12 @@ import { empty } from '../styles/empty';
|
|
|
62
52
|
* @attr {Boolean} [readonly=false] - true if field is readonly mode
|
|
63
53
|
*/
|
|
64
54
|
|
|
65
|
-
export class GvCode extends
|
|
55
|
+
export class GvCode extends GvInput {
|
|
66
56
|
static get properties() {
|
|
67
57
|
return { ...super.properties,
|
|
68
58
|
options: {
|
|
69
59
|
type: Object
|
|
70
60
|
},
|
|
71
|
-
clipboard: {
|
|
72
|
-
type: Boolean
|
|
73
|
-
},
|
|
74
|
-
_clipboardIcon: {
|
|
75
|
-
type: String
|
|
76
|
-
},
|
|
77
|
-
_codeMirror: {
|
|
78
|
-
type: Object
|
|
79
|
-
},
|
|
80
61
|
rows: {
|
|
81
62
|
type: Number
|
|
82
63
|
},
|
|
@@ -95,191 +76,222 @@ export class GvCode extends InputElement(LitElement) {
|
|
|
95
76
|
this.autofocus = false;
|
|
96
77
|
this.clipboard = false;
|
|
97
78
|
this._clipboardIcon = shapeClipboard;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
this._error = `Cannot load library, please read the documentation.`;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async _onLoad() {
|
|
105
|
-
if (this._loaded !== true) {
|
|
106
|
-
this._loaded = true;
|
|
107
|
-
|
|
108
|
-
if (this.clipboard) {
|
|
109
|
-
import('clipboard-copy').then(mod => {
|
|
110
|
-
const copy = mod.default;
|
|
111
|
-
this.shadowRoot.querySelector('gv-button').addEventListener('gv-button:click', () => {
|
|
112
|
-
copy(this.value);
|
|
113
|
-
this._copied = true;
|
|
114
|
-
this._clipboardIcon = shapeCopied;
|
|
115
|
-
dispatchCustomEvent(this, 'clipboard-copy');
|
|
116
|
-
setTimeout(() => {
|
|
117
|
-
this._copied = false;
|
|
118
|
-
this._clipboardIcon = shapeClipboard;
|
|
119
|
-
}, 1000);
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const options = this._getProcessedOptions();
|
|
125
|
-
|
|
126
|
-
try {
|
|
127
|
-
if (options.mode != null) {
|
|
128
|
-
const mode = typeof options.mode === 'string' ? options.mode : options.mode.name;
|
|
129
|
-
|
|
130
|
-
if (mode === 'asciidoc') {
|
|
131
|
-
await import('codemirror-asciidoc/lib/asciidoc.js');
|
|
132
|
-
} else {
|
|
133
|
-
await import(`codemirror/mode/${mode}/${mode}.js`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
} catch (er) {}
|
|
137
|
-
|
|
138
|
-
const textArea = this.shadowRoot.querySelector(`#${this._id}`);
|
|
139
|
-
this._codeMirror = CodeMirror.fromTextArea(textArea, { ...options,
|
|
140
|
-
...{
|
|
141
|
-
theme: 'mdn-like',
|
|
142
|
-
lineWrapping: true,
|
|
143
|
-
readOnly: this.readonly,
|
|
144
|
-
autofocus: this.autofocus,
|
|
145
|
-
scrollbarStyle: this.singleLine ? null : 'native'
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
if (this.autofocus) {
|
|
150
|
-
setTimeout(() => {
|
|
151
|
-
this._codeMirror.focus();
|
|
152
|
-
}, 200);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
dispatchCustomEvent(this, 'ready');
|
|
156
|
-
}
|
|
79
|
+
this.languageCompartment = new Compartment();
|
|
80
|
+
this.readonlyCompartment = new Compartment();
|
|
81
|
+
this.placeholderCompartment = new Compartment();
|
|
157
82
|
}
|
|
158
83
|
|
|
159
84
|
render() {
|
|
160
|
-
|
|
161
|
-
return html`<div class="error">${this._error}</div>`;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return html` <link @load="${this._onLoad}" @error="${this._onError}" rel="stylesheet" href="./css/codemirror/all.css"> <div class="${classMap({
|
|
85
|
+
const classes = {
|
|
165
86
|
box: true,
|
|
166
87
|
'box-invisible': this.skeleton,
|
|
167
88
|
large: this.large,
|
|
168
89
|
medium: this.medium || !this.large && !this.small,
|
|
169
|
-
small: this.small
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
90
|
+
small: this.small,
|
|
91
|
+
copied: this.hasClipboard && this._copied
|
|
92
|
+
};
|
|
93
|
+
const inputClasses = {
|
|
94
|
+
content: true,
|
|
95
|
+
code: !this.hasInputStyle,
|
|
96
|
+
input: this.hasInputStyle
|
|
97
|
+
};
|
|
98
|
+
return html` <div class="${classMap(classes)}"> ${this.label ? html`<label for="code">${this.label}</label>` : ''} <div id="${this._id}" class="${classMap(inputClasses)}"> ${this.renderIcon()} </div> </div> ${this.description != null ? html`<div class="description" .innerHTML="${this.description}"></div>` : ''} `;
|
|
173
99
|
}
|
|
174
100
|
|
|
175
|
-
|
|
176
|
-
this
|
|
177
|
-
|
|
101
|
+
bindInputEvents() {
|
|
102
|
+
dispatchCustomEvent(this, 'ready', {
|
|
103
|
+
currentTarget: this
|
|
104
|
+
});
|
|
178
105
|
}
|
|
179
106
|
|
|
180
|
-
get
|
|
107
|
+
get hasInputStyle() {
|
|
181
108
|
return this.rows === 1;
|
|
182
109
|
}
|
|
183
110
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
111
|
+
_autocomplete(completionContext) {
|
|
112
|
+
const {
|
|
113
|
+
handler,
|
|
114
|
+
match
|
|
115
|
+
} = this.findBestAutocompleteHandler(completionContext);
|
|
116
|
+
return handler.run.call(this, completionContext, match);
|
|
117
|
+
}
|
|
187
118
|
|
|
188
|
-
|
|
189
|
-
|
|
119
|
+
findBestAutocompleteHandler(completionContext) {
|
|
120
|
+
return {
|
|
121
|
+
handler: this.defaultCompletionHandler,
|
|
122
|
+
match: true
|
|
123
|
+
};
|
|
190
124
|
}
|
|
191
125
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
if (this.singleLine && this._id === cm.getTextArea().id) {
|
|
197
|
-
// Identify typing events that add a newline to the buffer.
|
|
198
|
-
const hasTypedNewline = event.origin === '+input' && typeof event.text === 'object' && event.text.join('') === ''; // Prevent newline characters from being added to the buffer.
|
|
126
|
+
get defaultCompletionHandler() {
|
|
127
|
+
return {
|
|
128
|
+
run(completionContext) {
|
|
129
|
+
const language = completionContext.state.languageDataAt('autocomplete', completionContext.pos);
|
|
199
130
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
131
|
+
if (language.length > 0) {
|
|
132
|
+
return language[0](completionContext);
|
|
133
|
+
}
|
|
203
134
|
|
|
135
|
+
return {
|
|
136
|
+
from: completionContext.pos,
|
|
137
|
+
options: []
|
|
138
|
+
};
|
|
139
|
+
}
|
|
204
140
|
|
|
205
|
-
|
|
141
|
+
};
|
|
142
|
+
}
|
|
206
143
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
144
|
+
_getExtensions() {
|
|
145
|
+
return [basicSetup, GvCode.codemirrorTheme, this.languageCompartment.of(json()), this.placeholderCompartment.of(placeholder(this.placeholder || '')), EditorState.transactionFilter.of(tr => this.hasInputStyle && tr.newDoc.lines > 1 ? [] : tr), this.readonlyCompartment.of(EditorView.editable.of(!this.readonly && !this.disabled)), EditorView.updateListener.of(viewUpdate => {
|
|
146
|
+
if (viewUpdate.docChanged) {
|
|
147
|
+
this.value = this._editorView.state.doc.toString();
|
|
148
|
+
dispatchCustomEvent(this, 'input', this.value);
|
|
149
|
+
}
|
|
150
|
+
}), autocompletion({
|
|
151
|
+
activateOnTyping: true,
|
|
152
|
+
override: [this._autocomplete.bind(this)]
|
|
153
|
+
}), ...this.getExtensions()];
|
|
154
|
+
}
|
|
212
155
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
156
|
+
getExtensions() {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
getInputElement() {
|
|
161
|
+
return this.shadowRoot.querySelector(`[id=${this._id}]`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
firstUpdated() {
|
|
165
|
+
super.firstUpdated();
|
|
166
|
+
this._editorState = EditorState.create({
|
|
167
|
+
doc: this.value,
|
|
168
|
+
extensions: this._getExtensions()
|
|
169
|
+
});
|
|
170
|
+
const parent = this.getInputElement();
|
|
171
|
+
this._editorView = new EditorView({
|
|
172
|
+
root: this.shadowRoot,
|
|
173
|
+
parent,
|
|
174
|
+
state: this._editorState,
|
|
175
|
+
dispatch: transaction => {
|
|
176
|
+
try {
|
|
177
|
+
this._editorView.update([transaction]);
|
|
178
|
+
} catch (e) {// Sometimes the default dispatch fn throws an NS_ERROR_FAILURE at runtime.
|
|
179
|
+
// It's so strange but with this catch everything is okay
|
|
218
180
|
}
|
|
219
181
|
}
|
|
220
|
-
};
|
|
221
|
-
CodeMirror.defineInitHook(cm => {
|
|
222
|
-
cm.on('beforeChange', this._handlers.beforeChange);
|
|
223
|
-
cm.on('change', this._handlers.change);
|
|
224
182
|
});
|
|
183
|
+
parent.appendChild(this._editorView.dom);
|
|
225
184
|
}
|
|
226
185
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
186
|
+
async updated(properties) {
|
|
187
|
+
super.updated(properties);
|
|
188
|
+
|
|
189
|
+
if (properties.has('placeholder')) {
|
|
190
|
+
this._reflectPlaceholder();
|
|
191
|
+
}
|
|
230
192
|
|
|
231
|
-
if (
|
|
232
|
-
|
|
233
|
-
name: 'javascript',
|
|
234
|
-
json: true
|
|
235
|
-
};
|
|
193
|
+
if (properties.has('value')) {
|
|
194
|
+
this._reflectValue();
|
|
236
195
|
}
|
|
237
196
|
|
|
238
|
-
if (
|
|
239
|
-
|
|
197
|
+
if (properties.has('readonly') || properties.has('disabled')) {
|
|
198
|
+
this._reflectReadonlyDisabled();
|
|
240
199
|
}
|
|
241
200
|
|
|
242
|
-
|
|
201
|
+
if (properties.has('options') && this.options) {
|
|
202
|
+
await this._reflectOptions();
|
|
203
|
+
}
|
|
243
204
|
}
|
|
244
205
|
|
|
245
|
-
|
|
246
|
-
|
|
206
|
+
_reflectPlaceholder() {
|
|
207
|
+
this._editorView.dispatch({
|
|
208
|
+
effects: this.placeholderCompartment.reconfigure(placeholder(this.placeholder))
|
|
209
|
+
});
|
|
210
|
+
}
|
|
247
211
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
this.
|
|
212
|
+
_reflectValue() {
|
|
213
|
+
const transaction = this._editorState.update({
|
|
214
|
+
changes: {
|
|
215
|
+
from: 0,
|
|
216
|
+
to: this._editorState.doc.length,
|
|
217
|
+
insert: this.value
|
|
254
218
|
}
|
|
219
|
+
});
|
|
255
220
|
|
|
256
|
-
|
|
257
|
-
}
|
|
221
|
+
this._editorState = transaction.state;
|
|
258
222
|
}
|
|
259
223
|
|
|
260
|
-
|
|
261
|
-
|
|
224
|
+
_reflectReadonlyDisabled() {
|
|
225
|
+
this._editorView.dispatch({
|
|
226
|
+
effects: this.readonlyCompartment.reconfigure(EditorView.editable.of(!this.readonly && !this.disabled))
|
|
227
|
+
});
|
|
262
228
|
}
|
|
263
229
|
|
|
264
|
-
|
|
265
|
-
if (
|
|
266
|
-
const
|
|
230
|
+
static async findLanguage(mode) {
|
|
231
|
+
if (mode) {
|
|
232
|
+
const modeOnly = mode.split('/').pop();
|
|
233
|
+
|
|
234
|
+
if (modeOnly === 'asciidoc') {
|
|
235
|
+
const [{
|
|
236
|
+
asciidoc
|
|
237
|
+
}, {
|
|
238
|
+
StreamLanguage
|
|
239
|
+
}] = await Promise.all([import('codemirror-asciidoc/lib/asciidoc'), import('@codemirror/stream-parser')]);
|
|
240
|
+
return {
|
|
241
|
+
name: 'asciidoc',
|
|
242
|
+
support: {
|
|
243
|
+
extension: StreamLanguage.define(asciidoc)
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
} else {
|
|
247
|
+
const language = languages.find(languageDescription => {
|
|
248
|
+
return languageDescription.name.toUpperCase() === modeOnly.toUpperCase() || languageDescription.alias.includes(modeOnly);
|
|
249
|
+
});
|
|
267
250
|
|
|
268
|
-
|
|
269
|
-
|
|
251
|
+
if (language == null) {
|
|
252
|
+
console.warn(`Cannot find language ${mode}, please use language supported by CodeMirror 6`, languages.map(l => l.name));
|
|
253
|
+
}
|
|
270
254
|
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
255
|
+
return language;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async _reflectOptions() {
|
|
263
|
+
const language = await GvCode.findLanguage(this.options.mode);
|
|
264
|
+
|
|
265
|
+
if (language != null) {
|
|
266
|
+
if (language.support == null) {
|
|
267
|
+
await language.load();
|
|
274
268
|
}
|
|
269
|
+
|
|
270
|
+
this._editorView.dispatch({
|
|
271
|
+
effects: this.languageCompartment.reconfigure(language.support.extension)
|
|
272
|
+
});
|
|
275
273
|
}
|
|
276
274
|
}
|
|
277
275
|
|
|
276
|
+
static get codemirrorTheme() {
|
|
277
|
+
return EditorView.theme({
|
|
278
|
+
'&.cm-editor.cm-focused': {
|
|
279
|
+
outline: 'none'
|
|
280
|
+
},
|
|
281
|
+
'.cm-gutters': {
|
|
282
|
+
backgroundColor: 'var(--gv-input-icon--bgc, var(--gv-theme-neutral-color, #f5f5f5))',
|
|
283
|
+
color: 'var(--gv-theme-font-color-dark, #262626)',
|
|
284
|
+
borderLeft: '5px solid',
|
|
285
|
+
borderColor: 'var(--gv-input--bdc, var(--gv-theme-neutral-color-dark, #d9d9d9))'
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
278
290
|
static get styles() {
|
|
279
|
-
return [skeleton, empty, input, // language=CSS
|
|
280
|
-
css`:host{box-sizing:border-box;display:block;margin:0 .2rem .2rem .2rem}.
|
|
291
|
+
return [...super.styles, skeleton, empty, input, // language=CSS
|
|
292
|
+
css`:host{box-sizing:border-box;display:block;margin:0 .2rem .2rem .2rem}.content{position:relative;border:var(--gv-input--bdw,1px) var(--gv-input--bds,solid) var(--gv-input--bdc,var(--gv-theme-neutral-color-dark,#d9d9d9));box-sizing:border-box;border-radius:4px}.box-icon{bottom:-1px;right:-1px;z-index:1}.code .box-icon{border-radius:3px}.code .cm-content,.code .cm-gutters{height:var(--input-medium--h)}.large .code .cm-content,.large .code .cm-gutters{height:var(--input-large--h)}.small .code .cm-content,.small .code .cm-gutters{height:var(--input-small--h)}.input .cm-gutters{display:none}.input .cm-scroller{overflow:hidden}.input .cm-activeLine,:host([readonly]) .cm-activeLine{background-color:transparent}.input .cm-content{padding:0}:host([invalid]) .cm-gutters{border-color:var(--gv-theme-color-error,#da1a1b)}`];
|
|
281
293
|
}
|
|
282
294
|
|
|
283
295
|
}
|
|
284
296
|
window.customElements.define('gv-code', GvCode);
|
|
285
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1jb2RlLmpzIl0sIm5hbWVzIjpbImNzcyIsIkxpdEVsZW1lbnQiLCJodG1sIiwiY2xhc3NNYXAiLCJDb2RlTWlycm9yIiwiaTE4biIsInNoYXBlQ2xpcGJvYXJkIiwic2hhcGVDb3BpZWQiLCJza2VsZXRvbiIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJJbnB1dEVsZW1lbnQiLCJ1dWlkIiwiaW5wdXQiLCJlbXB0eSIsIkd2Q29kZSIsInByb3BlcnRpZXMiLCJvcHRpb25zIiwidHlwZSIsIk9iamVjdCIsImNsaXBib2FyZCIsIkJvb2xlYW4iLCJfY2xpcGJvYXJkSWNvbiIsIlN0cmluZyIsIl9jb2RlTWlycm9yIiwicm93cyIsIk51bWJlciIsIl9lcnJvciIsImF0dHJpYnV0ZSIsImNvbnN0cnVjdG9yIiwiX2lkIiwidmFsdWUiLCJyZWFkb25seSIsImF1dG9mb2N1cyIsIl9vbkVycm9yIiwiX29uTG9hZCIsIl9sb2FkZWQiLCJ0aGVuIiwibW9kIiwiY29weSIsImRlZmF1bHQiLCJzaGFkb3dSb290IiwicXVlcnlTZWxlY3RvciIsImFkZEV2ZW50TGlzdGVuZXIiLCJfY29waWVkIiwic2V0VGltZW91dCIsIl9nZXRQcm9jZXNzZWRPcHRpb25zIiwibW9kZSIsIm5hbWUiLCJlciIsInRleHRBcmVhIiwiZnJvbVRleHRBcmVhIiwidGhlbWUiLCJsaW5lV3JhcHBpbmciLCJyZWFkT25seSIsInNjcm9sbGJhclN0eWxlIiwic2luZ2xlTGluZSIsImZvY3VzIiwicmVuZGVyIiwiYm94IiwibGFyZ2UiLCJtZWRpdW0iLCJzbWFsbCIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJfb25DaGFuZ2UiLCJjbSIsImdldFZhbHVlIiwiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCJvZmYiLCJfaGFuZGxlcnMiLCJiZWZvcmVDaGFuZ2UiLCJjaGFuZ2UiLCJjb25uZWN0ZWRDYWxsYmFjayIsImV2ZW50IiwiZ2V0VGV4dEFyZWEiLCJpZCIsImhhc1R5cGVkTmV3bGluZSIsIm9yaWdpbiIsInRleHQiLCJqb2luIiwiY2FuY2VsIiwiaGFzUGFzdGVkTmV3bGluZSIsImxlbmd0aCIsIm5ld1RleHQiLCJ1cGRhdGUiLCJkZWZpbmVJbml0SG9vayIsIm9uIiwianNvbiIsInBsYWNlaG9sZGVyIiwidXBkYXRlZCIsImNoYW5nZWRQcm9wZXJ0aWVzIiwiaGFzIiwic2NyZWVuUmVhZGVyTGFiZWwiLCJnZXRDTSIsInNldFZhbHVlIiwicmVzaXplIiwicGxhY2Vob2xkZXJCeUxpbmVzIiwic3BsaXQiLCJzZXRTaXplIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsVUFBZCxFQUEwQkMsSUFBMUIsUUFBc0MsS0FBdEM7QUFDQSxTQUFTQyxRQUFULFFBQXlCLDBCQUF6QjtBQUVBLE9BQU9DLFVBQVAsTUFBdUIsMkJBQXZCO0FBQ0EsT0FBTyxxQ0FBUDtBQUNBLE9BQU8sZ0NBQVA7QUFDQSxPQUFPLHFDQUFQO0FBQ0EsT0FBTyxpQ0FBUDtBQUNBLE9BQU8sZ0NBQVA7QUFDQSxPQUFPLGdDQUFQO0FBQ0EsT0FBTyxzQ0FBUDtBQUNBLE9BQU8sc0NBQVA7QUFDQSxPQUFPLGdDQUFQO0FBQ0EsT0FBTyw0QkFBUDtBQUNBLE9BQU8saUNBQVA7QUFDQSxPQUFPLGlDQUFQO0FBQ0EsT0FBTyxzQ0FBUDtBQUNBLFNBQVNDLElBQVQsUUFBcUIsYUFBckI7QUFDQSxTQUFTQyxjQUFULEVBQXlCQyxXQUF6QixRQUE0QyxrQkFBNUM7QUFDQSxTQUFTQyxRQUFULFFBQXlCLG9CQUF6QjtBQUNBLFNBQVNDLG1CQUFULFFBQW9DLGVBQXBDO0FBQ0EsU0FBU0MsWUFBVCxRQUE2Qix5QkFBN0I7QUFD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QVAsQ0FBc0JDLE1BQXRCLENBQTZCLFNBQTdCLEVBQXdDeEYsTUFBeEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcblxuaW1wb3J0IENvZGVNaXJyb3IgZnJvbSAnY29kZW1pcnJvci9saWIvY29kZW1pcnJvcic7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vZWRpdC9jbG9zZWJyYWNrZXRzJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9lZGl0L2Nsb3NldGFnJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2VkaXQvbWF0Y2h0YWdzJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9mb2xkL3htbC1mb2xkJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9zZWFyY2gvc2VhcmNoJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9zZWFyY2gvanVtcC10by1saW5lJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9kaWFsb2cvZGlhbG9nJztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9saW50L2xpbnQnO1xuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2xpbnQvanNvbi1saW50JztcbmltcG9ydCAnY29kZW1pcnJvci9hZGRvbi9saW50L3lhbWwtbGludCc7XG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vZGlzcGxheS9wbGFjZWhvbGRlcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbGliL2kxOG4nO1xuaW1wb3J0IHsgc2hhcGVDbGlwYm9hcmQsIHNoYXBlQ29waWVkIH0gZnJvbSAnLi4vc3R5bGVzL3NoYXBlcyc7XG5pbXBvcnQgeyBza2VsZXRvbiB9IGZyb20gJy4uL3N0eWxlcy9za2VsZXRvbic7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQgfSBmcm9tICcuLi9taXhpbnMvaW5wdXQtZWxlbWVudCc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IGlucHV0IH0gZnJvbSAnLi4vc3R5bGVzL2lucHV0JztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vc3R5bGVzL2VtcHR5JztcblxuLyoqXG4gKiBDb2RlIGNvbXBvbmVudFxuICpcbiAqICMjIERldGFpbHNcbiAqICogVGhpcyBjb21wb25lbnQgcmVxdWlyZXMgdGhhdCB0aGUgXCJncmF2aXRlZS11aS1jb21wb25lbnRzL2Fzc2V0cy9jc3NcIiBmb2xkZXIgYmUgbW91bnRlZCBvbiBcIi9jc3NcIiBvZiB5b3VyIHdlYmFwcFxuICogKiBoYXMgQHRoZW1lIGZhY2V0XG4gKlxuICogQGZpcmVzIGd2LWNvZGU6aW5wdXQgLSBpbnB1dCBldmVudHMgd2l0aCB0aGUgYHZhbHVlYCBvbiBgZGV0YWlsYFxuICogQGZpcmVzIGd2LWNvZGU6cmVhZHkgLSBldmVudCBkaXNwYXRjaCB3aGVuIGNvbXBvbmVudCBpcyByZWFkeVxuICogQGZpcmVzIGd2LWNvZGU6Y2xpcGJvYXJkLWNvcHkgLSBldmVudCBkaXNwYXRjaCB3aGVuIGNvbXBvbmVudCB0aGUgYHZhbHVlYCBoYXMgYmVlbiBjb3BpZWQgdG8gY2xpcGJvYXJkXG4gKlxuICogQGF0dHIge1N0cmluZ30gbGFiZWwgLSBjb2RlIGxhbmd1YWdlXG4gKiBAYXR0ciB7U3RyaW5nfSB2YWx1ZSAtIGNvZGUgY29udGVudCB0byBiZSBoaWdobGlnaHRlZFxuICogQGF0dHIge29wdGlvbnN9IE9iamVjdCAtIG9wdGlvbnMgYmFzZWQgb24gY29kZW1pcnJvciBodHRwczovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb25maWdcbiAqIEBhdHRyIHtTdHJpbmd9IHBsYWNlaG9sZGVyIC0gYW4gZXhhbXBsZSB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSBpbnB1dCB3aGVuIGVtcHR5XG4gKiBAYXR0ciB7TnVtYmVyfSByb3dzIC0gbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHRleHQgZWxlbWVudFxuICogQGF0dHIge0Jvb2xlYW59IGxhcmdlIC0gZm9yIGEgbGFyZ2UgaW5wdXQgKG9ubHkgaWYgdGhlIGZpZWxkIGhhcyBvbmUgcm93KVxuICogQGF0dHIge0Jvb2xlYW59IG1lZGl1bSAtIGZvciBhIG1lZGl1bSBpbnB1dCAob25seSBpZiB0aGUgZmllbGQgaGFzIG9uZSByb3cpIChEZWZhdWx0KVxuICogQGF0dHIge0Jvb2xlYW59IHNtYWxsIC0gZm9yIGEgc21hbGwgaW5wdXQgKG9ubHkgaWYgdGhlIGZpZWxkIGhhcyBvbmUgcm93KVxuICpcbiAqIEBhdHRyIHtCb29sZWFufSBbY2xpcGJvYXJkPWZhbHNlXS0gdHJ1ZSBpZiBmaWVsZCBoYXMgY2xpcGJvYXJkIGJ1dHRvblxuICogQGF0dHIge0Jvb2xlYW59IFthdXRvZm9jdXM9ZmFsc2VdIC0gdHJ1ZSB0byBwdXQgdGhlIGZvY3VzIG9uIHRoZSBpbnB1dFxuICogQGF0dHIge0Jvb2xlYW59IFtyZWFkb25seT1mYWxzZV0gLSB0cnVlIGlmIGZpZWxkIGlzIHJlYWRvbmx5IG1vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIEd2Q29kZSBleHRlbmRzIElucHV0RWxlbWVudChMaXRFbGVtZW50KSB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIucHJvcGVydGllcyxcbiAgICAgIG9wdGlvbnM6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBjbGlwYm9hcmQ6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgX2NsaXBib2FyZEljb246IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBfY29kZU1pcnJvcjogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHJvd3M6IHsgdHlwZTogTnVtYmVyIH0sXG4gICAgICBfZXJyb3I6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faWQgPSBgZ3YtY29kZS0ke3V1aWQoKX1gO1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB0aGlzLnJlYWRvbmx5ID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NsaXBib2FyZEljb24gPSBzaGFwZUNsaXBib2FyZDtcbiAgfVxuXG4gIF9vbkVycm9yKCkge1xuICAgIHRoaXMuX2Vycm9yID0gYENhbm5vdCBsb2FkIGxpYnJhcnksIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uLmA7XG4gIH1cblxuICBhc3luYyBfb25Mb2FkKCkge1xuICAgIGlmICh0aGlzLl9sb2FkZWQgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5jbGlwYm9hcmQpIHtcbiAgICAgICAgaW1wb3J0KCdjbGlwYm9hcmQtY29weScpLnRoZW4oKG1vZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvcHkgPSBtb2QuZGVmYXVsdDtcbiAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtYnV0dG9uJykuYWRkRXZlbnRMaXN0ZW5lcignZ3YtYnV0dG9uOmNsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29weSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2NvcGllZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jbGlwYm9hcmRJY29uID0gc2hhcGVDb3BpZWQ7XG4gICAgICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjbGlwYm9hcmQtY29weScpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvcGllZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLl9jbGlwYm9hcmRJY29uID0gc2hhcGVDbGlwYm9hcmQ7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UHJvY2Vzc2VkT3B0aW9ucygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAob3B0aW9ucy5tb2RlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBtb2RlID0gdHlwZW9mIG9wdGlvbnMubW9kZSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLm1vZGUgOiBvcHRpb25zLm1vZGUubmFtZTtcbiAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FzY2lpZG9jJykge1xuICAgICAgICAgICAgYXdhaXQgaW1wb3J0KCdjb2RlbWlycm9yLWFzY2lpZG9jL2xpYi9hc2NpaWRvYy5qcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBpbXBvcnQoYGNvZGVtaXJyb3IvbW9kZS8ke21vZGV9LyR7bW9kZX0uanNgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVyKSB7fVxuXG4gICAgICBjb25zdCB0ZXh0QXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLl9pZH1gKTtcbiAgICAgIHRoaXMuX2NvZGVNaXJyb3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh0ZXh0QXJlYSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi57XG4gICAgICAgICAgdGhlbWU6ICdtZG4tbGlrZScsXG4gICAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlLFxuICAgICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgIGF1dG9mb2N1czogdGhpcy5hdXRvZm9jdXMsXG4gICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IHRoaXMuc2luZ2xlTGluZSA/IG51bGwgOiAnbmF0aXZlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29kZU1pcnJvci5mb2N1cygpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdyZWFkeScpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fZXJyb3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImVycm9yXCI+JHt0aGlzLl9lcnJvcn08L2Rpdj5gO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYFxuICAgICAgPGxpbmsgQGxvYWQ9XCIke3RoaXMuX29uTG9hZH1cIiBAZXJyb3I9JHt0aGlzLl9vbkVycm9yfSByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi4vY3NzL2NvZGVtaXJyb3IvYWxsLmNzc1wiIC8+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcCh7XG4gICAgICAgICAgYm94OiB0cnVlLFxuICAgICAgICAgICdib3gtaW52aXNpYmxlJzogdGhpcy5za2VsZXRvbixcbiAgICAgICAgICBsYXJnZTogdGhpcy5sYXJnZSxcbiAgICAgICAgICBtZWRpdW06IHRoaXMubWVkaXVtIHx8ICghdGhpcy5sYXJnZSAmJiAhdGhpcy5zbWFsbCksXG4gICAgICAgICAgc21hbGw6IHRoaXMuc21hbGwsXG4gICAgICAgIH0pfVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKHsgaW5wdXQ6IHRoaXMuc2luZ2xlTGluZSB9KX1cIj5cbiAgICAgICAgICAke3RoaXMubGFiZWwgPyBodG1sYDxsYWJlbCBmb3I9XCJjb2RlXCI+JHt0aGlzLmxhYmVsfTwvbGFiZWw+YCA6ICcnfVxuICAgICAgICAgICR7dGhpcy5jbGlwYm9hcmRcbiAgICAgICAgICAgID8gaHRtbGA8Z3YtYnV0dG9uXG4gICAgICAgICAgICAgICAgdGl0bGU9XCIke2kxOG4oJ2d2LWNvZGUuY29weScpfVwiXG4gICAgICAgICAgICAgICAgP291dGxpbmVkPVwiJHshdGhpcy5fY29waWVkfVwiXG4gICAgICAgICAgICAgICAgP3ByaW1hcnk9XCIke3RoaXMuX2NvcGllZH1cIlxuICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgaWNvbj1cIiR7dGhpcy5fY2xpcGJvYXJkSWNvbn1cIlxuICAgICAgICAgICAgICA+PC9ndi1idXR0b24+YFxuICAgICAgICAgICAgOiAnJ31cbiAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCIke3RoaXMuX2lkfVwiIG5hbWU9XCJjb2RlXCI+JHt0aGlzLnZhbHVlfTwvdGV4dGFyZWE+XG4gICAgICAgICAgJHt0aGlzLnNrZWxldG9uID8gaHRtbGA8ZGl2IGNsYXNzPVwic2tlbGV0b25cIj48L2Rpdj5gIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke3RoaXMuZGVzY3JpcHRpb24gIT0gbnVsbCA/IGh0bWxgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgLmlubmVySFRNTD1cIiR7dGhpcy5kZXNjcmlwdGlvbn1cIj48L2Rpdj5gIDogJyd9XG4gICAgYDtcbiAgfVxuXG4gIF9vbkNoYW5nZShjbSkge1xuICAgIHRoaXMudmFsdWUgPSBjbS5nZXRWYWx1ZSgpO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2lucHV0JywgdGhpcy52YWx1ZSk7XG4gIH1cblxuICBnZXQgc2luZ2xlTGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzID09PSAxO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuX2NvZGVNaXJyb3IgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fY29kZU1pcnJvci5vZmYoJ2JlZm9yZUNoYW5nZScsIHRoaXMuX2hhbmRsZXJzLmJlZm9yZUNoYW5nZSk7XG4gICAgICB0aGlzLl9jb2RlTWlycm9yLm9mZignY2hhbmdlJywgdGhpcy5faGFuZGxlcnMuY2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge1xuICAgICAgYmVmb3JlQ2hhbmdlOiAoY20sIGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNpbmdsZUxpbmUgJiYgdGhpcy5faWQgPT09IGNtLmdldFRleHRBcmVhKCkuaWQpIHtcbiAgICAgICAgICAvLyBJZGVudGlmeSB0eXBpbmcgZXZlbnRzIHRoYXQgYWRkIGEgbmV3bGluZSB0byB0aGUgYnVmZmVyLlxuICAgICAgICAgIGNvbnN0IGhhc1R5cGVkTmV3bGluZSA9IGV2ZW50Lm9yaWdpbiA9PT0gJytpbnB1dCcgJiYgdHlwZW9mIGV2ZW50LnRleHQgPT09ICdvYmplY3QnICYmIGV2ZW50LnRleHQuam9pbignJykgPT09ICcnO1xuXG4gICAgICAgICAgLy8gUHJldmVudCBuZXdsaW5lIGNoYXJhY3RlcnMgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgYnVmZmVyLlxuICAgICAgICAgIGlmIChoYXNUeXBlZE5ld2xpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudC5jYW5jZWwoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZGVudGlmeSBwYXN0ZSBldmVudHMuXG4gICAgICAgICAgY29uc3QgaGFzUGFzdGVkTmV3bGluZSA9IGV2ZW50Lm9yaWdpbiA9PT0gJ3Bhc3RlJyAmJiB0eXBlb2YgZXZlbnQudGV4dCA9PT0gJ29iamVjdCcgJiYgZXZlbnQudGV4dC5sZW5ndGggPiAxO1xuXG4gICAgICAgICAgLy8gRm9ybWF0IHBhc3RlZCB0ZXh0IHRvIHJlcGxhY2UgbmV3bGluZXMgd2l0aCBzcGFjZXMuXG4gICAgICAgICAgaWYgKGhhc1Bhc3RlZE5ld2xpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBldmVudC50ZXh0LmpvaW4oJyAnKTtcbiAgICAgICAgICAgIHJldHVybiBldmVudC51cGRhdGUobnVsbCwgbnVsbCwgW25ld1RleHRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgY2hhbmdlOiAoY20pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lkID09PSBjbS5nZXRUZXh0QXJlYSgpLmlkKSB7XG4gICAgICAgICAgdGhpcy5fb25DaGFuZ2UoY20pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gICAgQ29kZU1pcnJvci5kZWZpbmVJbml0SG9vaygoY20pID0+IHtcbiAgICAgIGNtLm9uKCdiZWZvcmVDaGFuZ2UnLCB0aGlzLl9oYW5kbGVycy5iZWZvcmVDaGFuZ2UpO1xuICAgICAgY20ub24oJ2NoYW5nZScsIHRoaXMuX2hhbmRsZXJzLmNoYW5nZSk7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0UHJvY2Vzc2VkT3B0aW9ucygpIHtcbiAgICBjb25zdCBvcHRpb25zID0geyAuLi50aGlzLm9wdGlvbnMgfTtcbiAgICBpZiAob3B0aW9ucy5tb2RlID09PSAnanNvbicgfHwgb3B0aW9ucy5tb2RlID09PSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICAgIG9wdGlvbnMubW9kZSA9IHtcbiAgICAgICAgbmFtZTogJ2phdmFzY3JpcHQnLFxuICAgICAgICBqc29uOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgIG9wdGlvbnMucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykge1xuICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xhYmVsJykgJiYgdGhpcy5sYWJlbCkge1xuICAgICAgdGhpcy5zY3JlZW5SZWFkZXJMYWJlbCA9IHRoaXMubGFiZWw7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ZhbHVlJykpIHtcbiAgICAgIGlmICh0aGlzLmdldENNKCkgIT0gbnVsbCAmJiB0aGlzLmdldENNKCkuZ2V0VmFsdWUoKSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWUgIT0gbnVsbCA/IHRoaXMudmFsdWUgOiAnJztcbiAgICAgICAgdGhpcy5nZXRDTSgpLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q00oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gIH1cblxuICByZXNpemUoKSB7XG4gICAgaWYgKHRoaXMuX2NvZGVNaXJyb3IpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRQcm9jZXNzZWRPcHRpb25zKCk7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsICYmIG9wdGlvbnMucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJCeUxpbmVzID0gb3B0aW9ucy5wbGFjZWhvbGRlci5zcGxpdCgnXFxuJyk7XG4gICAgICAgIHRoaXMuX2NvZGVNaXJyb3Iuc2V0U2l6ZShudWxsLCBwbGFjZWhvbGRlckJ5TGluZXMubGVuZ3RoICogMTgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29kZU1pcnJvci5zZXRTaXplKG51bGwsIG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBza2VsZXRvbixcbiAgICAgIGVtcHR5LFxuICAgICAgaW5wdXQsXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgbWFyZ2luOiAwIDAuMnJlbSAwLjJyZW0gMC4ycmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLnNrZWxldG9uIHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ib3gge1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ib3gtaW52aXNpYmxlIHtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA3MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveC1pbnZpc2libGUgPiAqOm5vdCguc2tlbGV0b24pIHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHRhcmVhW25hbWU9J2NvZGUnXSB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsIHtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMTVweDtcbiAgICAgICAgICBwYWRkaW5nOiAwIDAgMC4ycmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICBndi1idXR0b24ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgICB0b3A6IDA7XG4gICAgICAgICAgei1pbmRleDogMTA7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogRW5hYmxlIGF1dG9yZXNpemU6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvZGVtby9yZXNpemUuaHRtbCAqKi9cbiAgICAgICAgLkNvZGVNaXJyb3Ige1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBPdmVyd3JpdGUgY29kZSBtaXJyb3IgY29sb3JzICoqL1xuICAgICAgICA6aG9zdChbaW52YWxpZF0pIC5jbS1zLW1kbi1saWtlIC5Db2RlTWlycm9yLWd1dHRlcnMge1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZ3YtdGhlbWUtY29sb3ItZXJyb3ItZGFyaywgI2QzMmYyZik7XG4gICAgICAgIH1cblxuICAgICAgICAuY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHtcbiAgICAgICAgICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHZhcigtLWd2LXRoZW1lLWNvbG9yLCAjNWE3Njg0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBPdmVyd3JpdGUgY29kZSBtaXJyb3IgZm9yIGlucHV0IHN0eWxlICoqL1xuICAgICAgICAuaW5wdXQge1xuICAgICAgICAgIC0taW5wdXQtbWVkaXVtLS1wOiAxMXB4IDVweCA5cHg7XG4gICAgICAgIH1cblxuICAgICAgICAuaW5wdXQgLkNvZGVNaXJyb3ItbGluZXMge1xuICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuaW5wdXQgLkNvZGVNaXJyb3Itd3JhcCBwcmUuQ29kZU1pcnJvci1saW5lLFxuICAgICAgICAuaW5wdXQgLkNvZGVNaXJyb3Itd3JhcCBwcmUuQ29kZU1pcnJvci1saW5lIHtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgICAgICB9XG5cbiAgICAgICAgLm1lZGl1bSAuaW5wdXQgLkNvZGVNaXJyb3Ige1xuICAgICAgICAgIGhlaWdodDogdmFyKC0taW5wdXQtbWVkaXVtLS1saCk7XG4gICAgICAgIH1cblxuICAgICAgICAuc21hbGwgLmlucHV0IC5Db2RlTWlycm9yIHtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWlucHV0LXNtYWxsLS1saCk7XG4gICAgICAgIH1cblxuICAgICAgICAubGFyZ2UgLmlucHV0IC5Db2RlTWlycm9yIHtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWlucHV0LWxhcmdlLS1saCk7XG4gICAgICAgIH1cblxuICAgICAgICAuaW5wdXQgLkNvZGVNaXJyb3Itc2l6ZXIge1xuICAgICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuaW5wdXQgLkNvZGVNaXJyb3Itc2Nyb2xsIHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1jb2RlJywgR3ZDb2RlKTtcbiJdfQ==
|
|
297
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1jb2RlLmpzIl0sIm5hbWVzIjpbImNzcyIsImh0bWwiLCJFZGl0b3JWaWV3IiwiYmFzaWNTZXR1cCIsIkVkaXRvclN0YXRlIiwiQ29tcGFydG1lbnQiLCJhdXRvY29tcGxldGlvbiIsImpzb24iLCJsYW5ndWFnZXMiLCJwbGFjZWhvbGRlciIsInNoYXBlQ2xpcGJvYXJkIiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsInV1aWQiLCJjbGFzc01hcCIsIkd2SW5wdXQiLCJza2VsZXRvbiIsImVtcHR5IiwiaW5wdXQiLCJHdkNvZGUiLCJwcm9wZXJ0aWVzIiwib3B0aW9ucyIsInR5cGUiLCJPYmplY3QiLCJyb3dzIiwiTnVtYmVyIiwiX2Vycm9yIiwiU3RyaW5nIiwiYXR0cmlidXRlIiwiY29uc3RydWN0b3IiLCJfaWQiLCJ2YWx1ZSIsInJlYWRvbmx5IiwiYXV0b2ZvY3VzIiwiY2xpcGJvYXJkIiwiX2NsaXBib2FyZEljb24iLCJsYW5ndWFnZUNvbXBhcnRtZW50IiwicmVhZG9ubHlDb21wYXJ0bWVudCIsInBsYWNlaG9sZGVyQ29tcGFydG1lbnQiLCJyZW5kZXIiLCJjbGFzc2VzIiwiYm94IiwibGFyZ2UiLCJtZWRpdW0iLCJzbWFsbCIsImNvcGllZCIsImhhc0NsaXBib2FyZCIsIl9jb3BpZWQiLCJpbnB1dENsYXNzZXMiLCJjb250ZW50IiwiY29kZSIsImhhc0lucHV0U3R5bGUiLCJsYWJlbCIsInJlbmRlckljb24iLCJkZXNjcmlwdGlvbiIsImJpbmRJbnB1dEV2ZW50cyIsImN1cnJlbnRUYXJnZXQiLCJfYXV0b2NvbXBsZXRlIiwiY29tcGxldGlvbkNvbnRleHQiLCJoYW5kbGVyIiwibWF0Y2giLCJmaW5kQmVzdEF1dG9jb21wbGV0ZUhhbmRsZXIiLCJydW4iLCJjYWxsIiwiZGVmYXVsdENvbXBsZXRpb25IYW5kbGVyIiwibGFuZ3VhZ2UiLCJzdGF0ZSIsImxhbmd1YWdlRGF0YUF0IiwicG9zIiwibGVuZ3RoIiwiZnJvbSIsIl9nZXRFeHRlbnNpb25zIiwiY29kZW1pcnJvclRoZW1lIiwib2YiLCJ0cmFuc2FjdGlvbkZpbHRlciIsInRyIiwibmV3RG9jIiwibGluZXMiLCJlZGl0YWJsZSIsImRpc2FibGVkIiwidXBkYXRlTGlzdGVuZXIiLCJ2aWV3VXBkYXRlIiwiZG9jQ2hhbmdlZCIsIl9lZGl0b3JWaWV3IiwiZG9jIiwidG9TdHJpbmciLCJhY3RpdmF0ZU9uVHlwaW5nIiwib3ZlcnJpZGUiLCJiaW5kIiwiZ2V0RXh0ZW5zaW9ucyIsImdldElucHV0RWxlbWVudCIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yIiwiZmlyc3RVcGRhdGVkIiwiX2VkaXRvclN0YXRlIiwiY3JlYXRlIiwiZXh0ZW5zaW9ucyIsInBhcmVudCIsInJvb3QiLCJkaXNwYXRjaCIsInRyYW5zYWN0aW9uIiwidXBkYXRlIiwiZSIsImFwcGVuZENoaWxkIiwiZG9tIiwidXBkYXRlZCIsImhhcyIsIl9yZWZsZWN0UGxhY2Vob2xkZXIiLCJfcmVmbGVjdFZhbHVlIiwiX3JlZmxlY3RSZWFkb25seURpc2FibGVkIiwiX3JlZmxlY3RPcHRpb25zIiwiZWZmZWN0cyIsInJlY29uZmlndXJlIiwiY2hhbmdlcyIsInRvIiwiaW5zZXJ0IiwiZmluZExhbmd1YWdlIiwibW9kZSIsIm1vZGVPbmx5Iiwic3BsaXQiLCJwb3AiLCJhc2NpaWRvYyIsIlN0cmVhbUxhbmd1YWdlIiwiUHJvbWlzZSIsImFsbCIsIm5hbWUiLCJzdXBwb3J0IiwiZXh0ZW5zaW9uIiwiZGVmaW5lIiwiZmluZCIsImxhbmd1YWdlRGVzY3JpcHRpb24iLCJ0b1VwcGVyQ2FzZSIsImFsaWFzIiwiaW5jbHVkZXMiLCJjb25zb2xlIiwid2FybiIsIm1hcCIsImwiLCJsb2FkIiwidGhlbWUiLCJvdXRsaW5lIiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJib3JkZXJMZWZ0IiwiYm9yZGVyQ29sb3IiLCJzdHlsZXMiLCJ3aW5kb3ciLCJj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SyxFQUdMQyxLQUhLLEVBSUxDLEtBSkssRUFLTDtBQUNBakIsSUFBQUEsR0FBRyxxekJBTkUsQ0FBUDtBQXVFRDs7QUEzU2lDO0FBOFNwQ2lKLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQm5CLE1BQXRCLENBQTZCLFNBQTdCLEVBQXdDN0csTUFBeEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgRWRpdG9yVmlldywgYmFzaWNTZXR1cCB9IGZyb20gJ0Bjb2RlbWlycm9yL2Jhc2ljLXNldHVwJztcbmltcG9ydCB7IEVkaXRvclN0YXRlLCBDb21wYXJ0bWVudCB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IGF1dG9jb21wbGV0aW9uIH0gZnJvbSAnQGNvZGVtaXJyb3IvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IGpzb24gfSBmcm9tICdAY29kZW1pcnJvci9sYW5nLWpzb24nO1xuaW1wb3J0IHsgbGFuZ3VhZ2VzIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UtZGF0YSc7XG5pbXBvcnQgeyBwbGFjZWhvbGRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuXG5pbXBvcnQgeyBzaGFwZUNsaXBib2FyZCB9IGZyb20gJy4uL3N0eWxlcy9zaGFwZXMnO1xuaW1wb3J0IHsgZGlzcGF0Y2hDdXN0b21FdmVudCB9IGZyb20gJy4uL2xpYi9ldmVudHMnO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC1odG1sL2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IEd2SW5wdXQgfSBmcm9tICcuLi9hdG9tcy9ndi1pbnB1dCc7XG5pbXBvcnQgeyBza2VsZXRvbiB9IGZyb20gJy4uL3N0eWxlcy9za2VsZXRvbic7XG5pbXBvcnQgeyBlbXB0eSB9IGZyb20gJy4uL3N0eWxlcy9lbXB0eSc7XG5pbXBvcnQgeyBpbnB1dCB9IGZyb20gJy4uL3N0eWxlcy9pbnB1dCc7XG5cbi8qKlxuICogQ29kZSBjb21wb25lbnRcbiAqXG4gKiAjIyBEZXRhaWxzXG4gKiAqIGhhcyBAdGhlbWUgZmFjZXRcbiAqXG4gKiBAZmlyZXMgZ3YtY29kZTppbnB1dCAtIGlucHV0IGV2ZW50cyB3aXRoIHRoZSBgdmFsdWVgIG9uIGBkZXRhaWxgXG4gKiBAZmlyZXMgZ3YtY29kZTpyZWFkeSAtIGV2ZW50IGRpc3BhdGNoIHdoZW4gY29tcG9uZW50IGlzIHJlYWR5XG4gKiBAZmlyZXMgZ3YtY29kZTpjbGlwYm9hcmQtY29weSAtIGV2ZW50IGRpc3BhdGNoIHdoZW4gY29tcG9uZW50IHRoZSBgdmFsdWVgIGhhcyBiZWVuIGNvcGllZCB0byBjbGlwYm9hcmRcbiAqXG4gKiBAYXR0ciB7U3RyaW5nfSBsYWJlbCAtIGNvZGUgbGFuZ3VhZ2VcbiAqIEBhdHRyIHtTdHJpbmd9IHZhbHVlIC0gY29kZSBjb250ZW50IHRvIGJlIGhpZ2hsaWdodGVkXG4gKiBAYXR0ciB7b3B0aW9uc30gT2JqZWN0IC0gb3B0aW9ucyBiYXNlZCBvbiBjb2RlbWlycm9yXG4gKiBAYXR0ciB7U3RyaW5nfSBwbGFjZWhvbGRlciAtIGFuIGV4YW1wbGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgaW5wdXQgd2hlbiBlbXB0eVxuICogQGF0dHIge051bWJlcn0gcm93cyAtIG51bWJlciBvZiByb3dzIG9mIHRoZSB0ZXh0IGVsZW1lbnRcbiAqIEBhdHRyIHtCb29sZWFufSBsYXJnZSAtIGZvciBhIGxhcmdlIGlucHV0IChvbmx5IGlmIHRoZSBmaWVsZCBoYXMgb25lIHJvdylcbiAqIEBhdHRyIHtCb29sZWFufSBtZWRpdW0gLSBmb3IgYSBtZWRpdW0gaW5wdXQgKG9ubHkgaWYgdGhlIGZpZWxkIGhhcyBvbmUgcm93KSAoRGVmYXVsdClcbiAqIEBhdHRyIHtCb29sZWFufSBzbWFsbCAtIGZvciBhIHNtYWxsIGlucHV0IChvbmx5IGlmIHRoZSBmaWVsZCBoYXMgb25lIHJvdylcbiAqXG4gKiBAYXR0ciB7Qm9vbGVhbn0gW2NsaXBib2FyZD1mYWxzZV0tIHRydWUgaWYgZmllbGQgaGFzIGNsaXBib2FyZCBidXR0b25cbiAqIEBhdHRyIHtCb29sZWFufSBbYXV0b2ZvY3VzPWZhbHNlXSAtIHRydWUgdG8gcHV0IHRoZSBmb2N1cyBvbiB0aGUgaW5wdXRcbiAqIEBhdHRyIHtCb29sZWFufSBbcmVhZG9ubHk9ZmFsc2VdIC0gdHJ1ZSBpZiBmaWVsZCBpcyByZWFkb25seSBtb2RlXG4gKi9cbmV4cG9ydCBjbGFzcyBHdkNvZGUgZXh0ZW5kcyBHdklucHV0IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5wcm9wZXJ0aWVzLFxuICAgICAgb3B0aW9uczogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHJvd3M6IHsgdHlwZTogTnVtYmVyIH0sXG4gICAgICBfZXJyb3I6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faWQgPSBgZ3YtY29kZS0ke3V1aWQoKX1gO1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB0aGlzLnJlYWRvbmx5ID0gZmFsc2U7XG4gICAgdGhpcy5hdXRvZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NsaXBib2FyZEljb24gPSBzaGFwZUNsaXBib2FyZDtcbiAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgICB0aGlzLnJlYWRvbmx5Q29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgYm94OiB0cnVlLFxuICAgICAgJ2JveC1pbnZpc2libGUnOiB0aGlzLnNrZWxldG9uLFxuICAgICAgbGFyZ2U6IHRoaXMubGFyZ2UsXG4gICAgICBtZWRpdW06IHRoaXMubWVkaXVtIHx8ICghdGhpcy5sYXJnZSAmJiAhdGhpcy5zbWFsbCksXG4gICAgICBzbWFsbDogdGhpcy5zbWFsbCxcbiAgICAgIGNvcGllZDogdGhpcy5oYXNDbGlwYm9hcmQgJiYgdGhpcy5fY29waWVkLFxuICAgIH07XG4gICAgY29uc3QgaW5wdXRDbGFzc2VzID0ge1xuICAgICAgY29udGVudDogdHJ1ZSxcbiAgICAgIGNvZGU6ICF0aGlzLmhhc0lucHV0U3R5bGUsXG4gICAgICBpbnB1dDogdGhpcy5oYXNJbnB1dFN0eWxlLFxuICAgIH07XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKGNsYXNzZXMpfVwiPlxuICAgICAgICAke3RoaXMubGFiZWwgPyBodG1sYDxsYWJlbCBmb3I9XCJjb2RlXCI+JHt0aGlzLmxhYmVsfTwvbGFiZWw+YCA6ICcnfVxuICAgICAgICA8ZGl2IGlkPVwiJHt0aGlzLl9pZH1cIiBjbGFzcz1cIiR7Y2xhc3NNYXAoaW5wdXRDbGFzc2VzKX1cIj5cbiAgICAgICAgICA8IS0tIE5vIGZvcm1hdCBwbGVhc2UgLS0+XG4gICAgICAgICAgJHt0aGlzLnJlbmRlckljb24oKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICR7dGhpcy5kZXNjcmlwdGlvbiAhPSBudWxsID8gaHRtbGA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIiAuaW5uZXJIVE1MPVwiJHt0aGlzLmRlc2NyaXB0aW9ufVwiPjwvZGl2PmAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgYmluZElucHV0RXZlbnRzKCkge1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3JlYWR5JywgeyBjdXJyZW50VGFyZ2V0OiB0aGlzIH0pO1xuICB9XG5cbiAgZ2V0IGhhc0lucHV0U3R5bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93cyA9PT0gMTtcbiAgfVxuXG4gIF9hdXRvY29tcGxldGUoY29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBjb25zdCB7IGhhbmRsZXIsIG1hdGNoIH0gPSB0aGlzLmZpbmRCZXN0QXV0b2NvbXBsZXRlSGFuZGxlcihjb21wbGV0aW9uQ29udGV4dCk7XG4gICAgcmV0dXJuIGhhbmRsZXIucnVuLmNhbGwodGhpcywgY29tcGxldGlvbkNvbnRleHQsIG1hdGNoKTtcbiAgfVxuXG4gIGZpbmRCZXN0QXV0b2NvbXBsZXRlSGFuZGxlcihjb21wbGV0aW9uQ29udGV4dCkge1xuICAgIHJldHVybiB7IGhhbmRsZXI6IHRoaXMuZGVmYXVsdENvbXBsZXRpb25IYW5kbGVyLCBtYXRjaDogdHJ1ZSB9O1xuICB9XG5cbiAgZ2V0IGRlZmF1bHRDb21wbGV0aW9uSGFuZGxlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcnVuKGNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlID0gY29tcGxldGlvbkNvbnRleHQuc3RhdGUubGFuZ3VhZ2VEYXRhQXQoJ2F1dG9jb21wbGV0ZScsIGNvbXBsZXRpb25Db250ZXh0LnBvcyk7XG4gICAgICAgIGlmIChsYW5ndWFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhbmd1YWdlWzBdKGNvbXBsZXRpb25Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tOiBjb21wbGV0aW9uQ29udGV4dC5wb3MsIG9wdGlvbnM6IFtdIH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBfZ2V0RXh0ZW5zaW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgYmFzaWNTZXR1cCxcbiAgICAgIEd2Q29kZS5jb2RlbWlycm9yVGhlbWUsXG4gICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YoanNvbigpKSxcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJDb21wYXJ0bWVudC5vZihwbGFjZWhvbGRlcih0aGlzLnBsYWNlaG9sZGVyIHx8ICcnKSksXG4gICAgICBFZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlci5vZigodHIpID0+ICh0aGlzLmhhc0lucHV0U3R5bGUgJiYgdHIubmV3RG9jLmxpbmVzID4gMSA/IFtdIDogdHIpKSxcbiAgICAgIHRoaXMucmVhZG9ubHlDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKCF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLmRpc2FibGVkKSksXG4gICAgICBFZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyLm9mKCh2aWV3VXBkYXRlKSA9PiB7XG4gICAgICAgIGlmICh2aWV3VXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fZWRpdG9yVmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdpbnB1dCcsIHRoaXMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGF1dG9jb21wbGV0aW9uKHtcbiAgICAgICAgYWN0aXZhdGVPblR5cGluZzogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGU6IFt0aGlzLl9hdXRvY29tcGxldGUuYmluZCh0aGlzKV0sXG4gICAgICB9KSxcbiAgICAgIC4uLnRoaXMuZ2V0RXh0ZW5zaW9ucygpLFxuICAgIF07XG4gIH1cblxuICBnZXRFeHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldElucHV0RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZD0ke3RoaXMuX2lkfV1gKTtcbiAgfVxuXG4gIGZpcnN0VXBkYXRlZCgpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoKTtcbiAgICB0aGlzLl9lZGl0b3JTdGF0ZSA9IEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICBkb2M6IHRoaXMudmFsdWUsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLl9nZXRFeHRlbnNpb25zKCksXG4gICAgfSk7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5nZXRJbnB1dEVsZW1lbnQoKTtcbiAgICB0aGlzLl9lZGl0b3JWaWV3ID0gbmV3IEVkaXRvclZpZXcoe1xuICAgICAgcm9vdDogdGhpcy5zaGFkb3dSb290LFxuICAgICAgcGFyZW50LFxuICAgICAgc3RhdGU6IHRoaXMuX2VkaXRvclN0YXRlLFxuICAgICAgZGlzcGF0Y2g6ICh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2VkaXRvclZpZXcudXBkYXRlKFt0cmFuc2FjdGlvbl0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBkZWZhdWx0IGRpc3BhdGNoIGZuIHRocm93cyBhbiBOU19FUlJPUl9GQUlMVVJFIGF0IHJ1bnRpbWUuXG4gICAgICAgICAgLy8gSXQncyBzbyBzdHJhbmdlIGJ1dCB3aXRoIHRoaXMgY2F0Y2ggZXZlcnl0aGluZyBpcyBva2F5XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKHRoaXMuX2VkaXRvclZpZXcuZG9tKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZWQocHJvcGVydGllcykge1xuICAgIHN1cGVyLnVwZGF0ZWQocHJvcGVydGllcyk7XG4gICAgaWYgKHByb3BlcnRpZXMuaGFzKCdwbGFjZWhvbGRlcicpKSB7XG4gICAgICB0aGlzLl9yZWZsZWN0UGxhY2Vob2xkZXIoKTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnRpZXMuaGFzKCd2YWx1ZScpKSB7XG4gICAgICB0aGlzLl9yZWZsZWN0VmFsdWUoKTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnRpZXMuaGFzKCdyZWFkb25seScpIHx8IHByb3BlcnRpZXMuaGFzKCdkaXNhYmxlZCcpKSB7XG4gICAgICB0aGlzLl9yZWZsZWN0UmVhZG9ubHlEaXNhYmxlZCgpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydGllcy5oYXMoJ29wdGlvbnMnKSAmJiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlZmxlY3RPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgX3JlZmxlY3RQbGFjZWhvbGRlcigpIHtcbiAgICB0aGlzLl9lZGl0b3JWaWV3LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IHRoaXMucGxhY2Vob2xkZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShwbGFjZWhvbGRlcih0aGlzLnBsYWNlaG9sZGVyKSksXG4gICAgfSk7XG4gIH1cblxuICBfcmVmbGVjdFZhbHVlKCkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5fZWRpdG9yU3RhdGUudXBkYXRlKHtcbiAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgZnJvbTogMCxcbiAgICAgICAgdG86IHRoaXMuX2VkaXRvclN0YXRlLmRvYy5sZW5ndGgsXG4gICAgICAgIGluc2VydDogdGhpcy52YWx1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5fZWRpdG9yU3RhdGUgPSB0cmFuc2FjdGlvbi5zdGF0ZTtcbiAgfVxuXG4gIF9yZWZsZWN0UmVhZG9ubHlEaXNhYmxlZCgpIHtcbiAgICB0aGlzLl9lZGl0b3JWaWV3LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IHRoaXMucmVhZG9ubHlDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKCF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLmRpc2FibGVkKSksXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZmluZExhbmd1YWdlKG1vZGUpIHtcbiAgICBpZiAobW9kZSkge1xuICAgICAgY29uc3QgbW9kZU9ubHkgPSBtb2RlLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICBpZiAobW9kZU9ubHkgPT09ICdhc2NpaWRvYycpIHtcbiAgICAgICAgY29uc3QgW3sgYXNjaWlkb2MgfSwgeyBTdHJlYW1MYW5ndWFnZSB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBpbXBvcnQoJ2NvZGVtaXJyb3ItYXNjaWlkb2MvbGliL2FzY2lpZG9jJyksXG4gICAgICAgICAgaW1wb3J0KCdAY29kZW1pcnJvci9zdHJlYW0tcGFyc2VyJyksXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6ICdhc2NpaWRvYycsXG4gICAgICAgICAgc3VwcG9ydDoge1xuICAgICAgICAgICAgZXh0ZW5zaW9uOiBTdHJlYW1MYW5ndWFnZS5kZWZpbmUoYXNjaWlkb2MpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsYW5ndWFnZSA9IGxhbmd1YWdlcy5maW5kKChsYW5ndWFnZURlc2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGxhbmd1YWdlRGVzY3JpcHRpb24ubmFtZS50b1VwcGVyQ2FzZSgpID09PSBtb2RlT25seS50b1VwcGVyQ2FzZSgpIHx8IGxhbmd1YWdlRGVzY3JpcHRpb24uYWxpYXMuaW5jbHVkZXMobW9kZU9ubHkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxhbmd1YWdlID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgbGFuZ3VhZ2UgJHttb2RlfSwgcGxlYXNlIHVzZSBsYW5ndWFnZSBzdXBwb3J0ZWQgYnkgQ29kZU1pcnJvciA2YCxcbiAgICAgICAgICAgIGxhbmd1YWdlcy5tYXAoKGwpID0+IGwubmFtZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgX3JlZmxlY3RPcHRpb25zKCkge1xuICAgIGNvbnN0IGxhbmd1YWdlID0gYXdhaXQgR3ZDb2RlLmZpbmRMYW5ndWFnZSh0aGlzLm9wdGlvbnMubW9kZSk7XG4gICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHtcbiAgICAgIGlmIChsYW5ndWFnZS5zdXBwb3J0ID09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgbGFuZ3VhZ2UubG9hZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWRpdG9yVmlldy5kaXNwYXRjaCh7XG4gICAgICAgIGVmZmVjdHM6IHRoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsYW5ndWFnZS5zdXBwb3J0LmV4dGVuc2lvbiksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGNvZGVtaXJyb3JUaGVtZSgpIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnJi5jbS1lZGl0b3IuY20tZm9jdXNlZCc6IHtcbiAgICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgfSxcbiAgICAgICcuY20tZ3V0dGVycyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZ3YtaW5wdXQtaWNvbi0tYmdjLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLCAjZjVmNWY1KSknLFxuICAgICAgICBjb2xvcjogJ3ZhcigtLWd2LXRoZW1lLWZvbnQtY29sb3ItZGFyaywgIzI2MjYyNiknLFxuICAgICAgICBib3JkZXJMZWZ0OiAnNXB4IHNvbGlkJyxcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1ndi1pbnB1dC0tYmRjLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWRhcmssICNkOWQ5ZDkpKScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnN1cGVyLnN0eWxlcyxcbiAgICAgIHNrZWxldG9uLFxuICAgICAgZW1wdHksXG4gICAgICBpbnB1dCxcbiAgICAgIC8vIGxhbmd1YWdlPUNTU1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBtYXJnaW46IDAgMC4ycmVtIDAuMnJlbSAwLjJyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIGJvcmRlcjogdmFyKC0tZ3YtaW5wdXQtLWJkdywgMXB4KSB2YXIoLS1ndi1pbnB1dC0tYmRzLCBzb2xpZCkgdmFyKC0tZ3YtaW5wdXQtLWJkYywgdmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1kYXJrLCAjZDlkOWQ5KSk7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIH1cblxuICAgICAgICAuYnRuX2NvcHkge1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveC1pY29uIHtcbiAgICAgICAgICBib3R0b206IC0xcHg7XG4gICAgICAgICAgcmlnaHQ6IC0xcHg7XG4gICAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb2RlIC5ib3gtaWNvbiB7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvZGUgLmNtLWNvbnRlbnQsXG4gICAgICAgIC5jb2RlIC5jbS1ndXR0ZXJzIHtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWlucHV0LW1lZGl1bS0taCk7XG4gICAgICAgIH1cblxuICAgICAgICAubGFyZ2UgLmNvZGUgLmNtLWNvbnRlbnQsXG4gICAgICAgIC5sYXJnZSAuY29kZSAuY20tZ3V0dGVycyB7XG4gICAgICAgICAgaGVpZ2h0OiB2YXIoLS1pbnB1dC1sYXJnZS0taCk7XG4gICAgICAgIH1cblxuICAgICAgICAuc21hbGwgLmNvZGUgLmNtLWNvbnRlbnQsXG4gICAgICAgIC5zbWFsbCAuY29kZSAuY20tZ3V0dGVycyB7XG4gICAgICAgICAgaGVpZ2h0OiB2YXIoLS1pbnB1dC1zbWFsbC0taCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogIE92ZXJyaWRlIENvZGVtaXJyb3IgdGhlbWUgKi9cbiAgICAgICAgLmlucHV0IC5jbS1ndXR0ZXJzIHtcbiAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICB9XG5cbiAgICAgICAgLmlucHV0IC5jbS1zY3JvbGxlciB7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5pbnB1dCAuY20tYWN0aXZlTGluZSxcbiAgICAgICAgOmhvc3QoW3JlYWRvbmx5XSkgLmNtLWFjdGl2ZUxpbmUge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLmlucHV0IC5jbS1jb250ZW50IHtcbiAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgOmhvc3QoW2ludmFsaWRdKSAuY20tZ3V0dGVycyB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ndi10aGVtZS1jb2xvci1lcnJvciwgI2RhMWExYik7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1jb2RlJywgR3ZDb2RlKTtcbiJdfQ==
|