@dbx-tools/appkit-mastra 0.6.49 → 0.6.51

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 CHANGED
@@ -300,6 +300,17 @@ explicit tree. When no Databricks client is resolvable at startup, the tree is
300
300
  written to a local temp dir and handed to Mastra as an extra local skill path
301
301
  for the current process only.
302
302
 
303
+ The destination is **probed with a real write** before it is used, and falls back
304
+ to that local tree when the probe fails. Writing the shared
305
+ `/Workspace/.assistant/skills` tree is a workspace-ADMIN action, and a Databricks
306
+ App runs as a non-admin service principal, so the common deployment cannot write
307
+ it - and the workspace API reports a path the caller may not touch as
308
+ `RESOURCE_DOES_NOT_EXIST` rather than a permission error. Only the storage
309
+ LOCATION degrades: the same skills are provisioned either way, so a
310
+ non-admin app keeps a working agent instead of failing startup. Give the app's
311
+ service principal `CAN_MANAGE` on the tree (or point `databricksBasePath` at one
312
+ it owns) to get workspace persistence back.
313
+
303
314
  A source that resolves through neither path fails app startup, so a misconfigured
304
315
  skill set is caught at boot rather than silently missing. Set `failOnError: false`
305
316
  (top-level or per-source) to log and skip a bad source instead. Install the
@@ -40,9 +40,12 @@
40
40
  * action writes to), so provisioned skills persist across restarts and are
41
41
  * discovered by the built-in Assistant-skills mount. Pass `userEmail` (or an
42
42
  * explicit `databricksBasePath`) to target `/Users/<email>/.assistant/skills`
43
- * instead. When no Databricks client is resolvable at startup, the tree is
44
- * written under {@link localFS.tmpFS} and returned as an extra local skill path
45
- * for the current process.
43
+ * instead. When no Databricks client is resolvable at startup - or the resolved
44
+ * identity cannot WRITE the destination, which is the normal case for a
45
+ * Databricks App service principal against the admin-owned shared tree (see
46
+ * {@link openWritableWorkspace}) - the tree is written under
47
+ * {@link localFS.tmpFS} and returned as an extra local skill path for the
48
+ * current process. Storage location degrades; the skills themselves do not.
46
49
  *
47
50
  * @module
48
51
  */
@@ -40,9 +40,12 @@
40
40
  * action writes to), so provisioned skills persist across restarts and are
41
41
  * discovered by the built-in Assistant-skills mount. Pass `userEmail` (or an
42
42
  * explicit `databricksBasePath`) to target `/Users/<email>/.assistant/skills`
43
- * instead. When no Databricks client is resolvable at startup, the tree is
44
- * written under {@link localFS.tmpFS} and returned as an extra local skill path
45
- * for the current process.
43
+ * instead. When no Databricks client is resolvable at startup - or the resolved
44
+ * identity cannot WRITE the destination, which is the normal case for a
45
+ * Databricks App service principal against the admin-owned shared tree (see
46
+ * {@link openWritableWorkspace}) - the tree is written under
47
+ * {@link localFS.tmpFS} and returned as an extra local skill path for the
48
+ * current process. Storage location degrades; the skills themselves do not.
46
49
  *
47
50
  * @module
48
51
  */
@@ -245,23 +248,18 @@ export async function provisionRemoteSkills(option) {
245
248
  return empty;
246
249
  const failDefault = options.failOnError !== false;
247
250
  const client = options.client ?? appkit.tryGetExecutionContext()?.client;
248
- const databricksBasePath = resolveDatabricksBasePath(options, client);
249
- const destination = databricksBasePath
250
- ? new DatabricksFileSystem({
251
- client: client,
252
- root: databricksBasePath,
253
- readOnly: false,
254
- createRoot: true,
255
- })
251
+ // Probed rather than assumed: an identity that cannot write the workspace
252
+ // tree falls back to the local one instead of failing startup. The probe also
253
+ // creates the root, which the first cache READ needs - `copySkillDirs` would
254
+ // otherwise be the first thing to create it, which is too late.
255
+ const requestedBasePath = resolveDatabricksBasePath(options, client);
256
+ const destination = requestedBasePath
257
+ ? await openWritableWorkspace(requestedBasePath, client)
256
258
  : undefined;
259
+ const databricksBasePath = destination ? requestedBasePath : undefined;
257
260
  const localSkillPaths = [];
258
261
  const skillNames = [];
259
262
  let staging;
260
- // The destination roots the shared metadata document, so it has to exist
261
- // before the first cache READ - `copySkillDirs` would otherwise be the first
262
- // thing to create it, which is too late.
263
- if (destination)
264
- await destination.init();
265
263
  try {
266
264
  const sources = Array.isArray(options.sources) ? options.sources : [options.sources];
267
265
  for (const entry of sources) {
@@ -336,6 +334,45 @@ export async function provisionRemoteSkills(option) {
336
334
  }
337
335
  return { localSkillPaths, databricksBasePath, skillNames };
338
336
  }
337
+ /** Probe file {@link openWritableWorkspace} writes and removes. */
338
+ const WRITE_PROBE_FILE = ".dbx-tools-write-probe";
339
+ /**
340
+ * Open the Databricks skills destination, or `undefined` when this identity
341
+ * cannot write there.
342
+ *
343
+ * The default destination (`/Workspace/.assistant/skills`) is commonly
344
+ * admins-only, and an app service principal is not an admin - so a Databricks
345
+ * App writing there fails with `RESOURCE_DOES_NOT_EXIST`, which is how the
346
+ * workspace API reports a path the caller is not allowed to see. That is a fact
347
+ * about WHERE the tree is stored, not about whether the skills are usable, so it
348
+ * degrades to the local tree (handed to Mastra as an extra scan path) rather
349
+ * than taking app startup down over bookkeeping location.
350
+ *
351
+ * The probe is a real write: `mkdirs` succeeds on an existing directory even for
352
+ * an identity that cannot write into it, so init alone proves nothing. Removing
353
+ * the probe file is best-effort - a failed cleanup must not decide writability.
354
+ */
355
+ async function openWritableWorkspace(basePath, client) {
356
+ const fs = new DatabricksFileSystem({
357
+ client,
358
+ root: basePath,
359
+ readOnly: false,
360
+ createRoot: true,
361
+ });
362
+ try {
363
+ await fs.init();
364
+ await fs.writeFile(WRITE_PROBE_FILE, new Date().toISOString(), { overwrite: true });
365
+ }
366
+ catch (err) {
367
+ logger.warn("destination:unwritable", {
368
+ destination: basePath,
369
+ error: error.errorMessage(err),
370
+ });
371
+ return undefined;
372
+ }
373
+ await fs.deleteFile(WRITE_PROBE_FILE, { force: true }).catch(() => undefined);
374
+ return fs;
375
+ }
339
376
  /** Resolve the Databricks Assistant skills destination, or `undefined` for local temp. */
340
377
  function resolveDatabricksBasePath(options, client) {
341
378
  if (!client)
@@ -577,4 +614,4 @@ async function pathExists(path) {
577
614
  return false;
578
615
  }
579
616
  }
580
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStDRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlyRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFbEQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7QUFFckMsK0VBQStFO0FBQy9FLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFFekQsOEVBQThFO0FBQzlFLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFcEQsOEVBQThFO0FBQzlFLE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUM7QUFFL0M7Ozs7R0FJRztBQUNILE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBRXZDLHVGQUF1RjtBQUN2RixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQiw2RUFBNkU7QUFDN0UsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFbkQsNEVBQTRFO0FBRTVFOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQztBQUt4Qzs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsb0NBQW9DLENBQUM7QUFFMUQseUVBQXlFO0FBQ3pFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUUzQixpRkFBaUY7QUFDakYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFnSTlCLDZFQUE2RTtBQUU3RSxtRUFBbUU7QUFDbkUsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxNQUFzQztJQUV0QyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFFLE1BQTRCLENBQUMsQ0FBQztJQUNoRix3REFBd0Q7SUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbkQsT0FBTyxFQUFFLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzdCLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsU0FBUyxrQkFBa0IsQ0FBQyxLQUFjO0lBQ3hDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDO0FBQ3RELENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsU0FBUyxZQUFZLENBQ25CLEtBQXVEO0lBRXZELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxlQUFlLENBQUMsTUFBeUI7SUFDaEQsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2xELElBQUksTUFBTSxZQUFZLEdBQUc7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO0lBQ2hFLElBQUksUUFBUSxJQUFJLE1BQU07UUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNwRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsY0FBYyxDQUFDLE1BQW1CO0lBQ3pDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzlDLE9BQU8sTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ2hFLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsU0FBUyxlQUFlLENBQUMsTUFBYztJQUNyQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxjQUFjLENBQUM7QUFDeEQsQ0FBQztBQUVELDZFQUE2RTtBQUU3RTs7Ozs7O0dBTUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxhQUErQjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRztRQUNiLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxHQUFHLENBQUMsYUFBYSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNwRixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxhQUErQjtJQUMvQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQzdGLENBQUM7QUFDSixDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLFNBQVMsaUJBQWlCLENBQ3hCLGFBQStCLEVBQy9CLE9BQXFDO0lBRXJDLE9BQU8sYUFBYSxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLHNCQUFzQixDQUFDO0FBQ3RGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxZQUFZLENBQUMsRUFBYztJQUN4QyxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFxQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssZ0JBQWdCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEYsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUQsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxPQUFPLENBQUMsS0FBNEIsRUFBRSxLQUFhO0lBQzFELElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzdELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFlBQVksQ0FBQztJQUN0QyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUMxQixFQUFjLEVBQ2QsR0FBVyxFQUNYLEtBQTRCO0lBRTVCLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUF5QjtRQUNqQyxPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRTtLQUMvQyxDQUFDO0lBQ0YsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLGFBQWEsQ0FBQyxHQUFXO0lBQ2hDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLGdCQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLE1BQXNDO0lBRXRDLE1BQU0sT0FBTyxHQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE1BQU0sS0FBSyxHQUE0QixFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQy9FLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFM0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDekUsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQUcsa0JBQWtCO1FBQ3BDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxNQUF5QjtZQUNqQyxJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztRQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFDckMsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQ2hDLElBQUksT0FBb0MsQ0FBQztJQUV6Qyx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLHlDQUF5QztJQUN6QyxJQUFJLFdBQVc7UUFBRSxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUUxQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckYsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUM7WUFDN0QsSUFBSSxDQUFDO2dCQUNILHdFQUF3RTtnQkFDeEUscUNBQXFDO2dCQUNyQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sT0FBTyxHQUFHLFdBQVcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNELElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDekUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLFdBQVc7d0JBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7d0JBQ2hDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTt3QkFDNUIsV0FBVyxFQUFFLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxJQUFJO3dCQUMvQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7d0JBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTt3QkFDckIsTUFBTSxFQUFFLElBQUk7cUJBQ2IsQ0FBQyxDQUFDO29CQUNILFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNyQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07aUJBQzdCLENBQUMsQ0FBQztnQkFDSCxPQUFPLEtBQUssTUFBTSxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDNUUsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sTUFBTSxHQUEwQjtvQkFDcEMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNO29CQUM1QixZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7b0JBQ3RDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNyQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzlCLENBQUM7Z0JBQ0YsSUFBSSxXQUFXLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxhQUFhLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN6QyxrRUFBa0U7b0JBQ2xFLHFFQUFxRTtvQkFDckUsTUFBTSxhQUFhLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7b0JBQ3BDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtvQkFDNUIsV0FBVyxFQUFFLGtCQUFrQixJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYiw0Q0FBNEMsYUFBYSxDQUFDLE1BQU0sTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQy9GLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDOUIsQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQzVCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtvQkFDNUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2lCQUMvQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7WUFBUyxDQUFDO1FBQ1QsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDN0QsQ0FBQztBQUVELDBGQUEwRjtBQUMxRixTQUFTLHlCQUF5QixDQUNoQyxPQUFxQyxFQUNyQyxNQUF1QztJQUV2QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLElBQUksT0FBTyxDQUFDLGtCQUFrQjtRQUFFLE9BQU8sT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUN0RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLHdDQUF3QztJQUN4QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDO0FBQy9FLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUN4QixhQUErQixFQUMvQixXQUFtQixFQUNuQixPQUFxQztJQUVyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRCxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6Qyx5RUFBeUU7SUFDekUsSUFBSSxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsSUFBSSxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDMUIsT0FBTyxhQUFhLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLGFBQStCLEVBQy9CLE1BQWMsRUFDZCxPQUFxQztJQUVyQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQztJQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixDQUFDLE1BQU0sUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQ2hGLFNBQVMsQ0FDcUIsQ0FBQztJQUVqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQy9FLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxjQUFjLElBQUksYUFBYSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQzdFLENBQUM7SUFDRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsWUFBWSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQy9DLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM3QyxDQUFDLENBQUMsQ0FDSixDQUFDO0lBQ0YsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdEYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGFBQWEsQ0FBQyxHQUFXLEVBQUUsSUFBWTtJQUM5QyxPQUFPLHFDQUFxQyxZQUFZLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzVFLENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsS0FBbUIsRUFDbkIsS0FBYSxFQUNiLE1BQWtDO0lBRWxDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0UsT0FBTyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBRSxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGlCQUFpQixDQUM5QixhQUErQixFQUMvQixNQUFjO0lBRWQsTUFBTSxHQUFHLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFM0IsTUFBTSxJQUFJLEdBQUc7UUFDWCxHQUFHLEdBQUcsQ0FBQyxJQUFJO1FBQ1gsS0FBSztRQUNMLGFBQWEsQ0FBQyxNQUFNO1FBQ3BCLFNBQVM7UUFDVCxnQkFBZ0I7UUFDaEIsUUFBUTtRQUNSLElBQUk7S0FDTCxDQUFDO0lBQ0YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFbkYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO1FBQ2pELEdBQUcsRUFBRSxNQUFNO1FBQ1gsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFNBQVM7UUFDakIsS0FBSyxFQUFFLEtBQUs7S0FDYixDQUFDLENBQUM7SUFDSCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQkFBMkIsTUFBTSxDQUFDLFFBQVEsTUFBTSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDakYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDL0UsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDhEQUE4RDtJQUNoRSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSxhQUFhLENBQzFCLGFBQStCLEVBQy9CLE1BQWMsRUFDZCxPQUFxQztJQUVyQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsYUFBYSxDQUFDLE1BQU0sbUVBQW1FLENBQ25HLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLGVBQWUsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQztJQUM5RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixTQUFTLGVBQWUsQ0FDdEIsYUFBK0IsRUFDL0IsT0FBcUM7SUFFckMsT0FBTyxhQUFhLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDLGdCQUFnQixJQUFJLDBCQUEwQixDQUFDO0FBQ2xHLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7SUFDbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixRQUFRLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxTQUFTLGVBQWUsQ0FBQyxTQUFpQjtJQUN4QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFRRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMxQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pDLElBQUksTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQXFCLEVBQUUsQ0FBQztJQUNsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFBRSxTQUFTO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxhQUFhLENBQUMsV0FBdUIsRUFBRSxJQUFzQjtJQUMxRSxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3RGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUUsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILEtBQUssVUFBVSxjQUFjLENBQzNCLEdBQVcsRUFDWCxJQUFzQixFQUN0QixNQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckYsTUFBTSxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFBYztJQUM5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YXJ0dXAgcHJvdmlzaW9uaW5nIG9mIHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIGZvciBhIE1hc3RyYSB3b3Jrc3BhY2UuXG4gKlxuICogQSB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2V9IG5hbWVzIFdIRVJFIGEgYFNLSUxMLm1kYCB0cmVlIGNvbWVzIGZyb20gLSB0aGVcbiAqIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYW55IGdpdCAvIEdpdExhYiBVUkwsXG4gKiBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgLSBhbmQgb3B0aW9uYWwgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKiB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSBtYXRlcmlhbGl6ZXMgZXZlcnkgc291cmNlIGludG8gYSBsb2NhbFxuICogYFNLSUxMLm1kYCB0cmVlIGF0IGFwcCBib290IGFuZCByZXR1cm5zIHRoZSBkaXJlY3RvcmllcyB0byBoYW5kIE1hc3RyYSBhc1xuICogZXh0cmEgc2tpbGwgc2NhbiBwYXRocy5cbiAqXG4gKiBSZXNvbHV0aW9uIHBlciBzb3VyY2UsIGluIG9yZGVyOlxuICpcbiAqIDEuIHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50IChgXCJhaXRvb2xzXCJgKTogRGF0YWJyaWNrcycgb3duIHNraWxsXG4gKiAgICBzZXQsIHJlYWQgc3RyYWlnaHQgZnJvbSB0aGUgcHVibGljIHJlcG8gdGhlIGBkYXRhYnJpY2tzIGFpdG9vbHNgIENMSVxuICogICAgc291cmNlcyBmcm9tLiBObyBDTEksIG5vIERhdGFicmlja3MgYXV0aCAtIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgdXNhYmxlXG4gKiAgICBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIsIHdoZXJlIHRoZSBDTEkgaXMgbm90IGluc3RhbGxlZDtcbiAqIDIuIHRoZSBPUFRJT05BTCBgc2tpbGxzYCBucG0gQ0xJIChwZWVyIGRlcCk6IGlmIGluc3RhbGxlZCwgZWFjaCBzb3VyY2UgaXNcbiAqICAgIGNvcGllZCBpbnRvIGEgc3RhZ2luZyBkaXIgd2l0aCBgc2tpbGxzIGFkZCA8c291cmNlPiAtLWFnZW50IDxkaXI+IC0tY29weWAsXG4gKiAgICB3aGljaCB1bmRlcnN0YW5kcyBldmVyeSBzb3VyY2UgZm9ybWF0IHRoZSBlY29zeXN0ZW0gZG9lcyAoR2l0SHViXG4gKiAgICBzaG9ydGhhbmQsIGdpdCBVUkxzLCBhcmNoaXZlL2Rvd25sb2FkIFVSTHMpO1xuICogMy4gb3RoZXJ3aXNlIGEgcGxhaW4ge0BsaW5rIGZldGNofSBvZiB0aGUgc291cmNlIFVSTCAoYnVpbHQgd2l0aFxuICogICAge0BsaW5rIG5ldC51cmxCdWlsZGVyfSksIHdyaXRpbmcgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB0byBhIHN0YWdpbmdcbiAqICAgIGRpci5cbiAqXG4gKiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzIHRocm91Z2ggbmVpdGhlciBwYXRoIGZhaWxzIGFwcCBzdGFydHVwLCB1bmxlc3MgdGhlXG4gKiBzb3VyY2UgKG9yIHRoZSB0b3AtbGV2ZWwgY2FsbCkgc2V0cyBgZmFpbE9uRXJyb3I6IGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBpdCBpc1xuICogbG9nZ2VkIGFuZCBza2lwcGVkIHNvIG9uZSBiYWQgc291cmNlIG5ldmVyIHRha2VzIHRoZSBhcHAgZG93bi5cbiAqXG4gKiBFdmVyeSBwcm92aXNpb25lZCB0cmVlIGNhcnJpZXMgYSB7QGxpbmsgTUVUQURBVEFfRklMRX0gcmVjb3JkaW5nIHdoZW4gZWFjaFxuICogc291cmNlIHdhcyBsYXN0IGRvd25sb2FkZWQsIGFuZCBhIHNvdXJjZSBpcyBvbmx5IHJlLWRvd25sb2FkZWQgb25jZSB0aGF0XG4gKiByZWNvcmQgaXMgb2xkZXIgdGhhbiB7QGxpbmsgREVGQVVMVF9SRUZSRVNIX1RUTF9NU30gKGEgZGF5KS4gVGhpcyBydW5zIGF0IGFwcFxuICogQk9PVCwgc28gd2l0aG91dCBpdCBhIGNvbnRhaW5lciB0aGF0IHJlc3RhcnRzIGEgZG96ZW4gdGltZXMgYW4gaG91ciByZS1wdWxsc1xuICogdGhlIHdob2xlIEFJIFRvb2xzIHNldCBhIGRvemVuIHRpbWVzIGZvciBjb250ZW50IHRoYXQgY2hhbmdlcyByYXJlbHkuIFRoZVxuICogcmVjb3JkIHRyYXZlbHMgV0lUSCB0aGUgdHJlZSByYXRoZXIgdGhhbiBpbiBwcm9jZXNzIG1lbW9yeSwgc28gdGhlIHJldXNlXG4gKiBzdXJ2aXZlcyBhIHJlc3RhcnQgLSB3aGljaCBpcyB0aGUgb25seSB3YXkgaXQgaGVscHMgYSBEYXRhYnJpY2tzIEFwcCBhdCBhbGwuXG4gKiBQYXNzIGByZWZyZXNoVHRsTXM6IDBgIHRvIGRvd25sb2FkIG9uIGV2ZXJ5IGJvb3QuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIHNhbWUgdHJlZSBhIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICogYWN0aW9uIHdyaXRlcyB0byksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgXG4gKiBpbnN0ZWFkLiBXaGVuIG5vIERhdGFicmlja3MgY2xpZW50IGlzIHJlc29sdmFibGUgYXQgc3RhcnR1cCwgdGhlIHRyZWUgaXNcbiAqIHdyaXR0ZW4gdW5kZXIge0BsaW5rIGxvY2FsRlMudG1wRlN9IGFuZCByZXR1cm5lZCBhcyBhbiBleHRyYSBsb2NhbCBza2lsbCBwYXRoXG4gKiBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQgeyBlcnJvciwgaGFzaCwganNvbiwgbG9nLCBuZXQsIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogU3RhYmxlIHRlbXAgZGlyZWN0b3J5IGhvbGRpbmcgb25lIHJlYnVpbHQgc2tpbGwgdHJlZSBwZXIgcmVtb3RlIHNvdXJjZS4gKi9cbmNvbnN0IExPQ0FMX1NLSUxMU19ESVIgPSBcIm1hc3RyYS1sb2NhbC1za2lsbHNcIjtcblxuLyoqXG4gKiBCb29ra2VlcGluZyBmaWxlIHdyaXR0ZW4gYXQgdGhlIHJvb3Qgb2YgZXZlcnkgcHJvdmlzaW9uZWQgc2tpbGwgdHJlZSwgbmFtaW5nXG4gKiB3aGVuIGVhY2ggc291cmNlIHdhcyBsYXN0IGRvd25sb2FkZWQuIEEgZG90ZmlsZSBzbyB0aGUgc2tpbGwgc2Nhbm5lcnMsIHdoaWNoXG4gKiBsb29rIGZvciBgPGRpcj4vU0tJTEwubWRgLCBuZXZlciBtaXN0YWtlIGl0IGZvciBhIHNraWxsLlxuICovXG5jb25zdCBNRVRBREFUQV9GSUxFID0gXCIubWV0YWRhdGEuanNvblwiO1xuXG4vKiogU2hhcGUgbWFya2VyIGZvciB7QGxpbmsgTUVUQURBVEFfRklMRX07IGFuIHVua25vd24gdmVyc2lvbiBpcyBpZ25vcmVkLCBub3QgcmVhZC4gKi9cbmNvbnN0IE1FVEFEQVRBX1ZFUlNJT04gPSAxO1xuXG4vKiogSG93IGxvbmcgYSBwcm92aXNpb25lZCBzb3VyY2UgaXMgcmV1c2VkIGJlZm9yZSBiZWluZyBkb3dubG9hZGVkIGFnYWluLiAqL1xuY29uc3QgREVGQVVMVF9SRUZSRVNIX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBSSBUb29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTb3VyY2UgY29uc3RhbnQgc2VsZWN0aW5nIERhdGFicmlja3MnIG93biBBSSBUb29scyBza2lsbCBzZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hc3RyYSh7IHJlbW90ZVNraWxsczogXCJhaXRvb2xzXCIgfSk7XG4gKi9cbmV4cG9ydCBjb25zdCBBSVRPT0xTX1NPVVJDRSA9IFwiYWl0b29sc1wiO1xuXG4vKiogVGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gbGl0ZXJhbCwgZm9yIGNhbGxlcnMgc3BlbGxpbmcgdGhlIHVuaW9uIG91dC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbHNTb3VyY2UgPSB0eXBlb2YgQUlUT09MU19TT1VSQ0U7XG5cbi8qKlxuICogVGhlIFBVQkxJQyByZXBvIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbGAgc291cmNlcyBmcm9tLiBSZWFkaW5nIGl0XG4gKiBkaXJlY3RseSBpcyB3aGF0IGxldHMgYW4gYXBwIGdldCB0aGUgc2FtZSBza2lsbHMgdGhlIENMSSBpbnN0YWxscyB3aXRob3V0XG4gKiB0aGUgQ0xJIC0gd2hpY2ggYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIgZG9lcyBub3Qgc2hpcC5cbiAqL1xuY29uc3QgQUlUT09MU19SRVBPID0gXCJkYXRhYnJpY2tzL2RhdGFicmlja3MtYWdlbnQtc2tpbGxzXCI7XG5cbi8qKiBSZXBvIHJlZiB0aGUgc2tpbGxzIGFyZSByZWFkIGZyb20uIE92ZXJyaWRlIHBlciBzb3VyY2Ugd2l0aCBgcmVmYC4gKi9cbmNvbnN0IEFJVE9PTFNfUkVGID0gXCJtYWluXCI7XG5cbi8qKiBTa2lsbCBmaWxlcyBkb3dubG9hZGVkIGF0IG9uY2U7IHRoZSBzZXQgaXMgfjMwIHNraWxscyBvZiBhIGZldyBmaWxlcyBlYWNoLiAqL1xuY29uc3QgQUlUT09MU19DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIHRoZSByZXBvJ3MgZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBBaVRvb2xzTWFuaWZlc3Qge1xuICBza2lsbHM/OiBSZWNvcmQ8c3RyaW5nLCB7IGZpbGVzPzogc3RyaW5nW107IHJlcG9fZGlyPzogc3RyaW5nIH0+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSByZW1vdGUgc2tpbGwgc291cmNlIGFuZCBpdHMgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYHNvdXJjZWAgaXMge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBvciBhbnl0aGluZyB0aGUgYHNraWxsc2AgZWNvc3lzdGVtXG4gKiB1bmRlcnN0YW5kczogYSBHaXRIdWIgYG93bmVyL3JlcG9gIHNob3J0aGFuZCwgYSBmdWxsIEdpdEh1YiAvIEdpdExhYiAvIGdpdFxuICogVVJMLCBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgdG8gYSBgU0tJTEwubWRgIG9yIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHtcbiAgLyoqIGBcImFpdG9vbHNcImAsIGEgR2l0SHViIHNob3J0aGFuZCwgYSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRvd25sb2FkIFVSTC4gKi9cbiAgc291cmNlOiBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2U7XG4gIC8qKiBJbnN0YWxsIG9ubHkgdGhlc2Ugc2tpbGwgbmFtZXMgZnJvbSB0aGUgc291cmNlLiAqL1xuICBza2lsbHM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIEluY2x1ZGUgZXhwZXJpbWVudGFsIHNraWxscy4gYFwiYWl0b29sc1wiYCBvbmx5LiAqL1xuICBleHBlcmltZW50YWw/OiBib29sZWFuO1xuICAvKiogUGluIHRoZSByZXBvIHJlZiAodGFnIC8gYnJhbmNoIC8gc2hhKS4gYFwiYWl0b29sc1wiYCBvbmx5OyBkZWZhdWx0cyB0byBgbWFpbmAuICovXG4gIHJlZj86IHN0cmluZztcbiAgLyoqIE92ZXJyaWRlIHRoZSBieXRlIGNlaWxpbmcgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgZm9yIHRoaXMgc291cmNlLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogSG93IGxvbmcgdGhpcyBzb3VyY2UncyBwcm92aXNpb25lZCB0cmVlIGlzIHJldXNlZCBiZWZvcmUgaXQgaXMgZG93bmxvYWRlZFxuICAgKiBhZ2FpbiwgaW4gbWlsbGlzZWNvbmRzLiBPdmVycmlkZXMgdGhlIHRvcC1sZXZlbFxuICAgKiB7QGxpbmsgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucy5yZWZyZXNoVHRsTXN9OyBgMGAgcmUtZG93bmxvYWRzIG9uXG4gICAqIGV2ZXJ5IGJvb3QuXG4gICAqL1xuICByZWZyZXNoVHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVuIGBmYWxzZWAsIGEgc291cmNlIHRoYXQgZmFpbHMgdG8gcmVzb2x2ZSBpcyBsb2dnZWQgYW5kIHNraXBwZWQgaW5zdGVhZFxuICAgKiBvZiBmYWlsaW5nIGFwcCBzdGFydHVwLiBPdmVycmlkZXMgdGhlIHRvcC1sZXZlbCB7QGxpbmsgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucy5mYWlsT25FcnJvcn0uXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSByZW1vdGUgc2tpbGwgc291cmNlOiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCwgYSBVUkwtbGlrZVxuICogKHN0cmluZyAvIGBVUkxgIC8gYHsgdXJsIH1gKSwgb3IgYSB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zfSBiYWcgd2l0aFxuICogcGVyLXNvdXJjZSBwb2xpY3kuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW90ZVNraWxsU291cmNlID0gbmV0LlVybExpa2UgfCBBaVRvb2xzU291cmNlIHwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zO1xuXG4vKipcbiAqIFRoZSB3b3Jrc3BhY2UgYHJlbW90ZVNraWxsc2Agb3B0aW9uOiBvbmUgc291cmNlLCBhIG5vbi1lbXB0eSBsaXN0IG9mIHRoZW0sIG9yXG4gKiBhIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zfSBiYWcgd2hlbiB0b3AtbGV2ZWwgcG9saWN5IGlzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxzT3B0aW9uID1cbiAgUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+IHwgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucztcblxuLyoqIEEgc291cmNlIGVudHJ5IHdpdGggaXRzIGBzb3VyY2VgIGZsYXR0ZW5lZCB0byBhIHBsYWluIHN0cmluZy4gKi9cbnR5cGUgTm9ybWFsaXplZFNvdXJjZSA9IE9taXQ8UmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBcInNvdXJjZVwiPiAmIHsgc291cmNlOiBzdHJpbmcgfTtcblxuLyoqIFRvcC1sZXZlbCByZW1vdGUtc2tpbGxzIHByb3Zpc2lvbmluZyBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgLyoqIFNvdXJjZXMgdG8gbWF0ZXJpYWxpemUgYXQgc3RhcnR1cC4gKi9cbiAgc291cmNlczogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+O1xuICAvKipcbiAgICogRmFpbCBhcHAgc3RhcnR1cCB3aGVuIGEgc291cmNlIGNhbid0IGJlIHJlc29sdmVkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuIEFcbiAgICogcGVyLXNvdXJjZSBgZmFpbE9uRXJyb3JgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xuICAvKipcbiAgICogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIHRoYXQgcm9vdHMgdGhlIGRlc3RpbmF0aW9uIEFzc2lzdGFudCBza2lsbHMgdHJlZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIE9CTyB1c2VyJ3MgYC9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYC5cbiAgICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqIEF1dGgtc2NvcGVkIERhdGFicmlja3MgY2xpZW50LiBEZWZhdWx0cyB0byB0aGUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuICBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnRMaWtlO1xuICAvKiogVXNlciBlbWFpbCB1c2VkIHRvIGRlcml2ZSB0aGUgZGVmYXVsdCBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uLiAqL1xuICB1c2VyRW1haWw/OiBzdHJpbmc7XG4gIC8qKiBCeXRlIGNlaWxpbmcgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQuIERlZmF1bHRzIHRvIDEwIE1pQi4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIGEgcHJvdmlzaW9uZWQgdHJlZSBpcyByZXVzZWQgYmVmb3JlIGl0cyBzb3VyY2UgaXMgZG93bmxvYWRlZFxuICAgKiBhZ2FpbiwgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBhIGRheTsgYDBgIHJlLWRvd25sb2FkcyBvbiBldmVyeSBib290LlxuICAgKiBBIHBlci1zb3VyY2UgYHJlZnJlc2hUdGxNc2Agd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICByZWZyZXNoVHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IHtAbGluayBwcm92aXNpb25SZW1vdGVTa2lsbHN9IHJlc29sdmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25lZFJlbW90ZVNraWxscyB7XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCBzY2FuIHBhdGhzIHRvIGhhbmQgTWFzdHJhIChhIHRlbXAgZGlyIHBlciBzb3VyY2UgdGhhdFxuICAgKiBjb3VsZG4ndCBiZSB3cml0dGVuIHRvIERhdGFicmlja3MpLiBFbXB0eSB3aGVuIGV2ZXJ5dGhpbmcgbGFuZGVkIGluIHRoZVxuICAgKiBEYXRhYnJpY2tzIEFzc2lzdGFudCB0cmVlLCB3aGljaCB0aGUgYnVpbHQtaW4gbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgICovXG4gIGxvY2FsU2tpbGxQYXRoczogc3RyaW5nW107XG4gIC8qKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGVhY2ggc291cmNlIHdhcyB3cml0dGVuIHRvLCBpZiBhbnkuICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzIG9mIGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSBub3cgYXZhaWxhYmxlLCB3aGV0aGVyIGl0IHdhcyBkb3dubG9hZGVkIG9uXG4gICAqIHRoaXMgYm9vdCBvciByZXVzZWQgZnJvbSBhIHN0aWxsLWZyZXNoIHRyZWUgKHNlZSB7QGxpbmsgTUVUQURBVEFfRklMRX0pLlxuICAgKi9cbiAgc2tpbGxOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCBvbmUgc291cmNlJ3MgbGFzdCBkb3dubG9hZCBsZWZ0IGJlaGluZCwgYXMgcmVjb3JkZWQgaW5cbiAqIHtAbGluayBNRVRBREFUQV9GSUxFfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbENhY2hlRW50cnkge1xuICAvKiogVGhlIHNvdXJjZSBzdHJpbmcgdGhpcyBlbnRyeSB3YXMgZG93bmxvYWRlZCBmcm9tLCBmb3IgcmVhZGFiaWxpdHkuICovXG4gIHNvdXJjZTogc3RyaW5nO1xuICAvKiogV2hlbiB0aGUgZG93bmxvYWQgY29tcGxldGVkLCBJU08tODYwMS4gKi9cbiAgZG93bmxvYWRlZEF0OiBzdHJpbmc7XG4gIC8qKiBTa2lsbCBkaXJlY3RvcnkgbmFtZXMgdGhlIGRvd25sb2FkIHByb2R1Y2VkLiAqL1xuICBza2lsbHM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeSB0aGF0IGRvd25sb2FkIHVzZWQuIEFsc28gZm9sZGVkIGludG8gdGhlIGVudHJ5XG4gICAqIEtFWSwgc28gbmFycm93aW5nIGBza2lsbHNgIG9yIG1vdmluZyBgcmVmYCBtaXNzZXMgdGhlIGNhY2hlIGluc3RlYWQgb2ZcbiAgICogc2lsZW50bHkgc2VydmluZyB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgKi9cbiAgcG9saWN5PzogeyBza2lsbHM/OiBzdHJpbmdbXTsgZXhwZXJpbWVudGFsPzogYm9vbGVhbjsgcmVmPzogc3RyaW5nIH07XG59XG5cbi8qKiBUaGUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IGRvY3VtZW50OiBvbmUgZW50cnkgcGVyIHByb3Zpc2lvbmVkIHNvdXJjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxzTWV0YWRhdGEge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFJlbW90ZVNraWxsQ2FjaGVFbnRyeT47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBOb3JtYWxpemUgdGhlIGByZW1vdGVTa2lsbHNgIG9wdGlvbiBpbnRvIGEgZmxhdCBvcHRpb25zIGJhZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24oXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYmFnID0gaXNQcm92aXNpb25PcHRpb25zKG9wdGlvbikgPyBvcHRpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNvdXJjZXMgPSB0b1NvdXJjZUxpc3QoYmFnID8gYmFnLnNvdXJjZXMgOiAob3B0aW9uIGFzIFJlbW90ZVNraWxsU291cmNlKSk7XG4gIC8vIEFuIGVtcHR5IGxpc3QgaXMgdGhlIHNhbWUgYXMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwuXG4gIGlmICghb2JqZWN0LmlzT25lT3JNYW55KHNvdXJjZXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyAuLi5iYWcsIHNvdXJjZXMgfTtcbn1cblxuLyoqIEEgYHNvdXJjZXNgLWJlYXJpbmcgYmFnIGlzIHRoZSB0b3AtbGV2ZWwgb3B0aW9ucyBzaGFwZSwgbm90IGEgc2luZ2xlIHNvdXJjZS4gKi9cbmZ1bmN0aW9uIGlzUHJvdmlzaW9uT3B0aW9ucyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSAmJiBcInNvdXJjZXNcIiBpbiB2YWx1ZTtcbn1cblxuLyoqIE9uZSBzb3VyY2Ugb3IgbWFueSwgYXMgYSBwbGFpbiBhcnJheS4gQSBzb3VyY2UgaXMgbmV2ZXIgaXRzZWxmIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VMaXN0KFxuICBpbnB1dDogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+LFxuKTogUmVtb3RlU2tpbGxTb3VyY2VbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IFsuLi5pbnB1dF0gOiBbaW5wdXRdO1xufVxuXG4vKiogRmxhdHRlbiBhIHNvdXJjZSBlbnRyeSAtIHN0cmluZywgYFVSTGAsIGB7IHVybCB9YCwgb3Igb3B0aW9ucyBiYWcgLSB0byBhIHtAbGluayBOb3JtYWxpemVkU291cmNlfS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlT3B0aW9ucyhzb3VyY2U6IFJlbW90ZVNraWxsU291cmNlKTogTm9ybWFsaXplZFNvdXJjZSB7XG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBzb3VyY2UgfTtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudG9TdHJpbmcoKSB9O1xuICBpZiAoXCJzb3VyY2VcIiBpbiBzb3VyY2UpIHJldHVybiB7IC4uLnNvdXJjZSwgc291cmNlOiB0b1NvdXJjZVN0cmluZyhzb3VyY2Uuc291cmNlKSB9O1xuICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZS51cmwgfTtcbn1cblxuLyoqIEEge0BsaW5rIG5ldC5VcmxMaWtlfSBhcyB0aGUgcGxhaW4gc3RyaW5nIHRoZSBzdGFnaW5nIHBhdGhzIHdvcmsgd2l0aC4gKi9cbmZ1bmN0aW9uIHRvU291cmNlU3RyaW5nKHNvdXJjZTogbmV0LlVybExpa2UpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHNvdXJjZTtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFVSTCA/IHNvdXJjZS50b1N0cmluZygpIDogc291cmNlLnVybDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIHNvdXJjZSBzZWxlY3RzIHRoZSBidWlsdC1pbiBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxsIHNldC4gKi9cbmZ1bmN0aW9uIGlzQWlUb29sc1NvdXJjZShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBBSVRPT0xTX1NPVVJDRTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgcG9saWN5IHRoYXQgZGVjaWRlcyB3aGF0IGEgc291cmNlJ3MgZG93bmxvYWQgQ09OVEFJTlMuXG4gKlxuICogT25seSB0aGVzZSB0aHJlZSBjaGFuZ2UgdGhlIHJlc3VsdGluZyB0cmVlLCBzbyBvbmx5IHRoZXNlIGJlbG9uZyBpbiB0aGUgY2FjaGVcbiAqIGtleSAtIGBmYWlsT25FcnJvcmAgYW5kIGBtYXhEb3dubG9hZEJ5dGVzYCBnb3Zlcm4gaG93IGEgZmFpbHVyZSBpcyBoYW5kbGVkLFxuICogbm90IHdoYXQgYSBzdWNjZXNzIHByb2R1Y2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5W1wicG9saWN5XCJdIHtcbiAgY29uc3Qgc2tpbGxzID0gc3RyaW5nLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8geyByZWY6IHNvdXJjZU9wdGlvbnMucmVmIS50cmltKCkgfSA6IHt9KSxcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBvbGljeSkubGVuZ3RoID4gMCA/IHBvbGljeSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFibGUgaWRlbnRpdHkgb2YgYSBzb3VyY2UgQU5EIGl0cyBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kuXG4gKlxuICogS2V5aW5nIG9uIHRoZSBzb3VyY2UgYWxvbmUgd291bGQgbGV0IGEgY2hhbmdlZCBgc2tpbGxzYCBmaWx0ZXIgb3IgYHJlZmAgcmVhZFxuICogYmFjayB0aGUgcHJldmlvdXMgZG93bmxvYWQgZm9yIGEgZGF5OyBrZXlpbmcgb24gYm90aCB0dXJucyB0aGF0IGludG8gYSBtaXNzLlxuICogVGhlIHNraWxsIGxpc3QgaXMgc29ydGVkIGZpcnN0IHNvIGEgcmVvcmRlcmVkIGFycmF5IGlzIHN0aWxsIHRoZSBzYW1lIGtleS5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkoc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNoLmZudkhhc2goXG4gICAgSlNPTi5zdHJpbmdpZnkoeyBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLCBwb2xpY3k6IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpID8/IG51bGwgfSksXG4gICk7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIHJldXNlIHdpbmRvdzogcGVyLXNvdXJjZSwgdGhlbiB0b3AtbGV2ZWwsIHRoZW4gYSBkYXkuICovXG5mdW5jdGlvbiByZXNvbHZlUmVmcmVzaFR0bChcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiBzb3VyY2VPcHRpb25zLnJlZnJlc2hUdGxNcyA/PyBvcHRpb25zLnJlZnJlc2hUdGxNcyA/PyBERUZBVUxUX1JFRlJFU0hfVFRMX01TO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIG1ldGFkYXRhIGRvY3VtZW50IGF0IHRoZSByb290IG9mIGEgcHJvdmlzaW9uZWQgdHJlZSwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gdGhlcmUgaXMgbm9uZSwgaXQgaXMgdW5yZWFkYWJsZSwgb3IgaXQgd2FzIHdyaXR0ZW4gYnkgYSBzaGFwZSB0aGlzXG4gKiB2ZXJzaW9uIGRvZXMgbm90IGtub3cuXG4gKlxuICogTmV2ZXIgdGhyb3dzOiBhIG1pc3Npbmcgb3IgY29ycnVwdCByZWNvcmQgaXMgYSBjYWNoZSBNSVNTLCB3aGljaCBjb3N0cyBhXG4gKiBkb3dubG9hZCAtIHdoaWxlIGxldHRpbmcgaXQgZmFpbCB3b3VsZCB0YWtlIGFwcCBzdGFydHVwIGRvd24gb3ZlclxuICogYm9va2tlZXBpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNZXRhZGF0YShmczogRmlsZVN5c3RlbSk6IFByb21pc2U8UmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHMoTUVUQURBVEFfRklMRSkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKE1FVEFEQVRBX0ZJTEUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3LCB1bmRlZmluZWQpIGFzIFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnNlZCkgfHwgcGFyc2VkLnZlcnNpb24gIT09IE1FVEFEQVRBX1ZFUlNJT04pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9iamVjdC5pc1JlY29yZChwYXJzZWQuc291cmNlcykgPyBwYXJzZWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlOnVucmVhZGFibGVcIiwgeyBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gZW50cnkgaXMgc3RpbGwgaW5zaWRlIGl0cyByZXVzZSB3aW5kb3cuXG4gKlxuICogQSBgdHRsTXNgIG9mIGAwYCBkaXNhYmxlcyByZXVzZSBvdXRyaWdodCwgYW5kIGFuIHVucGFyc2VhYmxlIG9yIEZVVFVSRVxuICogdGltZXN0YW1wIGNvdW50cyBhcyBzdGFsZSAtIGEgY2xvY2sgdGhhdCBtb3ZlZCBiYWNrd2FyZHMgc2hvdWxkIGNvc3Qgb25lXG4gKiBleHRyYSBkb3dubG9hZCwgbm90IHBpbiBhIHRyZWUgYXMgZnJlc2ggaW5kZWZpbml0ZWx5LlxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksIHR0bE1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR0bE1zIDw9IDAgfHwgIUFycmF5LmlzQXJyYXkoZW50cnkuc2tpbGxzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkb3dubG9hZGVkQXQgPSBEYXRlLnBhcnNlKGVudHJ5LmRvd25sb2FkZWRBdCA/PyBcIlwiKTtcbiAgaWYgKE51bWJlci5pc05hTihkb3dubG9hZGVkQXQpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBkb3dubG9hZGVkQXQ7XG4gIHJldHVybiBhZ2UgPj0gMCAmJiBhZ2UgPCB0dGxNcztcbn1cblxuLyoqXG4gKiBNZXJnZSBvbmUgc291cmNlJ3MgZW50cnkgaW50byB0aGUgdHJlZSdzIG1ldGFkYXRhIGRvY3VtZW50LCBwcmVzZXJ2aW5nIHdoYXRcbiAqIG90aGVyIHNvdXJjZXMgcmVjb3JkZWQgLSB0aGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBpcyBTSEFSRUQsIHNvIGEgYmxpbmRcbiAqIG92ZXJ3cml0ZSB3b3VsZCBkcm9wIGV2ZXJ5IHNpYmxpbmcgc291cmNlJ3MgdGltZXN0YW1wIGFuZCByZS1kb3dubG9hZCB0aGVcbiAqIGxvdCBvbiB0aGUgbmV4dCBib290LlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1ldGFkYXRhKFxuICBmczogRmlsZVN5c3RlbSxcbiAga2V5OiBzdHJpbmcsXG4gIGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY3VycmVudCA9IGF3YWl0IHJlYWRNZXRhZGF0YShmcyk7XG4gIGNvbnN0IG5leHQ6IFJlbW90ZVNraWxsc01ldGFkYXRhID0ge1xuICAgIHZlcnNpb246IE1FVEFEQVRBX1ZFUlNJT04sXG4gICAgc291cmNlczogeyAuLi5jdXJyZW50Py5zb3VyY2VzLCBba2V5XTogZW50cnkgfSxcbiAgfTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKE1FVEFEQVRBX0ZJTEUsIGAke0pTT04uc3RyaW5naWZ5KG5leHQsIG51bGwsIDIpfVxcbmAsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xufVxuXG4vKiogVGhlIHN0YWJsZSBsb2NhbCB0cmVlIGEgc291cmNlIGlzIHJlYnVpbHQgaW50bywga2V5ZWQgYnkge0BsaW5rIGNhY2hlS2V5fS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxzRlMoa2V5OiBzdHJpbmcpOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICByZXR1cm4gbG9jYWxGUy50bXBGUyhgJHtMT0NBTF9TS0lMTFNfRElSfS8ke2tleX1gKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSBldmVyeSBjb25maWd1cmVkIHJlbW90ZSBza2lsbCBzb3VyY2UgYXQgYXBwIHN0YXJ0dXAuXG4gKlxuICogV3JpdGVzIGVhY2ggcmVzb2x2ZWQgYFNLSUxMLm1kYCB0cmVlIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIgQXNzaXN0YW50IHNraWxsc1xuICogZm9sZGVyIHdoZW4gYSB3cml0YWJsZSB3b3Jrc3BhY2UgaXMgYXZhaWxhYmxlLCBlbHNlIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gcmV0dXJuZWQgaW4ge0BsaW5rIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLmxvY2FsU2tpbGxQYXRoc30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbFBhdGhzOiBbXSwgc2tpbGxOYW1lczogW10gfTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gZW1wdHk7XG5cbiAgY29uc3QgZmFpbERlZmF1bHQgPSBvcHRpb25zLmZhaWxPbkVycm9yICE9PSBmYWxzZTtcbiAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICBjb25zdCBkYXRhYnJpY2tzQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gZGF0YWJyaWNrc0Jhc2VQYXRoXG4gICAgPyBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgICAgICBjbGllbnQ6IGNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQsXG4gICAgICAgIHJvb3Q6IGRhdGFicmlja3NCYXNlUGF0aCxcbiAgICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgICBjcmVhdGVSb290OiB0cnVlLFxuICAgICAgfSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGRlc3RpbmF0aW9uIHJvb3RzIHRoZSBzaGFyZWQgbWV0YWRhdGEgZG9jdW1lbnQsIHNvIGl0IGhhcyB0byBleGlzdFxuICAvLyBiZWZvcmUgdGhlIGZpcnN0IGNhY2hlIFJFQUQgLSBgY29weVNraWxsRGlyc2Agd291bGQgb3RoZXJ3aXNlIGJlIHRoZSBmaXJzdFxuICAvLyB0aGluZyB0byBjcmVhdGUgaXQsIHdoaWNoIGlzIHRvbyBsYXRlLlxuICBpZiAoZGVzdGluYXRpb24pIGF3YWl0IGRlc3RpbmF0aW9uLmluaXQoKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuc291cmNlcykgPyBvcHRpb25zLnNvdXJjZXMgOiBbb3B0aW9ucy5zb3VyY2VzXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZU9wdGlvbnMgPSB0b1NvdXJjZU9wdGlvbnMoZW50cnkpO1xuICAgICAgY29uc3QgZmFpbE9uRXJyb3IgPSBzb3VyY2VPcHRpb25zLmZhaWxPbkVycm9yID8/IGZhaWxEZWZhdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gV2hlcmUgdGhpcyBzb3VyY2UncyBib29ra2VlcGluZyBsaXZlczogdGhlIHNoYXJlZCBEYXRhYnJpY2tzIHRyZWUsIG9yXG4gICAgICAgIC8vIHRoZSBzb3VyY2UncyBvd24gc3RhYmxlIGxvY2FsIGRpci5cbiAgICAgICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc291cmNlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNhY2hlRlMgPSBkZXN0aW5hdGlvbiA/PyBsb2NhbFNraWxsc0ZTKGtleSk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IChhd2FpdCByZWFkTWV0YWRhdGEoY2FjaGVGUykpPy5zb3VyY2VzW2tleV07XG4gICAgICAgIGlmIChjYWNoZWQgJiYgaXNGcmVzaChjYWNoZWQsIHJlc29sdmVSZWZyZXNoVHRsKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpKSkge1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5jYWNoZWQuc2tpbGxzKTtcbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uKSBsb2NhbFNraWxsUGF0aHMucHVzaChjYWNoZUZTLnJvb3QpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIHJlYWR5XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogZGF0YWJyaWNrc0Jhc2VQYXRoID8/IGNhY2hlRlMucm9vdCxcbiAgICAgICAgICAgIGRvd25sb2FkZWRBdDogY2FjaGVkLmRvd25sb2FkZWRBdCxcbiAgICAgICAgICAgIHNraWxsczogY2FjaGVkLnNraWxscyxcbiAgICAgICAgICAgIGNhY2hlZDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5pbmZvKFwiaW5zdGFsbGluZyByZW1vdGUgc2tpbGxcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnaW5nID8/PSBhd2FpdCBpbml0aWFsaXplZFNjcmF0Y2goXCJtYXN0cmEtcmVtb3RlLXNraWxsc1wiKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkRGlyID0gYXdhaXQgc3RhZ2VTb3VyY2Uoc291cmNlT3B0aW9ucywgc3RhZ2luZy5yb290LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkID0gYXdhaXQgY29sbGVjdFNraWxsRGlycyhzdGFnZWREaXIpO1xuICAgICAgICBpZiAoc3RhZ2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gU0tJTEwubWQgZm91bmQgZm9yIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2xpY3kgPSBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZW1vdGVTa2lsbENhY2hlRW50cnkgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBkb3dubG9hZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICAgIC4uLihwb2xpY3kgPyB7IHBvbGljeSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGF0YWJyaWNrc0Jhc2VQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weVNraWxsRGlycyhkZXN0aW5hdGlvbiwgc3RhZ2VkKTtcbiAgICAgICAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb3B5IGxhbmRzOiBhIG1ldGFkYXRhIGVudHJ5IHdyaXR0ZW4gZmlyc3Qgd291bGRcbiAgICAgICAgICAvLyBtYXJrIGEgZmFpbGVkIHByb3Zpc2lvbiBhcyBmcmVzaCBhbmQgc3VwcHJlc3MgdGhlIHJldHJ5IGZvciBhIGRheS5cbiAgICAgICAgICBhd2FpdCB3cml0ZU1ldGFkYXRhKGRlc3RpbmF0aW9uLCBrZXksIHJlY29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxTa2lsbFBhdGhzLnB1c2goYXdhaXQgcGVyc2lzdExvY2FsbHkoa2V5LCBzdGFnZWQsIHJlY29yZCkpO1xuICAgICAgICB9XG4gICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5yZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgaW5zdGFsbGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gbG9jYWxTa2lsbFBhdGhzLmF0KC0xKSxcbiAgICAgICAgICBza2lsbHM6IHJlY29yZC5za2lsbHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChmYWlsT25FcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBmYWlsZWQgdG8gcHJvdmlzaW9uIHJlbW90ZSBza2lsbCBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiOiAke2Vycm9yLmVycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICAgICAgICB7IGNhdXNlOiBlcnJvci50b0Vycm9yKGVycikgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwic291cmNlOnNraXBwZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWdpbmcpIHtcbiAgICAgIGF3YWl0IHJtKHN0YWdpbmcucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgbG9jYWxTa2lsbFBhdGhzLCBkYXRhYnJpY2tzQmFzZVBhdGgsIHNraWxsTmFtZXMgfTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgZm9yIGxvY2FsIHRlbXAuICovXG5mdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKSByZXR1cm4gb3B0aW9ucy5kYXRhYnJpY2tzQmFzZVBhdGgudHJpbSgpIHx8IHVuZGVmaW5lZDtcbiAgY29uc3QgZW1haWwgPSBzdHJpbmcudHJpbVRvTnVsbChvcHRpb25zLnVzZXJFbWFpbCk7XG4gIC8vIEEgbmFtZWQgdXNlciB0YXJnZXRzIHRoZWlyIHBlcnNvbmFsIEFzc2lzdGFudCB0cmVlICh0aGUgXCJzYXZlIGEgc2tpbGxcIlxuICAvLyB0YXJnZXQpOyBvdGhlcndpc2UgdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHRyZWUsIHdoaWNoIHRoZSBidWlsdC1pblxuICAvLyBBc3Npc3RhbnQtc2tpbGxzIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gIHJldHVybiBlbWFpbCA/IHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKGVtYWlsKSA6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEg7XG59XG5cbi8qKlxuICogU3RhZ2Ugb25lIHNvdXJjZSBpbnRvIGEgZnJlc2ggZGlyIHVuZGVyIGBzdGFnaW5nUm9vdGAsIHByZWZlcnJpbmcgdGhlIG9wdGlvbmFsXG4gKiBgc2tpbGxzYCBDTEkgYW5kIGZhbGxpbmcgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VTb3VyY2UoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0YXJnZXQgPSBqb2luKHN0YWdpbmdSb290LCBgc3JjLSR7aGFzaC5pZCgpfWApO1xuICBhd2FpdCBta2Rpcih0YXJnZXQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBBSSBUb29scyByZXNvbHZlcyBmcm9tIGEga25vd24gcmVwbyBsYXlvdXQsIHNvIGl0IG5ldmVyIG5lZWRzIHRoZSBDTEkuXG4gIGlmIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpKSByZXR1cm4gc3RhZ2VBaVRvb2xzKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG4gIGNvbnN0IHZpYUNsaSA9IGF3YWl0IHN0YWdlVmlhU2tpbGxzQ2xpKHNvdXJjZU9wdGlvbnMsIHRhcmdldCk7XG4gIGlmICh2aWFDbGkpIHJldHVybiB2aWFDbGk7XG4gIHJldHVybiBzdGFnZVZpYUZldGNoKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgdGhlIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzIGludG8gYHRhcmdldGAuXG4gKlxuICogUmVhZHMgdGhlIHJlcG8ncyBvd24gZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCAod2hpY2ggbmFtZXMgZWFjaCBza2lsbCdzXG4gKiBmaWxlcyBhbmQgd2hldGhlciBpdCBsaXZlcyB1bmRlciBgc2tpbGxzL2Agb3IgYGV4cGVyaW1lbnRhbC9gKSBhbmQgZG93bmxvYWRzXG4gKiB0aGVtIC0gdGhlIHNhbWUgdGhpbmcgYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBkb2VzLCBtaW51cyB0aGUgQ0xJIGFuZFxuICogbWludXMgYW55IERhdGFicmlja3MgYXV0aCwgc2luY2UgdGhlIHJlcG8gaXMgcHVibGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZUFpVG9vbHMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZiA9IHN0cmluZy50cmltVG9OdWxsKHNvdXJjZU9wdGlvbnMucmVmKSA/PyBBSVRPT0xTX1JFRjtcbiAgY29uc3QgbWFuaWZlc3QgPSBqc29uLnBhcnNlKFxuICAgIChhd2FpdCBkb3dubG9hZChhaVRvb2xzUmF3VXJsKHJlZiwgXCJtYW5pZmVzdC5qc29uXCIpLCBtYXhCeXRlcykpLnRvU3RyaW5nKFwidXRmOFwiKSxcbiAgICB1bmRlZmluZWQsXG4gICkgYXMgQWlUb29sc01hbmlmZXN0IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHdhbnRlZCA9IG5ldyBTZXQoc3RyaW5nLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpO1xuICBjb25zdCBzZWxlY3RlZCA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0Py5za2lsbHMgPz8ge30pLmZpbHRlcigoW25hbWUsIGVudHJ5XSkgPT5cbiAgICB3YW50ZWQuc2l6ZSA+IDBcbiAgICAgID8gd2FudGVkLmhhcyhuYW1lKVxuICAgICAgOiBlbnRyeS5yZXBvX2RpciAhPT0gXCJleHBlcmltZW50YWxcIiB8fCBzb3VyY2VPcHRpb25zLmV4cGVyaW1lbnRhbCA9PT0gdHJ1ZSxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gbWF0Y2hpbmcgc2tpbGxzIGluICR7QUlUT09MU19SRVBPfUAke3JlZn1gKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gc2VsZWN0ZWQuZmxhdE1hcCgoW25hbWUsIGVudHJ5XSkgPT5cbiAgICAoZW50cnkuZmlsZXMgPz8gW10pLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIHVybDogYWlUb29sc1Jhd1VybChyZWYsIGAke2VudHJ5LnJlcG9fZGlyID8/IFwic2tpbGxzXCJ9LyR7bmFtZX0vJHtmaWxlfWApLFxuICAgICAgcGF0aDogam9pbih0YXJnZXQsIG5hbWUsIC4uLmZpbGUuc3BsaXQoXCIvXCIpKSxcbiAgICB9KSksXG4gICk7XG4gIGF3YWl0IG1hcENvbmN1cnJlbnQoZmlsZXMsIEFJVE9PTFNfQ09OQ1VSUkVOQ1ksIGFzeW5jIChpdGVtKSA9PiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGRvd25sb2FkKGl0ZW0udXJsLCBtYXhCeXRlcyk7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShpdGVtLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoaXRlbS5wYXRoLCBib2R5KTtcbiAgfSk7XG5cbiAgbG9nZ2VyLmRlYnVnKFwiYWl0b29sczpzdGFnZWRcIiwgeyByZWYsIHNraWxsczogc2VsZWN0ZWQubGVuZ3RoLCBmaWxlczogZmlsZXMubGVuZ3RoIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogUmF3LWNvbnRlbnQgVVJMIGZvciBhIHBhdGggaW4gdGhlIEFJIFRvb2xzIHJlcG8gYXQgYHJlZmAuICovXG5mdW5jdGlvbiBhaVRvb2xzUmF3VXJsKHJlZjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke0FJVE9PTFNfUkVQT30vJHtyZWZ9LyR7cGF0aH1gO1xufVxuXG4vKiogUnVuIGB3b3JrZXJgIG92ZXIgYGl0ZW1zYCwgYXQgbW9zdCBgbGltaXRgIGluIGZsaWdodC4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1hcENvbmN1cnJlbnQ8VD4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4gIGxpbWl0OiBudW1iZXIsXG4gIHdvcmtlcjogKGl0ZW06IFQpID0+IFByb21pc2U8dm9pZD4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGN1cnNvciA9IDA7XG4gIGNvbnN0IHJ1bm5lcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihsaW1pdCwgaXRlbXMubGVuZ3RoKSB9LCBhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKGN1cnNvciA8IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgYXdhaXQgd29ya2VyKGl0ZW1zW2N1cnNvcisrXSEpO1xuICAgIH1cbiAgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHJ1bm5lcnMpO1xufVxuXG4vKipcbiAqIENvcHkgYSBzb3VyY2UgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBgc2tpbGxzYCBDTEkgd2hlbiBpdCBpcyBpbnN0YWxsZWQuXG4gKiBSZXR1cm5zIHRoZSBkaXIgaG9sZGluZyB0aGUgY29waWVkIGBTS0lMTC5tZGAgdHJlZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gKiBDTEkgaXMgYWJzZW50IChzbyB0aGUgY2FsbGVyIGNhbiBmYWxsIGJhY2sgdG8gYSBmZXRjaCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhU2tpbGxzQ2xpKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNsaSA9IGF3YWl0IHJlc29sdmVTa2lsbHNDbGkoKTtcbiAgaWYgKCFjbGkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAuLi5jbGkuYXJncyxcbiAgICBcImFkZFwiLFxuICAgIHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgIFwiLS1hZ2VudFwiLFxuICAgIFNLSUxMU19DTElfQUdFTlQsXG4gICAgXCItLWNvcHlcIixcbiAgICBcIi15XCIsXG4gIF07XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc3RyaW5nLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpIHtcbiAgICBhcmdzLnB1c2goXCItLXNraWxsXCIsIHNraWxsKTtcbiAgfVxuICBpZiAoc3RyaW5nLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykubGVuZ3RoID09PSAwKSBhcmdzLnB1c2goXCItLXNraWxsXCIsIFwiKlwiKTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjLnNwYXduKGNsaS5jb21tYW5kLCBhcmdzLCB7XG4gICAgY3dkOiB0YXJnZXQsXG4gICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgIGNoZWNrOiBmYWxzZSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgc2tpbGxzIENMSSBmYWlsZWQgKGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9KTogJHtyZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXR9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBqb2luKHRhcmdldCwgLi4uU0tJTExTX0NMSV9MQVlPVVQpO1xufVxuXG4vKipcbiAqIExvY2F0ZSB0aGUgb3B0aW9uYWwgYHNraWxsc2AgQ0xJIGJpbiwgcmVzb2x2ZWQgZnJvbSBUSElTIHBhY2thZ2UncyBtb2R1bGVcbiAqIGdyYXBoLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIHBlZXIgZGVwIGlzbid0IGluc3RhbGxlZCwgc28gdGhlIGNhbGxlclxuICogZmFsbHMgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsc0NsaSgpOiBQcm9taXNlPHsgY29tbWFuZDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBwa2dQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwic2tpbGxzL3BhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBiaW4gPSBqb2luKHBrZ1BhdGgsIFwiLi5cIiwgXCJiaW5cIiwgXCJjbGkubWpzXCIpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGJpbikpIHJldHVybiB7IGNvbW1hbmQ6IHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3M6IFtiaW5dIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIHBlZXIgZGVwIGFic2VudCBvciB1bnJlc29sdmFibGUgLSBmZXRjaCBmYWxsYmFjayBoYW5kbGVzIGl0XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHNvdXJjZSBVUkwgYW5kIHdyaXRlIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdW5kZXIgYHRhcmdldGAuXG4gKiBVc2VkIHdoZW4gdGhlIGBza2lsbHNgIENMSSBpc24ndCBpbnN0YWxsZWQ7IHN1cHBvcnRzIGEgZGlyZWN0IGBTS0lMTC5tZGAgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYUZldGNoKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHNvdXJjZU9wdGlvbnMuc291cmNlKTtcbiAgaWYgKCF1cmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIiBpcyBub3QgYSBVUkwgYW5kIHRoZSBvcHRpb25hbCBcInNraWxsc1wiIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZGAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBhd2FpdCBkb3dubG9hZCh1cmwudG9TdHJpbmcoKSwgcmVzb2x2ZU1heEJ5dGVzKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpKTtcbiAgY29uc3QgbmFtZSA9IHN0cmluZy50b1NsdWcoZGVyaXZlU2tpbGxOYW1lKHVybC50b1N0cmluZygpKSkgfHwgXCJyZW1vdGUtc2tpbGxcIjtcbiAgY29uc3Qgc2tpbGxEaXIgPSBqb2luKHRhcmdldCwgbmFtZSk7XG4gIGF3YWl0IG1rZGlyKHNraWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oc2tpbGxEaXIsIFwiU0tJTEwubWRcIiksIGJ1ZmZlcik7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIGRvd25sb2FkIGNlaWxpbmc6IHBlci1zb3VyY2UsIHRoZW4gdG9wLWxldmVsLCB0aGVuIHRoZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1heEJ5dGVzKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBvcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVM7XG59XG5cbi8qKiBHRVQgYSBVUkwsIGZhaWxpbmcgbG91ZGx5IG9uIGEgbm9uLTJ4eCBzdGF0dXMgb3IgYW4gb3ZlcnNpemVkIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZCh1cmw6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgZG93bmxvYWQgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSAoJHt1cmx9KWApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xuICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggPiBtYXhCeXRlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgZG93bmxvYWQgZXhjZWVkcyAke21heEJ5dGVzfSBieXRlcyAoJHt1cmx9KWApO1xuICB9XG4gIHJldHVybiBidWZmZXI7XG59XG5cbi8qKiBEZXJpdmUgYSBza2lsbCBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgZG93bmxvYWQgVVJMJ3MgbGFzdCBwYXRoIHNlZ21lbnQuICovXG5mdW5jdGlvbiBkZXJpdmVTa2lsbE5hbWUodXJsU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcih1cmxTdHJpbmcpO1xuICBjb25zdCBsYXN0ID0gdXJsPy5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLnBvcCgpID8/IFwiXCI7XG4gIHJldHVybiBsYXN0LnJlcGxhY2UoL1xcLihtZHx6aXB8dGFyfHRnenxneikkL2ksIFwiXCIpO1xufVxuXG4vKiogQSBza2lsbCBkaXJlY3RvcnkgKGhvbGRpbmcgYSBgU0tJTEwubWRgKSBzdGFnZWQgb24gbG9jYWwgZGlzay4gKi9cbmludGVyZmFjZSBTdGFnZWRTa2lsbERpciB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWJzb2x1dGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdCBldmVyeSBza2lsbCBkaXJlY3RvcnkgdW5kZXIgYHJvb3RgOiBhIGByb290L1NLSUxMLm1kYCAocm9vdCBJUyB0aGVcbiAqIHNraWxsKSBvciBlYWNoIGltbWVkaWF0ZSBjaGlsZCBkaXIgdGhhdCBjb250YWlucyBhIGBTS0lMTC5tZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RTa2lsbERpcnMocm9vdDogc3RyaW5nKTogUHJvbWlzZTxTdGFnZWRTa2lsbERpcltdPiB7XG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMocm9vdCkpKSByZXR1cm4gW107XG4gIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4ocm9vdCwgXCJTS0lMTC5tZFwiKSkpIHtcbiAgICBjb25zdCBuYW1lID0gcG9zaXguYmFzZW5hbWUocm9vdC5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKTtcbiAgICByZXR1cm4gW3sgbmFtZSwgYWJzb2x1dGVQYXRoOiByb290IH1dO1xuICB9XG4gIGNvbnN0IGRpcnM6IFN0YWdlZFNraWxsRGlyW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhd2FpdCByZWFkZGlyKHJvb3QsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG4gICAgY29uc3QgZGlyID0gam9pbihyb290LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKGRpciwgXCJTS0lMTC5tZFwiKSkpIHtcbiAgICAgIGRpcnMucHVzaCh7IG5hbWU6IGVudHJ5Lm5hbWUsIGFic29sdXRlUGF0aDogZGlyIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlycztcbn1cblxuLyoqXG4gKiBDb3B5IGV2ZXJ5IHN0YWdlZCBza2lsbCBkaXJlY3RvcnkgaW50byB7QGxpbmsgZGVzdGluYXRpb259LCBwcmVzZXJ2aW5nIHRoZVxuICogYDxza2lsbD4vPHJlbGF0aXZlPmAgbGF5b3V0LiBUaGUgZGVzdGluYXRpb24gaXMganVzdCBhIHtAbGluayBGaWxlU3lzdGVtfSxcbiAqIHNvIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCB0cmVlIGFuZCB0aGUgbG9jYWwgZmFsbGJhY2sgc2hhcmUgb25lIGNvcGllci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29weVNraWxsRGlycyhkZXN0aW5hdGlvbjogRmlsZVN5c3RlbSwgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBkZXN0aW5hdGlvbi5pbml0KCk7XG4gIGZvciAoY29uc3QgZGlyIG9mIGRpcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlbGF0aXZlIG9mIGZpbmQuZmluZEZpbGVzKFwiKiovKlwiLCB7IGN3ZDogZGlyLmFic29sdXRlUGF0aCwgbm9kaXI6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLmFic29sdXRlUGF0aCwgcmVsYXRpdmUpKTtcbiAgICAgIGNvbnN0IHNraWxsUGF0aCA9IHBvc2l4LmpvaW4oZGlyLm5hbWUsIHJlbGF0aXZlLnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgICAgYXdhaXQgZGVzdGluYXRpb24ud3JpdGVGaWxlKHNraWxsUGF0aCwgYnVmZmVyLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3B5IHN0YWdlZCBza2lsbCBkaXJzIGludG8gYSBTVEFCTEUgbG9jYWwgdHJlZSBrZXllZCBieSB0aGUgc291cmNlLCBhbmRcbiAqIHJldHVybiBpdHMgcm9vdCBwYXRoLlxuICpcbiAqIEEgZ2l2ZW4gc291cmNlIHJlc29sdmVzIHRvIHRoZSBzYW1lIGNvbnRlbnQgb24gYWxtb3N0IGV2ZXJ5IGJvb3QsIHNvIGVhY2hcbiAqIG9uZSBvd25zIGEgZGlyZWN0b3J5IG5hbWVkIGZvciBpdHMge0BsaW5rIGNhY2hlS2V5fSByYXRoZXIgdGhhbiBsZWF2aW5nIGFcbiAqIGZyZXNoIHNjcmF0Y2ggZGlyIGJlaGluZCBwZXIgcmVzdGFydC4gS2V5aW5nIG9uIHRoZSBzb3VyY2UgYW5kIGl0cyBwb2xpY3lcbiAqIChub3QgdGhlIGNvbnRlbnQpIGlzIHdoYXQga2VlcHMgdHdvIGRpZmZlcmVudCBzb3VyY2VzIGZyb20gb3ZlcndyaXRpbmcgZWFjaFxuICogb3RoZXIuXG4gKlxuICogVGhlIG1ldGFkYXRhIGlzIHdyaXR0ZW4gSU5TSURFIHRoZSByZWJ1aWxkIHJhdGhlciB0aGFuIGFmdGVyIGl0OiBgcmVidWlsZEZTYFxuICogcmVwbGFjZXMgdGhlIHN0YWJsZSByb290IHdob2xlc2FsZSwgc28gYW55dGhpbmcgd3JpdHRlbiBhZnRlcndhcmRzIHdvdWxkXG4gKiBzdXJ2aXZlIG9ubHkgdW50aWwgdGhlIG5leHQgcmVmcmVzaCwgYW5kIGFueXRoaW5nIHdyaXR0ZW4gYmVmb3JlIHdvdWxkIGJlXG4gKiB0aHJvd24gYXdheSBieSB0aGUgc3dhcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGVyc2lzdExvY2FsbHkoXG4gIGtleTogc3RyaW5nLFxuICBkaXJzOiBTdGFnZWRTa2lsbERpcltdLFxuICByZWNvcmQ6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0YWJsZSA9IGF3YWl0IGxvY2FsRlMucmVidWlsZEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7a2V5fWAsIGFzeW5jIChzY3JhdGNoKSA9PiB7XG4gICAgYXdhaXQgY29weVNraWxsRGlycyhzY3JhdGNoLCBkaXJzKTtcbiAgICBhd2FpdCB3cml0ZU1ldGFkYXRhKHNjcmF0Y2gsIGtleSwgcmVjb3JkKTtcbiAgfSk7XG4gIHJldHVybiBzdGFibGUucm9vdDtcbn1cblxuLyoqXG4gKiBBIHNjcmF0Y2ggZmlsZXN5c3RlbSB3aG9zZSByb290IGV4aXN0cyBvbiBkaXNrLCBmb3IgdGhlIHBhdGhzIHRoYXQgaGFuZCBhXG4gKiByZWFsIGRpcmVjdG9yeSB0byBgbm9kZTpmc2Agb3IgYSBjaGlsZCBwcm9jZXNzIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAqIHRoZSB7QGxpbmsgRmlsZVN5c3RlbX0gQVBJLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplZFNjcmF0Y2gocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPExvY2FsRmlsZVN5c3RlbT4ge1xuICBjb25zdCBzY3JhdGNoID0gbG9jYWxGUy5zY3JhdGNoRlMocHJlZml4KTtcbiAgYXdhaXQgc2NyYXRjaC5pbml0KCk7XG4gIHJldHVybiBzY3JhdGNoO1xufVxuXG4vKiogQmVzdC1lZmZvcnQgZXhpc3RlbmNlIGNoZWNrLiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0aEV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBzdGF0KHBhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
617
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlyRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFbEQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7QUFFckMsK0VBQStFO0FBQy9FLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxT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LEtBQUssVUFBVSxjQUFjLENBQzNCLEdBQVcsRUFDWCxJQUFzQixFQUN0QixNQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckYsTUFBTSxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFBYztJQUM5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YXJ0dXAgcHJvdmlzaW9uaW5nIG9mIHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIGZvciBhIE1hc3RyYSB3b3Jrc3BhY2UuXG4gKlxuICogQSB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2V9IG5hbWVzIFdIRVJFIGEgYFNLSUxMLm1kYCB0cmVlIGNvbWVzIGZyb20gLSB0aGVcbiAqIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYW55IGdpdCAvIEdpdExhYiBVUkwsXG4gKiBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgLSBhbmQgb3B0aW9uYWwgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKiB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSBtYXRlcmlhbGl6ZXMgZXZlcnkgc291cmNlIGludG8gYSBsb2NhbFxuICogYFNLSUxMLm1kYCB0cmVlIGF0IGFwcCBib290IGFuZCByZXR1cm5zIHRoZSBkaXJlY3RvcmllcyB0byBoYW5kIE1hc3RyYSBhc1xuICogZXh0cmEgc2tpbGwgc2NhbiBwYXRocy5cbiAqXG4gKiBSZXNvbHV0aW9uIHBlciBzb3VyY2UsIGluIG9yZGVyOlxuICpcbiAqIDEuIHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50IChgXCJhaXRvb2xzXCJgKTogRGF0YWJyaWNrcycgb3duIHNraWxsXG4gKiAgICBzZXQsIHJlYWQgc3RyYWlnaHQgZnJvbSB0aGUgcHVibGljIHJlcG8gdGhlIGBkYXRhYnJpY2tzIGFpdG9vbHNgIENMSVxuICogICAgc291cmNlcyBmcm9tLiBObyBDTEksIG5vIERhdGFicmlja3MgYXV0aCAtIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgdXNhYmxlXG4gKiAgICBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIsIHdoZXJlIHRoZSBDTEkgaXMgbm90IGluc3RhbGxlZDtcbiAqIDIuIHRoZSBPUFRJT05BTCBgc2tpbGxzYCBucG0gQ0xJIChwZWVyIGRlcCk6IGlmIGluc3RhbGxlZCwgZWFjaCBzb3VyY2UgaXNcbiAqICAgIGNvcGllZCBpbnRvIGEgc3RhZ2luZyBkaXIgd2l0aCBgc2tpbGxzIGFkZCA8c291cmNlPiAtLWFnZW50IDxkaXI+IC0tY29weWAsXG4gKiAgICB3aGljaCB1bmRlcnN0YW5kcyBldmVyeSBzb3VyY2UgZm9ybWF0IHRoZSBlY29zeXN0ZW0gZG9lcyAoR2l0SHViXG4gKiAgICBzaG9ydGhhbmQsIGdpdCBVUkxzLCBhcmNoaXZlL2Rvd25sb2FkIFVSTHMpO1xuICogMy4gb3RoZXJ3aXNlIGEgcGxhaW4ge0BsaW5rIGZldGNofSBvZiB0aGUgc291cmNlIFVSTCAoYnVpbHQgd2l0aFxuICogICAge0BsaW5rIG5ldC51cmxCdWlsZGVyfSksIHdyaXRpbmcgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB0byBhIHN0YWdpbmdcbiAqICAgIGRpci5cbiAqXG4gKiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzIHRocm91Z2ggbmVpdGhlciBwYXRoIGZhaWxzIGFwcCBzdGFydHVwLCB1bmxlc3MgdGhlXG4gKiBzb3VyY2UgKG9yIHRoZSB0b3AtbGV2ZWwgY2FsbCkgc2V0cyBgZmFpbE9uRXJyb3I6IGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBpdCBpc1xuICogbG9nZ2VkIGFuZCBza2lwcGVkIHNvIG9uZSBiYWQgc291cmNlIG5ldmVyIHRha2VzIHRoZSBhcHAgZG93bi5cbiAqXG4gKiBFdmVyeSBwcm92aXNpb25lZCB0cmVlIGNhcnJpZXMgYSB7QGxpbmsgTUVUQURBVEFfRklMRX0gcmVjb3JkaW5nIHdoZW4gZWFjaFxuICogc291cmNlIHdhcyBsYXN0IGRvd25sb2FkZWQsIGFuZCBhIHNvdXJjZSBpcyBvbmx5IHJlLWRvd25sb2FkZWQgb25jZSB0aGF0XG4gKiByZWNvcmQgaXMgb2xkZXIgdGhhbiB7QGxpbmsgREVGQVVMVF9SRUZSRVNIX1RUTF9NU30gKGEgZGF5KS4gVGhpcyBydW5zIGF0IGFwcFxuICogQk9PVCwgc28gd2l0aG91dCBpdCBhIGNvbnRhaW5lciB0aGF0IHJlc3RhcnRzIGEgZG96ZW4gdGltZXMgYW4gaG91ciByZS1wdWxsc1xuICogdGhlIHdob2xlIEFJIFRvb2xzIHNldCBhIGRvemVuIHRpbWVzIGZvciBjb250ZW50IHRoYXQgY2hhbmdlcyByYXJlbHkuIFRoZVxuICogcmVjb3JkIHRyYXZlbHMgV0lUSCB0aGUgdHJlZSByYXRoZXIgdGhhbiBpbiBwcm9jZXNzIG1lbW9yeSwgc28gdGhlIHJldXNlXG4gKiBzdXJ2aXZlcyBhIHJlc3RhcnQgLSB3aGljaCBpcyB0aGUgb25seSB3YXkgaXQgaGVscHMgYSBEYXRhYnJpY2tzIEFwcCBhdCBhbGwuXG4gKiBQYXNzIGByZWZyZXNoVHRsTXM6IDBgIHRvIGRvd25sb2FkIG9uIGV2ZXJ5IGJvb3QuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIHNhbWUgdHJlZSBhIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICogYWN0aW9uIHdyaXRlcyB0byksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgXG4gKiBpbnN0ZWFkLiBXaGVuIG5vIERhdGFicmlja3MgY2xpZW50IGlzIHJlc29sdmFibGUgYXQgc3RhcnR1cCAtIG9yIHRoZSByZXNvbHZlZFxuICogaWRlbnRpdHkgY2Fubm90IFdSSVRFIHRoZSBkZXN0aW5hdGlvbiwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGZvciBhXG4gKiBEYXRhYnJpY2tzIEFwcCBzZXJ2aWNlIHByaW5jaXBhbCBhZ2FpbnN0IHRoZSBhZG1pbi1vd25lZCBzaGFyZWQgdHJlZSAoc2VlXG4gKiB7QGxpbmsgb3BlbldyaXRhYmxlV29ya3NwYWNlfSkgLSB0aGUgdHJlZSBpcyB3cml0dGVuIHVuZGVyXG4gKiB7QGxpbmsgbG9jYWxGUy50bXBGU30gYW5kIHJldHVybmVkIGFzIGFuIGV4dHJhIGxvY2FsIHNraWxsIHBhdGggZm9yIHRoZVxuICogY3VycmVudCBwcm9jZXNzLiBTdG9yYWdlIGxvY2F0aW9uIGRlZ3JhZGVzOyB0aGUgc2tpbGxzIHRoZW1zZWx2ZXMgZG8gbm90LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9jYWxGUywgdHlwZSBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgZmluZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3BhdGhcIjtcbmltcG9ydCB7IGVycm9yLCBoYXNoLCBqc29uLCBsb2csIG5ldCwgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBPbmVPck1hbnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5cbmltcG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsIHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9yZW1vdGUtc2tpbGxzXCIpO1xuXG4vKipcbiAqIEFnZW50IGlkIHRoZSBgc2tpbGxzYCBDTEkgaW5zdGFsbHMgYSBiYXJlIGBTS0lMTC5tZGAgdHJlZSB1bmRlci5cbiAqXG4gKiBgdW5pdmVyc2FsYCBpcyB0aGUgQ0xJJ3Mgb3duIG5hbWUgZm9yIFwibm8gcGFydGljdWxhciBhZ2VudCwganVzdCB0aGUgcGxhaW5cbiAqIHRyZWVcIiwgd2hpY2ggaXMgd2hhdCB0aGlzIG1vZHVsZSB3YW50cyAtIGl0IHJlLWhvc3RzIHRoZSByZXN1bHQgaXRzZWxmLiBUaGVcbiAqIGlkIG11c3QgYmUgb25lIHRoZSBpbnN0YWxsZWQgQ0xJIGtub3dzOiBhbiB1bnJlY29nbml6ZWQgb25lIGlzIHJlamVjdGVkXG4gKiBvdXRyaWdodCAoYEludmFsaWQgYWdlbnRzOiAuLi5gKSwgdGFraW5nIGV2ZXJ5IG5vbi1gYWl0b29sc2Agc291cmNlIGRvd24gd2l0aFxuICogaXQsIHNpbmNlIGEgQ0xJIGZhaWx1cmUgaXMgYSBoYXJkIGZhaWx1cmUgcmF0aGVyIHRoYW4gYSBmYWxsLXRocm91Z2ggdG9cbiAqIHtAbGluayBzdGFnZVZpYUZldGNofS5cbiAqL1xuY29uc3QgU0tJTExTX0NMSV9BR0VOVCA9IFwidW5pdmVyc2FsXCI7XG5cbi8qKiBXaGVyZSB0aGUgYHNraWxsc2AgQ0xJIGRyb3BzIGEgcGxhaW4gYFNLSUxMLm1kYCB0cmVlIHVuZGVyIGEgdGFyZ2V0IGRpci4gKi9cbmNvbnN0IFNLSUxMU19DTElfTEFZT1VUID0gW1wiLmFnZW50c1wiLCBcInNraWxsc1wiXSBhcyBjb25zdDtcblxuLyoqIENhcCBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBib2R5LCBtYXRjaGluZyB0aGUgYHNraWxsc2AgQ0xJIGRlZmF1bHQuICovXG5jb25zdCBERUZBVUxUX01BWF9ET1dOTE9BRF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8qKiBTdGFibGUgdGVtcCBkaXJlY3RvcnkgaG9sZGluZyBvbmUgcmVidWlsdCBza2lsbCB0cmVlIHBlciByZW1vdGUgc291cmNlLiAqL1xuY29uc3QgTE9DQUxfU0tJTExTX0RJUiA9IFwibWFzdHJhLWxvY2FsLXNraWxsc1wiO1xuXG4vKipcbiAqIEJvb2trZWVwaW5nIGZpbGUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiBldmVyeSBwcm92aXNpb25lZCBza2lsbCB0cmVlLCBuYW1pbmdcbiAqIHdoZW4gZWFjaCBzb3VyY2Ugd2FzIGxhc3QgZG93bmxvYWRlZC4gQSBkb3RmaWxlIHNvIHRoZSBza2lsbCBzY2FubmVycywgd2hpY2hcbiAqIGxvb2sgZm9yIGA8ZGlyPi9TS0lMTC5tZGAsIG5ldmVyIG1pc3Rha2UgaXQgZm9yIGEgc2tpbGwuXG4gKi9cbmNvbnN0IE1FVEFEQVRBX0ZJTEUgPSBcIi5tZXRhZGF0YS5qc29uXCI7XG5cbi8qKiBTaGFwZSBtYXJrZXIgZm9yIHtAbGluayBNRVRBREFUQV9GSUxFfTsgYW4gdW5rbm93biB2ZXJzaW9uIGlzIGlnbm9yZWQsIG5vdCByZWFkLiAqL1xuY29uc3QgTUVUQURBVEFfVkVSU0lPTiA9IDE7XG5cbi8qKiBIb3cgbG9uZyBhIHByb3Zpc2lvbmVkIHNvdXJjZSBpcyByZXVzZWQgYmVmb3JlIGJlaW5nIGRvd25sb2FkZWQgYWdhaW4uICovXG5jb25zdCBERUZBVUxUX1JFRlJFU0hfVFRMX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFJIFRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFNvdXJjZSBjb25zdGFudCBzZWxlY3RpbmcgRGF0YWJyaWNrcycgb3duIEFJIFRvb2xzIHNraWxsIHNldC5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcImFpdG9vbHNcIiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IEFJVE9PTFNfU09VUkNFID0gXCJhaXRvb2xzXCI7XG5cbi8qKiBUaGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBsaXRlcmFsLCBmb3IgY2FsbGVycyBzcGVsbGluZyB0aGUgdW5pb24gb3V0LiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sc1NvdXJjZSA9IHR5cGVvZiBBSVRPT0xTX1NPVVJDRTtcblxuLyoqXG4gKiBUaGUgUFVCTElDIHJlcG8gYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBzb3VyY2VzIGZyb20uIFJlYWRpbmcgaXRcbiAqIGRpcmVjdGx5IGlzIHdoYXQgbGV0cyBhbiBhcHAgZ2V0IHRoZSBzYW1lIHNraWxscyB0aGUgQ0xJIGluc3RhbGxzIHdpdGhvdXRcbiAqIHRoZSBDTEkgLSB3aGljaCBhIERhdGFicmlja3MgQXBwIGNvbnRhaW5lciBkb2VzIG5vdCBzaGlwLlxuICovXG5jb25zdCBBSVRPT0xTX1JFUE8gPSBcImRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHNcIjtcblxuLyoqIFJlcG8gcmVmIHRoZSBza2lsbHMgYXJlIHJlYWQgZnJvbS4gT3ZlcnJpZGUgcGVyIHNvdXJjZSB3aXRoIGByZWZgLiAqL1xuY29uc3QgQUlUT09MU19SRUYgPSBcIm1haW5cIjtcblxuLyoqIFNraWxsIGZpbGVzIGRvd25sb2FkZWQgYXQgb25jZTsgdGhlIHNldCBpcyB+MzAgc2tpbGxzIG9mIGEgZmV3IGZpbGVzIGVhY2guICovXG5jb25zdCBBSVRPT0xTX0NPTkNVUlJFTkNZID0gODtcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIHJlcG8ncyBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gIHRoaXMgbW9kdWxlIHJlYWRzLiAqL1xuaW50ZXJmYWNlIEFpVG9vbHNNYW5pZmVzdCB7XG4gIHNraWxscz86IFJlY29yZDxzdHJpbmcsIHsgZmlsZXM/OiBzdHJpbmdbXTsgcmVwb19kaXI/OiBzdHJpbmcgfT47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHJlbW90ZSBza2lsbCBzb3VyY2UgYW5kIGl0cyBwZXItc291cmNlIHBvbGljeS5cbiAqXG4gKiBgc291cmNlYCBpcyB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IG9yIGFueXRoaW5nIHRoZSBgc2tpbGxzYCBlY29zeXN0ZW1cbiAqIHVuZGVyc3RhbmRzOiBhIEdpdEh1YiBgb3duZXIvcmVwb2Agc2hvcnRoYW5kLCBhIGZ1bGwgR2l0SHViIC8gR2l0TGFiIC8gZ2l0XG4gKiBVUkwsIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTCB0byBhIGBTS0lMTC5tZGAgb3IgYXJjaGl2ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMge1xuICAvKiogYFwiYWl0b29sc1wiYCwgYSBHaXRIdWIgc2hvcnRoYW5kLCBhIGdpdCAvIEdpdExhYiBVUkwsIG9yIGEgZG93bmxvYWQgVVJMLiAqL1xuICBzb3VyY2U6IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZTtcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UuICovXG4gIHNraWxscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiogSW5jbHVkZSBleHBlcmltZW50YWwgc2tpbGxzLiBgXCJhaXRvb2xzXCJgIG9ubHkuICovXG4gIGV4cGVyaW1lbnRhbD86IGJvb2xlYW47XG4gIC8qKiBQaW4gdGhlIHJlcG8gcmVmICh0YWcgLyBicmFuY2ggLyBzaGEpLiBgXCJhaXRvb2xzXCJgIG9ubHk7IGRlZmF1bHRzIHRvIGBtYWluYC4gKi9cbiAgcmVmPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBmb3IgdGhpcyBzb3VyY2UuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGlzIHNvdXJjZSdzIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdCBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsXG4gICAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLnJlZnJlc2hUdGxNc307IGAwYCByZS1kb3dubG9hZHMgb25cbiAgICogZXZlcnkgYm9vdC5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIFVSTC1saWtlXG4gKiAoc3RyaW5nIC8gYFVSTGAgLyBgeyB1cmwgfWApLCBvciBhIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IGJhZyB3aXRoXG4gKiBwZXItc291cmNlIHBvbGljeS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxTb3VyY2UgPSBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnM7XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZSBgcmVtb3RlU2tpbGxzYCBvcHRpb246IG9uZSBzb3VyY2UsIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGhlbSwgb3JcbiAqIGEge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogQSBzb3VyY2UgZW50cnkgd2l0aCBpdHMgYHNvdXJjZWAgZmxhdHRlbmVkIHRvIGEgcGxhaW4gc3RyaW5nLiAqL1xudHlwZSBOb3JtYWxpemVkU291cmNlID0gT21pdDxSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFwic291cmNlXCI+ICYgeyBzb3VyY2U6IHN0cmluZyB9O1xuXG4vKiogVG9wLWxldmVsIHJlbW90ZS1za2lsbHMgcHJvdmlzaW9uaW5nIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICAvKiogU291cmNlcyB0byBtYXRlcmlhbGl6ZSBhdCBzdGFydHVwLiAqL1xuICBzb3VyY2VzOiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT47XG4gIC8qKlxuICAgKiBGYWlsIGFwcCBzdGFydHVwIHdoZW4gYSBzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC4gQVxuICAgKiBwZXItc291cmNlIGBmYWlsT25FcnJvcmAgd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggdGhhdCByb290cyB0aGUgZGVzdGluYXRpb24gQXNzaXN0YW50IHNraWxscyB0cmVlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgT0JPIHVzZXIncyBgL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLlxuICAgKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogQXV0aC1zY29wZWQgRGF0YWJyaWNrcyBjbGllbnQuIERlZmF1bHRzIHRvIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIC8qKiBVc2VyIGVtYWlsIHVzZWQgdG8gZGVyaXZlIHRoZSBkZWZhdWx0IERhdGFicmlja3MgZGVzdGluYXRpb24uICovXG4gIHVzZXJFbWFpbD86IHN0cmluZztcbiAgLyoqIEJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZC4gRGVmYXVsdHMgdG8gMTAgTWlCLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogSG93IGxvbmcgYSBwcm92aXNpb25lZCB0cmVlIGlzIHJldXNlZCBiZWZvcmUgaXRzIHNvdXJjZSBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGEgZGF5OyBgMGAgcmUtZG93bmxvYWRzIG9uIGV2ZXJ5IGJvb3QuXG4gICAqIEEgcGVyLXNvdXJjZSBgcmVmcmVzaFR0bE1zYCB3aW5zIG92ZXIgdGhpcy5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gcmVzb2x2ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzIHtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgdG8gaGFuZCBNYXN0cmEgKGEgdGVtcCBkaXIgcGVyIHNvdXJjZSB0aGF0XG4gICAqIGNvdWxkbid0IGJlIHdyaXR0ZW4gdG8gRGF0YWJyaWNrcykuIEVtcHR5IHdoZW4gZXZlcnl0aGluZyBsYW5kZWQgaW4gdGhlXG4gICAqIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUsIHdoaWNoIHRoZSBidWlsdC1pbiBtb3VudCBhbHJlYWR5IHNjYW5zLlxuICAgKi9cbiAgbG9jYWxTa2lsbFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3MgZGVzdGluYXRpb24gZWFjaCBzb3VyY2Ugd2FzIHdyaXR0ZW4gdG8sIGlmIGFueS4gKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogTmFtZXMgb2YgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IG5vdyBhdmFpbGFibGUsIHdoZXRoZXIgaXQgd2FzIGRvd25sb2FkZWQgb25cbiAgICogdGhpcyBib290IG9yIHJldXNlZCBmcm9tIGEgc3RpbGwtZnJlc2ggdHJlZSAoc2VlIHtAbGluayBNRVRBREFUQV9GSUxFfSkuXG4gICAqL1xuICBza2lsbE5hbWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBXaGF0IG9uZSBzb3VyY2UncyBsYXN0IGRvd25sb2FkIGxlZnQgYmVoaW5kLCBhcyByZWNvcmRlZCBpblxuICoge0BsaW5rIE1FVEFEQVRBX0ZJTEV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsQ2FjaGVFbnRyeSB7XG4gIC8qKiBUaGUgc291cmNlIHN0cmluZyB0aGlzIGVudHJ5IHdhcyBkb3dubG9hZGVkIGZyb20sIGZvciByZWFkYWJpbGl0eS4gKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRoZSBkb3dubG9hZCBjb21wbGV0ZWQsIElTTy04NjAxLiAqL1xuICBkb3dubG9hZGVkQXQ6IHN0cmluZztcbiAgLyoqIFNraWxsIGRpcmVjdG9yeSBuYW1lcyB0aGUgZG93bmxvYWQgcHJvZHVjZWQuICovXG4gIHNraWxsczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgY29udGVudC1hZmZlY3RpbmcgcG9saWN5IHRoYXQgZG93bmxvYWQgdXNlZC4gQWxzbyBmb2xkZWQgaW50byB0aGUgZW50cnlcbiAgICogS0VZLCBzbyBuYXJyb3dpbmcgYHNraWxsc2Agb3IgbW92aW5nIGByZWZgIG1pc3NlcyB0aGUgY2FjaGUgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBzZXJ2aW5nIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gICAqL1xuICBwb2xpY3k/OiB7IHNraWxscz86IHN0cmluZ1tdOyBleHBlcmltZW50YWw/OiBib29sZWFuOyByZWY/OiBzdHJpbmcgfTtcbn1cblxuLyoqIFRoZSB7QGxpbmsgTUVUQURBVEFfRklMRX0gZG9jdW1lbnQ6IG9uZSBlbnRyeSBwZXIgcHJvdmlzaW9uZWQgc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbHNNZXRhZGF0YSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgc291cmNlczogUmVjb3JkPHN0cmluZywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5Pjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE5vcm1hbGl6ZSB0aGUgYHJlbW90ZVNraWxsc2Agb3B0aW9uIGludG8gYSBmbGF0IG9wdGlvbnMgYmFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlbW90ZVNraWxsc09wdGlvbihcbiAgb3B0aW9uOiBSZW1vdGVTa2lsbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBiYWcgPSBpc1Byb3Zpc2lvbk9wdGlvbnMob3B0aW9uKSA/IG9wdGlvbiA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc291cmNlcyA9IHRvU291cmNlTGlzdChiYWcgPyBiYWcuc291cmNlcyA6IChvcHRpb24gYXMgUmVtb3RlU2tpbGxTb3VyY2UpKTtcbiAgLy8gQW4gZW1wdHkgbGlzdCBpcyB0aGUgc2FtZSBhcyBubyBjb25maWd1cmF0aW9uIGF0IGFsbC5cbiAgaWYgKCFvYmplY3QuaXNPbmVPck1hbnkoc291cmNlcykpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IC4uLmJhZywgc291cmNlcyB9O1xufVxuXG4vKiogQSBgc291cmNlc2AtYmVhcmluZyBiYWcgaXMgdGhlIHRvcC1sZXZlbCBvcHRpb25zIHNoYXBlLCBub3QgYSBzaW5nbGUgc291cmNlLiAqL1xuZnVuY3Rpb24gaXNQcm92aXNpb25PcHRpb25zKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQodmFsdWUpICYmIFwic291cmNlc1wiIGluIHZhbHVlO1xufVxuXG4vKiogT25lIHNvdXJjZSBvciBtYW55LCBhcyBhIHBsYWluIGFycmF5LiBBIHNvdXJjZSBpcyBuZXZlciBpdHNlbGYgYW4gYXJyYXkuICovXG5mdW5jdGlvbiB0b1NvdXJjZUxpc3QoXG4gIGlucHV0OiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4sXG4pOiBSZW1vdGVTa2lsbFNvdXJjZVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gWy4uLmlucHV0XSA6IFtpbnB1dF07XG59XG5cbi8qKiBGbGF0dGVuIGEgc291cmNlIGVudHJ5IC0gc3RyaW5nLCBgVVJMYCwgYHsgdXJsIH1gLCBvciBvcHRpb25zIGJhZyAtIHRvIGEge0BsaW5rIE5vcm1hbGl6ZWRTb3VyY2V9LiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VPcHRpb25zKHNvdXJjZTogUmVtb3RlU2tpbGxTb3VyY2UpOiBOb3JtYWxpemVkU291cmNlIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiB7IHNvdXJjZSB9O1xuICBpZiAoc291cmNlIGluc3RhbmNlb2YgVVJMKSByZXR1cm4geyBzb3VyY2U6IHNvdXJjZS50b1N0cmluZygpIH07XG4gIGlmIChcInNvdXJjZVwiIGluIHNvdXJjZSkgcmV0dXJuIHsgLi4uc291cmNlLCBzb3VyY2U6IHRvU291cmNlU3RyaW5nKHNvdXJjZS5zb3VyY2UpIH07XG4gIHJldHVybiB7IHNvdXJjZTogc291cmNlLnVybCB9O1xufVxuXG4vKiogQSB7QGxpbmsgbmV0LlVybExpa2V9IGFzIHRoZSBwbGFpbiBzdHJpbmcgdGhlIHN0YWdpbmcgcGF0aHMgd29yayB3aXRoLiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VTdHJpbmcoc291cmNlOiBuZXQuVXJsTGlrZSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSByZXR1cm4gc291cmNlO1xuICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgVVJMID8gc291cmNlLnRvU3RyaW5nKCkgOiBzb3VyY2UudXJsO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgc291cmNlIHNlbGVjdHMgdGhlIGJ1aWx0LWluIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGwgc2V0LiAqL1xuZnVuY3Rpb24gaXNBaVRvb2xzU291cmNlKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzb3VyY2UudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IEFJVE9PTFNfU09VUkNFO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjYWNoZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBwb2xpY3kgdGhhdCBkZWNpZGVzIHdoYXQgYSBzb3VyY2UncyBkb3dubG9hZCBDT05UQUlOUy5cbiAqXG4gKiBPbmx5IHRoZXNlIHRocmVlIGNoYW5nZSB0aGUgcmVzdWx0aW5nIHRyZWUsIHNvIG9ubHkgdGhlc2UgYmVsb25nIGluIHRoZSBjYWNoZVxuICoga2V5IC0gYGZhaWxPbkVycm9yYCBhbmQgYG1heERvd25sb2FkQnl0ZXNgIGdvdmVybiBob3cgYSBmYWlsdXJlIGlzIGhhbmRsZWQsXG4gKiBub3Qgd2hhdCBhIHN1Y2Nlc3MgcHJvZHVjZXMuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UpOiBSZW1vdGVTa2lsbENhY2hlRW50cnlbXCJwb2xpY3lcIl0ge1xuICBjb25zdCBza2lsbHMgPSBzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKTtcbiAgY29uc3QgcG9saWN5ID0ge1xuICAgIC4uLihza2lsbHMubGVuZ3RoID4gMCA/IHsgc2tpbGxzOiBbLi4uc2tpbGxzXS5zb3J0KCkgfSA6IHt9KSxcbiAgICAuLi4oc291cmNlT3B0aW9ucy5leHBlcmltZW50YWwgPT09IHRydWUgPyB7IGV4cGVyaW1lbnRhbDogdHJ1ZSB9IDoge30pLFxuICAgIC4uLihzdHJpbmcudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPyB7IHJlZjogc291cmNlT3B0aW9ucy5yZWYhLnRyaW0oKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5KS5sZW5ndGggPiAwID8gcG9saWN5IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBBTkQgaXRzIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeS5cbiAqXG4gKiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbG9uZSB3b3VsZCBsZXQgYSBjaGFuZ2VkIGBza2lsbHNgIGZpbHRlciBvciBgcmVmYCByZWFkXG4gKiBiYWNrIHRoZSBwcmV2aW91cyBkb3dubG9hZCBmb3IgYSBkYXk7IGtleWluZyBvbiBib3RoIHR1cm5zIHRoYXQgaW50byBhIG1pc3MuXG4gKiBUaGUgc2tpbGwgbGlzdCBpcyBzb3J0ZWQgZmlyc3Qgc28gYSByZW9yZGVyZWQgYXJyYXkgaXMgc3RpbGwgdGhlIHNhbWUga2V5LlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc2guZm52SGFzaChcbiAgICBKU09OLnN0cmluZ2lmeSh7IHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsIHBvbGljeTogY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucykgPz8gbnVsbCB9KSxcbiAgKTtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgcmV1c2Ugd2luZG93OiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiBhIGRheS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWZyZXNoVHRsKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMucmVmcmVzaFR0bE1zID8/IG9wdGlvbnMucmVmcmVzaFR0bE1zID8/IERFRkFVTFRfUkVGUkVTSF9UVExfTVM7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWV0YWRhdGEgZG9jdW1lbnQgYXQgdGhlIHJvb3Qgb2YgYSBwcm92aXNpb25lZCB0cmVlLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCB3YXMgd3JpdHRlbiBieSBhIHNoYXBlIHRoaXNcbiAqIHZlcnNpb24gZG9lcyBub3Qga25vdy5cbiAqXG4gKiBOZXZlciB0aHJvd3M6IGEgbWlzc2luZyBvciBjb3JydXB0IHJlY29yZCBpcyBhIGNhY2hlIE1JU1MsIHdoaWNoIGNvc3RzIGFcbiAqIGRvd25sb2FkIC0gd2hpbGUgbGV0dGluZyBpdCBmYWlsIHdvdWxkIHRha2UgYXBwIHN0YXJ0dXAgZG93biBvdmVyXG4gKiBib29ra2VlcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGZzOiBGaWxlU3lzdGVtKTogUHJvbWlzZTxSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhNRVRBREFUQV9GSUxFKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoTUVUQURBVEFfRklMRSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZShyYXcsIHVuZGVmaW5lZCkgYXMgUmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFyc2VkKSB8fCBwYXJzZWQudmVyc2lvbiAhPT0gTUVUQURBVEFfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBhcnNlZC5zb3VyY2VzKSA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGU6dW5yZWFkYWJsZVwiLCB7IGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBlbnRyeSBpcyBzdGlsbCBpbnNpZGUgaXRzIHJldXNlIHdpbmRvdy5cbiAqXG4gKiBBIGB0dGxNc2Agb2YgYDBgIGRpc2FibGVzIHJldXNlIG91dHJpZ2h0LCBhbmQgYW4gdW5wYXJzZWFibGUgb3IgRlVUVVJFXG4gKiB0aW1lc3RhbXAgY291bnRzIGFzIHN0YWxlIC0gYSBjbG9jayB0aGF0IG1vdmVkIGJhY2t3YXJkcyBzaG91bGQgY29zdCBvbmVcbiAqIGV4dHJhIGRvd25sb2FkLCBub3QgcGluIGEgdHJlZSBhcyBmcmVzaCBpbmRlZmluaXRlbHkuXG4gKi9cbmZ1bmN0aW9uIGlzRnJlc2goZW50cnk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSwgdHRsTXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAodHRsTXMgPD0gMCB8fCAhQXJyYXkuaXNBcnJheShlbnRyeS5za2lsbHMpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRvd25sb2FkZWRBdCA9IERhdGUucGFyc2UoZW50cnkuZG93bmxvYWRlZEF0ID8/IFwiXCIpO1xuICBpZiAoTnVtYmVyLmlzTmFOKGRvd25sb2FkZWRBdCkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGRvd25sb2FkZWRBdDtcbiAgcmV0dXJuIGFnZSA+PSAwICYmIGFnZSA8IHR0bE1zO1xufVxuXG4vKipcbiAqIE1lcmdlIG9uZSBzb3VyY2UncyBlbnRyeSBpbnRvIHRoZSB0cmVlJ3MgbWV0YWRhdGEgZG9jdW1lbnQsIHByZXNlcnZpbmcgd2hhdFxuICogb3RoZXIgc291cmNlcyByZWNvcmRlZCAtIHRoZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGlzIFNIQVJFRCwgc28gYSBibGluZFxuICogb3ZlcndyaXRlIHdvdWxkIGRyb3AgZXZlcnkgc2libGluZyBzb3VyY2UncyB0aW1lc3RhbXAgYW5kIHJlLWRvd25sb2FkIHRoZVxuICogbG90IG9uIHRoZSBuZXh0IGJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWV0YWRhdGEoXG4gIGZzOiBGaWxlU3lzdGVtLFxuICBrZXk6IHN0cmluZyxcbiAgZW50cnk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjdXJyZW50ID0gYXdhaXQgcmVhZE1ldGFkYXRhKGZzKTtcbiAgY29uc3QgbmV4dDogUmVtb3RlU2tpbGxzTWV0YWRhdGEgPSB7XG4gICAgdmVyc2lvbjogTUVUQURBVEFfVkVSU0lPTixcbiAgICBzb3VyY2VzOiB7IC4uLmN1cnJlbnQ/LnNvdXJjZXMsIFtrZXldOiBlbnRyeSB9LFxuICB9O1xuICBhd2FpdCBmcy53cml0ZUZpbGUoTUVUQURBVEFfRklMRSwgYCR7SlNPTi5zdHJpbmdpZnkobmV4dCwgbnVsbCwgMil9XFxuYCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG59XG5cbi8qKiBUaGUgc3RhYmxlIGxvY2FsIHRyZWUgYSBzb3VyY2UgaXMgcmVidWlsdCBpbnRvLCBrZXllZCBieSB7QGxpbmsgY2FjaGVLZXl9LiAqL1xuZnVuY3Rpb24gbG9jYWxTa2lsbHNGUyhrZXk6IHN0cmluZyk6IExvY2FsRmlsZVN5c3RlbSB7XG4gIHJldHVybiBsb2NhbEZTLnRtcEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7a2V5fWApO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIGV2ZXJ5IGNvbmZpZ3VyZWQgcmVtb3RlIHNraWxsIHNvdXJjZSBhdCBhcHAgc3RhcnR1cC5cbiAqXG4gKiBXcml0ZXMgZWFjaCByZXNvbHZlZCBgU0tJTEwubWRgIHRyZWUgdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzXG4gKiBmb2xkZXIgd2hlbiBhIHdyaXRhYmxlIHdvcmtzcGFjZSBpcyBhdmFpbGFibGUsIGVsc2UgdW5kZXJcbiAqIHtAbGluayBsb2NhbEZTLnRtcEZTfSByZXR1cm5lZCBpbiB7QGxpbmsgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMubG9jYWxTa2lsbFBhdGhzfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvblJlbW90ZVNraWxscyhcbiAgb3B0aW9uOiBSZW1vdGVTa2lsbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24ob3B0aW9uKTtcbiAgY29uc3QgZW1wdHk6IFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzID0geyBsb2NhbFNraWxsUGF0aHM6IFtdLCBza2lsbE5hbWVzOiBbXSB9O1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBlbXB0eTtcblxuICBjb25zdCBmYWlsRGVmYXVsdCA9IG9wdGlvbnMuZmFpbE9uRXJyb3IgIT09IGZhbHNlO1xuICBjb25zdCBjbGllbnQgPSBvcHRpb25zLmNsaWVudCA/PyBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpPy5jbGllbnQ7XG4gIC8vIFByb2JlZCByYXRoZXIgdGhhbiBhc3N1bWVkOiBhbiBpZGVudGl0eSB0aGF0IGNhbm5vdCB3cml0ZSB0aGUgd29ya3NwYWNlXG4gIC8vIHRyZWUgZmFsbHMgYmFjayB0byB0aGUgbG9jYWwgb25lIGluc3RlYWQgb2YgZmFpbGluZyBzdGFydHVwLiBUaGUgcHJvYmUgYWxzb1xuICAvLyBjcmVhdGVzIHRoZSByb290LCB3aGljaCB0aGUgZmlyc3QgY2FjaGUgUkVBRCBuZWVkcyAtIGBjb3B5U2tpbGxEaXJzYCB3b3VsZFxuICAvLyBvdGhlcndpc2UgYmUgdGhlIGZpcnN0IHRoaW5nIHRvIGNyZWF0ZSBpdCwgd2hpY2ggaXMgdG9vIGxhdGUuXG4gIGNvbnN0IHJlcXVlc3RlZEJhc2VQYXRoID0gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChvcHRpb25zLCBjbGllbnQpO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IHJlcXVlc3RlZEJhc2VQYXRoXG4gICAgPyBhd2FpdCBvcGVuV3JpdGFibGVXb3Jrc3BhY2UocmVxdWVzdGVkQmFzZVBhdGgsIGNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRhdGFicmlja3NCYXNlUGF0aCA9IGRlc3RpbmF0aW9uID8gcmVxdWVzdGVkQmFzZVBhdGggOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbG9jYWxTa2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBza2lsbE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgc3RhZ2luZzogTG9jYWxGaWxlU3lzdGVtIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5zb3VyY2VzKSA/IG9wdGlvbnMuc291cmNlcyA6IFtvcHRpb25zLnNvdXJjZXNdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlcykge1xuICAgICAgY29uc3Qgc291cmNlT3B0aW9ucyA9IHRvU291cmNlT3B0aW9ucyhlbnRyeSk7XG4gICAgICBjb25zdCBmYWlsT25FcnJvciA9IHNvdXJjZU9wdGlvbnMuZmFpbE9uRXJyb3IgPz8gZmFpbERlZmF1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGVyZSB0aGlzIHNvdXJjZSdzIGJvb2trZWVwaW5nIGxpdmVzOiB0aGUgc2hhcmVkIERhdGFicmlja3MgdHJlZSwgb3JcbiAgICAgICAgLy8gdGhlIHNvdXJjZSdzIG93biBzdGFibGUgbG9jYWwgZGlyLlxuICAgICAgICBjb25zdCBrZXkgPSBjYWNoZUtleShzb3VyY2VPcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2FjaGVGUyA9IGRlc3RpbmF0aW9uID8/IGxvY2FsU2tpbGxzRlMoa2V5KTtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gKGF3YWl0IHJlYWRNZXRhZGF0YShjYWNoZUZTKSk/LnNvdXJjZXNba2V5XTtcbiAgICAgICAgaWYgKGNhY2hlZCAmJiBpc0ZyZXNoKGNhY2hlZCwgcmVzb2x2ZVJlZnJlc2hUdGwoc291cmNlT3B0aW9ucywgb3B0aW9ucykpKSB7XG4gICAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLmNhY2hlZC5za2lsbHMpO1xuICAgICAgICAgIGlmICghZGVzdGluYXRpb24pIGxvY2FsU2tpbGxQYXRocy5wdXNoKGNhY2hlRlMucm9vdCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgcmVhZHlcIiwge1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gY2FjaGVGUy5yb290LFxuICAgICAgICAgICAgZG93bmxvYWRlZEF0OiBjYWNoZWQuZG93bmxvYWRlZEF0LFxuICAgICAgICAgICAgc2tpbGxzOiBjYWNoZWQuc2tpbGxzLFxuICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHJlbW90ZSBza2lsbFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICBjb25zdCBzdGFnZWREaXIgPSBhd2FpdCBzdGFnZVNvdXJjZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRvd25sb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNraWxsczogc3RhZ2VkLm1hcCgoZGlyKSA9PiBkaXIubmFtZSksXG4gICAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uLCBzdGFnZWQpO1xuICAgICAgICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGNvcHkgbGFuZHM6IGEgbWV0YWRhdGEgZW50cnkgd3JpdHRlbiBmaXJzdCB3b3VsZFxuICAgICAgICAgIC8vIG1hcmsgYSBmYWlsZWQgcHJvdmlzaW9uIGFzIGZyZXNoIGFuZCBzdXBwcmVzcyB0aGUgcmV0cnkgZm9yIGEgZGF5LlxuICAgICAgICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoZGVzdGluYXRpb24sIGtleSwgcmVjb3JkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFNraWxsUGF0aHMucHVzaChhd2FpdCBwZXJzaXN0TG9jYWxseShrZXksIHN0YWdlZCwgcmVjb3JkKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnJlY29yZC5za2lsbHMpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCBpbnN0YWxsZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBsb2NhbFNraWxsUGF0aHMuYXQoLTEpLFxuICAgICAgICAgIHNraWxsczogcmVjb3JkLnNraWxscyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGZhaWxlZCB0byBwcm92aXNpb24gcmVtb3RlIHNraWxsIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCI6ICR7ZXJyb3IuZXJyb3JNZXNzYWdlKGVycil9YCxcbiAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yLnRvRXJyb3IoZXJyKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2U6c2tpcHBlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhZ2luZykge1xuICAgICAgYXdhaXQgcm0oc3RhZ2luZy5yb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBsb2NhbFNraWxsUGF0aHMsIGRhdGFicmlja3NCYXNlUGF0aCwgc2tpbGxOYW1lcyB9O1xufVxuXG4vKiogUHJvYmUgZmlsZSB7QGxpbmsgb3BlbldyaXRhYmxlV29ya3NwYWNlfSB3cml0ZXMgYW5kIHJlbW92ZXMuICovXG5jb25zdCBXUklURV9QUk9CRV9GSUxFID0gXCIuZGJ4LXRvb2xzLXdyaXRlLXByb2JlXCI7XG5cbi8qKlxuICogT3BlbiB0aGUgRGF0YWJyaWNrcyBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpZGVudGl0eVxuICogY2Fubm90IHdyaXRlIHRoZXJlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIChgL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc2ApIGlzIGNvbW1vbmx5XG4gKiBhZG1pbnMtb25seSwgYW5kIGFuIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCBpcyBub3QgYW4gYWRtaW4gLSBzbyBhIERhdGFicmlja3NcbiAqIEFwcCB3cml0aW5nIHRoZXJlIGZhaWxzIHdpdGggYFJFU09VUkNFX0RPRVNfTk9UX0VYSVNUYCwgd2hpY2ggaXMgaG93IHRoZVxuICogd29ya3NwYWNlIEFQSSByZXBvcnRzIGEgcGF0aCB0aGUgY2FsbGVyIGlzIG5vdCBhbGxvd2VkIHRvIHNlZS4gVGhhdCBpcyBhIGZhY3RcbiAqIGFib3V0IFdIRVJFIHRoZSB0cmVlIGlzIHN0b3JlZCwgbm90IGFib3V0IHdoZXRoZXIgdGhlIHNraWxscyBhcmUgdXNhYmxlLCBzbyBpdFxuICogZGVncmFkZXMgdG8gdGhlIGxvY2FsIHRyZWUgKGhhbmRlZCB0byBNYXN0cmEgYXMgYW4gZXh0cmEgc2NhbiBwYXRoKSByYXRoZXJcbiAqIHRoYW4gdGFraW5nIGFwcCBzdGFydHVwIGRvd24gb3ZlciBib29ra2VlcGluZyBsb2NhdGlvbi5cbiAqXG4gKiBUaGUgcHJvYmUgaXMgYSByZWFsIHdyaXRlOiBgbWtkaXJzYCBzdWNjZWVkcyBvbiBhbiBleGlzdGluZyBkaXJlY3RvcnkgZXZlbiBmb3JcbiAqIGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIGludG8gaXQsIHNvIGluaXQgYWxvbmUgcHJvdmVzIG5vdGhpbmcuIFJlbW92aW5nXG4gKiB0aGUgcHJvYmUgZmlsZSBpcyBiZXN0LWVmZm9ydCAtIGEgZmFpbGVkIGNsZWFudXAgbXVzdCBub3QgZGVjaWRlIHdyaXRhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuV3JpdGFibGVXb3Jrc3BhY2UoXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxEYXRhYnJpY2tzRmlsZVN5c3RlbSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgY2xpZW50LFxuICAgIHJvb3Q6IGJhc2VQYXRoLFxuICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICBjcmVhdGVSb290OiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGVzdGluYXRpb246dW53cml0YWJsZVwiLCB7XG4gICAgICBkZXN0aW5hdGlvbjogYmFzZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhd2FpdCBmcy5kZWxldGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIHsgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGZzO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgbG9jYWwgdGVtcC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzQmFzZVBhdGgoXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5kYXRhYnJpY2tzQmFzZVBhdGgpIHJldHVybiBvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aC50cmltKCkgfHwgdW5kZWZpbmVkO1xuICBjb25zdCBlbWFpbCA9IHN0cmluZy50cmltVG9OdWxsKG9wdGlvbnMudXNlckVtYWlsKTtcbiAgLy8gQSBuYW1lZCB1c2VyIHRhcmdldHMgdGhlaXIgcGVyc29uYWwgQXNzaXN0YW50IHRyZWUgKHRoZSBcInNhdmUgYSBza2lsbFwiXG4gIC8vIHRhcmdldCk7IG90aGVyd2lzZSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluXG4gIC8vIEFzc2lzdGFudC1za2lsbHMgbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSDtcbn1cblxuLyoqXG4gKiBTdGFnZSBvbmUgc291cmNlIGludG8gYSBmcmVzaCBkaXIgdW5kZXIgYHN0YWdpbmdSb290YCwgcHJlZmVycmluZyB0aGUgb3B0aW9uYWxcbiAqIGBza2lsbHNgIENMSSBhbmQgZmFsbGluZyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVNvdXJjZShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgc3RhZ2luZ1Jvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldCA9IGpvaW4oc3RhZ2luZ1Jvb3QsIGBzcmMtJHtoYXNoLmlkKCl9YCk7XG4gIGF3YWl0IG1rZGlyKHRhcmdldCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIEFJIFRvb2xzIHJlc29sdmVzIGZyb20gYSBrbm93biByZXBvIGxheW91dCwgc28gaXQgbmV2ZXIgbmVlZHMgdGhlIENMSS5cbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBzdGFnZUFpVG9vbHMoc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbiAgY29uc3QgdmlhQ2xpID0gYXdhaXQgc3RhZ2VWaWFTa2lsbHNDbGkoc291cmNlT3B0aW9ucywgdGFyZ2V0KTtcbiAgaWYgKHZpYUNsaSkgcmV0dXJuIHZpYUNsaTtcbiAgcmV0dXJuIHN0YWdlVmlhRmV0Y2goc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSB0aGUgRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbHMgaW50byBgdGFyZ2V0YC5cbiAqXG4gKiBSZWFkcyB0aGUgcmVwbydzIG93biBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gICh3aGljaCBuYW1lcyBlYWNoIHNraWxsJ3NcbiAqIGZpbGVzIGFuZCB3aGV0aGVyIGl0IGxpdmVzIHVuZGVyIGBza2lsbHMvYCBvciBgZXhwZXJpbWVudGFsL2ApIGFuZCBkb3dubG9hZHNcbiAqIHRoZW0gLSB0aGUgc2FtZSB0aGluZyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIGRvZXMsIG1pbnVzIHRoZSBDTEkgYW5kXG4gKiBtaW51cyBhbnkgRGF0YWJyaWNrcyBhdXRoLCBzaW5jZSB0aGUgcmVwbyBpcyBwdWJsaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlQWlUb29scyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtYXhCeXRlcyA9IHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKTtcbiAgY29uc3QgcmVmID0gc3RyaW5nLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8/IEFJVE9PTFNfUkVGO1xuICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2UoXG4gICAgKGF3YWl0IGRvd25sb2FkKGFpVG9vbHNSYXdVcmwocmVmLCBcIm1hbmlmZXN0Lmpzb25cIiksIG1heEJ5dGVzKSkudG9TdHJpbmcoXCJ1dGY4XCIpLFxuICAgIHVuZGVmaW5lZCxcbiAgKSBhcyBBaVRvb2xzTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldChzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSk7XG4gIGNvbnN0IHNlbGVjdGVkID0gT2JqZWN0LmVudHJpZXMobWFuaWZlc3Q/LnNraWxscyA/PyB7fSkuZmlsdGVyKChbbmFtZSwgZW50cnldKSA9PlxuICAgIHdhbnRlZC5zaXplID4gMFxuICAgICAgPyB3YW50ZWQuaGFzKG5hbWUpXG4gICAgICA6IGVudHJ5LnJlcG9fZGlyICE9PSBcImV4cGVyaW1lbnRhbFwiIHx8IHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlLFxuICApO1xuICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBtYXRjaGluZyBza2lsbHMgaW4gJHtBSVRPT0xTX1JFUE99QCR7cmVmfWApO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBzZWxlY3RlZC5mbGF0TWFwKChbbmFtZSwgZW50cnldKSA9PlxuICAgIChlbnRyeS5maWxlcyA/PyBbXSkubWFwKChmaWxlKSA9PiAoe1xuICAgICAgdXJsOiBhaVRvb2xzUmF3VXJsKHJlZiwgYCR7ZW50cnkucmVwb19kaXIgPz8gXCJza2lsbHNcIn0vJHtuYW1lfS8ke2ZpbGV9YCksXG4gICAgICBwYXRoOiBqb2luKHRhcmdldCwgbmFtZSwgLi4uZmlsZS5zcGxpdChcIi9cIikpLFxuICAgIH0pKSxcbiAgKTtcbiAgYXdhaXQgbWFwQ29uY3VycmVudChmaWxlcywgQUlUT09MU19DT05DVVJSRU5DWSwgYXN5bmMgKGl0ZW0pID0+IHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgZG93bmxvYWQoaXRlbS51cmwsIG1heEJ5dGVzKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGl0ZW0ucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShpdGVtLnBhdGgsIGJvZHkpO1xuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJhaXRvb2xzOnN0YWdlZFwiLCB7IHJlZiwgc2tpbGxzOiBzZWxlY3RlZC5sZW5ndGgsIGZpbGVzOiBmaWxlcy5sZW5ndGggfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBSYXctY29udGVudCBVUkwgZm9yIGEgcGF0aCBpbiB0aGUgQUkgVG9vbHMgcmVwbyBhdCBgcmVmYC4gKi9cbmZ1bmN0aW9uIGFpVG9vbHNSYXdVcmwocmVmOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7QUlUT09MU19SRVBPfS8ke3JlZn0vJHtwYXRofWA7XG59XG5cbi8qKiBSdW4gYHdvcmtlcmAgb3ZlciBgaXRlbXNgLCBhdCBtb3N0IGBsaW1pdGAgaW4gZmxpZ2h0LiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFwQ29uY3VycmVudDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgbGltaXQ6IG51bWJlcixcbiAgd29ya2VyOiAoaXRlbTogVCkgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgY3Vyc29yID0gMDtcbiAgY29uc3QgcnVubmVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWluKGxpbWl0LCBpdGVtcy5sZW5ndGgpIH0sIGFzeW5jICgpID0+IHtcbiAgICB3aGlsZSAoY3Vyc29yIDwgaXRlbXMubGVuZ3RoKSB7XG4gICAgICBhd2FpdCB3b3JrZXIoaXRlbXNbY3Vyc29yKytdISk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwocnVubmVycyk7XG59XG5cbi8qKlxuICogQ29weSBhIHNvdXJjZSBpbnRvIGB0YXJnZXRgIHdpdGggdGhlIGBza2lsbHNgIENMSSB3aGVuIGl0IGlzIGluc3RhbGxlZC5cbiAqIFJldHVybnMgdGhlIGRpciBob2xkaW5nIHRoZSBjb3BpZWQgYFNLSUxMLm1kYCB0cmVlcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIENMSSBpcyBhYnNlbnQgKHNvIHRoZSBjYWxsZXIgY2FuIGZhbGwgYmFjayB0byBhIGZldGNoKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFTa2lsbHNDbGkoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2xpID0gYXdhaXQgcmVzb2x2ZVNraWxsc0NsaSgpO1xuICBpZiAoIWNsaSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBhcmdzID0gW1xuICAgIC4uLmNsaS5hcmdzLFxuICAgIFwiYWRkXCIsXG4gICAgc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgXCItLWFnZW50XCIsXG4gICAgU0tJTExTX0NMSV9BR0VOVCxcbiAgICBcIi0tY29weVwiLFxuICAgIFwiLXlcIixcbiAgXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmcucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMuc3Bhd24oY2xpLmNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBza2lsbHMgQ0xJIGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4odGFyZ2V0LCAuLi5TS0lMTFNfQ0xJX0xBWU9VVCk7XG59XG5cbi8qKlxuICogTG9jYXRlIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBDTEkgYmluLCByZXNvbHZlZCBmcm9tIFRISVMgcGFja2FnZSdzIG1vZHVsZVxuICogZ3JhcGguIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGVlciBkZXAgaXNuJ3QgaW5zdGFsbGVkLCBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxzQ2xpKCk6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJza2lsbHMvcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IGJpbiA9IGpvaW4ocGtnUGF0aCwgXCIuLlwiLCBcImJpblwiLCBcImNsaS5tanNcIik7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoYmluKSkgcmV0dXJuIHsgY29tbWFuZDogcHJvY2Vzcy5leGVjUGF0aCwgYXJnczogW2Jpbl0gfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcGVlciBkZXAgYWJzZW50IG9yIHVucmVzb2x2YWJsZSAtIGZldGNoIGZhbGxiYWNrIGhhbmRsZXMgaXRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc291cmNlIFVSTCBhbmQgd3JpdGUgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB1bmRlciBgdGFyZ2V0YC5cbiAqIFVzZWQgd2hlbiB0aGUgYHNraWxsc2AgQ0xJIGlzbid0IGluc3RhbGxlZDsgc3VwcG9ydHMgYSBkaXJlY3QgYFNLSUxMLm1kYCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhRmV0Y2goXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiIGlzIG5vdCBhIFVSTCBhbmQgdGhlIG9wdGlvbmFsIFwic2tpbGxzXCIgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGRvd25sb2FkKHVybC50b1N0cmluZygpLCByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucykpO1xuICBjb25zdCBuYW1lID0gc3RyaW5nLnRvU2x1ZyhkZXJpdmVTa2lsbE5hbWUodXJsLnRvU3RyaW5nKCkpKSB8fCBcInJlbW90ZS1za2lsbFwiO1xuICBjb25zdCBza2lsbERpciA9IGpvaW4odGFyZ2V0LCBuYW1lKTtcbiAgYXdhaXQgbWtkaXIoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihza2lsbERpciwgXCJTS0lMTC5tZFwiKSwgYnVmZmVyKTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgZG93bmxvYWQgY2VpbGluZzogcGVyLXNvdXJjZSwgdGhlbiB0b3AtbGV2ZWwsIHRoZW4gdGhlIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlTWF4Qnl0ZXMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gc291cmNlT3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IG9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBERUZBVUxUX01BWF9ET1dOTE9BRF9CWVRFUztcbn1cblxuLyoqIEdFVCBhIFVSTCwgZmFpbGluZyBsb3VkbHkgb24gYSBub24tMnh4IHN0YXR1cyBvciBhbiBvdmVyc2l6ZWQgYm9keS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkKHVybDogc3RyaW5nLCBtYXhCeXRlczogbnVtYmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9ICgke3VybH0pYCk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzICgke3VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuLyoqIERlcml2ZSBhIHNraWxsIGRpcmVjdG9yeSBuYW1lIGZyb20gYSBkb3dubG9hZCBVUkwncyBsYXN0IHBhdGggc2VnbWVudC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVNraWxsTmFtZSh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHVybFN0cmluZyk7XG4gIGNvbnN0IGxhc3QgPSB1cmw/LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gXCJcIjtcbiAgcmV0dXJuIGxhc3QucmVwbGFjZSgvXFwuKG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG59XG5cbi8qKiBBIHNraWxsIGRpcmVjdG9yeSAoaG9sZGluZyBhIGBTS0lMTC5tZGApIHN0YWdlZCBvbiBsb2NhbCBkaXNrLiAqL1xuaW50ZXJmYWNlIFN0YWdlZFNraWxsRGlyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB1bmRlciBgcm9vdGA6IGEgYHJvb3QvU0tJTEwubWRgIChyb290IElTIHRoZVxuICogc2tpbGwpIG9yIGVhY2ggaW1tZWRpYXRlIGNoaWxkIGRpciB0aGF0IGNvbnRhaW5zIGEgYFNLSUxMLm1kYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNraWxsRGlycyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlZFNraWxsRGlyW10+IHtcbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhyb290KSkpIHJldHVybiBbXTtcbiAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihyb290LCBcIlNLSUxMLm1kXCIpKSkge1xuICAgIGNvbnN0IG5hbWUgPSBwb3NpeC5iYXNlbmFtZShyb290LnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgIHJldHVybiBbeyBuYW1lLCBhYnNvbHV0ZVBhdGg6IHJvb3QgfV07XG4gIH1cbiAgY29uc3QgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSBqb2luKHJvb3QsIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4oZGlyLCBcIlNLSUxMLm1kXCIpKSkge1xuICAgICAgZGlycy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgYWJzb2x1dGVQYXRoOiBkaXIgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXJzO1xufVxuXG4vKipcbiAqIENvcHkgZXZlcnkgc3RhZ2VkIHNraWxsIGRpcmVjdG9yeSBpbnRvIHtAbGluayBkZXN0aW5hdGlvbn0sIHByZXNlcnZpbmcgdGhlXG4gKiBgPHNraWxsPi88cmVsYXRpdmU+YCBsYXlvdXQuIFRoZSBkZXN0aW5hdGlvbiBpcyBqdXN0IGEge0BsaW5rIEZpbGVTeXN0ZW19LFxuICogc28gdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUgYW5kIHRoZSBsb2NhbCBmYWxsYmFjayBzaGFyZSBvbmUgY29waWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLCBkaXJzOiBTdGFnZWRTa2lsbERpcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGRlc3RpbmF0aW9uLmluaXQoKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmUgb2YgZmluZC5maW5kRmlsZXMoXCIqKi8qXCIsIHsgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLCBub2RpcjogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcG9zaXguam9pbihkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUoc2tpbGxQYXRoLCBidWZmZXIsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIFNUQUJMRSBsb2NhbCB0cmVlIGtleWVkIGJ5IHRoZSBzb3VyY2UsIGFuZFxuICogcmV0dXJuIGl0cyByb290IHBhdGguXG4gKlxuICogQSBnaXZlbiBzb3VyY2UgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY29udGVudCBvbiBhbG1vc3QgZXZlcnkgYm9vdCwgc28gZWFjaFxuICogb25lIG93bnMgYSBkaXJlY3RvcnkgbmFtZWQgZm9yIGl0cyB7QGxpbmsgY2FjaGVLZXl9IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICogZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbmQgaXRzIHBvbGljeVxuICogKG5vdCB0aGUgY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoXG4gKiBvdGhlci5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBJTlNJREUgdGhlIHJlYnVpbGQgcmF0aGVyIHRoYW4gYWZ0ZXIgaXQ6IGByZWJ1aWxkRlNgXG4gKiByZXBsYWNlcyB0aGUgc3RhYmxlIHJvb3Qgd2hvbGVzYWxlLCBzbyBhbnl0aGluZyB3cml0dGVuIGFmdGVyd2FyZHMgd291bGRcbiAqIHN1cnZpdmUgb25seSB1bnRpbCB0aGUgbmV4dCByZWZyZXNoLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBiZWZvcmUgd291bGQgYmVcbiAqIHRocm93biBhd2F5IGJ5IHRoZSBzd2FwLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShcbiAga2V5OiBzdHJpbmcsXG4gIGRpcnM6IFN0YWdlZFNraWxsRGlyW10sXG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhYmxlID0gYXdhaXQgbG9jYWxGUy5yZWJ1aWxkRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCwgYXN5bmMgKHNjcmF0Y2gpID0+IHtcbiAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKHNjcmF0Y2gsIGRpcnMpO1xuICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoc2NyYXRjaCwga2V5LCByZWNvcmQpO1xuICB9KTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -31,18 +31,18 @@
31
31
  "dependencies": {
32
32
  "@databricks/appkit": "^0.43.0",
33
33
  "@databricks/sdk-experimental": "^0.17.0",
34
- "@dbx-tools/appkit": "0.6.49",
35
- "@dbx-tools/core": "0.6.49",
36
- "@dbx-tools/databricks": "0.6.49",
37
- "@dbx-tools/fs": "0.6.49",
38
- "@dbx-tools/genie": "0.6.49",
39
- "@dbx-tools/model": "0.6.49",
40
- "@dbx-tools/path": "0.6.49",
41
- "@dbx-tools/shared-core": "0.6.49",
42
- "@dbx-tools/shared-fs": "0.6.49",
43
- "@dbx-tools/shared-genie": "0.6.49",
44
- "@dbx-tools/shared-mastra": "0.6.49",
45
- "@dbx-tools/shared-model": "0.6.49",
34
+ "@dbx-tools/appkit": "0.6.51",
35
+ "@dbx-tools/core": "0.6.51",
36
+ "@dbx-tools/databricks": "0.6.51",
37
+ "@dbx-tools/fs": "0.6.51",
38
+ "@dbx-tools/genie": "0.6.51",
39
+ "@dbx-tools/model": "0.6.51",
40
+ "@dbx-tools/path": "0.6.51",
41
+ "@dbx-tools/shared-core": "0.6.51",
42
+ "@dbx-tools/shared-fs": "0.6.51",
43
+ "@dbx-tools/shared-genie": "0.6.51",
44
+ "@dbx-tools/shared-mastra": "0.6.51",
45
+ "@dbx-tools/shared-model": "0.6.51",
46
46
  "@mastra/ai-sdk": "^1.6.0",
47
47
  "@mastra/core": "^1.47.0",
48
48
  "@mastra/express": "^1.4.2",
@@ -71,7 +71,7 @@
71
71
  "./package.json": "./package.json"
72
72
  }
73
73
  },
74
- "version": "0.6.49",
74
+ "version": "0.6.51",
75
75
  "types": "./lib/index.d.ts",
76
76
  "type": "module",
77
77
  "exports": {
@@ -40,9 +40,12 @@
40
40
  * action writes to), so provisioned skills persist across restarts and are
41
41
  * discovered by the built-in Assistant-skills mount. Pass `userEmail` (or an
42
42
  * explicit `databricksBasePath`) to target `/Users/<email>/.assistant/skills`
43
- * instead. When no Databricks client is resolvable at startup, the tree is
44
- * written under {@link localFS.tmpFS} and returned as an extra local skill path
45
- * for the current process.
43
+ * instead. When no Databricks client is resolvable at startup - or the resolved
44
+ * identity cannot WRITE the destination, which is the normal case for a
45
+ * Databricks App service principal against the admin-owned shared tree (see
46
+ * {@link openWritableWorkspace}) - the tree is written under
47
+ * {@link localFS.tmpFS} and returned as an extra local skill path for the
48
+ * current process. Storage location degrades; the skills themselves do not.
46
49
  *
47
50
  * @module
48
51
  */
@@ -413,25 +416,20 @@ export async function provisionRemoteSkills(
413
416
 
414
417
  const failDefault = options.failOnError !== false;
415
418
  const client = options.client ?? appkit.tryGetExecutionContext()?.client;
416
- const databricksBasePath = resolveDatabricksBasePath(options, client);
417
- const destination = databricksBasePath
418
- ? new DatabricksFileSystem({
419
- client: client as WorkspaceClient,
420
- root: databricksBasePath,
421
- readOnly: false,
422
- createRoot: true,
423
- })
419
+ // Probed rather than assumed: an identity that cannot write the workspace
420
+ // tree falls back to the local one instead of failing startup. The probe also
421
+ // creates the root, which the first cache READ needs - `copySkillDirs` would
422
+ // otherwise be the first thing to create it, which is too late.
423
+ const requestedBasePath = resolveDatabricksBasePath(options, client);
424
+ const destination = requestedBasePath
425
+ ? await openWritableWorkspace(requestedBasePath, client as WorkspaceClient)
424
426
  : undefined;
427
+ const databricksBasePath = destination ? requestedBasePath : undefined;
425
428
 
426
429
  const localSkillPaths: string[] = [];
427
430
  const skillNames: string[] = [];
428
431
  let staging: LocalFileSystem | undefined;
429
432
 
430
- // The destination roots the shared metadata document, so it has to exist
431
- // before the first cache READ - `copySkillDirs` would otherwise be the first
432
- // thing to create it, which is too late.
433
- if (destination) await destination.init();
434
-
435
433
  try {
436
434
  const sources = Array.isArray(options.sources) ? options.sources : [options.sources];
437
435
  for (const entry of sources) {
@@ -508,6 +506,49 @@ export async function provisionRemoteSkills(
508
506
  return { localSkillPaths, databricksBasePath, skillNames };
509
507
  }
510
508
 
509
+ /** Probe file {@link openWritableWorkspace} writes and removes. */
510
+ const WRITE_PROBE_FILE = ".dbx-tools-write-probe";
511
+
512
+ /**
513
+ * Open the Databricks skills destination, or `undefined` when this identity
514
+ * cannot write there.
515
+ *
516
+ * The default destination (`/Workspace/.assistant/skills`) is commonly
517
+ * admins-only, and an app service principal is not an admin - so a Databricks
518
+ * App writing there fails with `RESOURCE_DOES_NOT_EXIST`, which is how the
519
+ * workspace API reports a path the caller is not allowed to see. That is a fact
520
+ * about WHERE the tree is stored, not about whether the skills are usable, so it
521
+ * degrades to the local tree (handed to Mastra as an extra scan path) rather
522
+ * than taking app startup down over bookkeeping location.
523
+ *
524
+ * The probe is a real write: `mkdirs` succeeds on an existing directory even for
525
+ * an identity that cannot write into it, so init alone proves nothing. Removing
526
+ * the probe file is best-effort - a failed cleanup must not decide writability.
527
+ */
528
+ async function openWritableWorkspace(
529
+ basePath: string,
530
+ client: WorkspaceClient,
531
+ ): Promise<DatabricksFileSystem | undefined> {
532
+ const fs = new DatabricksFileSystem({
533
+ client,
534
+ root: basePath,
535
+ readOnly: false,
536
+ createRoot: true,
537
+ });
538
+ try {
539
+ await fs.init();
540
+ await fs.writeFile(WRITE_PROBE_FILE, new Date().toISOString(), { overwrite: true });
541
+ } catch (err) {
542
+ logger.warn("destination:unwritable", {
543
+ destination: basePath,
544
+ error: error.errorMessage(err),
545
+ });
546
+ return undefined;
547
+ }
548
+ await fs.deleteFile(WRITE_PROBE_FILE, { force: true }).catch(() => undefined);
549
+ return fs;
550
+ }
551
+
511
552
  /** Resolve the Databricks Assistant skills destination, or `undefined` for local temp. */
512
553
  function resolveDatabricksBasePath(
513
554
  options: ProvisionRemoteSkillsOptions,