@rusticarcade/palette 0.4.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/dev/index.js +588 -722
- package/dist/prod/index.d.ts +154 -360
- package/dist/prod/index.js +1 -1
- package/dist/test/index.d.ts +128 -317
- package/dist/test/index.js +14 -210
- package/package.json +1 -1
package/dist/test/index.js
CHANGED
|
@@ -16,178 +16,6 @@ async function cleanupGlobalTestDOM() {
|
|
|
16
16
|
GlobalRegistrator.unregister();
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
// src/errors.ts
|
|
20
|
-
function getDevError(code) {
|
|
21
|
-
const DEV_ERROR_INFO = {
|
|
22
|
-
[0 /* INVARIANT */]: `
|
|
23
|
-
INVARIANT
|
|
24
|
-
A condition has occurred which should never happen, such as a code path that
|
|
25
|
-
shouldn't be reachable when using correct types, or a disallowed state.
|
|
26
|
-
`,
|
|
27
|
-
[1 /* INVALID_ENV */]: `
|
|
28
|
-
INVALID_ENV
|
|
29
|
-
Failed to find a custom elements registry in this environment. Is a window
|
|
30
|
-
global available with a customElements property?
|
|
31
|
-
`,
|
|
32
|
-
[2 /* INVALID_CALLSITE */]: `
|
|
33
|
-
INVALID_CALLSITE
|
|
34
|
-
A function was invoked with an invalid set of parameters.
|
|
35
|
-
`,
|
|
36
|
-
[100 /* INVALID_TAGNAME */]: `
|
|
37
|
-
INVALID_TAGNAME
|
|
38
|
-
Failed to determine a valid HTML Tag to use when registering a component as a
|
|
39
|
-
custom element. Specify a static readonly tagName property on your component
|
|
40
|
-
class or provide a tagName argument to Component.register.
|
|
41
|
-
|
|
42
|
-
Alternatively, you can directly register your element as you would any other
|
|
43
|
-
HTML custom element: customElements.define("my-tag", MyComponentClass);
|
|
44
|
-
`,
|
|
45
|
-
[300 /* MISSING_ELEMENT */]: `
|
|
46
|
-
MISSING_ELEMENT
|
|
47
|
-
An element was expected to exist but was not found when the DOM was queried.
|
|
48
|
-
`,
|
|
49
|
-
[301 /* MISSING_STATE */]: `
|
|
50
|
-
MISSING_STATE
|
|
51
|
-
A Component's reactive state was accessed, but no initialState is defined for
|
|
52
|
-
the Component's class. Initial state must be defined as an object or function.
|
|
53
|
-
`,
|
|
54
|
-
[302 /* INVALID_CONTENT */]: `
|
|
55
|
-
INVALID_CONTENT
|
|
56
|
-
Tried to set a value as content in a template, but the value was not a supported
|
|
57
|
-
type. Values must be a string, HTMLElement.
|
|
58
|
-
|
|
59
|
-
Instead, got %s: %s.
|
|
60
|
-
`,
|
|
61
|
-
[200 /* TEMPLATE_INVALID_VALUE */]: `
|
|
62
|
-
TEMPLATE_INVALID
|
|
63
|
-
The value %s cannot be interpolated via the Template html string helper.
|
|
64
|
-
Values may only be HTMLTemplateElements (template content is adopted) or
|
|
65
|
-
strings (shorthand for a ::swap directive on an element)
|
|
66
|
-
`,
|
|
67
|
-
[201 /* TEMPLATE_INVALID_NOTATION_SYNTAX */]: `
|
|
68
|
-
TEMPLATE_INVALID_NOTATION
|
|
69
|
-
A template value notation failed to parse. Notations must begin with one of
|
|
70
|
-
@, $, *, or #, followed by a dot-separated path of accessor names. Optionally,
|
|
71
|
-
notations may have modifiers such as the ! modifier.
|
|
72
|
-
|
|
73
|
-
The notation that failed to parse was "%s"
|
|
74
|
-
`,
|
|
75
|
-
[203 /* TEMPLATE_INVALID_COMPONENT */]: `
|
|
76
|
-
TEMPLATE_INVALID_COMPONENT
|
|
77
|
-
Failed to interpolate a Component in an html template string due to the
|
|
78
|
-
Component having an invalid tagName property.
|
|
79
|
-
|
|
80
|
-
Component "%s" has an invalid tagName property "%s"
|
|
81
|
-
`,
|
|
82
|
-
[204 /* TEMPLATE_INVALID_LIST_DATA */]: `
|
|
83
|
-
TEMPLATE_INVALID_LIST
|
|
84
|
-
A template failed to render because an ::each directive fetched a value which
|
|
85
|
-
was not an array of actionable data.
|
|
86
|
-
`,
|
|
87
|
-
[3 /* MISSING_NODE_REF */]: `
|
|
88
|
-
TEMPLATE_INVALID_NODE_REF
|
|
89
|
-
A template failed to prepare a node from a compiled source. Typically, this
|
|
90
|
-
means something is broken within the compiled template rather than an error with
|
|
91
|
-
the template content itself.
|
|
92
|
-
`,
|
|
93
|
-
[205 /* TEMPLATE_MISSING_LIST_KEY */]: `
|
|
94
|
-
TEMPLATE_MISSING_LIST_KEY
|
|
95
|
-
A template failed to compile because an ::each directive was found on an element
|
|
96
|
-
without a corresponding ::key directive. ::each directives must have a ::key
|
|
97
|
-
directive specified on the same element, whose notation evaluates to a unique
|
|
98
|
-
value for each item in the list.
|
|
99
|
-
|
|
100
|
-
Example: <li ::each="$items" ::key="#id"> ... </li>
|
|
101
|
-
`,
|
|
102
|
-
[206 /* TEMPLATE_DUPLICATE_LIST_KEY */]: `
|
|
103
|
-
TEMPLATE_DUPLICATE_LIST_KEY
|
|
104
|
-
A list failed to render because item key %s appeared multiple times when
|
|
105
|
-
resolving list item keys. Each ::key directive must reference a notation whose
|
|
106
|
-
value is unique for each list item.
|
|
107
|
-
`,
|
|
108
|
-
[207 /* TEMPLATE_INVALID_CONDITIONAL */]: `
|
|
109
|
-
TEMPLATE_INVALID_CONDITIONAL
|
|
110
|
-
A template failed to compile due to an invalid use of conditional directives.
|
|
111
|
-
|
|
112
|
-
Conditional elements must be siblings. The first conditional branch must use an
|
|
113
|
-
::if directive, followed by zero or more ::else-if directives, and finally zero
|
|
114
|
-
or one ::else directive.
|
|
115
|
-
|
|
116
|
-
::if and ::else-if directives must specify a notation to evaluate. ::else does
|
|
117
|
-
not take any values and is just a binary attribute.
|
|
118
|
-
`,
|
|
119
|
-
[202 /* TEMPLATE_MISSING_NOTATION */]: `
|
|
120
|
-
TEMPLATE_MISSING_NOTATION
|
|
121
|
-
A template failed to compile because a %s directive did not have an associated
|
|
122
|
-
notation despite requiring one.
|
|
123
|
-
`,
|
|
124
|
-
[303 /* INVALID_STATE_KEY */]: `
|
|
125
|
-
INVALID_STATE_KEY
|
|
126
|
-
Tried to access a state property which does not exist
|
|
127
|
-
|
|
128
|
-
Key path: %s
|
|
129
|
-
`,
|
|
130
|
-
[304 /* INVALID_STATE_UPDATE */]: `
|
|
131
|
-
INVALID_STATE_UPDATE
|
|
132
|
-
A Component's setState() was called with a value which could not be patched in
|
|
133
|
-
to the existing component state.
|
|
134
|
-
|
|
135
|
-
setState() takes a partial object describing state keys to update.
|
|
136
|
-
|
|
137
|
-
Instead, received: %s
|
|
138
|
-
`,
|
|
139
|
-
[305 /* STATE_LOCKED */]: `
|
|
140
|
-
STATE_LOCKED
|
|
141
|
-
A State received a request to update or lock while already locked.
|
|
142
|
-
States may be locked using the .lock() method and unlocked using the .unlock()
|
|
143
|
-
method. States lock during async mutations done through the .mutateAsync()
|
|
144
|
-
method if "true" is passed as the second parameter.
|
|
145
|
-
|
|
146
|
-
You can check the lock status of a State instance with .isLocked
|
|
147
|
-
`,
|
|
148
|
-
[306 /* MAX_SEQUENTIAL_RENDERS */]: `
|
|
149
|
-
MAX_SEQUENTIAL_RENDERS
|
|
150
|
-
A component has errored after re-rendering more than %s times in the same frame.
|
|
151
|
-
|
|
152
|
-
This typically happens because state or live attributes are being modified
|
|
153
|
-
during a render lifecycle method such as beforeUpdate() or afterUpdate(). If
|
|
154
|
-
state changes unconditionally during a render, the render will infinitely loop.
|
|
155
|
-
Updating render source data during a render cycle is supported, but infinite
|
|
156
|
-
update loops may occur if unchecked.
|
|
157
|
-
`,
|
|
158
|
-
[208 /* TEMPLATE_INVALID_KEY_DIRECTIVE */]: `
|
|
159
|
-
TEMPLATE_INVALID_KEY_DIRECTIVE
|
|
160
|
-
A template failed to compile because a ::key directive was found on an element
|
|
161
|
-
with no associated ::each directive. ::key directives can only be used in
|
|
162
|
-
association with list rendering via ::each.
|
|
163
|
-
`,
|
|
164
|
-
[209 /* TEMPLATE_PARENT_REQUIRED */]: `
|
|
165
|
-
TEMPLATE_PARENT_REQUIRED
|
|
166
|
-
A template failed to compile due to an element which requires a parent having
|
|
167
|
-
no available parent in the template.
|
|
168
|
-
|
|
169
|
-
::each and ::if/::else-if/::else elements must have a parent node.
|
|
170
|
-
`
|
|
171
|
-
};
|
|
172
|
-
return DEV_ERROR_INFO[code];
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
class PaletteError extends Error {
|
|
176
|
-
name = "PaletteError";
|
|
177
|
-
code;
|
|
178
|
-
constructor(code, ...values) {
|
|
179
|
-
let message = `Code: ${code}`;
|
|
180
|
-
if (true) {
|
|
181
|
-
message += getDevError(code);
|
|
182
|
-
for (const val of values) {
|
|
183
|
-
message = message.replace(`%s`, String(val));
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
super(message);
|
|
187
|
-
this.code = code;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
19
|
// src/util/attributes.ts
|
|
192
20
|
function serializeAttribute(value) {
|
|
193
21
|
if (typeof value === "string" || typeof value === "number") {
|
|
@@ -201,41 +29,22 @@ function serializeAttribute(value) {
|
|
|
201
29
|
}
|
|
202
30
|
return value.toString();
|
|
203
31
|
}
|
|
204
|
-
function
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
return map;
|
|
211
|
-
}
|
|
212
|
-
if (source instanceof Map) {
|
|
213
|
-
for (const [key, val] of source) {
|
|
214
|
-
map.set(key, serializeAttribute(val));
|
|
215
|
-
}
|
|
216
|
-
return map;
|
|
32
|
+
function applyAttribute(element, name, value) {
|
|
33
|
+
if (value === null) {
|
|
34
|
+
element.removeAttribute(name);
|
|
35
|
+
} else {
|
|
36
|
+
element.setAttribute(name, value);
|
|
217
37
|
}
|
|
218
|
-
if (typeof source === "object" && source !== null) {
|
|
219
|
-
for (const [key, val] of Object.entries(source)) {
|
|
220
|
-
map.set(key, serializeAttribute(val));
|
|
221
|
-
}
|
|
222
|
-
return map;
|
|
223
|
-
}
|
|
224
|
-
throw new PaletteError(0 /* INVARIANT */);
|
|
225
38
|
}
|
|
226
|
-
function
|
|
39
|
+
function applyElementAttributes(target, attrs) {
|
|
227
40
|
const currentNames = new Set(target.getAttributeNames());
|
|
228
|
-
const incomingNames = new Set(
|
|
41
|
+
const incomingNames = new Set(Object.keys(attrs));
|
|
229
42
|
const attributesToRemove = currentNames.difference(incomingNames);
|
|
230
43
|
for (const attr of attributesToRemove) {
|
|
231
44
|
target.removeAttribute(attr);
|
|
232
45
|
}
|
|
233
|
-
for (const [name, val] of attrs) {
|
|
234
|
-
|
|
235
|
-
target.removeAttribute(name);
|
|
236
|
-
} else {
|
|
237
|
-
target.setAttribute(name, val);
|
|
238
|
-
}
|
|
46
|
+
for (const [name, val] of Object.entries(attrs)) {
|
|
47
|
+
applyAttribute(target, name, serializeAttribute(val));
|
|
239
48
|
}
|
|
240
49
|
}
|
|
241
50
|
// src/util/lru-cache.ts
|
|
@@ -336,19 +145,14 @@ async function renderTestComponent(component, attributes2) {
|
|
|
336
145
|
customElements.define(useTagname, component);
|
|
337
146
|
}
|
|
338
147
|
const $component = document.createElement(component.tagName);
|
|
339
|
-
|
|
340
|
-
applyAttributeMap($component, attributeMap);
|
|
148
|
+
applyElementAttributes($component, attributes2 ?? {});
|
|
341
149
|
document.body.append($component);
|
|
342
150
|
await Bun.sleep(1);
|
|
343
151
|
return $component;
|
|
344
152
|
}
|
|
345
153
|
async function rerenderTestComponent(element) {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
await Bun.sleep(1);
|
|
349
|
-
resolve();
|
|
350
|
-
});
|
|
351
|
-
});
|
|
154
|
+
element.render();
|
|
155
|
+
await Bun.sleep(1);
|
|
352
156
|
}
|
|
353
157
|
export {
|
|
354
158
|
rerenderTestComponent,
|
|
@@ -358,5 +162,5 @@ export {
|
|
|
358
162
|
cleanupGlobalTestDOM
|
|
359
163
|
};
|
|
360
164
|
|
|
361
|
-
//# debugId=
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3QtdXRpbC9nbG9iYWwtZW52LnRzIiwgInNyYy9lcnJvcnMudHMiLCAic3JjL3V0aWwvYXR0cmlidXRlcy50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy90ZXN0LXV0aWwvdGFncy50cyIsICJzcmMvdGVzdC11dGlsL3JlbmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBHbG9iYWxSZWdpc3RyYXRvciB9IGZyb20gXCJAaGFwcHktZG9tL2dsb2JhbC1yZWdpc3RyYXRvclwiO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGdsb2JhbCB0ZXN0IERPTSBlbnZpcm9ubWVudCAodXNpbmcgSGFwcHlET00pXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlR2xvYmFsVGVzdERPTSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEdsb2JhbFRlc3RET00oKTtcbiAgR2xvYmFsUmVnaXN0cmF0b3IucmVnaXN0ZXIoKTtcbn1cblxuLyoqXG4gKiBDbGVhbnVwIHRoZSBnbG9iYWwgdGVzdCBET00gZW52aXJvbm1lbnQgKHVzaW5nIEhhcHB5RE9NKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEdsb2JhbFRlc3RET00oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aGlsZSAoZG9jdW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgQnVuLnNsZWVwKDEpO1xuXG4gIGlmIChHbG9iYWxSZWdpc3RyYXRvci5pc1JlZ2lzdGVyZWQpIHtcbiAgICBHbG9iYWxSZWdpc3RyYXRvci51bnJlZ2lzdGVyKCk7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG4vKipcbiAqIFBvc3NpYmxlIGVycm9yIHR5cGVzIGZvciB7QGxpbmsgUGFsZXR0ZUVycm9yfVxuICpcbiAqIENvZGVzIGFyZSBjYXRlZ29yaXplZCBpbnRvIGdyb3VwcyBieSB0aGUgMTAwJ3M6XG4gKlxuICogLSAwIC0gOTk6IEludmFyaWFudHNcbiAqIC0gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgLyBFbnZpcm9ubWVudCBFcnJvcnNcbiAqIC0gMjAwIC0gMjk5OiBUZW1wbGF0aW5nIEVycm9yc1xuICogLSAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIDAgLSA5OTogSW52YXJpYW50c1xuICBJTlZBUklBTlQgPSAwLFxuICBJTlZBTElEX0VOViA9IDEsXG4gIElOVkFMSURfQ0FMTFNJVEUgPSAyLFxuICBNSVNTSU5HX05PREVfUkVGID0gMyxcblxuICAvLyAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyBFcnJvcnNcbiAgSU5WQUxJRF9UQUdOQU1FID0gMTAwLFxuXG4gIC8vIDIwMCAtIDI5OTogVGVtcGxhdGUgRXJyb3JzXG4gIFRFTVBMQVRFX0lOVkFMSURfVkFMVUUgPSAyMDAsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYID0gMjAxLFxuICBURU1QTEFURV9NSVNTSU5HX05PVEFUSU9OID0gMjAyLFxuICBURU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVCA9IDIwMyxcbiAgVEVNUExBVEVfSU5WQUxJRF9MSVNUX0RBVEEgPSAyMDQsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkgPSAyMDUsXG4gIFRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSA9IDIwNixcbiAgVEVNUExBVEVfSU5WQUxJRF9DT05ESVRJT05BTCA9IDIwNyxcbiAgVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFID0gMjA4LFxuICBURU1QTEFURV9QQVJFTlRfUkVRVUlSRUQgPSAyMDksXG5cbiAgLy8gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICBNSVNTSU5HX0VMRU1FTlQgPSAzMDAsXG4gIE1JU1NJTkdfU1RBVEUgPSAzMDEsXG4gIElOVkFMSURfQ09OVEVOVCA9IDMwMixcbiAgSU5WQUxJRF9TVEFURV9LRVkgPSAzMDMsXG4gIElOVkFMSURfU1RBVEVfVVBEQVRFID0gMzA0LFxuICBTVEFURV9MT0NLRUQgPSAzMDUsXG4gIE1BWF9TRVFVRU5USUFMX1JFTkRFUlMgPSAzMDYsXG59XG5cbmZ1bmN0aW9uIGdldERldkVycm9yKGNvZGU6IEVycm9yQ29kZSkge1xuICBjb25zdCBERVZfRVJST1JfSU5GTzogUmVjb3JkPEVycm9yQ29kZSwgc3RyaW5nPiA9IHtcbiAgICBbRXJyb3JDb2RlLklOVkFSSUFOVF06IGBcbklOVkFSSUFOVFxuQSBjb25kaXRpb24gaGFzIG9jY3VycmVkIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4sIHN1Y2ggYXMgYSBjb2RlIHBhdGggdGhhdFxuc2hvdWxkbid0IGJlIHJlYWNoYWJsZSB3aGVuIHVzaW5nIGNvcnJlY3QgdHlwZXMsIG9yIGEgZGlzYWxsb3dlZCBzdGF0ZS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfRU5WXTogYFxuSU5WQUxJRF9FTlZcbkZhaWxlZCB0byBmaW5kIGEgY3VzdG9tIGVsZW1lbnRzIHJlZ2lzdHJ5IGluIHRoaXMgZW52aXJvbm1lbnQuIElzIGEgd2luZG93XG5nbG9iYWwgYXZhaWxhYmxlIHdpdGggYSBjdXN0b21FbGVtZW50cyBwcm9wZXJ0eT9cbmAsXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0NBTExTSVRFXTogYFxuSU5WQUxJRF9DQUxMU0lURVxuQSBmdW5jdGlvbiB3YXMgaW52b2tlZCB3aXRoIGFuIGludmFsaWQgc2V0IG9mIHBhcmFtZXRlcnMuICAgXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1RBR05BTUVdOiBgXG5JTlZBTElEX1RBR05BTUVcbkZhaWxlZCB0byBkZXRlcm1pbmUgYSB2YWxpZCBIVE1MIFRhZyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyBhIGNvbXBvbmVudCBhcyBhXG5jdXN0b20gZWxlbWVudC4gU3BlY2lmeSBhIHN0YXRpYyByZWFkb25seSB0YWdOYW1lIHByb3BlcnR5IG9uIHlvdXIgY29tcG9uZW50XG5jbGFzcyBvciBwcm92aWRlIGEgdGFnTmFtZSBhcmd1bWVudCB0byBDb21wb25lbnQucmVnaXN0ZXIuXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgeW91ciBlbGVtZW50IGFzIHlvdSB3b3VsZCBhbnkgb3RoZXJcbkhUTUwgY3VzdG9tIGVsZW1lbnQ6IGN1c3RvbUVsZW1lbnRzLmRlZmluZShcIm15LXRhZ1wiLCBNeUNvbXBvbmVudENsYXNzKTtcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVF06IGBcbk1JU1NJTkdfRUxFTUVOVFxuQW4gZWxlbWVudCB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IHdhcyBub3QgZm91bmQgd2hlbiB0aGUgRE9NIHdhcyBxdWVyaWVkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19TVEFURV06IGBcbk1JU1NJTkdfU1RBVEVcbkEgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2FzIGFjY2Vzc2VkLCBidXQgbm8gaW5pdGlhbFN0YXRlIGlzIGRlZmluZWQgZm9yXG50aGUgQ29tcG9uZW50J3MgY2xhc3MuIEluaXRpYWwgc3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIG9iamVjdCBvciBmdW5jdGlvbi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVF06IGBcbklOVkFMSURfQ09OVEVOVFxuVHJpZWQgdG8gc2V0IGEgdmFsdWUgYXMgY29udGVudCBpbiBhIHRlbXBsYXRlLCBidXQgdGhlIHZhbHVlIHdhcyBub3QgYSBzdXBwb3J0ZWRcbnR5cGUuIFZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLCBIVE1MRWxlbWVudC5cblxuSW5zdGVhZCwgZ290ICVzOiAlcy5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfVkFMVUVdOiBgXG5URU1QTEFURV9JTlZBTElEXG5UaGUgdmFsdWUgJXMgY2Fubm90IGJlIGludGVycG9sYXRlZCB2aWEgdGhlIFRlbXBsYXRlIGh0bWwgc3RyaW5nIGhlbHBlci5cblZhbHVlcyBtYXkgb25seSBiZSBIVE1MVGVtcGxhdGVFbGVtZW50cyAodGVtcGxhdGUgY29udGVudCBpcyBhZG9wdGVkKSBvclxuc3RyaW5ncyAoc2hvcnRoYW5kIGZvciBhIDo6c3dhcCBkaXJlY3RpdmUgb24gYW4gZWxlbWVudClcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTlxuQSB0ZW1wbGF0ZSB2YWx1ZSBub3RhdGlvbiBmYWlsZWQgdG8gcGFyc2UuIE5vdGF0aW9ucyBtdXN0IGJlZ2luIHdpdGggb25lIG9mXG5ALCAkLCAqLCBvciAjLCBmb2xsb3dlZCBieSBhIGRvdC1zZXBhcmF0ZWQgcGF0aCBvZiBhY2Nlc3NvciBuYW1lcy4gT3B0aW9uYWxseSxcbm5vdGF0aW9ucyBtYXkgaGF2ZSBtb2RpZmllcnMgc3VjaCBhcyB0aGUgISBtb2RpZmllci5cblxuVGhlIG5vdGF0aW9uIHRoYXQgZmFpbGVkIHRvIHBhcnNlIHdhcyBcIiVzXCJcbmAsXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVF06IGBcblRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UXG5GYWlsZWQgdG8gaW50ZXJwb2xhdGUgYSBDb21wb25lbnQgaW4gYW4gaHRtbCB0ZW1wbGF0ZSBzdHJpbmcgZHVlIHRvIHRoZVxuQ29tcG9uZW50IGhhdmluZyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkuXG5cbkNvbXBvbmVudCBcIiVzXCIgaGFzIGFuIGludmFsaWQgdGFnTmFtZSBwcm9wZXJ0eSBcIiVzXCJcbiAgICBgLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0xJU1RfREFUQV06IGBcblRFTVBMQVRFX0lOVkFMSURfTElTVFxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcmVuZGVyIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSBmZXRjaGVkIGEgdmFsdWUgd2hpY2hcbndhcyBub3QgYW4gYXJyYXkgb2YgYWN0aW9uYWJsZSBkYXRhLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19OT0RFX1JFRl06IGBcblRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUZcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYSBub2RlIGZyb20gYSBjb21waWxlZCBzb3VyY2UuIFR5cGljYWxseSwgdGhpc1xubWVhbnMgc29tZXRoaW5nIGlzIGJyb2tlbiB3aXRoaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHJhdGhlciB0aGFuIGFuIGVycm9yIHdpdGhcbnRoZSB0ZW1wbGF0ZSBjb250ZW50IGl0c2VsZi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVldOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSB3YXMgZm91bmQgb24gYW4gZWxlbWVudFxud2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgOjprZXkgZGlyZWN0aXZlLiA6OmVhY2ggZGlyZWN0aXZlcyBtdXN0IGhhdmUgYSA6OmtleVxuZGlyZWN0aXZlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBlbGVtZW50LCB3aG9zZSBub3RhdGlvbiBldmFsdWF0ZXMgdG8gYSB1bmlxdWVcbnZhbHVlIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbkV4YW1wbGU6IDxsaSA6OmVhY2g9XCIkaXRlbXNcIiA6OmtleT1cIiNpZFwiPiAuLi4gPC9saT5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWV06IGBcblRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWVxuQSBsaXN0IGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBpdGVtIGtleSAlcyBhcHBlYXJlZCBtdWx0aXBsZSB0aW1lcyB3aGVuXG5yZXNvbHZpbmcgbGlzdCBpdGVtIGtleXMuIEVhY2ggOjprZXkgZGlyZWN0aXZlIG11c3QgcmVmZXJlbmNlIGEgbm90YXRpb24gd2hvc2VcbnZhbHVlIGlzIHVuaXF1ZSBmb3IgZWFjaCBsaXN0IGl0ZW0uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0NPTkRJVElPTkFMXTogYFxuVEVNUExBVEVfSU5WQUxJRF9DT05ESVRJT05BTFxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gY29tcGlsZSBkdWUgdG8gYW4gaW52YWxpZCB1c2Ugb2YgY29uZGl0aW9uYWwgZGlyZWN0aXZlcy5cblxuQ29uZGl0aW9uYWwgZWxlbWVudHMgbXVzdCBiZSBzaWJsaW5ncy4gVGhlIGZpcnN0IGNvbmRpdGlvbmFsIGJyYW5jaCBtdXN0IHVzZSBhblxuOjppZiBkaXJlY3RpdmUsIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSA6OmVsc2UtaWYgZGlyZWN0aXZlcywgYW5kIGZpbmFsbHkgemVyb1xub3Igb25lIDo6ZWxzZSBkaXJlY3RpdmUuXG5cbjo6aWYgYW5kIDo6ZWxzZS1pZiBkaXJlY3RpdmVzIG11c3Qgc3BlY2lmeSBhIG5vdGF0aW9uIHRvIGV2YWx1YXRlLiA6OmVsc2UgZG9lc1xubm90IHRha2UgYW55IHZhbHVlcyBhbmQgaXMganVzdCBhIGJpbmFyeSBhdHRyaWJ1dGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX05PVEFUSU9OXTogYFxuVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gY29tcGlsZSBiZWNhdXNlIGEgJXMgZGlyZWN0aXZlIGRpZCBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkXG5ub3RhdGlvbiBkZXNwaXRlIHJlcXVpcmluZyBvbmUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWV06IGBcbklOVkFMSURfU1RBVEVfS0VZXG5UcmllZCB0byBhY2Nlc3MgYSBzdGF0ZSBwcm9wZXJ0eSB3aGljaCBkb2VzIG5vdCBleGlzdFxuXG5LZXkgcGF0aDogJXNcbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFXTogYFxuSU5WQUxJRF9TVEFURV9VUERBVEVcbkEgQ29tcG9uZW50J3Mgc2V0U3RhdGUoKSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB3aGljaCBjb3VsZCBub3QgYmUgcGF0Y2hlZCBpblxudG8gdGhlIGV4aXN0aW5nIGNvbXBvbmVudCBzdGF0ZS5cblxuc2V0U3RhdGUoKSB0YWtlcyBhIHBhcnRpYWwgb2JqZWN0IGRlc2NyaWJpbmcgc3RhdGUga2V5cyB0byB1cGRhdGUuXG5cbkluc3RlYWQsIHJlY2VpdmVkOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuU1RBVEVfTE9DS0VEXTogYFxuU1RBVEVfTE9DS0VEXG5BIFN0YXRlIHJlY2VpdmVkIGEgcmVxdWVzdCB0byB1cGRhdGUgb3IgbG9jayB3aGlsZSBhbHJlYWR5IGxvY2tlZC5cblN0YXRlcyBtYXkgYmUgbG9ja2VkIHVzaW5nIHRoZSAubG9jaygpIG1ldGhvZCBhbmQgdW5sb2NrZWQgdXNpbmcgdGhlIC51bmxvY2soKVxubWV0aG9kLiBTdGF0ZXMgbG9jayBkdXJpbmcgYXN5bmMgbXV0YXRpb25zIGRvbmUgdGhyb3VnaCB0aGUgLm11dGF0ZUFzeW5jKClcbm1ldGhvZCBpZiBcInRydWVcIiBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG5cbllvdSBjYW4gY2hlY2sgdGhlIGxvY2sgc3RhdHVzIG9mIGEgU3RhdGUgaW5zdGFuY2Ugd2l0aCAuaXNMb2NrZWRcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlNdOiBgXG5NQVhfU0VRVUVOVElBTF9SRU5ERVJTXG5BIGNvbXBvbmVudCBoYXMgZXJyb3JlZCBhZnRlciByZS1yZW5kZXJpbmcgbW9yZSB0aGFuICVzIHRpbWVzIGluIHRoZSBzYW1lIGZyYW1lLlxuXG5UaGlzIHR5cGljYWxseSBoYXBwZW5zIGJlY2F1c2Ugc3RhdGUgb3IgbGl2ZSBhdHRyaWJ1dGVzIGFyZSBiZWluZyBtb2RpZmllZFxuZHVyaW5nIGEgcmVuZGVyIGxpZmVjeWNsZSBtZXRob2Qgc3VjaCBhcyBiZWZvcmVVcGRhdGUoKSBvciBhZnRlclVwZGF0ZSgpLiBJZlxuc3RhdGUgY2hhbmdlcyB1bmNvbmRpdGlvbmFsbHkgZHVyaW5nIGEgcmVuZGVyLCB0aGUgcmVuZGVyIHdpbGwgaW5maW5pdGVseSBsb29wLlxuVXBkYXRpbmcgcmVuZGVyIHNvdXJjZSBkYXRhIGR1cmluZyBhIHJlbmRlciBjeWNsZSBpcyBzdXBwb3J0ZWQsIGJ1dCBpbmZpbml0ZVxudXBkYXRlIGxvb3BzIG1heSBvY2N1ciBpZiB1bmNoZWNrZWQuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0tFWV9ESVJFQ1RJVkVdOiBgXG5URU1QTEFURV9JTlZBTElEX0tFWV9ESVJFQ1RJVkVcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhIDo6a2V5IGRpcmVjdGl2ZSB3YXMgZm91bmQgb24gYW4gZWxlbWVudFxud2l0aCBubyBhc3NvY2lhdGVkIDo6ZWFjaCBkaXJlY3RpdmUuIDo6a2V5IGRpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgdXNlZCBpblxuYXNzb2NpYXRpb24gd2l0aCBsaXN0IHJlbmRlcmluZyB2aWEgOjplYWNoLlxuYCxcbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX1BBUkVOVF9SRVFVSVJFRF06IGBcblRFTVBMQVRFX1BBUkVOVF9SRVFVSVJFRFxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gY29tcGlsZSBkdWUgdG8gYW4gZWxlbWVudCB3aGljaCByZXF1aXJlcyBhIHBhcmVudCBoYXZpbmdcbm5vIGF2YWlsYWJsZSBwYXJlbnQgaW4gdGhlIHRlbXBsYXRlLlxuXG46OmVhY2ggYW5kIDo6aWYvOjplbHNlLWlmLzo6ZWxzZSBlbGVtZW50cyBtdXN0IGhhdmUgYSBwYXJlbnQgbm9kZS5cbmAsXG4gIH07XG5cbiAgcmV0dXJuIERFVl9FUlJPUl9JTkZPW2NvZGVdO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9yaWdpbmF0aW5nIGZyb20gd2l0aGluIGEgUGFsZXR0ZSBzdWJzeXN0ZW0uXG4gKlxuICogSW4gdGhlIGBkZXZlbG9wbWVudGAgZW52aXJvbm1lbnQsIHRoZSBlcnJvciB3aWxsIHN1cmZhY2Ugd2l0aCBleHRlbmRlZCBpbmZvXG4gKiBhYm91dCB0aGUgZXJyb3IgYW5kIGFueSBkZXRhaWxzIHdoaWNoIG1heSBiZSByZWxldmFudCB0byBoZWxwIHdpdGggZGVidWdnaW5nLlxuICpcbiAqIEluIHRoZSBgcHJvZHVjdGlvbmAgZW52aXJvbm1lbnQsIGEgbWluaW1hbCBlcnJvciBvbmx5IHN1cmZhY2luZyB0aGUgbnVtZXJpY1xuICogZXJyb3IgY29kZSBpcyB0aHJvd24gaW5zdGVhZC5cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFsZXR0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gXCJQYWxldHRlRXJyb3JcIjtcbiAgY29kZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IG51bWJlciwgLi4udmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtZXNzYWdlID0gYENvZGU6ICR7Y29kZX1gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBtZXNzYWdlICs9IGdldERldkVycm9yKGNvZGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShgJXNgLCBTdHJpbmcodmFsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcblxuLyoqIEFuIGF0dHJpYnV0ZSB2YWx1ZSBhcyByZWFkIGZyb20gYSBET00gZWxlbWVudCAqL1xudHlwZSBBdHRyaWJ1dGVWYWx1ZSA9IHN0cmluZyB8IG51bGw7XG5cbi8qKiBBIE1hcCBvZiBzdHJpbmcgYXR0cmlidXRlIG5hbWVzIHRvIHtAbGluayBBdHRyaWJ1dGVWYWx1ZX0gKi9cbnR5cGUgQXR0cmlidXRlTWFwID0gTWFwPHN0cmluZywgQXR0cmlidXRlVmFsdWU+O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogQXR0cmlidXRlVmFsdWUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlTWFwKFxuICBzb3VyY2U6IG9iamVjdCB8IE1hcDxzdHJpbmcsIHVua25vd24+IHwgSFRNTEVsZW1lbnQsXG4pOiBBdHRyaWJ1dGVNYXAge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygc291cmNlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIG1hcC5zZXQobmFtZSwgc2VyaWFsaXplQXR0cmlidXRlKHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2Ygc291cmNlKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICAgIG1hcC5zZXQoa2V5LCBzZXJpYWxpemVBdHRyaWJ1dGUodmFsKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBdHRyaWJ1dGVNYXAoXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXG4gIGF0dHJzOiBBdHRyaWJ1dGVNYXAsXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KGF0dHJzLmtleXMoKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBhdHRycykge1xuICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG50eXBlIE1ldHJpY3MgPSB7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMUlVDYWNoZU1ldHJpY3MgPSB7XG4gIGxvb2t1cHM6IG51bWJlcjtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbiAgY2FwYWNpdHk6IG51bWJlcjtcbiAgZW50cmllczogbnVtYmVyO1xuICBoaXRSYXRlOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEEgc2ltcGxlIGluLW1lbW9yeSBMUlUgQ2FjaGUgdXNpbmcgSmF2YVNjcmlwdCBtYXBzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogQ2FjaGVkIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEEgY2FjaGUgb2YgQVBJIFVSTHMgdG8gdGhlaXIgcmV0dXJuZWQgcGF5bG9hZHNcbiAqIGNvbnN0IGNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgQVBJUGF5bG9hZD4oKTtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBtYWtlUmVxdWVzdCh1cmw6IHN0cmluZykge1xuICogICBsZXQgY2FjaGVkID0gY2FjaGUuZ2V0KHVybCk7XG4gKiAgIGlmIChjYWNoZWQpIHtcbiAqICAgICByZXR1cm4gY2FjaGVkO1xuICogICB9XG4gKlxuICogICAvLyAuLi4gTWFrZSB0aGUgcmVxdWVzdCBhbmQgY2FjaGUuc2V0KCkgdGhlIHJlc3BvbnNlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlPEssIFY+IHtcbiAgcHJpdmF0ZSBfbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIF9kYXRhOiBNYXA8SywgVj47XG4gIHByaXZhdGUgX21ldHJpY3M6IE1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKG1heFNpemU6IG51bWJlciA9IDUwMCkge1xuICAgIGlmIChtYXhTaXplIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkxSVSBDYWNoZSBjYXBhY2l0eSBtdXN0IGJlID49IDFcIik7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuICAgIH1cblxuICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgTWFwPEssIFY+KCk7XG4gIH1cblxuICBwcml2YXRlIF90cmltID0gKCkgPT4ge1xuICAgIHdoaWxlICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuX2RhdGEua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChmaXJzdEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3VyZFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBwZXJmb3JtYW5jZSBtZXRyaWNzIGZyb20gdGhpcyBMUlUgQ2FjaGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEluIGRldmVsb3BtZW50IG1vZGUsIHRoaXMgcmV0dXJucyBpbnNpZ2h0cyBpbnRvIGhpdHMvbWlzc2VzIG9mIHRoZSBjYWNoZSxcbiAgICogYXMgd2VsbCBhcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBlbnRyeSBjb3VudC5cbiAgICpcbiAgICogSW4gcHJvZHVjdGlvbiBtb2RlLCB0aGlzIHJldHVybnMgYSBwbGFjZWhvbGRlciBvYmplY3QsIGFzIG1ldHJpYyBjb2xsZWN0aW9uXG4gICAqIGlzIG5vdCBhY3RpdmUgaW4gcHJvZHVjdGlvbi5cbiAgICovXG4gIGdldE1ldHJpY3MoKTogTFJVQ2FjaGVNZXRyaWNzIHwgdm9pZCB7XG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGNvbnN0IHsgaGl0cyA9IDAsIG1pc3NlcyA9IDAgfSA9IHRoaXMuX21ldHJpY3MgPz8ge307XG4gICAgICBjb25zdCBsb29rdXBzID0gaGl0cyArIG1pc3NlcztcbiAgICAgIGNvbnN0IGhpdFJhdGUgPSBsb29rdXBzID09PSAwID8gMCA6IGhpdHMgLyBsb29rdXBzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb29rdXBzLFxuICAgICAgICBoaXRzOiBoaXRzLFxuICAgICAgICBtaXNzZXM6IG1pc3NlcyxcbiAgICAgICAgY2FwYWNpdHk6IHRoaXMuX21heFNpemUsXG4gICAgICAgIGVudHJpZXM6IHRoaXMuX2RhdGEuc2l6ZSxcbiAgICAgICAgaGl0UmF0ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgbWF4aW11bSBjYWNoZSBzaXplIGZvciB0aGlzIGluc3RhbmNlLiBJbW1lZGlhdGVseSB0cmlnZ2VycyBhXG4gICAqIHB1cmdlIG9mIGNhY2hlZCBjb250ZW50cyBpZiB0aGUgbmV3IGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudFxuICAgKiBudW1iZXIgb2YgY2FjaGVkIGVudHJpZXMuXG4gICAqL1xuICBzZXRDYXBhY2l0eSA9IChtYXhTaXplOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwICYmIF9fREVWX18pIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbUGFsZXR0ZSBMUlUgQ2FjaGVdIENhY2hlIHNpemUgaXMgPD0gMC4gQ2FjaGUgaXMgZGlzYWJsZWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuX3RyaW0oKTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2ggYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGlmIG5vIHZhbHVlIHdhcyBmb3VuZFxuICAgKi9cbiAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YS5nZXQoa2V5KTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICB0aGlzLl9tZXRyaWNzLm1pc3NlcyArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgYW5kIHJlLXNldCB0aGUgdmFsdWUgdG8gbW92ZSB0aGUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIGtleSBsaXN0XG4gICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzLmhpdHMgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgdmFsdWUgaW4gdGhlIGNhY2hlLiBUaGlzIGFsc28gbW92ZXMgdGhlIHZhbHVlIHRvIHRoZSBiYWNrIG9mIHRoZSBsaXN0XG4gICAqIG9mIHZhbHVlcyB0byBjb25zaWRlciBldmljdGluZyB3aGVuIHRoZSBjYWNoZSBpcyBmdWxsLlxuICAgKi9cbiAgc2V0KGtleTogSywgdmFsdWU6IFYpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgaWYgZXhpc3RzIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgIGlmICh0aGlzLl9kYXRhLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIHRoaXMuX3RyaW0oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNvbnRlbnRzIG9mIHRoaXMgY2FjaGUgaW5zdGFuY2VcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgY2FjaGUgaW5zdGFuY2VcbiAgICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuc2l6ZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMUlVDYWNoZTtcbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgTFJVQ2FjaGUgZnJvbSBcIi4vbHJ1LWNhY2hlXCI7XG5cbmV4cG9ydCBjb25zdCBmcmFnbWVudENhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgRG9jdW1lbnRGcmFnbWVudD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUb0ZyYWdtZW50KGh0bWw6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBsb29rdXAgPSBmcmFnbWVudENhY2hlLmdldChodG1sKTtcblxuICBpZiAobG9va3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9va3VwLmNsb25lTm9kZSh0cnVlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICB9XG5cbiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcC5pbm5lckhUTUwgPSBodG1sO1xuICBmcmFnbWVudENhY2hlLnNldChodG1sLCB0ZW1wLmNvbnRlbnQpO1xuICByZXR1cm4gdGVtcC5jb250ZW50LmNsb25lTm9kZSh0cnVlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUZyYWdtZW50KGh0bWw6IHN0cmluZywgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgZnJhZ21lbnQpO1xufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gdGFnIG5hbWUgZm9yIHVzZSBpbiBhIHRlc3QgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgcmFuZG9tVGFnTmFtZSA9ICgpID0+IHtcbiAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpLnJlcGxhY2VBbGwoXCItXCIsIFwiXCIpLnNsaWNlKDAsIDEwKTtcbiAgcmV0dXJuIGB0ZXN0LWVsZW1lbnQtJHtpZH1gO1xufTtcbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgYXBwbHlBdHRyaWJ1dGVNYXAsIGNyZWF0ZUF0dHJpYnV0ZU1hcCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgcmFuZG9tVGFnTmFtZSB9IGZyb20gXCIuL3RhZ3NcIjtcblxuLyoqXG4gKiBSZW5kZXIgYSBQYWxldHRlIENvbXBvbmVudCBjbGFzcyBhcyBhIHRlc3QgZWxlbWVudFxuICpcbiAqIElmIHRoZSBjbGFzcyBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGl0IGlzIGF1dG8tcmVnaXN0ZXJlZCBiZWZvcmUgY3JlYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0ZXN0KFwiY29tcG9uZW50IGRvZXMgc29tZXRoaW5nXCIsIGFzeW5jICgpID0+IHtcbiAqICAgbGV0IHNvbWV0aGluZ01vY2sgPSBtb2NrKCk7XG4gKlxuICogICBjbGFzcyBNeVRlc3RDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICogICAgIHNjcmlwdCgpIHtcbiAqICAgICAgIHNvbWV0aGluZ01vY2soKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIGF3YWl0IHJlbmRlclRlc3RDb21wb25lbnQoTXlUZXN0Q29tcG9uZW50KTtcbiAqICAgZXhwZWN0KHNvbWV0aGluZ01vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IGNsYXNzIHRvIHJlZ2lzdGVyIGFuZCBjcmVhdGVcbiAqIEBwYXJhbSBhdHRyaWJ1dGVzIEEgcmVjb3JkIG9mIGF0dHJpYnV0ZXMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlZCBDb21wb25lbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlc3RDb21wb25lbnQ8RSBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ8YW55Pj4oXG4gIGNvbXBvbmVudDogRSxcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8RT4+IHtcbiAgLy8gRXJyb3IgZWFybHkgaWYgbWlzY29uZmlndXJlZFxuICBpZiAoXG4gICAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIHR5cGVvZiB3aW5kb3cuY3VzdG9tRWxlbWVudHMgPT09IFwidW5kZWZpbmVkXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJGYWlsZWQgdG8gcmVuZGVyIHRlc3QgY29tcG9uZW50OiBcIiArXG4gICAgICAgIFwid2luZG93LmN1c3RvbUVsZW1lbnRzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudC5cIixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdXNlVGFnbmFtZSA9XG4gICAgY29tcG9uZW50LnRhZ05hbWUgPT09IFwiXCIgPyByYW5kb21UYWdOYW1lKCkgOiBjb21wb25lbnQudGFnTmFtZTtcblxuICAvLyBSZWFzc2lnbiB0aGUgdGFnbmFtZSBiYWNrIHRvIHRoZSBjb21wb25lbnQgdG8gZW5zdXJlIGl0IGlzIHNldCBiZWZvcmUgcmVnaXN0cmF0aW9uXG4gIGNvbXBvbmVudC50YWdOYW1lID0gdXNlVGFnbmFtZTtcblxuICAvLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGlmIG5lZWQgYmVcbiAgaWYgKCFjdXN0b21FbGVtZW50cy5nZXQodXNlVGFnbmFtZSkpIHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICB1c2VUYWduYW1lLFxuICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yLFxuICAgICk7XG4gIH1cblxuICAvLyBDb25zdHJ1Y3QgYSB0ZXN0IGluc3RhbmNlXG4gIGNvbnN0ICRjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50YWdOYW1lKTtcblxuICAvLyBBcHBseSBhdHRyaWJ1dGVzIGJlZm9yZSByZW5kZXJpbmdcbiAgY29uc3QgYXR0cmlidXRlTWFwID0gY3JlYXRlQXR0cmlidXRlTWFwKGF0dHJpYnV0ZXMgPz8ge30pO1xuICBhcHBseUF0dHJpYnV0ZU1hcCgkY29tcG9uZW50LCBhdHRyaWJ1dGVNYXApO1xuXG4gIC8vIFJlbmRlciBhbmQgYXdhaXQgdG8gYWxsb3cgbWljcm90YXNrcyB0byBzZXR0bGVcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmQoJGNvbXBvbmVudCk7XG4gIGF3YWl0IEJ1bi5zbGVlcCgxKTtcblxuICAvLyBSZXR1cm4gdGhlIHJlbmRlcmVkIGluc3RhbmNlXG4gIHJldHVybiAkY29tcG9uZW50IGFzIEluc3RhbmNlVHlwZTxFPjtcbn1cblxuLyoqXG4gKiBGb3JjZSBhIHJlbmRlciBvbiB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSByZW5kZXIgaGFzIGNvbXBsZXRlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVyZW5kZXJUZXN0Q29tcG9uZW50KGVsZW1lbnQ6IENvbXBvbmVudCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBlbGVtZW50LnJlcXVlc3RSZW5kZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgQnVuLnNsZWVwKDEpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O0FBT0E7QUFLQSxlQUFzQixvQkFBb0IsR0FBa0I7QUFBQSxFQUMxRCxNQUFNLHFCQUFxQjtBQUFBLEVBQzNCLGtCQUFrQixTQUFTO0FBQUE7QUFNN0IsZUFBc0Isb0JBQW9CLEdBQWtCO0FBQUEsRUFDMUQsSUFBSSxPQUFPLGFBQWEsYUFBYTtBQUFBLElBQ25DLE9BQU8sU0FBUyxZQUFZO0FBQUEsTUFDMUIsU0FBUyxZQUFZLFNBQVMsVUFBVTtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUFBLEVBRWpCLElBQUksa0JBQWtCLGNBQWM7QUFBQSxJQUNsQyxrQkFBa0IsV0FBVztBQUFBLEVBQy9CO0FBQUE7O0FDZ0JGLFNBQVMsV0FBVyxDQUFDLE1BQWlCO0FBQUEsRUFDcEMsTUFBTSxpQkFBNEM7QUFBQSxLQUMvQyxvQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTXRCLHNCQUF3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FLeEIsMkJBQTZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FLN0IsNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBVTVCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBSzVCLDBCQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNMUIsNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FRNUIsbUNBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBT25DLDZDQUE2QztBQUFBO0FBQUE7QUFB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S0FBSyxNQUFNLElBQUksS0FBSyxLQUFLO0FBQUEsSUFFekIsSUFBSSxLQUFLLE1BQU0sT0FBTyxLQUFLLFVBQVU7QUFBQSxNQUNuQyxLQUFLLE1BQU07QUFBQSxJQUNiO0FBQUE7QUFBQSxFQU1GLEtBQUssR0FBUztBQUFBLElBQ1osS0FBSyxNQUFNLE1BQU07QUFBQTtBQUFBLE1BTWYsSUFBSSxHQUFXO0FBQUEsSUFDakIsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUV0QjtBQUVBLElBQWU7OztBQy9KUixJQUFNLGdCQUFnQixJQUFJOztBQ0cxQixJQUFNLGdCQUFnQixNQUFNO0FBQUEsRUFDakMsTUFBTSxLQUFLLE9BQU8sV0FBVyxFQUFFLFdBQVcsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQSxFQUM5RCxPQUFPLGdCQUFnQjtBQUFBOzs7QUN5QnpCLGVBQXNCLG1CQUFvRCxDQUN4RSxXQUNBLGFBQzBCO0FBQUEsRUFFMUIsSUFDRSxPQUFPLFdBQVcsZUFDbEIsT0FBTyxPQUFPLG1CQUFtQixhQUNqQztBQUFBLElBQ0EsTUFBTSxJQUFJLE1BQ1Isc0NBQ0UsNkRBQ0o7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLGFBQ0osVUFBVSxZQUFZLEtBQUssY0FBYyxJQUFJLFVBQVU7QUFBQSxFQUd6RCxVQUFVLFVBQVU7QUFBQSxFQUdwQixJQUFJLENBQUMsZUFBZSxJQUFJLFVBQVUsR0FBRztBQUFBLElBQ25DLGVBQWUsT0FDYixZQUNBLFNBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFHQSxNQUFNLGFBQWEsU0FBUyxjQUFjLFVBQVUsT0FBTztBQUFBLEVBRzNELE1BQU0sZUFBZSxtQkFBbUIsZUFBYyxDQUFDLENBQUM7QUFBQSxFQUN4RCxrQkFBa0IsWUFBWSxZQUFZO0FBQUEsRUFHMUMsU0FBUyxLQUFLLE9BQU8sVUFBVTtBQUFBLEVBQy9CLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFBQSxFQUdqQixPQUFPO0FBQUE7QUFRVCxlQUFzQixxQkFBcUIsQ0FBQyxTQUFtQztBQUFBLEVBQzdFLE9BQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUFBLElBQzlCLFFBQVEsY0FBYyxZQUFZO0FBQUEsTUFDaEMsTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUFBLE1BQ2pCLFFBQVE7QUFBQSxLQUNUO0FBQUEsR0FDRjtBQUFBOyIsCiAgImRlYnVnSWQiOiAiQjI4RjhFRDVFQzRCOEU3QzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
|
165
|
+
//# debugId=6550070DCFC2AA2864756E2164756E21
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3QtdXRpbC9nbG9iYWwtZW52LnRzIiwgInNyYy91dGlsL2F0dHJpYnV0ZXMudHMiLCAic3JjL3V0aWwvbHJ1LWNhY2hlLnRzIiwgInNyYy91dGlsL2ZyYWdtZW50cy50cyIsICJzcmMvdGVzdC11dGlsL3RhZ3MudHMiLCAic3JjL3Rlc3QtdXRpbC9yZW5kZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgR2xvYmFsUmVnaXN0cmF0b3IgfSBmcm9tIFwiQGhhcHB5LWRvbS9nbG9iYWwtcmVnaXN0cmF0b3JcIjtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgdGVzdCBET00gZW52aXJvbm1lbnQgKHVzaW5nIEhhcHB5RE9NKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUdsb2JhbFRlc3RET00oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNsZWFudXBHbG9iYWxUZXN0RE9NKCk7XG4gIEdsb2JhbFJlZ2lzdHJhdG9yLnJlZ2lzdGVyKCk7XG59XG5cbi8qKlxuICogQ2xlYW51cCB0aGUgZ2xvYmFsIHRlc3QgRE9NIGVudmlyb25tZW50ICh1c2luZyBIYXBweURPTSlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBHbG9iYWxUZXN0RE9NKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2hpbGUgKGRvY3VtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUNoaWxkKGRvY3VtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IEJ1bi5zbGVlcCgxKTtcblxuICBpZiAoR2xvYmFsUmVnaXN0cmF0b3IuaXNSZWdpc3RlcmVkKSB7XG4gICAgR2xvYmFsUmVnaXN0cmF0b3IudW5yZWdpc3RlcigpO1xuICB9XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUF0dHJpYnV0ZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXR0cmlidXRlcyhcbiAgc291cmNlOiBIVE1MRWxlbWVudCxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgYXR0cnNbbmFtZV0gPSBzZXJpYWxpemVBdHRyaWJ1dGUoc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gIH1cblxuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUVsZW1lbnRBdHRyaWJ1dGVzKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGF0dHJzKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRycykpIHtcbiAgICBhcHBseUF0dHJpYnV0ZSh0YXJnZXQsIG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXR0cmlidXRlUmVjb3JkKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICBvdXRba2V5XSA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG50eXBlIE1ldHJpY3MgPSB7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMUlVDYWNoZU1ldHJpY3MgPSB7XG4gIGxvb2t1cHM6IG51bWJlcjtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbiAgY2FwYWNpdHk6IG51bWJlcjtcbiAgZW50cmllczogbnVtYmVyO1xuICBoaXRSYXRlOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEEgc2ltcGxlIGluLW1lbW9yeSBMUlUgQ2FjaGUgdXNpbmcgSmF2YVNjcmlwdCBtYXBzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogQ2FjaGVkIG5ldHdvcmsgcmVxdWVzdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEEgY2FjaGUgb2YgQVBJIFVSTHMgdG8gdGhlaXIgcmV0dXJuZWQgcGF5bG9hZHNcbiAqIGNvbnN0IGNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgQVBJUGF5bG9hZD4oKTtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBtYWtlUmVxdWVzdCh1cmw6IHN0cmluZykge1xuICogICBsZXQgY2FjaGVkID0gY2FjaGUuZ2V0KHVybCk7XG4gKiAgIGlmIChjYWNoZWQpIHtcbiAqICAgICByZXR1cm4gY2FjaGVkO1xuICogICB9XG4gKlxuICogICAvLyAuLi4gTWFrZSB0aGUgcmVxdWVzdCBhbmQgY2FjaGUuc2V0KCkgdGhlIHJlc3BvbnNlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlPEssIFY+IHtcbiAgcHJpdmF0ZSBfbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIF9kYXRhOiBNYXA8SywgVj47XG4gIHByaXZhdGUgX21ldHJpY3M6IE1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKG1heFNpemU6IG51bWJlciA9IDUwMCkge1xuICAgIGlmIChtYXhTaXplIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkxSVSBDYWNoZSBjYXBhY2l0eSBtdXN0IGJlID49IDFcIik7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuICAgIH1cblxuICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgTWFwPEssIFY+KCk7XG4gIH1cblxuICBwcml2YXRlIF90cmltID0gKCkgPT4ge1xuICAgIHdoaWxlICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuX2RhdGEua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChmaXJzdEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFic3VyZFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBwZXJmb3JtYW5jZSBtZXRyaWNzIGZyb20gdGhpcyBMUlUgQ2FjaGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEluIGRldmVsb3BtZW50IG1vZGUsIHRoaXMgcmV0dXJucyBpbnNpZ2h0cyBpbnRvIGhpdHMvbWlzc2VzIG9mIHRoZSBjYWNoZSxcbiAgICogYXMgd2VsbCBhcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBlbnRyeSBjb3VudC5cbiAgICpcbiAgICogSW4gcHJvZHVjdGlvbiBtb2RlLCB0aGlzIHJldHVybnMgYSBwbGFjZWhvbGRlciBvYmplY3QsIGFzIG1ldHJpYyBjb2xsZWN0aW9uXG4gICAqIGlzIG5vdCBhY3RpdmUgaW4gcHJvZHVjdGlvbi5cbiAgICovXG4gIGdldE1ldHJpY3MoKTogTFJVQ2FjaGVNZXRyaWNzIHwgdm9pZCB7XG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGNvbnN0IHsgaGl0cyA9IDAsIG1pc3NlcyA9IDAgfSA9IHRoaXMuX21ldHJpY3MgPz8ge307XG4gICAgICBjb25zdCBsb29rdXBzID0gaGl0cyArIG1pc3NlcztcbiAgICAgIGNvbnN0IGhpdFJhdGUgPSBsb29rdXBzID09PSAwID8gMCA6IGhpdHMgLyBsb29rdXBzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb29rdXBzLFxuICAgICAgICBoaXRzOiBoaXRzLFxuICAgICAgICBtaXNzZXM6IG1pc3NlcyxcbiAgICAgICAgY2FwYWNpdHk6IHRoaXMuX21heFNpemUsXG4gICAgICAgIGVudHJpZXM6IHRoaXMuX2RhdGEuc2l6ZSxcbiAgICAgICAgaGl0UmF0ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgbWF4aW11bSBjYWNoZSBzaXplIGZvciB0aGlzIGluc3RhbmNlLiBJbW1lZGlhdGVseSB0cmlnZ2VycyBhXG4gICAqIHB1cmdlIG9mIGNhY2hlZCBjb250ZW50cyBpZiB0aGUgbmV3IGNhcGFjaXR5IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudFxuICAgKiBudW1iZXIgb2YgY2FjaGVkIGVudHJpZXMuXG4gICAqL1xuICBzZXRDYXBhY2l0eSA9IChtYXhTaXplOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwICYmIF9fREVWX18pIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbUGFsZXR0ZSBMUlUgQ2FjaGVdIENhY2hlIHNpemUgaXMgPD0gMC4gQ2FjaGUgaXMgZGlzYWJsZWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuX3RyaW0oKTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2ggYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGlmIG5vIHZhbHVlIHdhcyBmb3VuZFxuICAgKi9cbiAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YS5nZXQoa2V5KTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICB0aGlzLl9tZXRyaWNzLm1pc3NlcyArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgYW5kIHJlLXNldCB0aGUgdmFsdWUgdG8gbW92ZSB0aGUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIGtleSBsaXN0XG4gICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzLmhpdHMgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgdmFsdWUgaW4gdGhlIGNhY2hlLiBUaGlzIGFsc28gbW92ZXMgdGhlIHZhbHVlIHRvIHRoZSBiYWNrIG9mIHRoZSBsaXN0XG4gICAqIG9mIHZhbHVlcyB0byBjb25zaWRlciBldmljdGluZyB3aGVuIHRoZSBjYWNoZSBpcyBmdWxsLlxuICAgKi9cbiAgc2V0KGtleTogSywgdmFsdWU6IFYpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgaWYgZXhpc3RzIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgIGlmICh0aGlzLl9kYXRhLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIHRoaXMuX3RyaW0oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNvbnRlbnRzIG9mIHRoaXMgY2FjaGUgaW5zdGFuY2VcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgY2FjaGUgaW5zdGFuY2VcbiAgICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuc2l6ZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMUlVDYWNoZTtcbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgTFJVQ2FjaGUgZnJvbSBcIi4vbHJ1LWNhY2hlXCI7XG5cbmV4cG9ydCBjb25zdCBmcmFnbWVudENhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgRG9jdW1lbnRGcmFnbWVudD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUb0ZyYWdtZW50KGh0bWw6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBsb29rdXAgPSBmcmFnbWVudENhY2hlLmdldChodG1sKTtcblxuICBpZiAobG9va3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9va3VwLmNsb25lTm9kZSh0cnVlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICB9XG5cbiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcC5pbm5lckhUTUwgPSBodG1sO1xuICBmcmFnbWVudENhY2hlLnNldChodG1sLCB0ZW1wLmNvbnRlbnQpO1xuICByZXR1cm4gdGVtcC5jb250ZW50LmNsb25lTm9kZSh0cnVlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUZyYWdtZW50KGh0bWw6IHN0cmluZywgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgZnJhZ21lbnQpO1xufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gdGFnIG5hbWUgZm9yIHVzZSBpbiBhIHRlc3QgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgcmFuZG9tVGFnTmFtZSA9ICgpID0+IHtcbiAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpLnJlcGxhY2VBbGwoXCItXCIsIFwiXCIpLnNsaWNlKDAsIDEwKTtcbiAgcmV0dXJuIGB0ZXN0LWVsZW1lbnQtJHtpZH1gO1xufTtcbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgYXBwbHlFbGVtZW50QXR0cmlidXRlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgcmFuZG9tVGFnTmFtZSB9IGZyb20gXCIuL3RhZ3NcIjtcblxuLyoqXG4gKiBSZW5kZXIgYSBQYWxldHRlIENvbXBvbmVudCBjbGFzcyBhcyBhIHRlc3QgZWxlbWVudFxuICpcbiAqIElmIHRoZSBjbGFzcyBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGl0IGlzIGF1dG8tcmVnaXN0ZXJlZCBiZWZvcmUgY3JlYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0ZXN0KFwiY29tcG9uZW50IGRvZXMgc29tZXRoaW5nXCIsIGFzeW5jICgpID0+IHtcbiAqICAgbGV0IHNvbWV0aGluZ01vY2sgPSBtb2NrKCk7XG4gKlxuICogICBjbGFzcyBNeVRlc3RDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICogICAgIHNjcmlwdCgpIHtcbiAqICAgICAgIHNvbWV0aGluZ01vY2soKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIGF3YWl0IHJlbmRlclRlc3RDb21wb25lbnQoTXlUZXN0Q29tcG9uZW50KTtcbiAqICAgZXhwZWN0KHNvbWV0aGluZ01vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IGNsYXNzIHRvIHJlZ2lzdGVyIGFuZCBjcmVhdGVcbiAqIEBwYXJhbSBhdHRyaWJ1dGVzIEEgcmVjb3JkIG9mIGF0dHJpYnV0ZXMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlZCBDb21wb25lbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlc3RDb21wb25lbnQ8RSBleHRlbmRzIHR5cGVvZiBDb21wb25lbnQ8YW55Pj4oXG4gIGNvbXBvbmVudDogRSxcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LFxuKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8RT4+IHtcbiAgLy8gRXJyb3IgZWFybHkgaWYgbWlzY29uZmlndXJlZFxuICBpZiAoXG4gICAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIHR5cGVvZiB3aW5kb3cuY3VzdG9tRWxlbWVudHMgPT09IFwidW5kZWZpbmVkXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJGYWlsZWQgdG8gcmVuZGVyIHRlc3QgY29tcG9uZW50OiBcIiArXG4gICAgICAgIFwid2luZG93LmN1c3RvbUVsZW1lbnRzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudC5cIixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdXNlVGFnbmFtZSA9XG4gICAgY29tcG9uZW50LnRhZ05hbWUgPT09IFwiXCIgPyByYW5kb21UYWdOYW1lKCkgOiBjb21wb25lbnQudGFnTmFtZTtcblxuICAvLyBSZWFzc2lnbiB0aGUgdGFnbmFtZSBiYWNrIHRvIHRoZSBjb21wb25lbnQgdG8gZW5zdXJlIGl0IGlzIHNldCBiZWZvcmUgcmVnaXN0cmF0aW9uXG4gIGNvbXBvbmVudC50YWdOYW1lID0gdXNlVGFnbmFtZTtcblxuICAvLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGlmIG5lZWQgYmVcbiAgaWYgKCFjdXN0b21FbGVtZW50cy5nZXQodXNlVGFnbmFtZSkpIHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICB1c2VUYWduYW1lLFxuICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yLFxuICAgICk7XG4gIH1cblxuICAvLyBDb25zdHJ1Y3QgYSB0ZXN0IGluc3RhbmNlXG4gIGNvbnN0ICRjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50YWdOYW1lKTtcblxuICAvLyBBcHBseSBhdHRyaWJ1dGVzIGJlZm9yZSByZW5kZXJpbmdcbiAgYXBwbHlFbGVtZW50QXR0cmlidXRlcygkY29tcG9uZW50LCBhdHRyaWJ1dGVzID8/IHt9KTtcblxuICAvLyBSZW5kZXIgYW5kIGF3YWl0IHRvIGFsbG93IG1pY3JvdGFza3MgdG8gc2V0dGxlXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKCRjb21wb25lbnQpO1xuICBhd2FpdCBCdW4uc2xlZXAoMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBpbnN0YW5jZVxuICByZXR1cm4gJGNvbXBvbmVudCBhcyBJbnN0YW5jZVR5cGU8RT47XG59XG5cbi8qKlxuICogRm9yY2UgYSByZW5kZXIgb24gdGhlIHRhcmdldCBlbGVtZW50XG4gKlxuICogUmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBjb21wbGV0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcmVuZGVyVGVzdENvbXBvbmVudChlbGVtZW50OiBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZWxlbWVudC5yZW5kZXIoKTtcbiAgYXdhaXQgQnVuLnNsZWVwKDEpO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7QUFPQTtBQUtBLGVBQXNCLG9CQUFvQixHQUFrQjtBQUFBLEVBQzFELE1BQU0scUJBQXFCO0FBQUEsRUFDM0Isa0JBQWtCLFNBQVM7QUFBQTtBQU03QixlQUFzQixvQkFBb0IsR0FBa0I7QUFBQSxFQUMxRCxJQUFJLE9BQU8sYUFBYSxhQUFhO0FBQUEsSUFDbkMsT0FBTyxTQUFTLFlBQVk7QUFBQSxNQUMxQixTQUFTLFlBQVksU0FBUyxVQUFVO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLElBQUksTUFBTSxDQUFDO0FBQUEsRUFFakIsSUFBSSxrQkFBa0IsY0FBYztBQUFBLElBQ2xDLGtCQUFrQixXQUFXO0FBQUEsRUFDL0I7QUFBQTs7QUN6QkssU0FBUyxrQkFBa0IsQ0FBQyxPQUErQjtBQUFBLEVBQ2hFLElBQUksT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFVBQVU7QUFBQSxJQUMxRCxPQUFPLEdBQUc7QUFBQSxFQUNaO0FBQUEsRUFFQSxJQUFJLFVBQVUsTUFBTTtBQUFBLElBQ2xCLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxJQUFJLFVBQVUsUUFBUSxVQUFVLFNBQVMsVUFBVSxXQUFXO0FBQUEsSUFDNUQsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE9BQU8sTUFBTSxTQUFTO0FBQUE7QUFHakIsU0FBUyxjQUFjLENBQzVCLFNBQ0EsTUFDQSxPQUNNO0FBQUEs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
|