@decaf-ts/for-typeorm 0.0.15 → 0.0.16

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.
@@ -329,6 +329,87 @@
329
329
  throw new core.QueryError(`Could not find adapter translation for operator ${operator}`);
330
330
  }
331
331
 
332
+ /**
333
+ * @description Converts a JavaScript RegExp pattern to a PostgreSQL POSIX pattern string.
334
+ * @summary Accepts either a RegExp object or a string representation (/pattern/flags) and returns the raw pattern compatible with PostgreSQL's ~ and ~* operators.
335
+ * @param {RegExp|string} jsRegex JavaScript RegExp object or pattern string.
336
+ * @return {string} PostgreSQL-compatible regex pattern string.
337
+ * @function convertJsRegexToPostgres
338
+ * @mermaid
339
+ * sequenceDiagram
340
+ * participant App
341
+ * participant Utils as convertJsRegexToPostgres
342
+ * App->>Utils: convertJsRegexToPostgres(RegExp("foo.*","i"))
343
+ * Utils->>Utils: Parse string or use RegExp.source
344
+ * Utils-->>App: "foo.*"
345
+ * @memberOf module:for-typeorm
346
+ */
347
+ function convertJsRegexToPostgres(jsRegex) {
348
+ const rxp = new RegExp(/^\/(.+)\/(\w+)$/g);
349
+ if (typeof jsRegex === "string") {
350
+ const match = rxp.exec(jsRegex);
351
+ if (match) {
352
+ const [, p] = match;
353
+ jsRegex = p;
354
+ }
355
+ }
356
+ const regex = typeof jsRegex === "string" ? new RegExp(jsRegex) : jsRegex;
357
+ const pattern = regex.source;
358
+ return pattern;
359
+ }
360
+ function splitEagerRelations(m, cache = {}) {
361
+ let instance;
362
+ try {
363
+ instance = new m();
364
+ }
365
+ catch (e) {
366
+ throw new dbDecorators.InternalError(`Could not instantiate model ${m.name} for eager relation calculation: ${e}`);
367
+ }
368
+ const rels = core.Repository.relations(m);
369
+ cache[m.name] = cache[m.name] || undefined;
370
+ if (cache[m.name]) {
371
+ return cache[m.name];
372
+ }
373
+ const relations = rels.reduce((accum, attr) => {
374
+ const decorators = reflection.Reflection.getPropertyDecorators(core.Repository.key(core.PersistenceKeys.RELATION), instance, attr, true);
375
+ if (!decorators ||
376
+ !decorators.decorators ||
377
+ !decorators.decorators.length)
378
+ throw new dbDecorators.InternalError(`No decorators found for property ${attr} on model ${m.name}`);
379
+ if (decorators.decorators.length > 1)
380
+ throw new dbDecorators.InternalError(`Multiple decorators found for property ${attr} on model ${m.name}`);
381
+ const decorator = decorators.decorators[0];
382
+ const eager = decorator.props.populate;
383
+ let clazz = decorator.props.class;
384
+ if (typeof clazz === "string")
385
+ clazz = decoratorValidation.Model.get(clazz);
386
+ if (typeof clazz === "function" && !clazz.name)
387
+ clazz = clazz();
388
+ if (!clazz)
389
+ throw new dbDecorators.InternalError(`Could not find class for property ${attr} on model ${m.name}`);
390
+ if (!eager) {
391
+ accum.nonEager.push(attr);
392
+ }
393
+ else {
394
+ accum.relations.push(attr);
395
+ }
396
+ if (accum.relations.includes(attr)) {
397
+ const { nonEager, relations } = splitEagerRelations(clazz, cache);
398
+ if (nonEager.length && accum.relations.includes(attr)) {
399
+ const nonEagerRelations = nonEager.map((ne) => `${attr}.${ne}`);
400
+ accum.nonEager.push(...nonEagerRelations);
401
+ }
402
+ if (relations.length) {
403
+ const rels = relations.map((ne) => `${attr}.${ne}`);
404
+ accum.relations.push(...rels);
405
+ }
406
+ }
407
+ return accum;
408
+ }, { nonEager: [], relations: [] });
409
+ cache[m.name] = relations;
410
+ return relations;
411
+ }
412
+
332
413
  /**
333
414
  * @description Statement builder for TypeORM-backed queries.
334
415
  * @summary Provides a fluent interface for building SQL queries via TypeORM's SelectQueryBuilder with type safety and Decaf.ts abstractions.
@@ -407,11 +488,6 @@
407
488
  q.query = q.query.select(this.selectSelector.map((s) => `${tableName}.${s}`));
408
489
  else
409
490
  q.query = q.query.select();
410
- //
411
- // q.query = (q.query as SelectQueryBuilder<any>).from(
412
- // this.fromSelector[ModelKeys.ANCHOR as keyof typeof this.fromSelector],
413
- // tableName
414
- // );
415
491
  if (this.whereCondition)
416
492
  q.query = this.parseCondition(this.whereCondition, tableName, q.query).query;
417
493
  let orderByArgs;
@@ -487,6 +563,15 @@
487
563
  async raw(rawInput) {
488
564
  const log = this.log.for(this.raw);
489
565
  log.debug(`Executing raw query: ${rawInput.query.getSql()}`);
566
+ const { nonEager, relations } = splitEagerRelations(this.fromSelector);
567
+ // for (const relation of relations) {
568
+ rawInput.query = rawInput.query.setFindOptions({
569
+ loadEagerRelations: true,
570
+ loadRelationIds: {
571
+ relations: nonEager,
572
+ },
573
+ });
574
+ // }
490
575
  return (await rawInput.query.getMany());
491
576
  }
492
577
  parseConditionForPagination(condition, tableName, counter = 0, conditionalOp) {
@@ -1169,98 +1254,6 @@
1169
1254
  }
1170
1255
  }
1171
1256
 
1172
- /**
1173
- * @description Converts a JavaScript RegExp pattern to a PostgreSQL POSIX pattern string.
1174
- * @summary Accepts either a RegExp object or a string representation (/pattern/flags) and returns the raw pattern compatible with PostgreSQL's ~ and ~* operators.
1175
- * @param {RegExp|string} jsRegex JavaScript RegExp object or pattern string.
1176
- * @return {string} PostgreSQL-compatible regex pattern string.
1177
- * @function convertJsRegexToPostgres
1178
- * @mermaid
1179
- * sequenceDiagram
1180
- * participant App
1181
- * participant Utils as convertJsRegexToPostgres
1182
- * App->>Utils: convertJsRegexToPostgres(RegExp("foo.*","i"))
1183
- * Utils->>Utils: Parse string or use RegExp.source
1184
- * Utils-->>App: "foo.*"
1185
- * @memberOf module:for-typeorm
1186
- */
1187
- function convertJsRegexToPostgres(jsRegex) {
1188
- const rxp = new RegExp(/^\/(.+)\/(\w+)$/g);
1189
- if (typeof jsRegex === "string") {
1190
- const match = rxp.exec(jsRegex);
1191
- if (match) {
1192
- const [, p] = match;
1193
- jsRegex = p;
1194
- }
1195
- }
1196
- const regex = typeof jsRegex === "string" ? new RegExp(jsRegex) : jsRegex;
1197
- const pattern = regex.source;
1198
- return pattern;
1199
- }
1200
- function splitEagerRelations(m, cache = {}) {
1201
- let instance;
1202
- try {
1203
- instance = new m();
1204
- }
1205
- catch (e) {
1206
- throw new dbDecorators.InternalError(`Could not instantiate model ${m.name} for eager relation calculation: ${e}`);
1207
- }
1208
- const rels = core.Repository.relations(m);
1209
- const log = logging.Logging.for(splitEagerRelations);
1210
- cache[m.name] = cache[m.name] || undefined;
1211
- if (cache[m.name]) {
1212
- log.info(`Returning cached relations for ${m.name}`);
1213
- return cache[m.name];
1214
- }
1215
- const relations = rels.reduce((accum, attr) => {
1216
- log.info(`Retrieving decorators for property ${attr} on model ${m.name}`);
1217
- const decorators = reflection.Reflection.getPropertyDecorators(core.Repository.key(core.PersistenceKeys.RELATION), instance, attr, true);
1218
- if (!decorators ||
1219
- !decorators.decorators ||
1220
- !decorators.decorators.length)
1221
- throw new dbDecorators.InternalError(`No decorators found for property ${attr} on model ${m.name}`);
1222
- if (decorators.decorators.length > 1)
1223
- throw new dbDecorators.InternalError(`Multiple decorators found for property ${attr} on model ${m.name}`);
1224
- log.info(`Decorators found: ${JSON.stringify(decorators.decorators, null, 2)}`);
1225
- const decorator = decorators.decorators[0];
1226
- const eager = decorator.props.populate;
1227
- let clazz = decorator.props.class;
1228
- if (typeof clazz === "string")
1229
- clazz = decoratorValidation.Model.get(clazz);
1230
- if (typeof clazz === "function" && !clazz.name)
1231
- clazz = clazz();
1232
- if (!clazz)
1233
- throw new dbDecorators.InternalError(`Could not find class for property ${attr} on model ${m.name}`);
1234
- log.info(`Relation on prop ${attr} of ${m.name} found: ${clazz.name} with eager: ${eager}`);
1235
- if (!eager) {
1236
- accum.nonEager.push(attr);
1237
- }
1238
- else {
1239
- accum.relations.push(attr);
1240
- }
1241
- if (accum.relations.includes(attr)) {
1242
- log.info(`Getting relations for ${clazz.name} in prop ${attr} of ${m.name} with eager: ${eager}`);
1243
- const { nonEager, relations } = splitEagerRelations(clazz, cache);
1244
- log.info(`Relations for ${attr} of ${clazz.name}: ${JSON.stringify(relations, null, 2)}`);
1245
- log.info(`Non eager for ${attr} of ${clazz.name}: ${JSON.stringify(nonEager, null, 2)}`);
1246
- if (nonEager.length && accum.relations.includes(attr)) {
1247
- const nonEagerRelations = nonEager.map((ne) => `${attr}.${ne}`);
1248
- accum.nonEager.push(...nonEagerRelations);
1249
- }
1250
- if (relations.length) {
1251
- const rels = relations.map((ne) => `${attr}.${ne}`);
1252
- accum.relations.push(...rels);
1253
- }
1254
- log.info(`calculated Relations for ${attr} of ${clazz.name}: ${JSON.stringify(relations, null, 2)}`);
1255
- log.info(`calculated Non eager for ${attr} of ${clazz.name}: ${JSON.stringify(nonEager, null, 2)}`);
1256
- }
1257
- return accum;
1258
- }, { nonEager: [], relations: [] });
1259
- cache[m.name] = relations;
1260
- logging.Logging.for(splitEagerRelations).info(`Relations for ${m.name}: ${JSON.stringify(relations, null, 2)}`);
1261
- return relations;
1262
- }
1263
-
1264
1257
  function extractForRelations(target, property, columns) {
1265
1258
  let index = 0;
1266
1259
  const cols = columns.filter((c, i) => {
@@ -3060,7 +3053,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3060
3053
  * @const VERSION
3061
3054
  * @memberOf module:for-typeorm
3062
3055
  */
3063
- const VERSION = "0.0.15";
3056
+ const VERSION = "0.0.16";
3064
3057
 
3065
3058
  exports.IndexError = IndexError;
3066
3059
  exports.TypeORMAdapter = TypeORMAdapter;
@@ -3083,4 +3076,4 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
3083
3076
  exports.translateOperators = translateOperators;
3084
3077
 
3085
3078
  }));
3086
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuZXhwb3J0IGNvbnN0IFR5cGVPUk1GbGF2b3VyID0gXCJ0eXBlLW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgVHlwZU9STUtleXMgY29uc3RhbnQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgdGhlIGtleXMgYW5kIHRoZWlyIG1lYW5pbmdzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEB0eXBlZGVmIFR5cGVPUk1LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VQQVJBVE9SIFNlcGFyYXRvciB1c2VkIHRvIGpvaW4gdGFibGUgYW5kIGNvbHVtbiBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCBEZWZhdWx0IHByaW1hcnkga2V5IGZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVkVSU0lPTiBWZXJzaW9uIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUxFVEVEIFNvZnQtZGVsZXRlIHRpbWVzdGFtcCBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUQUJMRSBEYXRhYmFzZSB0YWJsZSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTQ0hFTUEgRGF0YWJhc2Ugc2NoZW1hIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUVVFTkNFIERhdGFiYXNlIHNlcXVlbmNlIG5hbWUga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOREVYIEluZGV4IGlkZW50aWZpZXIga2V5LlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB0aGF0IGlkZW50aWZ5IGNvbW1vbiBkYXRhYmFzZSBwcm9wZXJ0aWVzIGFuZCBhZGFwdGVyLXNwZWNpZmljIGtleXMuXG4gKiBAY29uc3QgVHlwZU9STUtleXNcbiAqIEB0eXBlIHtUeXBlT1JNS2V5c0RlZn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1LZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiLlwiLFxuICBJRDogXCJpZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgREVMRVRFRDogXCJkZWxldGVkX2F0XCIsXG4gIFRBQkxFOiBcInRhYmxlX25hbWVcIixcbiAgU0NIRU1BOiBcInNjaGVtYV9uYW1lXCIsXG4gIFNFUVVFTkNFOiBcInNlcXVlbmNlX25hbWVcIixcbiAgSU5ERVg6IFwiaW5kZXhcIixcbn07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBUeXBlT1JNIGluZGV4ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGVycm9yIHJlbGF0ZWQgdG8gaW5kZXggZ2VuZXJhdGlvbiBvciBoYW5kbGluZyB3aXRoaW4gdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBJbmRleEVycm9yXG4gKiB0cnkge1xuICogICAvLyBTb21lIGNvZGUgdGhhdCBtaWdodCB0aHJvdyBhbiBpbmRleCBlcnJvclxuICogICB0aHJvdyBuZXcgSW5kZXhFcnJvcihcIkluZGV4IG5vdCBmb3VuZFwiKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEluZGV4RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKFwiSW5kZXggZXJyb3Igb2NjdXJyZWQ6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEluZGV4RXJyb3IubmFtZSwgbXNnLCA0MDQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIEVRVUFMID0gXCI9XCIsXG4gIE5PVF9FUVVBTCA9IFwiPD5cIixcbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgSU4gPSBcIklOXCIsXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIExJS0UgPSBcIkxJS0VcIixcbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICBBTlkgPSBcIkFOWVwiLFxuICBBTEwgPSBcIkFMTFwiLFxuICBTT01FID0gXCJTT01FXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFF1ZXJ5IGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVpdGhlciBhIHJhdyBTUUwgc3RyaW5nIG9yIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgYWxvbmcgd2l0aCBvcHRpb25hbCBib3VuZCB2YWx1ZXMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgTSBUaGUgTW9kZWwgdHlwZSBmb3Igd2hpY2ggdGhlIFNlbGVjdFF1ZXJ5QnVpbGRlciBpcyBwYXJhbWV0ZXJpemVkLlxuICogQHRlbXBsYXRlIFQgVGhlIHVuZGVybHlpbmcgcXVlcnkgdHlwZSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LlxuICogQGludGVyZmFjZSBUeXBlT1JNUXVlcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNUXVlcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCA9IE1vZGVsLFxuICBUIGV4dGVuZHMgc3RyaW5nIHwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+ID0gc3RyaW5nLFxuPiB7XG4gIHF1ZXJ5OiBUO1xuICB2YWx1ZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgVHlwZU9STSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgRXh0ZW5kZWQgcmVwb3NpdG9yeSBmbGFncyBpbmNsdWRpbmcgY29ubmVjdGlvbi91c2VyIGNvbnRleHQgdGhhdCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1GbGFnc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1GbGFncyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXNlciBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUG9zdGdyZXMgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICovXG4gIHVzZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWNhdGlvbiBmb3IgYSB0YWJsZSBjcmVhdGlvbi9jaGFuZ2Ugc3RhdGVtZW50IHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgYSBUeXBlT1JNUXVlcnkgd2l0aCB0YWJsZSBtZXRhZGF0YSBzdWNoIGFzIHByaW1hcnkga2V5IGZsYWcsIGNvbnN0cmFpbnRzLCBhbmQgZm9yZWlnbiBrZXlzLlxuICogQHR5cGVkZWYgVHlwZU9STVRhYmxlU3BlY1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5S2V5IEluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNvbnN0cmFpbnRzIEEgbGlzdCBvZiByYXcgU1FMIGNvbnN0cmFpbnRzIHRvIGFwcGx5IHRvIHRoZSB0YWJsZS9jb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmb3JlaWduS2V5cyBBIGxpc3Qgb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBkZWZpbml0aW9ucy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZU9STVRhYmxlU3BlYyA9IFR5cGVPUk1RdWVyeSAmIHtcbiAgcHJpbWFyeUtleTogYm9vbGVhbjtcbiAgY29uc3RyYWludHM6IHN0cmluZ1tdO1xuICBmb3JlaWduS2V5czogc3RyaW5nW107XG59O1xuIiwiaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IE1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nIHJlc3VsdHMuXG4gKiBAY29uc3QgVHlwZU9STVF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2hlbiB0cmFuc2xhdGluZyBoaWdoLWxldmVsIGZpbHRlcnMgaW50byBTUUwgdmlhIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgRXF1YWxpdHkgb3BlcmF0b3IgKD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRkVSRU5UIEluZXF1YWxpdHkgb3BlcmF0b3IgKDw+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUiBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSX0VRIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPj0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiBMZXNzIHRoYW4gb3BlcmF0b3IgKDwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUl9FUSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKDw9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5PVCBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOIEluIGFycmF5IG9wZXJhdG9yIChJTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUdFWFAgUmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElSRUdFWFAgQ2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4qKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJS0UgUGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTElLRSBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKElMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJFVFdFRU4gUmFuZ2Ugb3BlcmF0b3IgKEJFVFdFRU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTlVMTCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOVUxMKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05PVF9OVUxMIE5PVCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOT1QgTlVMTClcbiAqIEBjb25zdCBUeXBlT1JNT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STU9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBTUUxPcGVyYXRvciB8IHN0cmluZz4gPSB7XG4gIEVRVUFMOiBTUUxPcGVyYXRvci5FUVVBTCxcbiAgRElGRkVSRU5UOiBTUUxPcGVyYXRvci5OT1RfRVFVQUwsXG4gIEJJR0dFUjogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOLFxuICBCSUdHRVJfRVE6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgU01BTExFUjogU1FMT3BlcmF0b3IuTEVTU19USEFOLFxuICBTTUFMTEVSX0VROiBTUUxPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEJFVFdFRU46IFNRTE9wZXJhdG9yLkJFVFdFRU4sXG4gIE5PVDogXCJOT1RcIixcbiAgSU46IFNRTE9wZXJhdG9yLklOLFxuICBJU19OVUxMOiBTUUxPcGVyYXRvci5JU19OVUxMLFxuICBJU19OT1RfTlVMTDogU1FMT3BlcmF0b3IuSVNfTk9UX05VTEwsXG4gIFJFR0VYUDogXCJ+XCIsXG4gIElSRUdFWFA6IFwifipcIixcbiAgTElLRTogU1FMT3BlcmF0b3IuTElLRSxcbiAgSUxJS0U6IFNRTE9wZXJhdG9yLklMSUtFLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIHVzZWQgd2hlbiBidWlsZGluZyBXSEVSRSBjbGF1c2UgZ3JvdXBzIGluIFR5cGVPUk0gcXVlcmllcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFORCBMb2dpY2FsIEFORCBvcGVyYXRvciAoQU5EKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE9SIExvZ2ljYWwgT1Igb3BlcmF0b3IgKE9SKVxuICogQGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFORDogXCJBTkRcIixcbiAgT1I6IFwiT1JcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpYWwgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFN0cmluZyBjb25zdGFudHMgcmVwcmVzZW50aW5nIHNwZWNpYWwgdmFsdWVzIHVzZWQgd2hpbGUgY29tcG9zaW5nIFNRTCB3aXRoIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMQ29uc3RUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVMTCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZS5cbiAqIEBjb25zdCBUeXBlT1JNQ29uc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Db25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJOVUxMXCIsXG59O1xuIiwiaW1wb3J0IHsgUGFnaW5hdG9yLCBQYWdpbmdFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgcGFnaW5hdGlvbiBmb3IgVHlwZU9STS1idWlsdCBxdWVyaWVzIHVzaW5nIHRha2Uvc2tpcCBmb3IgZWZmaWNpZW50IG5hdmlnYXRpb24gdGhyb3VnaCByZXN1bHQgc2V0cy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgVHlwZU9STVBhZ2luYXRvcihhZGFwdGVyLCB7IHF1ZXJ5OiBxYiB9LCAxMCwgVXNlcik7XG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgVHlwZU9STVF1ZXJ5XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSByZWNvcmQgY291bnQgYW5kIHBhZ2Ugc2l6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlcG8/OiBSZXBvPGFueT47XG5cbiAgcHJvdGVjdGVkIGdldCByZXBvKCkge1xuICAgIGlmICghdGhpcy5fX3JlcG8pIHtcbiAgICAgIHRoaXMuX19yZXBvID0gKHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcikuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkYXRhYmFzZSBzZXF1ZW5jZSBmb3IgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgU2VxdWVuY2V9cywgZGVsZWdhdGluZyB0byB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSB0byBmZXRjaCBhbmQgaW5jcmVtZW50IHZhbHVlcyB3aGlsZSBoYW5kbGluZyB0eXBlIHBhcnNpbmcgYW5kIGVycm9yIHRyYW5zbGF0aW9uLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAobmFtZSwgdHlwZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeSwgZXRjLikuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4gKiBAY2xhc3MgVHlwZU9STVNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbmQgdXNlIGEgVHlwZU9STS1iYWNrZWQgc2VxdWVuY2VcbiAqIGNvbnN0IHNlcSA9IG5ldyBUeXBlT1JNU2VxdWVuY2UoeyBuYW1lOiBcInVzZXJfaWRfc2VxXCIsIHR5cGU6IFwiTnVtYmVyXCIsIHN0YXJ0V2l0aDogMSwgaW5jcmVtZW50Qnk6IDEgfSwgYWRhcHRlcik7XG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXEubmV4dCgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFNlcSBhcyBUeXBlT1JNU2VxdWVuY2VcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBBcHAtPj5TZXE6IG5leHQoKVxuICogICBTZXEtPj5TZXE6IGN1cnJlbnQoKVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcoU0VMRUNUIGN1cnJlbnRfdmFsdWUgLi4uKVxuICogICBBZGFwdGVyLT4+REI6IFF1ZXJ5IGN1cnJlbnQgdmFsdWVcbiAqICAgREItLT4+QWRhcHRlcjogY3VycmVudF92YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLT4+U2VxOiBpbmNyZW1lbnQoY3VycmVudClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KG5leHR2YWwobmFtZSkpXG4gKiAgIEFkYXB0ZXItPj5EQjogbmV4dHZhbCgpXG4gKiAgIERCLS0+PkFkYXB0ZXI6IG5leHQgdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0tPj5BcHA6IHBhcnNlZCBuZXh0IHZhbHVlXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXE6IGFueSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBjdXJyZW50X3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxLmN1cnJlbnRfdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLmFkYXB0ZXIucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodHlwZSAhPT0gXCJOdW1iZXJcIiAmJiB0eXBlICE9PSBcIkJpZ0ludFwiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5jcmVtZW50IHNlcXVlbmNlIG9mIHR5cGUgJHt0eXBlfSB3aXRoICR7Y291bnR9YFxuICAgICAgKTtcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIHRyeSB7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICQxIFNUQVJUIFdJVEggJDIgSU5DUkVNRU5UIEJZICQzIE5PIENZQ0xFO2AsXG4gICAgICAgIHZhbHVlczogW25hbWUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gVHlwZU9STUtleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIFR5cGVPUk1LZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBBcnJheSBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4ZXNcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleE5hbWVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+Z2VuZXJhdGVJbmRleGVzOiBtb2RlbHNcbiAqXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBiYXNlIHRhYmxlIGluZGV4XG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhOYW1lOiBbQ291Y2hEQktleXMuVEFCTEVdXG4gKiAgIGdlbmVyYXRlSW5kZXhOYW1lLS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIHRhYmxlIGluZGV4IGNvbmZpZ1xuICpcbiAqICAgbG9vcCBGb3IgZWFjaCBtb2RlbFxuICogICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCBpbmRleGVzIG1ldGFkYXRhXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IGluZGV4IG1ldGFkYXRhXG4gKlxuICogICAgIGxvb3AgRm9yIGVhY2ggaW5kZXggaW4gbWV0YWRhdGFcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IEV4dHJhY3QgaW5kZXggcHJvcGVydGllc1xuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBEZWZpbmUgbmVzdGVkIGdlbmVyYXRlIGZ1bmN0aW9uXG4gKlxuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKCkgZm9yIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBpbmRleCBuYW1lIGFuZCBjb25maWdcbiAqXG4gKiAgICAgICBhbHQgSGFzIGRpcmVjdGlvbnNcbiAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBkaXJlY3Rpb25cbiAqICAgICAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoZGlyZWN0aW9uKVxuICogICAgICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBvcmRlcmVkIGluZGV4IGNvbmZpZ1xuICogICAgICAgICBlbmRcbiAqICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0tPj5DYWxsZXI6IEFycmF5IG9mIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4pOiBUeXBlT1JNUXVlcnlbXSB7XG4gIGNvbnN0IHRhYmxlTmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFtUeXBlT1JNS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNUXVlcnk+ID0ge307XG4gIGluZGV4ZXNbdGFibGVOYW1lXSA9IHtcbiAgICBxdWVyeTogYGAsXG4gICAgdmFsdWVzOiBbXSxcbiAgfTtcblxuICBtb2RlbHMuZm9yRWFjaCgobSkgPT4ge1xuICAgIGNvbnN0IGluZDogUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4gPSBSZXBvc2l0b3J5LmluZGV4ZXMobSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG5cbiAgICAgIGxldCB7IGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtrZXksIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLCBQZXJzaXN0ZW5jZUtleXMuSU5ERVhdLmpvaW4oXG4gICAgICAgICAgRGVmYXVsdFNlcGFyYXRvclxuICAgICAgICApO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgcXVlcnk6IGBDUkVBVEUgSU5ERVggJDEgT04gJDIgKCQzKTtgLFxuICAgICAgICAgIHZhbHVlczogW25hbWUsIHRhYmxlTmFtZSwga2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwidHlwZW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBhIGdpdmVuIE1vZGVsIHVzaW5nIHRoZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCBpbmNsdWRpbmcgYnVsayBvcGVyYXRpb25zIGFuZCBxdWVyeSBidWlsZGVyIGFjY2VzcyB3aGlsZSBwcmVzZXJ2aW5nIERlY2FmLnRzIHJlcG9zaXRvcnkgc2VtYW50aWNzLlxuICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWwgdGhhdCB0aGlzIHJlcG9zaXRvcnkgd2lsbCBtYW5hZ2UuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGhlIE1vZGVsIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGJhc2UgUmVwb3NpdG9yeS5cbiAqIEBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBUeXBlT1JNUmVwb3NpdG9yeTxVc2VyPihhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGNyZWF0ZWQuaWQpO1xuICpcbiAqIC8vIEJ1bGsgY3JlYXRlXG4gKiBhd2FpdCByZXBvLmNyZWF0ZUFsbChbbmV3IFVzZXIoeyBuYW1lOiBcIkFcIiB9KSwgbmV3IFVzZXIoeyBuYW1lOiBcIkJcIiB9KV0pO1xuICpcbiAqIC8vIFVzaW5nIHRoZSBxdWVyeSBidWlsZGVyXG4gKiBjb25zdCBxYiA9IHJlcG8ucXVlcnlCdWlsZGVyKCk7XG4gKiBjb25zdCByb3dzID0gYXdhaXQgcWIud2hlcmUoXCJuYW1lID0gOm5hbWVcIiwgeyBuYW1lOiBcIkFsaWNlXCIgfSkuZ2V0TWFueSgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBUeXBlT1JNL0RhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUobW9kZWwsIHBrKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH1cbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCAuLi5hcmdzKVxuICogICBBZGFwdGVyLT4+REI6IElOU0VSVCAuLi5cbiAqICAgREItLT4+QWRhcHRlcjogcm93XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcm93XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiByZXZlcnQocm93LCBjbGF6eiwgcGssIGlkKVxuICogICBBZGFwdGVyLS0+PlJlcG86IG1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdXNlcyhUeXBlT1JNRmxhdm91cilcbmV4cG9ydCBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgTSxcbiAgVHlwZU9STVF1ZXJ5PE0sIGFueT4sXG4gIEFkYXB0ZXI8RGF0YVNvdXJjZU9wdGlvbnMsIFR5cGVPUk1RdWVyeSwgVHlwZU9STUZsYWdzLCBDb250ZXh0PFR5cGVPUk1GbGFncz4+LFxuICBUeXBlT1JNRmxhZ3MsXG4gIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEFkYXB0ZXI8XG4gICAgICBEYXRhU291cmNlT3B0aW9ucyxcbiAgICAgIFR5cGVPUk1RdWVyeSxcbiAgICAgIFR5cGVPUk1GbGFncyxcbiAgICAgIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuICAgID4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIFR5cGVPUk0gcXVlcnkgYnVpbGRlciBmb3IgdGhlIHJlcG9zaXRvcnkgZW50aXR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgU2VsZWN0UXVlcnlCdWlsZGVyIGJvdW5kIHRvIHRoaXMgcmVwb3NpdG9yeSdzIGVudGl0eSBmb3IgYWR2YW5jZWQgcXVlcnlpbmcuXG4gICAqIEByZXR1cm4ge1F1ZXJ5QnVpbGRlcjxhbnk+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCk6IFF1ZXJ5QnVpbGRlcjxhbnk+IHtcbiAgICBjb25zdCByZXBvID0gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMuY2xhc3NbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc11cbiAgICApO1xuICAgIHJldHVybiByZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuZCBwZXJzaXN0cyBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwsIGRlbGVnYXRlcyBpbnNlcnRpb24gdG8gdGhlIGFkYXB0ZXIsIGFuZCByZWh5ZHJhdGVzIHRoZSBwZXJzaXN0ZWQgc3RhdGUgYmFjayBpbnRvIGEgTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkLFxuICAgICAgbW9kZWwgYXMgYW55LFxuICAgICAgdGhpcy5wayxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGxldCBjOiBDb250ZXh0PFR5cGVPUk1GbGFncz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIENvbnRleHQ8VHlwZU9STUZsYWdzPjtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmdcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbmQgcGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsLCBkZWxlZ2F0ZXMgdXBkYXRlIHRvIHRoZSBhZGFwdGVyLCBhbmQgcmVoeWRyYXRlcyB0aGUgcGVyc2lzdGVkIHN0YXRlIGJhY2sgaW50byBhIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCxcbiAgICAgIG1vZGVsLFxuICAgICAgdGhpcy5wayxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBtb2RlbHMgZm9yIGJ1bGsgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb25zIGFuZCByZXR1cm5zIHRyYW5zZm9ybWVkIG1vZGVscyB3aXRoIGNvbnRleHQgYXJncyBmb3IgY3JlYXRlQWxsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxbTVtdLCAuLi5hbnlbXV0+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgRGlzcGF0Y2gge1xuICogICAgICtpbml0aWFsaXplKClcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKClcbiAqICAgfVxuICogICBjbGFzcyBUeXBlT1JNRGlzcGF0Y2gge1xuICogICAgIC1vYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmdcbiAqICAgICAtYXR0ZW1wdENvdW50ZXI6IG51bWJlclxuICogICAgIC10aW1lb3V0OiBudW1iZXJcbiAqICAgICArY29uc3RydWN0b3IodGltZW91dClcbiAqICAgICAjbm90aWZpY2F0aW9uSGFuZGxlcigpXG4gKiAgICAgI2luaXRpYWxpemUoKVxuICogICB9XG4gKiAgIERpc3BhdGNoIDx8LS0gVHlwZU9STURpc3BhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxEYXRhU291cmNlT3B0aW9ucz4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIFR5cGVPUk0gbm90aWZpY2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyAodHJhbnNsYXRlZCBmcm9tIFR5cGVPUk0gZXZlbnRzKSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IHJlY29yZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkcyBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG5vdGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBQb3N0Z3JlU1FMRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gICAqICAgTm90ZSBvdmVyIEQ6IFJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20gUG9zdGdyZVNRTFxuICAgKiAgIEQtPj5EOiBQYXJzZSBub3RpZmljYXRpb24gcGF5bG9hZFxuICAgKiAgIEQtPj5EOiBFeHRyYWN0IHRhYmxlLCBvcGVyYXRpb24sIGFuZCBpZHNcbiAgICogICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICBELT4+RDogVXBkYXRlIG9ic2VydmVyTGFzdFVwZGF0ZVxuICAgKiAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgaWRzOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyKTtcbiAgICB0cnkge1xuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wZXJhdGlvbn0gZm9yICR7dGFibGV9YCk7XG4gICAgICBsb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaGVyIGFuZCBzdWJzY3JpYmVzIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIG9uIHRoZSBEYXRhU291cmNlIGFuZCBsb2dzIHRoZSBzdWJzY3JpcHRpb24gbGlmZWN5Y2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgVHlwZU9STURpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EUzogaW5pdGlhbGl6ZSgpXG4gICAqICAgUy0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFR5cGVPUk1FdmVudFN1YnNjcmliZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERTLS0+PlM6IFN1YnNjcmlwdGlvbiBlc3RhYmxpc2hlZFxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlc29sdmVzXG4gICAqICAgICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgc3Vic2NyaXB0aW9uXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgRFMtLT4+UzogRXJyb3JcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb1R5cGVPUk0odGhpczogVHlwZU9STURpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIvbmF0aXZlIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWFkYXB0ZXIuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgYWRhcHRlci5kYXRhU291cmNlLnN1YnNjcmliZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyLmJpbmQodGhpcykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvVHlwZU9STVxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gVHlwZU9STSBub3RpZmljYXRpb25zOiAke2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBpZiAodGhpcy5hZGFwdGVyKSB7XG4gICAgLy9cbiAgICAvLyAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG4gICAgLy8gICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIC8vIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBSZWdFeHAgcGF0dGVybiB0byBhIFBvc3RncmVTUUwgUE9TSVggcGF0dGVybiBzdHJpbmcuXG4gKiBAc3VtbWFyeSBBY2NlcHRzIGVpdGhlciBhIFJlZ0V4cCBvYmplY3Qgb3IgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gKC9wYXR0ZXJuL2ZsYWdzKSBhbmQgcmV0dXJucyB0aGUgcmF3IHBhdHRlcm4gY29tcGF0aWJsZSB3aXRoIFBvc3RncmVTUUwncyB+IGFuZCB+KiBvcGVyYXRvcnMuXG4gKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IGpzUmVnZXggSmF2YVNjcmlwdCBSZWdFeHAgb2JqZWN0IG9yIHBhdHRlcm4gc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBQb3N0Z3JlU1FMLWNvbXBhdGlibGUgcmVnZXggcGF0dGVybiBzdHJpbmcuXG4gKiBAZnVuY3Rpb24gY29udmVydEpzUmVnZXhUb1Bvc3RncmVzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBVdGlscyBhcyBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqICAgQXBwLT4+VXRpbHM6IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3JlcyhSZWdFeHAoXCJmb28uKlwiLFwiaVwiKSlcbiAqICAgVXRpbHMtPj5VdGlsczogUGFyc2Ugc3RyaW5nIG9yIHVzZSBSZWdFeHAuc291cmNlXG4gKiAgIFV0aWxzLS0+PkFwcDogXCJmb28uKlwiXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMoanNSZWdleDogUmVnRXhwIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcnhwID0gbmV3IFJlZ0V4cCgvXlxcLyguKylcXC8oXFx3KykkL2cpO1xuICBpZiAodHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJ4cC5leGVjKGpzUmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgWywgcF0gPSBtYXRjaDtcbiAgICAgIGpzUmVnZXggPSBwO1xuICAgIH1cbiAgfVxuICBjb25zdCByZWdleCA9IHR5cGVvZiBqc1JlZ2V4ID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChqc1JlZ2V4KSA6IGpzUmVnZXg7XG5cbiAgY29uc3QgcGF0dGVybiA9IHJlZ2V4LnNvdXJjZTtcblxuICByZXR1cm4gcGF0dGVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0RWFnZXJSZWxhdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbik6IHsgbm9uRWFnZXI6IHN0cmluZ1tdOyByZWxhdGlvbnM6IHN0cmluZ1tdIH0ge1xuICBsZXQgaW5zdGFuY2U6IE07XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UgPSBuZXcgbSgpO1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGluc3RhbnRpYXRlIG1vZGVsICR7bS5uYW1lfSBmb3IgZWFnZXIgcmVsYXRpb24gY2FsY3VsYXRpb246ICR7ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCByZWxzID0gUmVwb3NpdG9yeS5yZWxhdGlvbnMobSk7XG4gIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHNwbGl0RWFnZXJSZWxhdGlvbnMpO1xuICBjYWNoZVttLm5hbWVdID0gY2FjaGVbbS5uYW1lXSB8fCB1bmRlZmluZWQ7XG4gIGlmIChjYWNoZVttLm5hbWVdKSB7XG4gICAgbG9nLmluZm8oYFJldHVybmluZyBjYWNoZWQgcmVsYXRpb25zIGZvciAke20ubmFtZX1gKTtcbiAgICByZXR1cm4gY2FjaGVbbS5uYW1lXTtcbiAgfVxuICBjb25zdCByZWxhdGlvbnMgPSByZWxzLnJlZHVjZShcbiAgICAoYWNjdW06IHsgcmVsYXRpb25zOiBzdHJpbmdbXTsgbm9uRWFnZXI6IHN0cmluZ1tdIH0sIGF0dHIpID0+IHtcbiAgICAgIGxvZy5pbmZvKGBSZXRyaWV2aW5nIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7YXR0cn0gb24gbW9kZWwgJHttLm5hbWV9YCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTiksXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBhdHRyLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICAhZGVjb3JhdG9ycyB8fFxuICAgICAgICAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzIHx8XG4gICAgICAgICFkZWNvcmF0b3JzLmRlY29yYXRvcnMubGVuZ3RoXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBkZWNvcmF0b3JzIGZvdW5kIGZvciBwcm9wZXJ0eSAke2F0dHJ9IG9uIG1vZGVsICR7bS5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIGlmIChkZWNvcmF0b3JzLmRlY29yYXRvcnMubGVuZ3RoID4gMSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIGRlY29yYXRvcnMgZm91bmQgZm9yIHByb3BlcnR5ICR7YXR0cn0gb24gbW9kZWwgJHttLm5hbWV9YFxuICAgICAgICApO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBEZWNvcmF0b3JzIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KGRlY29yYXRvcnMuZGVjb3JhdG9ycywgbnVsbCwgMil9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZGVjb3JhdG9ycy5kZWNvcmF0b3JzWzBdO1xuICAgICAgY29uc3QgZWFnZXIgPSBkZWNvcmF0b3IucHJvcHMucG9wdWxhdGU7XG4gICAgICBsZXQgY2xhenogPSBkZWNvcmF0b3IucHJvcHMuY2xhc3M7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiKSBjbGF6eiA9IE1vZGVsLmdldChjbGF6eikgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpIGNsYXp6ID0gY2xhenooKTtcbiAgICAgIGlmICghY2xhenopXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjbGFzcyBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG5cbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVsYXRpb24gb24gcHJvcCAke2F0dHJ9IG9mICR7bS5uYW1lfSBmb3VuZDogJHtjbGF6ei5uYW1lfSB3aXRoIGVhZ2VyOiAke2VhZ2VyfWBcbiAgICAgICk7XG5cbiAgICAgIGlmICghZWFnZXIpIHtcbiAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaChhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKGF0dHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWNjdW0ucmVsYXRpb25zLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBHZXR0aW5nIHJlbGF0aW9ucyBmb3IgJHtjbGF6ei5uYW1lfSBpbiBwcm9wICR7YXR0cn0gb2YgJHttLm5hbWV9IHdpdGggZWFnZXI6ICR7ZWFnZXJ9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnMoY2xhenosIGNhY2hlKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlbGF0aW9ucyBmb3IgJHthdHRyfSBvZiAke2NsYXp6Lm5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9ucywgbnVsbCwgMil9YFxuICAgICAgICApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgTm9uIGVhZ2VyIGZvciAke2F0dHJ9IG9mICR7Y2xhenoubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkobm9uRWFnZXIsIG51bGwsIDIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5vbkVhZ2VyLmxlbmd0aCAmJiBhY2N1bS5yZWxhdGlvbnMuaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICBjb25zdCBub25FYWdlclJlbGF0aW9ucyA9IG5vbkVhZ2VyLm1hcCgobmUpID0+IGAke2F0dHJ9LiR7bmV9YCk7XG4gICAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaCguLi5ub25FYWdlclJlbGF0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMubWFwKChuZSkgPT4gYCR7YXR0cn0uJHtuZX1gKTtcbiAgICAgICAgICBhY2N1bS5yZWxhdGlvbnMucHVzaCguLi5yZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgY2FsY3VsYXRlZCBSZWxhdGlvbnMgZm9yICR7YXR0cn0gb2YgJHtjbGF6ei5uYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnMsIG51bGwsIDIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYGNhbGN1bGF0ZWQgTm9uIGVhZ2VyIGZvciAke2F0dHJ9IG9mICR7Y2xhenoubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkobm9uRWFnZXIsIG51bGwsIDIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAgeyBub25FYWdlcjogW10sIHJlbGF0aW9uczogW10gfVxuICApO1xuICBjYWNoZVttLm5hbWVdID0gcmVsYXRpb25zO1xuICBMb2dnaW5nLmZvcihzcGxpdEVhZ2VyUmVsYXRpb25zKS5pbmZvKFxuICAgIGBSZWxhdGlvbnMgZm9yICR7bS5uYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnMsIG51bGwsIDIpfWBcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aW9ucztcbn1cbiIsImltcG9ydCB7IENvbHVtbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvQ29sdW1uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0luZGV4TWV0YWRhdGFBcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW10sXG4gIGluZGV4ZXM/OiBJbmRleE1ldGFkYXRhQXJnc1tdXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgIChjOiBSZWxhdGlvbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgaWYgKGluZGV4ZXMpIHtcbiAgICBjb25zdCBpbmR4ID0gaW5kZXhlcy5maWx0ZXIoXG4gICAgICAoYzogSW5kZXhNZXRhZGF0YUFyZ3MpID0+XG4gICAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgKGMuY29sdW1ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgKTtcbiAgICBpbmR4LmZvckVhY2goKGkpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oaSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoV2lkdGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhXaWR0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwiZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzaW1wbGUtZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzZXRcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB8ICgodHlwZT86IGFueSkgPT4gRnVuY3Rpb24pXG4gICAgfCBDb2x1bW5UeXBlXG4gICAgfCAoQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9ucyksXG4gIG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBvYmplY3QsIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgdHlwZSA9IDxDb2x1bW5UeXBlPnR5cGVPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gPENvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucztcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIENvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gc3BlY2lmeSBIU1RPUkUgdHlwZSBpZiBjb2x1bW4gaXMgSFNUT1JFXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gXCJoc3RvcmVcIiAmJiAhb3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgb3B0aW9ucy5oc3RvcmVUeXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gT2JqZWN0ID8gXCJvYmplY3RcIiA6IFwic3RyaW5nXCI7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gcmVnaXN0ZXIgYW4gZW1iZWRkZWRcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbWJlZGRlZHMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgaXNBcnJheTogcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gQXJyYXkgfHwgb3B0aW9ucy5hcnJheSA9PT0gdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVmaXggOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgdHlwZTogdHlwZU9yT3B0aW9ucyBhcyAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gICAgICB9IGFzIEVtYmVkZGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVnaXN0ZXIgYSByZWd1bGFyIGNvbHVtblxuXG4gICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGNvbHVtbnM6IFtwcm9wZXJ0eU5hbWVdLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIFwicmVndWxhclwiLFxuICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnMsXG4gICAgICAgIG9wdGlvbnMudW5pcXVlID8gbWV0YWRhdGEuaW5kaWNlcyA6IHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZ2VuZXJhdGVkXG4gICAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJ1cGRhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uKG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMgfHwge30sXG4gICAgICBcImNyZWF0ZURhdGVcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG4gIH07XG59XG4iLCJleHBvcnQgY2xhc3MgT2JqZWN0VXRpbHMge1xuICAvKipcbiAgICogQ2hlY2tzIGlmIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAgICogV2UgY2Fubm90IHVzZSBpbnN0YW5jZW9mIGJlY2F1c2UgaXQgaGFzIHByb2JsZW1zIHdoZW4gcnVubmluZyBvbiBkaWZmZXJlbnQgY29udGV4dHMuXG4gICAqIEFuZCB3ZSBkb24ndCBzaW1wbHkgdXNlIHR5cGVvZiBiZWNhdXNlIHR5cGVvZiBudWxsID09PSBcIm9iamVjdFwiLlxuICAgKi9cbiAgc3RhdGljIGlzT2JqZWN0KHZhbDogYW55KTogdmFsIGlzIG9iamVjdCB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdFdpdGhOYW1lKHZhbDogYW55KTogdmFsIGlzIG9iamVjdCAmIHsgbmFtZTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiB2YWxbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVPih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVSwgVj4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlMSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTIgVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMyBUaGUgdGhpcmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVSwgViwgVz4oXG4gICAgdGFyZ2V0OiBULFxuICAgIHNvdXJjZTE6IFUsXG4gICAgc291cmNlMjogVixcbiAgICBzb3VyY2UzOiBXXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZXMgT25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBhc3NpZ24odGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IGFueVtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSkpIHtcbiAgICAgICAgKHRhcmdldCBhcyBhbnkpW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL1xuICAvLyAvKipcbiAgLy8gICogQ29udmVydHMgTWl4ZWRMaXN0PFQ+IHRvIHN0cmljdGx5IGFuIGFycmF5IG9mIGl0cyBUIGl0ZW1zLlxuICAvLyAgKi9cbiAgLy8gc3RhdGljIG1peGVkTGlzdFRvQXJyYXk8VD4obGlzdDogTWl4ZWRMaXN0PFQ+KTogVFtdIHtcbiAgLy8gICBpZiAobGlzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGlzdCA9PT0gXCJvYmplY3RcIikge1xuICAvLyAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChcbiAgLy8gICAgICAgKGtleSkgPT4gKGxpc3QgYXMgeyBba2V5OiBzdHJpbmddOiBUIH0pW2tleV1cbiAgLy8gICAgICk7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHJldHVybiBsaXN0O1xuICAvLyAgIH1cbiAgLy8gfVxufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4sIGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgcmVsYXRpb25UeXBlOiBcIm9uZS10by1vbmVcIixcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogQSBvbmUtdG8tbWFueSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MixcbiAqIGJ1dCBFbnRpdHkyIGhhcyBvbmx5IG9uZSBFbnRpdHkxLiBFbnRpdHkyIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZiBFbnRpdHkxIG9uIGl0c1xuICogc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBOb3cgdHJ5IHRvIGRldGVybWluZSBpZiBpdCBpcyBhIGxhenkgcmVsYXRpb24uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIEEgbWFueS10by1vbmUgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgRW50aXR5MiwgYnV0XG4gKiBFbnRpdHkyIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZlxuICogRW50aXR5MiBvbiBpdHMgc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvT25lPFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gTm93IHRyeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsYXp5IHJlbGF0aW9uLlxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tb25lXCIsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE1hbnktdG8tbWFueSBpcyBhIHR5cGUgb2YgcmVsYXRpb25zaGlwIHdoZW4gRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MiwgYW5kIEVudGl0eTIgY2FuIGhhdmVcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBUbyBhY2hpZXZlIGl0LCB0aGlzIHR5cGUgb2YgcmVsYXRpb24gY3JlYXRlcyBhIGp1bmN0aW9uIHRhYmxlLCB3aGVyZSBpdCBzdG9yYWdlXG4gKiBlbnRpdHkxIGFuZCBlbnRpdHkyIGlkcy4gVGhpcyBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBub3cgdHJ5IHRvIGRldGVybWluZSBpdCBpdHMgbGF6eSByZWxhdGlvblxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW1hbnlcIixcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBvcHRpb25zOiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInV1aWRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInJvd2lkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaWRlbnRpdHlcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3lPck9wdGlvbnM/OlxuICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgIHwgXCJ1dWlkXCJcbiAgICB8IFwicm93aWRcIlxuICAgIHwgXCJpZGVudGl0eVwiXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzpcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IG9wdGlvbnM6IENvbHVtbk9wdGlvbnMgPSB7fTtcbiAgbGV0IHN0cmF0ZWd5OiBcImluY3JlbWVudFwiIHwgXCJ1dWlkXCIgfCBcInJvd2lkXCIgfCBcImlkZW50aXR5XCI7XG4gIGlmIChzdHJhdGVneU9yT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RyYXRlZ3lPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICBzdHJhdGVneSA9IHN0cmF0ZWd5T3JPcHRpb25zIGFzXG4gICAgICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgICAgICB8IFwidXVpZFwiXG4gICAgICAgIHwgXCJyb3dpZFwiXG4gICAgICAgIHwgXCJpZGVudGl0eVwiO1xuXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KHN0cmF0ZWd5T3JPcHRpb25zKSkge1xuICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgfVxuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QobWF5YmVPcHRpb25zKSkgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiIHx8IHN0cmF0ZWd5ID09PSBcImlkZW50aXR5XCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInJvd2lkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgXCJyZWd1bGFyXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG4gIFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBwcmltYXJ5IGtleSBjb2x1bW4ncyBvcHRpb25zLlxuICogSWYgc3BlY2lmaWVkLCB0aGUgbnVsbGFibGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gZmFsc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFByaW1hcnlDb2x1bW5PcHRpb25zID0gQ29sdW1uT3B0aW9ucyAmIHsgbnVsbGFibGU/OiBmYWxzZSB9O1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGU/OiBDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IENvbHVtblR5cGUgfCBQcmltYXJ5Q29sdW1uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gU3RyaW5nIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBCb29sZWFuIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBOdW1iZXJcbiAgICApIHtcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zIGFzIENvbHVtblR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCA8UHJpbWFyeUNvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFByaW1hcnlDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGNvbnN0IHJlZmxlY3RNZXRhZGF0YVR5cGUgPVxuICAgICAgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhXG4gICAgICAgID8gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgJiYgcmVmbGVjdE1ldGFkYXRhVHlwZSkgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBjaGVjayBpZiBjb2x1bW4gaXMgbm90IG51bGxhYmxlLCBiZWNhdXNlIHdlIGNhbm5vdCBhbGxvdyBhIHByaW1hcnkga2V5IHRvIGJlIG51bGxhYmxlXG4gICAgaWYgKG9wdGlvbnMubnVsbGFibGUpXG4gICAgICB0aHJvdyBuZXcgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIFwicmVndWxhclwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcblxuICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIHN0cmF0ZWd5OlxuICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgOiBcImluY3JlbWVudFwiLFxuICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IEVudGl0eU9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZU1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvVGFibGVNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkob3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkobmFtZT86IHN0cmluZywgb3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkoXG4gIG5hbWVPck9wdGlvbnM/OiBzdHJpbmcgfCBFbnRpdHlPcHRpb25zLFxuICBtYXliZU9wdGlvbnM/OiBFbnRpdHlPcHRpb25zXG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIChPYmplY3RVdGlscy5pc09iamVjdChuYW1lT3JPcHRpb25zKVxuICAgICAgPyAobmFtZU9yT3B0aW9ucyBhcyBFbnRpdHlPcHRpb25zKVxuICAgICAgOiBtYXliZU9wdGlvbnMpIHx8IHt9O1xuICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBuYW1lT3JPcHRpb25zIDogb3B0aW9ucy5uYW1lO1xuXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFibGVzID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRhYmxlcztcbiAgICB0YWJsZXMucHVzaCh7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBcInJlZ3VsYXJcIixcbiAgICAgIG9yZGVyQnk6IG9wdGlvbnMub3JkZXJCeSA/IG9wdGlvbnMub3JkZXJCeSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuZ2luZTogb3B0aW9ucy5lbmdpbmUgPyBvcHRpb25zLmVuZ2luZSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlID8gb3B0aW9ucy5kYXRhYmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHNjaGVtYTogb3B0aW9ucy5zY2hlbWEgPyBvcHRpb25zLnNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgIHN5bmNocm9uaXplOiBvcHRpb25zLnN5bmNocm9uaXplLFxuICAgICAgd2l0aG91dFJvd2lkOiBvcHRpb25zLndpdGhvdXRSb3dpZCxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/IG9wdGlvbnMuY29tbWVudCA6IHVuZGVmaW5lZCxcbiAgICB9IGFzIFRhYmxlTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbEtleXMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuZXhwb3J0IGNvbnN0IEJhc2VLZXkgPSBcImRlY2FmXCI7XG5cbmZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbiAgc3BsaXR0ZXIgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogdm9pZCB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQ6IFJlY29yZDxhbnksIGFueT4gPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmICghKGtleSBpbiBjdXJyZW50KSkge1xuICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICBjdXJyZW50W2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxNZXRhZGF0YSA9IHtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdmFsaWRhdGlvbj86IFJlY29yZDxzdHJpbmcsIGFueVtdPjtcbiAgcmVsYXRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZ2VuZXJhdGVkPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcGs6IHN0cmluZztcbiAgZmtzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgaW5kZXhlcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICBwcml2YXRlIHN0YXRpYyBfbWV0YWRhdGE6IFJlY29yZDxzeW1ib2wsIE1vZGVsTWV0YWRhdGE+ID0ge307XG5cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIHN0YXRpYyBiYXNlS2V5ID0gQmFzZUtleTtcbiAgc3RhdGljIG1pcnJvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldFByb3BlcnRpZXMobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5wcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHN0YXRpYyBwayhtb2RlbDogQ29uc3RydWN0b3I8YW55Pikge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhLnBrKVswXTtcbiAgfVxuXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcyhtb2RlbCwgcHJvcClbMF07XG4gIH1cblxuICBzdGF0aWMgdHlwZXMobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZykge1xuICAgIGxldCBkZXNpZ25UeXBlOiBhbnkgPSB0aGlzLmdldChtb2RlbCwgYHByb3BlcnRpZXMuJHtwcm9wfWApO1xuICAgIGlmICghZGVzaWduVHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtwcm9wfSBub3QgZm91bmQgaW4gJHttb2RlbC5uYW1lfWApO1xuICAgIGRlc2lnblR5cGUgPSBbZGVzaWduVHlwZV07XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkge1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgICBpZiAobWV0YS52YWxpZGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBtZXRhLnZhbGlkYXRpb247XG4gICAgICAgIGlmICh2YWxpZGF0aW9uW1ZhbGlkYXRpb25LZXlzLlRZUEVdKVxuICAgICAgICAgIGRlc2lnblR5cGUgPSBkZXNpZ25UeXBlLmNvbmNhdCh2YWxpZGF0aW9uW1ZhbGlkYXRpb25LZXlzLlRZUEVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2lnblR5cGUuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IE1vZGVsTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nKTogYW55O1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgcmV0dXJuIGdldFZhbHVlQnlTcGxpdHRlcih0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLCBrZXksIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG5cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSA9IHt9IGFzIGFueTtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdmFsdWUsIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFzc2lnbihcbiAgICBtb2RlbDogb2JqZWN0LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm9wPzogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIE1ldGFkYXRhLnNldChtb2RlbCBhcyBhbnksIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcm9wZXJ0eShtb2RlbDogb2JqZWN0LCBwcm9wOiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShNb2RlbEtleXMuVFlQRSwgbW9kZWwsIHByb3ApO1xuICAgIHJldHVybiBhc3NpZ24oYHByb3BlcnR5LiR7cHJvcH1gLCBkZXNpZ25UeXBlKShtb2RlbCwgcHJvcCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDYXNjYWRlLFxuICBDYXNjYWRlTWV0YWRhdGEsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgZmluYWwsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBzZXF1ZW5jZU5hbWVGb3JNb2RlbCxcbiAgdHlwZSBTZXF1ZW5jZU9wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHJlc2VydmVkQXR0cmlidXRlcywgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcywgc3BsaXRFYWdlclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluc2VydFJlc3VsdCxcbiAgUmVsYXRpb25PcHRpb25zLFxuICBKb2luQ29sdW1uLFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG4gIFZlcnNpb25Db2x1bW4sXG4gIEpvaW5UYWJsZSxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uT3B0aW9ucyxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW5PcHRpb25zLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NvbHVtblwiO1xuaW1wb3J0IHsgVXBkYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBDcmVhdGVEYXRlQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmltcG9ydCB7IE9uZVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvT25lXCI7XG5pbXBvcnQgeyBPbmVUb01hbnkgfSBmcm9tIFwiLi9vdmVycmlkZXMvT25lVG9NYW55XCI7XG5pbXBvcnQgeyBNYW55VG9PbmUgfSBmcm9tIFwiLi9vdmVycmlkZXMvTWFueVRvT25lXCI7XG5pbXBvcnQgeyBNYW55VG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb01hbnlcIjtcbmltcG9ydCB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtblwiO1xuaW1wb3J0IHsgUHJpbWFyeUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvRW50aXR5XCI7XG5pbXBvcnQgeyBhc3NpZ24sIE1ldGFkYXRhLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgVHlwZU9STVJlcG9zaXRvcnk8TT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gIGRhdGE6IGFueSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwidXNlclwiKTtcbiAgICBtb2RlbFtrZXldID0gdXNlciBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBUeXBlT1JNLWJhY2tlZCBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgRGVjYWYudHMgQWRhcHRlciBvdmVyIGEgVHlwZU9STSBEYXRhU291cmNlLCBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeS9zdGF0ZW1lbnQgZmFjdG9yaWVzLCBzZXF1ZW5jZSBtYW5hZ2VtZW50LCBlcnJvciBwYXJzaW5nLCBhbmQgZGVjb3JhdGlvbiBoZWxwZXJzLlxuICogQHRlbXBsYXRlIFkgVGhlIG5hdGl2ZSBjb25maWd1cmF0aW9uIHR5cGUgKFR5cGVPUk0gRGF0YVNvdXJjZU9wdGlvbnMpLlxuICogQHRlbXBsYXRlIEYgVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAcGFyYW0ge0RhdGFTb3VyY2VPcHRpb25zfSBzY29wZSBUaGUgRGF0YVNvdXJjZSBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIFRoZSBmbGF2b3VyIG9mIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBUeXBlT1JNQWRhcHRlcih7IHR5cGU6ICdwb3N0Z3JlcycsIC8qIC4uLiAqXFwvIH0pO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKiBjb25zdCByZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5BZGFwdGVyOiBuZXcgVHlwZU9STUFkYXB0ZXIob3B0cylcbiAqICAgQWRhcHRlci0+PkRTOiBpbml0aWFsaXplKClcbiAqICAgQXBwLT4+QWRhcHRlcjogcmVwb3NpdG9yeSgpXG4gKiAgIEFkYXB0ZXItLT4+QXBwOiBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlL2NyZWF0ZS9yZXZlcnRcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBNb2RlbFxuICogICBSZXBvLS0+PkFwcDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gIFR5cGVPUk1RdWVyeSxcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBwcml2YXRlIF9kYXRhU291cmNlPzogRGF0YVNvdXJjZTtcblxuICBnZXQgZGF0YVNvdXJjZSgpOiBEYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuZmxhdm91cik7XG4gICAgICB0aGlzLl9kYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5uYXRpdmUsIHtcbiAgICAgICAgICBlbnRpdGllczogbW9kZWxzLm1hcCgoYykgPT4gY1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjXSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcbiAgfVxuICAvLyBwcm90ZWN0ZWQgZGF0YVNvdVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFTb3VyY2VPcHRpb25zLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKG9wdGlvbnMsIFR5cGVPUk1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFR5cGVPUk1GbGFncz5cbiAgKTogUHJvbWlzZTxUeXBlT1JNRmxhZ3M+IHtcbiAgICBjb25zdCBmID0gYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpO1xuICAgIGNvbnN0IG5ld09iajogYW55ID0ge1xuICAgICAgdXNlcjogKGF3YWl0IFR5cGVPUk1BZGFwdGVyLmdldEN1cnJlbnRVc2VyKHRoaXMuZGF0YVNvdXJjZSkpIGFzIHN0cmluZyxcbiAgICB9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoKTtcblxuICAgIGNvbnN0IGV4Y2VwdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobSkuaWQ7XG4gICAgICBleGNlcHRpb25zLnB1c2gocGsgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8XG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgKSB7XG4gICAgICBjb25zdCBkZWNzID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIG0sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgKGRlYzogYW55KSA9PlxuICAgICAgICAgICAgZGVjLmtleSA9PT0gREJLZXlzLlRJTUVTVEFNUCAmJlxuICAgICAgICAgICAgZGVjLnByb3BzLm9wZXJhdGlvbi5pbmRleE9mKG9wZXJhdGlvbikgIT09IC0xXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWMpIHtcbiAgICAgICAgICBhY2N1bVtrZXldID0gZGVjLnByb3BzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgZXhjZXB0aW9ucy5wdXNoKC4uLk9iamVjdC5rZXlzKGRlY3MpKTtcbiAgICB9XG5cbiAgICBuZXdPYmouaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID0gKFxuICAgICAgZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgPyBmLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA6IFtdXG4gICAgKS5jb25jYXQoLi4uZXhjZXB0aW9ucyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZiwgbmV3T2JqKSBhcyBUeXBlT1JNRmxhZ3M7XG4gIH1cblxuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogVHlwZU9STURpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1EaXNwYXRjaCgpO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFR5cGVPUk1SZXBvc2l0b3J5PE0+PiB7XG4gICAgcmV0dXJuIFR5cGVPUk1SZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVzIHN0YXRlbWVudCBmb3IgcXVlcnlpbmdcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlIGZvciBidWlsZGluZyBxdWVyaWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7VHlwZU9STVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogVHlwZU9STVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TdGF0ZW1lbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTFNlcXVlbmNlIGluc3RhbmNlIGZvciBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBTZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlciBieSBjcmVhdGluZyBpbmRleGVzIGZvciBhbGwgbWFuYWdlZCBtb2RlbHNcbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGRhdGFiYXNlIGluZGV4ZXMgZm9yIGFsbCBtb2RlbHMgbWFuYWdlZCBieSB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkcyA9IHRoaXMuZGF0YVNvdXJjZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHMuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgbG9nLnZlcmJvc2UoYCR7dGhpcy5mbGF2b3VyfSBhZGFwdGVyIGluaXRpYWxpemVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgaW5kZXhlcyBmb3IgdGhlIGdpdmVuIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBkYXRhYmFzZSBpbmRleGVzIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Li4uQ29uc3RydWN0b3I8TT59IG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICovXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBUeXBlT1JNUXVlcnlbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIkJFR0lOXCIpO1xuXG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KGluZGV4LnF1ZXJ5LCBpbmRleC52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJDT01NSVRcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBleGVjdXRlIHJhdyBTUUwgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcSAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihxOiBUeXBlT1JNUXVlcnkpOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yYXcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVlcnksIHZhbHVlcyB9ID0gcTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYGV4ZWN1dGluZyBxdWVyeTogJHsocXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikuZ2V0U3FsKCl9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTSxcbiAgICBjaGlsZCA9IGZhbHNlXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcblxuICAgIHByZXBhcmVkLnJlY29yZCA9IE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBIHx8IHRoaXMuaXNSZXNlcnZlZChrZXkpKVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKE1vZGVsLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnByZXBhcmUodmFsdWUsIGZpbmRQcmltYXJ5S2V5KHZhbHVlKS5pZCwgdHJ1ZSkucmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy9kbyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IubmFtZVxuICAgICk7XG4gICAgaWYgKCFjb25zdHIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gbm90IGZvdW5kIGluIHJlZ2lzdHJ5YFxuICAgICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBjaGlsZFxuICAgICAgPyBuZXcgKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0oKVxuICAgICAgOiBuZXcgY29uc3RyKCk7XG4gICAgaWYgKGNoaWxkKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkuZm9yRWFjaChcbiAgICAgIChba2V5LCB2YWxdKSA9PiAocmVzdWx0W2tleSBhcyBrZXlvZiB0eXBlb2YgcmVzdWx0XSA9IHZhbClcbiAgICApO1xuICAgIHByZXBhcmVkLnJlY29yZCA9IHJlc3VsdDtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBvYmopXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke3R5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBhIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlcG8uZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBgUmVjb3JkIGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7UmVwb3NpdG9yeS50YWJsZShtKX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHJlYWQgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gcHJpbWFyeSBrZXkgY29sdW1cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlYWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnMobSk7XG5cbiAgICAgIGNvbnN0IHE6IEZpbmRPbmVPcHRpb25zID0ge1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIFtwa106IGlkLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGlvbnM6IHJlbGF0aW9ucyxcbiAgICAgICAgbG9hZFJlbGF0aW9uSWRzOiB7XG4gICAgICAgICAgcmVsYXRpb25zOiBub25FYWdlcixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSAoYXdhaXQgcmVwby5maW5kT25lT3JGYWlsKHEpKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byB1cGRhdGUgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMucmVhZCh0YWJsZU5hbWUsIGlkLCBwayk7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVsZXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBJbnNlcnRSZXN1bHQgPSBhd2FpdCByZXBvLmluc2VydChtb2RlbCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHJlc3VsdC5pZGVudGlmaWVycy5tYXAoKGlkKSA9PiBpZC5pZCksXG4gICAgICAgIFwiaWRcIlxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWQubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiByZXBvLmZpbmRCeSh7IFtwa106IEluKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgbVtwa10sIG0sIHBrLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwodGFibGVOYW1lLCBpZHMsIHBrKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkcyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBhbmQgY29udmVydHMgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICovXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gVHlwZU9STUFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBpbiBQb3N0Z3JlU1FMXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhdHRyLm1hdGNoKHJlc2VydmVkQXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW4gZXJyb3IgYW5kIGNvbnZlcnQgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXMgYmFzZWQgb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VFcnJvclxuICAgKiAgIHBhcnRpY2lwYW50IEVycm9yVHlwZXNcbiAgICpcbiAgICogICBDYWxsZXItPj5wYXJzZUVycm9yOiBlcnIsIHJlYXNvblxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBDaGVjayBpZiBlcnIgaXMgYWxyZWFkeSBhIEJhc2VFcnJvclxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBwYXJzZUVycm9yLS0+PkNhbGxlcjogcmV0dXJuIGVyclxuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBmcm9tIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvZGUgbWF0Y2hlcyBcImR1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHNcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29kZSBtYXRjaGVzIFwiZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgY29kZSBwcm9wZXJ0eVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBhbmQgcmVhc29uXG4gICAqICAgZWxzZVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFVzZSBlcnIubWVzc2FnZSBhcyBjb2RlXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFN3aXRjaCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVcbiAgICogICBhbHQgY29kZSBpcyAyMzUwNSAodW5pcXVlX3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyAyMzUwMyAoZm9yZWlnbl9rZXlfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDAxICh1bmRlZmluZWRfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDI3MDMgKHVuZGVmaW5lZF9jb2x1bW4pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDcgKGR1cGxpY2F0ZV90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAxNiAoaW52YWxpZF90YWJsZV9kZWZpbml0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbmRleEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgIGVsc2VcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgY29uc3QgY29kZTogc3RyaW5nID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuXG4gICAgaWYgKGNvZGUubWF0Y2goL2R1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHMvZykpXG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgaWYgKGNvZGUubWF0Y2goL2RvZXMgbm90IGV4aXN0fG5vdCBmb3VuZHxDb3VsZCBub3QgZmluZC9nKSlcbiAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcblxuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgICAgICBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IHR5cGUgPVxuICAgICAgICAgIG9wdGlvbnMudHlwZSB8fCBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgcHJvcGVydHkgJHtwcm9wfSBvZiAke29yaWdpbmFsLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgc2VxdWVuY2VOYW1lRm9yTW9kZWwob3JpZ2luYWwsIFwicGtcIik7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwibnVtZXJpY1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwidmFyY2hhclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUNvbHVtbih7XG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUgYXMgQ29sdW1uVHlwZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKShvcmlnaW5hbCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHBrS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihNb2RlbEtleXMuQVRUUklCVVRFKVxuICAgICAgLmV4dGVuZChwcm9wZXJ0eSgpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAY29sdW1uKFwiY29sdW1uTmFtZVwiKSA9PiBAQ29sdW1uKHtuYW1lOiBcImNvbHVtbk5hbWVcIn0pXG4gICAgY29uc3QgY29sdW1uS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY29sdW1uS2V5KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1tKG5hbWU6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKG5hbWUpIG9wdHMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBjb25zdCBwayA9IE1ldGFkYXRhLmdldChvYmosIFwicGtcIik7XG4gICAgICAgICAgICBpZiAocGsgIT09IHByb3ApIHtcbiAgICAgICAgICAgICAgb3B0cy5udWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uKG9wdHMpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXJnc1sxXTtcbiAgICAgICAgICByZXR1cm4gW2NvbHVtbk5hbWVdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHVuaXF1ZSA9PiBAQ29sdW1uKHt1bmlxdWU6IHRydWV9KVxuICAgIGNvbnN0IHVuaXF1ZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVuaXF1ZUtleSlcbiAgICAgIC5kZWZpbmUocHJvcE1ldGFkYXRhKHVuaXF1ZUtleSwge30pKVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEByZXF1aXJlZCA9PiBAQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pXG4gICAgY29uc3QgcmVxdWlyZWRLZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocmVxdWlyZWRLZXkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHZlcnNpb24gPT4gQFZlcnNpb25Db2x1bW4oKVxuICAgIGNvbnN0IHZlcnNpb25LZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVkVSU0lPTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodmVyc2lvbktleSlcbiAgICAgIC5kZWZpbmUodHlwZShOdW1iZXIubmFtZSksIFZlcnNpb25Db2x1bW4oKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgICAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICBwcm9wTWV0YWRhdGEodGltZXN0YW1wS2V5LCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBlbHNlIGRlY29yYXRvcnMucHVzaChyZWFkb25seSgpKTtcbiAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0aW1lc3RhbXBLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIH0pXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAoLi4ub3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGltZXN0YW1wKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChvcHMuaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb09uZShjbGF6eikgPT4gQE9uZVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5Db2x1bW5PcHRzPzogSm9pbkNvbHVtbk9wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luQ29sdW1uT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgT25lVG9PbmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luQ29sdW1uKFxuICAgICAgICAgICAgICBqb2luQ29sdW1uT3B0cyB8fCBtZXRhZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlDb25zdHJhaW50TmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6ICh1bmRlZmluZWQgYXMgYW55KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9NYW55KGNsYXp6KSA9PiBAT25lVG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG5cbiAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvTWFueUtleSwgbWV0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBPbmVUb01hbnlXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIE9uZVRvTWFueShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGF6eiA9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGRlYy5wcm9wcy5jbGFzcyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWRlYy5wcm9wcy5jbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlYy5wcm9wcy5jbGFzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGRlYy5wcm9wcy5jbGFzcztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBDcm9zcyByZWxhdGlvbiBub3QgZm91bmQuIERpZCB5b3UgdXNlIEBtYW55VG9PbmUgb24gdGhlICR7Y2xhenoubmFtZX0/YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb09uZShjbGF6eikgPT4gQE1hbnlUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE1hbnlUb09uZVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIHJldHVybiBNYW55VG9PbmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBsZXQgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0RGVjKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIFR5cGUgRGVmaW5pdGlvbiBmb3VuZCBmb3IgJHtrfSBpbiAke20uY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGxpc3REZWMuY2xhenpbMF0oKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgY3Jvc3NSZWxhdGlvbktleSA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKVxuICAgICAgICAgICAgICAgICAgICApLmlkIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvTWFueShjbGF6eikgPT4gQE1hbnlUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE1hbnlUb01hbnkoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luVGFibGUoam9pblRhYmxlT3B0cyBhcyBhbnkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBpbmRleCgpID0+IEBJbmRleCgpXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLklOREVYKVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gaW5kZXgoXG4gICAgICAgICAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10gfCBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgbmFtZT86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW5kZXgob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvc2l0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICBuYW1lID0gY29tcG9zaXRpb25zO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9ucyAmJiBkaXJlY3Rpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgIVtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10uaW5jbHVkZXMoZCBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSBkaXJlY3Rpb25zIGFzIHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBJbmRleChbcHJvcCwgLi4uY29tcG9zaXRpb25zXSkob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEluZGV4KCkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGUsIHt9KSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICAgIC8vIGFzc2lnbihgcGsuJHtwcm9wfWAsIG9wdGlvbnMpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZSwge30pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChUeXBlT1JNRmxhdm91cik7XG4iLCJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cblR5cGVPUk1BZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXhlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcXVlbmNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBpbnRlZ3JhdGlvbiBmb3IgRGVjYWYudHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgVHlwZU9STS1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlY2FmLnRzIGRhdGEgYWNjZXNzIGFic3RyYWN0aW9ucywgaW5jbHVkaW5nIHRoZSBhZGFwdGVyLCByZXBvc2l0b3J5LCBzdGF0ZW1lbnQgYnVpbGRlciwgcGFnaW5hdGlvbiB1dGlsaXRpZXMsIGluZGV4IGhlbHBlcnMsIGFuZCB0eXBlIGRlZmluaXRpb25zLiBLZXkgZXhwb3J0cyBpbmNsdWRlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIHtAbGluayBUeXBlT1JNUmVwb3NpdG9yeX0sIHtAbGluayBUeXBlT1JNU3RhdGVtZW50fSwge0BsaW5rIFR5cGVPUk1QYWdpbmF0b3J9LCBhbmQgaW5kZXggZ2VuZXJhdGlvbiB1dGlsaXRpZXMuXG4gKiBAbW9kdWxlIGZvci10eXBlb3JtXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbi5cbiAqIEBzdW1tYXJ5IFRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgZm9yLXR5cGVvcm0gcGFja2FnZS5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkJhc2VFcnJvciIsIlNRTE9wZXJhdG9yIiwiUGFnaW5hdG9yIiwiTW9kZWxLZXlzIiwiUGFnaW5nRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlF1ZXJ5RXJyb3IiLCJTdGF0ZW1lbnQiLCJSZXBvc2l0b3J5IiwiT3JkZXJEaXJlY3Rpb24iLCJJbnRlcm5hbEVycm9yIiwiR3JvdXBPcGVyYXRvciIsIk9wZXJhdG9yIiwiU2VxdWVuY2UiLCJOb3RGb3VuZEVycm9yIiwiRGVmYXVsdFNlcGFyYXRvciIsIlBlcnNpc3RlbmNlS2V5cyIsIlR5cGVPUk1SZXBvc2l0b3J5IiwiQ29udGV4dCIsIk9wZXJhdGlvbktleXMiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiVmFsaWRhdGlvbkVycm9yIiwiX19kZWNvcmF0ZSIsInVzZXMiLCJBZGFwdGVyIiwiTW9kZWwiLCJFdmVudFN1YnNjcmliZXIiLCJEaXNwYXRjaCIsIkxvZ2dpbmciLCJSZWZsZWN0aW9uIiwiVmFsaWRhdGlvbktleXMiLCJVbnN1cHBvcnRlZEVycm9yIiwiZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSIsIkNvbHVtblR5cGVVbmRlZmluZWRFcnJvciIsIlByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IiLCJEYXRhU291cmNlIiwiREJLZXlzIiwiQ29uZmxpY3RFcnJvciIsIkluIiwiQ29ubmVjdGlvbkVycm9yIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFUyIsIkRlY29yYXRpb24iLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwicHJvcE1ldGFkYXRhIiwic2VxdWVuY2VOYW1lRm9yTW9kZWwiLCJhcHBseSIsIlZhbGlkYXRpb24iLCJ0eXBlIiwiVmVyc2lvbkNvbHVtbiIsIlVwZGF0ZVZhbGlkYXRpb25LZXlzIiwiZGF0ZSIsIkRCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJDYXNjYWRlIiwicHJvcCIsIkpvaW5Db2x1bW4iLCJsaXN0IiwiSm9pblRhYmxlIiwiSW5kZXgiLCJvbkNyZWF0ZSIsIm9uQ3JlYXRlVXBkYXRlIiwiZmluYWwiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7OztJQUtHO0FBQ0ksVUFBTSxrQkFBa0IsR0FDN0I7QUFFSyxVQUFNLGNBQWMsR0FBRztJQUU5Qjs7Ozs7Ozs7Ozs7OztJQWFHO0lBQ0g7Ozs7OztJQU1HO0FBQ0ksVUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBQSxTQUFTLEVBQUUsR0FBRztJQUNkLElBQUEsRUFBRSxFQUFFLElBQUk7SUFDUixJQUFBLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUEsT0FBTyxFQUFFLFlBQVk7SUFDckIsSUFBQSxLQUFLLEVBQUUsWUFBWTtJQUNuQixJQUFBLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLElBQUEsUUFBUSxFQUFFLGVBQWU7SUFDekIsSUFBQSxLQUFLLEVBQUUsT0FBTzs7O0lDdENoQjs7Ozs7Ozs7Ozs7Ozs7OztJQWdCRztJQUNHLE1BQU8sVUFBVyxTQUFRQSxzQkFBUyxDQUFBO0lBQ3ZDLElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7WUFDN0Is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
3079
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuZXhwb3J0IGNvbnN0IFR5cGVPUk1GbGF2b3VyID0gXCJ0eXBlLW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgVHlwZU9STUtleXMgY29uc3RhbnQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgdGhlIGtleXMgYW5kIHRoZWlyIG1lYW5pbmdzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEB0eXBlZGVmIFR5cGVPUk1LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VQQVJBVE9SIFNlcGFyYXRvciB1c2VkIHRvIGpvaW4gdGFibGUgYW5kIGNvbHVtbiBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCBEZWZhdWx0IHByaW1hcnkga2V5IGZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVkVSU0lPTiBWZXJzaW9uIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUxFVEVEIFNvZnQtZGVsZXRlIHRpbWVzdGFtcCBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUQUJMRSBEYXRhYmFzZSB0YWJsZSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTQ0hFTUEgRGF0YWJhc2Ugc2NoZW1hIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUVVFTkNFIERhdGFiYXNlIHNlcXVlbmNlIG5hbWUga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOREVYIEluZGV4IGlkZW50aWZpZXIga2V5LlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB0aGF0IGlkZW50aWZ5IGNvbW1vbiBkYXRhYmFzZSBwcm9wZXJ0aWVzIGFuZCBhZGFwdGVyLXNwZWNpZmljIGtleXMuXG4gKiBAY29uc3QgVHlwZU9STUtleXNcbiAqIEB0eXBlIHtUeXBlT1JNS2V5c0RlZn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1LZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiLlwiLFxuICBJRDogXCJpZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgREVMRVRFRDogXCJkZWxldGVkX2F0XCIsXG4gIFRBQkxFOiBcInRhYmxlX25hbWVcIixcbiAgU0NIRU1BOiBcInNjaGVtYV9uYW1lXCIsXG4gIFNFUVVFTkNFOiBcInNlcXVlbmNlX25hbWVcIixcbiAgSU5ERVg6IFwiaW5kZXhcIixcbn07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBUeXBlT1JNIGluZGV4ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGVycm9yIHJlbGF0ZWQgdG8gaW5kZXggZ2VuZXJhdGlvbiBvciBoYW5kbGluZyB3aXRoaW4gdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBJbmRleEVycm9yXG4gKiB0cnkge1xuICogICAvLyBTb21lIGNvZGUgdGhhdCBtaWdodCB0aHJvdyBhbiBpbmRleCBlcnJvclxuICogICB0aHJvdyBuZXcgSW5kZXhFcnJvcihcIkluZGV4IG5vdCBmb3VuZFwiKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEluZGV4RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKFwiSW5kZXggZXJyb3Igb2NjdXJyZWQ6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEluZGV4RXJyb3IubmFtZSwgbXNnLCA0MDQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIEVRVUFMID0gXCI9XCIsXG4gIE5PVF9FUVVBTCA9IFwiPD5cIixcbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgSU4gPSBcIklOXCIsXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIExJS0UgPSBcIkxJS0VcIixcbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICBBTlkgPSBcIkFOWVwiLFxuICBBTEwgPSBcIkFMTFwiLFxuICBTT01FID0gXCJTT01FXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFF1ZXJ5IGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVpdGhlciBhIHJhdyBTUUwgc3RyaW5nIG9yIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgYWxvbmcgd2l0aCBvcHRpb25hbCBib3VuZCB2YWx1ZXMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgTSBUaGUgTW9kZWwgdHlwZSBmb3Igd2hpY2ggdGhlIFNlbGVjdFF1ZXJ5QnVpbGRlciBpcyBwYXJhbWV0ZXJpemVkLlxuICogQHRlbXBsYXRlIFQgVGhlIHVuZGVybHlpbmcgcXVlcnkgdHlwZSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LlxuICogQGludGVyZmFjZSBUeXBlT1JNUXVlcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNUXVlcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCA9IE1vZGVsLFxuICBUIGV4dGVuZHMgc3RyaW5nIHwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+ID0gc3RyaW5nLFxuPiB7XG4gIHF1ZXJ5OiBUO1xuICB2YWx1ZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgVHlwZU9STSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgRXh0ZW5kZWQgcmVwb3NpdG9yeSBmbGFncyBpbmNsdWRpbmcgY29ubmVjdGlvbi91c2VyIGNvbnRleHQgdGhhdCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1GbGFnc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1GbGFncyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXNlciBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUG9zdGdyZXMgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICovXG4gIHVzZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWNhdGlvbiBmb3IgYSB0YWJsZSBjcmVhdGlvbi9jaGFuZ2Ugc3RhdGVtZW50IHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgYSBUeXBlT1JNUXVlcnkgd2l0aCB0YWJsZSBtZXRhZGF0YSBzdWNoIGFzIHByaW1hcnkga2V5IGZsYWcsIGNvbnN0cmFpbnRzLCBhbmQgZm9yZWlnbiBrZXlzLlxuICogQHR5cGVkZWYgVHlwZU9STVRhYmxlU3BlY1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5S2V5IEluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNvbnN0cmFpbnRzIEEgbGlzdCBvZiByYXcgU1FMIGNvbnN0cmFpbnRzIHRvIGFwcGx5IHRvIHRoZSB0YWJsZS9jb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmb3JlaWduS2V5cyBBIGxpc3Qgb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBkZWZpbml0aW9ucy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZU9STVRhYmxlU3BlYyA9IFR5cGVPUk1RdWVyeSAmIHtcbiAgcHJpbWFyeUtleTogYm9vbGVhbjtcbiAgY29uc3RyYWludHM6IHN0cmluZ1tdO1xuICBmb3JlaWduS2V5czogc3RyaW5nW107XG59O1xuIiwiaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IE1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nIHJlc3VsdHMuXG4gKiBAY29uc3QgVHlwZU9STVF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2hlbiB0cmFuc2xhdGluZyBoaWdoLWxldmVsIGZpbHRlcnMgaW50byBTUUwgdmlhIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgRXF1YWxpdHkgb3BlcmF0b3IgKD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRkVSRU5UIEluZXF1YWxpdHkgb3BlcmF0b3IgKDw+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUiBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSX0VRIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPj0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiBMZXNzIHRoYW4gb3BlcmF0b3IgKDwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUl9FUSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKDw9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5PVCBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOIEluIGFycmF5IG9wZXJhdG9yIChJTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUdFWFAgUmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElSRUdFWFAgQ2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4qKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJS0UgUGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTElLRSBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKElMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJFVFdFRU4gUmFuZ2Ugb3BlcmF0b3IgKEJFVFdFRU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTlVMTCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOVUxMKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05PVF9OVUxMIE5PVCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOT1QgTlVMTClcbiAqIEBjb25zdCBUeXBlT1JNT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STU9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBTUUxPcGVyYXRvciB8IHN0cmluZz4gPSB7XG4gIEVRVUFMOiBTUUxPcGVyYXRvci5FUVVBTCxcbiAgRElGRkVSRU5UOiBTUUxPcGVyYXRvci5OT1RfRVFVQUwsXG4gIEJJR0dFUjogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOLFxuICBCSUdHRVJfRVE6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgU01BTExFUjogU1FMT3BlcmF0b3IuTEVTU19USEFOLFxuICBTTUFMTEVSX0VROiBTUUxPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEJFVFdFRU46IFNRTE9wZXJhdG9yLkJFVFdFRU4sXG4gIE5PVDogXCJOT1RcIixcbiAgSU46IFNRTE9wZXJhdG9yLklOLFxuICBJU19OVUxMOiBTUUxPcGVyYXRvci5JU19OVUxMLFxuICBJU19OT1RfTlVMTDogU1FMT3BlcmF0b3IuSVNfTk9UX05VTEwsXG4gIFJFR0VYUDogXCJ+XCIsXG4gIElSRUdFWFA6IFwifipcIixcbiAgTElLRTogU1FMT3BlcmF0b3IuTElLRSxcbiAgSUxJS0U6IFNRTE9wZXJhdG9yLklMSUtFLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIHVzZWQgd2hlbiBidWlsZGluZyBXSEVSRSBjbGF1c2UgZ3JvdXBzIGluIFR5cGVPUk0gcXVlcmllcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFORCBMb2dpY2FsIEFORCBvcGVyYXRvciAoQU5EKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE9SIExvZ2ljYWwgT1Igb3BlcmF0b3IgKE9SKVxuICogQGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFORDogXCJBTkRcIixcbiAgT1I6IFwiT1JcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpYWwgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFN0cmluZyBjb25zdGFudHMgcmVwcmVzZW50aW5nIHNwZWNpYWwgdmFsdWVzIHVzZWQgd2hpbGUgY29tcG9zaW5nIFNRTCB3aXRoIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMQ29uc3RUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVMTCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZS5cbiAqIEBjb25zdCBUeXBlT1JNQ29uc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Db25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJOVUxMXCIsXG59O1xuIiwiaW1wb3J0IHsgUGFnaW5hdG9yLCBQYWdpbmdFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgcGFnaW5hdGlvbiBmb3IgVHlwZU9STS1idWlsdCBxdWVyaWVzIHVzaW5nIHRha2Uvc2tpcCBmb3IgZWZmaWNpZW50IG5hdmlnYXRpb24gdGhyb3VnaCByZXN1bHQgc2V0cy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgVHlwZU9STVBhZ2luYXRvcihhZGFwdGVyLCB7IHF1ZXJ5OiBxYiB9LCAxMCwgVXNlcik7XG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgVHlwZU9STVF1ZXJ5XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSByZWNvcmQgY291bnQgYW5kIHBhZ2Ugc2l6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlcG8/OiBSZXBvPGFueT47XG5cbiAgcHJvdGVjdGVkIGdldCByZXBvKCkge1xuICAgIGlmICghdGhpcy5fX3JlcG8pIHtcbiAgICAgIHRoaXMuX19yZXBvID0gKHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcikuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBKYXZhU2NyaXB0IFJlZ0V4cCBwYXR0ZXJuIHRvIGEgUG9zdGdyZVNRTCBQT1NJWCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBzdW1tYXJ5IEFjY2VwdHMgZWl0aGVyIGEgUmVnRXhwIG9iamVjdCBvciBhIHN0cmluZyByZXByZXNlbnRhdGlvbiAoL3BhdHRlcm4vZmxhZ3MpIGFuZCByZXR1cm5zIHRoZSByYXcgcGF0dGVybiBjb21wYXRpYmxlIHdpdGggUG9zdGdyZVNRTCdzIH4gYW5kIH4qIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30ganNSZWdleCBKYXZhU2NyaXB0IFJlZ0V4cCBvYmplY3Qgb3IgcGF0dGVybiBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFBvc3RncmVTUUwtY29tcGF0aWJsZSByZWdleCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFV0aWxzIGFzIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogICBBcHAtPj5VdGlsczogY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKFJlZ0V4cChcImZvby4qXCIsXCJpXCIpKVxuICogICBVdGlscy0+PlV0aWxzOiBQYXJzZSBzdHJpbmcgb3IgdXNlIFJlZ0V4cC5zb3VyY2VcbiAqICAgVXRpbHMtLT4+QXBwOiBcImZvby4qXCJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcyhqc1JlZ2V4OiBSZWdFeHAgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByeHAgPSBuZXcgUmVnRXhwKC9eXFwvKC4rKVxcLyhcXHcrKSQvZyk7XG4gIGlmICh0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gcnhwLmV4ZWMoanNSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBwXSA9IG1hdGNoO1xuICAgICAganNSZWdleCA9IHA7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKGpzUmVnZXgpIDoganNSZWdleDtcblxuICBjb25zdCBwYXR0ZXJuID0gcmVnZXguc291cmNlO1xuXG4gIHJldHVybiBwYXR0ZXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRFYWdlclJlbGF0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPixcbiAgY2FjaGU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuKTogeyBub25FYWdlcjogc3RyaW5nW107IHJlbGF0aW9uczogc3RyaW5nW10gfSB7XG4gIGxldCBpbnN0YW5jZTogTTtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZSA9IG5ldyBtKCk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgaW5zdGFudGlhdGUgbW9kZWwgJHttLm5hbWV9IGZvciBlYWdlciByZWxhdGlvbiBjYWxjdWxhdGlvbjogJHtlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlbHMgPSBSZXBvc2l0b3J5LnJlbGF0aW9ucyhtKTtcbiAgY2FjaGVbbS5uYW1lXSA9IGNhY2hlW20ubmFtZV0gfHwgdW5kZWZpbmVkO1xuICBpZiAoY2FjaGVbbS5uYW1lXSkge1xuICAgIHJldHVybiBjYWNoZVttLm5hbWVdO1xuICB9XG4gIGNvbnN0IHJlbGF0aW9ucyA9IHJlbHMucmVkdWNlKFxuICAgIChhY2N1bTogeyByZWxhdGlvbnM6IHN0cmluZ1tdOyBub25FYWdlcjogc3RyaW5nW10gfSwgYXR0cikgPT4ge1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT04pLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgYXR0cixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWRlY29yYXRvcnMgfHxcbiAgICAgICAgIWRlY29yYXRvcnMuZGVjb3JhdG9ycyB8fFxuICAgICAgICAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzLmxlbmd0aFxuICAgICAgKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gZGVjb3JhdG9ycyBmb3VuZCBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICBpZiAoZGVjb3JhdG9ycy5kZWNvcmF0b3JzLmxlbmd0aCA+IDEpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBkZWNvcmF0b3JzIGZvdW5kIGZvciBwcm9wZXJ0eSAke2F0dHJ9IG9uIG1vZGVsICR7bS5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZGVjb3JhdG9ycy5kZWNvcmF0b3JzWzBdO1xuICAgICAgY29uc3QgZWFnZXIgPSBkZWNvcmF0b3IucHJvcHMucG9wdWxhdGU7XG4gICAgICBsZXQgY2xhenogPSBkZWNvcmF0b3IucHJvcHMuY2xhc3M7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiKSBjbGF6eiA9IE1vZGVsLmdldChjbGF6eikgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpIGNsYXp6ID0gY2xhenooKTtcbiAgICAgIGlmICghY2xhenopXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjbGFzcyBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghZWFnZXIpIHtcbiAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaChhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKGF0dHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWNjdW0ucmVsYXRpb25zLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgIGNvbnN0IHsgbm9uRWFnZXIsIHJlbGF0aW9ucyB9ID0gc3BsaXRFYWdlclJlbGF0aW9ucyhjbGF6eiwgY2FjaGUpO1xuICAgICAgICBpZiAobm9uRWFnZXIubGVuZ3RoICYmIGFjY3VtLnJlbGF0aW9ucy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgIGNvbnN0IG5vbkVhZ2VyUmVsYXRpb25zID0gbm9uRWFnZXIubWFwKChuZSkgPT4gYCR7YXR0cn0uJHtuZX1gKTtcbiAgICAgICAgICBhY2N1bS5ub25FYWdlci5wdXNoKC4uLm5vbkVhZ2VyUmVsYXRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVscyA9IHJlbGF0aW9ucy5tYXAoKG5lKSA9PiBgJHthdHRyfS4ke25lfWApO1xuICAgICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKC4uLnJlbHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHsgbm9uRWFnZXI6IFtdLCByZWxhdGlvbnM6IFtdIH1cbiAgKTtcbiAgY2FjaGVbbS5uYW1lXSA9IHJlbGF0aW9ucztcbiAgcmV0dXJuIHJlbGF0aW9ucztcbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFJlcG9zaXRvcnksXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgdHJhbnNsYXRlT3BlcmF0b3JzIH0gZnJvbSBcIi4vdHJhbnNsYXRlXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnlMaW1pdCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVHlwZU9STVBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucywgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zV2hlcmUgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNXaGVyZVwiO1xuaW1wb3J0IHsgRmluZE9wdGlvbnNPcmRlciB9IGZyb20gXCJ0eXBlb3JtL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc09yZGVyXCI7XG5pbXBvcnQgeyBzcGxpdEVhZ2VyUmVsYXRpb25zIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YXRlbWVudCBidWlsZGVyIGZvciBUeXBlT1JNLWJhY2tlZCBxdWVyaWVzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBidWlsZGluZyBTUUwgcXVlcmllcyB2aWEgVHlwZU9STSdzIFNlbGVjdFF1ZXJ5QnVpbGRlciB3aXRoIHR5cGUgc2FmZXR5IGFuZCBEZWNhZi50cyBhYnN0cmFjdGlvbnMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUgcmV0dXJuZWQgZnJvbSBleGVjdXRpb24uXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAY2xhc3MgVHlwZU9STVN0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdXNpbmcgVHlwZU9STVN0YXRlbWVudFxuICogY29uc3Qgc3RhdGVtZW50ID0gbmV3IFR5cGVPUk1TdGF0ZW1lbnQ8VXNlciwgVXNlcltdPihhZGFwdGVyKTtcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlPFVzZXI+KCdhZ2UnKS5ndCgxOCkpXG4gKiAgIC5vcmRlckJ5KCdsYXN0TmFtZScsICdhc2MnKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIFR5cGVPUk1RdWVyeTxNPixcbiAgTSxcbiAgUlxuPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBhZGFwdGVyITogVHlwZU9STUFkYXB0ZXI7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIpIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgZnJvbSB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgVHlwZU9STS1iYWNrZWQgcXVlcnkgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBidWlsdCBUeXBlT1JNIHF1ZXJ5IGNvbnRhaW5lci5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGFyZSBpbnZhbGlkIHF1ZXJ5IGNvbmRpdGlvbnMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAgICogICBwYXJ0aWNpcGFudCBwYXJzZUNvbmRpdGlvblxuICAgKlxuICAgKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogYnVpbGQoKVxuICAgKiAgIE5vdGUgb3ZlciBTdGF0ZW1lbnQ6IEluaXRpYWxpemUgcXVlcnlcbiAgICogICBTdGF0ZW1lbnQtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICAgKiAgIFJlcG9zaXRvcnktLT4+U3RhdGVtZW50OiBSZXR1cm4gdGFibGUgbmFtZVxuICAgKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGJhc2UgcXVlcnlcbiAgICpcbiAgICogICBhbHQgSGFzIHNlbGVjdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBjb2x1bW5zIHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyB3aGVyZUNvbmRpdGlvblxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDcmVhdGUgY29tYmluZWQgY29uZGl0aW9uIHdpdGggdGFibGVcbiAgICogICAgIFN0YXRlbWVudC0+PnBhcnNlQ29uZGl0aW9uOiBQYXJzZSBjb25kaXRpb25cbiAgICogICAgIHBhcnNlQ29uZGl0aW9uLS0+PlN0YXRlbWVudDogUmV0dXJuIHBhcnNlZCBjb25kaXRpb25zXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBjb25kaXRpb25zIHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBvcmRlckJ5U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQWRkIG9yZGVyQnkgdG8gcXVlcnlcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIGxpbWl0U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogU2V0IGxpbWl0XG4gICAqICAgZWxzZVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBVc2UgZGVmYXVsdCBsaW1pdFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb2Zmc2V0U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogU2V0IG9mZnNldFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIFN0YXRlbWVudC0tPj5TdGF0ZW1lbnQ6IFJldHVybiBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkKCk6IFR5cGVPUk1RdWVyeTxNPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5mcm9tU2VsZWN0b3IoKTtcblxuICAgIGNvbnN0IHE6IFR5cGVPUk1RdWVyeTxNLCBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4+ID0ge1xuICAgICAgcXVlcnk6IHRoaXMuYWRhcHRlci5kYXRhU291cmNlXG4gICAgICAgIC5nZXRSZXBvc2l0b3J5KFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuZnJvbVNlbGVjdG9yXVxuICAgICAgICApXG4gICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIodGFibGVOYW1lKSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLm1hcCgocykgPT4gYCR7dGFibGVOYW1lfS4ke3MgYXMgc3RyaW5nfWApXG4gICAgICApO1xuICAgIGVsc2UgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KCk7XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbilcbiAgICAgIHEucXVlcnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT5cbiAgICAgICkucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT47XG5cbiAgICBsZXQgb3JkZXJCeUFyZ3M6IFtzdHJpbmcsIFwiREVTQ1wiIHwgXCJBU0NcIl07XG4gICAgaWYgKCF0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgIG9yZGVyQnlBcmdzID0gW1xuICAgICAgICBgJHt0YWJsZU5hbWV9LiR7ZmluZFByaW1hcnlLZXkobSkuaWQgYXMgc3RyaW5nfWAsXG4gICAgICAgIE9yZGVyRGlyZWN0aW9uLkFTQy50b1VwcGVyQ2FzZSgpIGFzIFwiQVNDXCIsXG4gICAgICBdO1xuICAgIGVsc2VcbiAgICAgIG9yZGVyQnlBcmdzID0gW1xuICAgICAgICBgJHt0YWJsZU5hbWV9LiR7dGhpcy5vcmRlckJ5U2VsZWN0b3JbMF0gYXMgc3RyaW5nfWAsXG4gICAgICAgIHRoaXMub3JkZXJCeVNlbGVjdG9yWzFdLnRvVXBwZXJDYXNlKCkgYXMgXCJERVNDXCIgfCBcIkFTQ1wiLFxuICAgICAgXTtcblxuICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55Pikub3JkZXJCeSguLi5vcmRlckJ5QXJncyk7XG4gICAgaWYgKHRoaXMubGltaXRTZWxlY3Rvcikge1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdCh0aGlzLmxpbWl0U2VsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGxpbWl0IG9mICR7VHlwZU9STVF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikubGltaXQoVHlwZU9STVF1ZXJ5TGltaXQpO1xuICAgIH1cblxuICAgIC8vIEFkZCBvZmZzZXRcbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55Pikuc2tpcCh0aGlzLm9mZnNldFNlbGVjdG9yKTtcblxuICAgIHJldHVybiBxIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHBhZ2luYXRvciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhIFR5cGVPUk1QYWdpbmF0b3IgZm9yIHBhZ2luYXRlZCByZXN1bHRzLlxuICAgKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHBhZ2luYXRvci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgdGhlcmUncyBhbiBlcnJvciBidWlsZGluZyB0aGUgcXVlcnkuXG4gICAqL1xuICBhc3luYyBwYWdpbmF0ZTxSPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBUeXBlT1JNUXVlcnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZFF1ZXJ5OiBGaW5kTWFueU9wdGlvbnM8TT4gPSB7fTtcbiAgICAgIGNvbnN0IGEgPSBxdWVyeS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5LndoZXJlID0gdGhpcy5wYXJzZUNvbmRpdGlvbkZvclBhZ2luYXRpb24oXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKVxuICAgICAgICApO1xuXG4gICAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkub3JkZXIgPSB7XG4gICAgICAgICAgW3RoaXMub3JkZXJCeVNlbGVjdG9yWzBdXTogdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9TdHJpbmcoKSxcbiAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIHJldHVybiBuZXcgVHlwZU9STVBhZ2luYXRvcihcbiAgICAgICAgdGhpcy5hZGFwdGVyIGFzIGFueSxcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeSBhcyBhbnksXG4gICAgICAgIHNpemUsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgcmF3IHJlc3VsdCByb3cgdG8gYSBtb2RlbCBpbnN0YW5jZSB1c2luZyB0aGUgYWRhcHRlci5cbiAgICogQHBhcmFtIHthbnl9IHIgVGhlIHJhdyByZWNvcmQuXG4gICAqIEBwYXJhbSB7a2V5b2YgTX0gcGtBdHRyIFRoZSBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgb2YgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0ge1wiTnVtYmVyXCIgfCBcIkJpZ0ludFwiIHwgdW5kZWZpbmVkfSBzZXF1ZW5jZVR5cGUgVGhlIHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBwcm9jZXNzZWQgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzUmVjb3JkKHI6IGFueSwgcGtBdHRyOiBrZXlvZiBNKSB7XG4gICAgaWYgKHR5cGVvZiByW3BrQXR0cl0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuZnJvbVNlbGVjdG9yLCBwa0F0dHIsIHJbcGtBdHRyXSk7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBUeXBlT1JNIHF1ZXJ5IGJ1aWxkZXIuXG4gICAqIEBzdW1tYXJ5IFNlbmRzIHRoZSBidWlsdCBTZWxlY3RRdWVyeUJ1aWxkZXIgdG8gdGhlIGRhdGFiYXNlIHZpYSBUeXBlT1JNIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLlxuICAgKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdJbnB1dCBUaGUgcXVlcnkgY29udGFpbmVyIHRvIGV4ZWN1dGUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBUeXBlT1JNUXVlcnk8TT4pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yYXcpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBFeGVjdXRpbmcgcmF3IHF1ZXJ5OiAkeyhyYXdJbnB1dC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPikuZ2V0U3FsKCl9YFxuICAgICk7XG5cbiAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnModGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIC8vIGZvciAoY29uc3QgcmVsYXRpb24gb2YgcmVsYXRpb25zKSB7XG4gICAgcmF3SW5wdXQucXVlcnkgPSAoXG4gICAgICByYXdJbnB1dC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPlxuICAgICkuc2V0RmluZE9wdGlvbnMoe1xuICAgICAgbG9hZEVhZ2VyUmVsYXRpb25zOiB0cnVlLFxuICAgICAgbG9hZFJlbGF0aW9uSWRzOiB7XG4gICAgICAgIHJlbGF0aW9uczogbm9uRWFnZXIsXG4gICAgICB9LFxuICAgIH0pIGFzIGFueTtcbiAgICAvLyB9XG4gICAgcmV0dXJuIChhd2FpdCAoXG4gICAgICByYXdJbnB1dC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPlxuICAgICkuZ2V0TWFueSgpKSBhcyBSO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBjb3VudGVyID0gMCxcbiAgICBjb25kaXRpb25hbE9wPzogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4gICk6IEZpbmRPcHRpb25zV2hlcmU8TT5bXSB8IEZpbmRPcHRpb25zV2hlcmU8TT4ge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbnNcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gUG9zdGdyZVNRTCBjb25kaXRpb24gc3RydWN0dXJlc1xuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhYmxlTmFtZV0gLSB0aGUgcG9zaXRpb25hbCBpbmRleCBvZiB0aGUgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1R5cGVPUk1RdWVyeX0gVGhlIFBvc3RncmVzU1FMIGNvbmRpdGlvblxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCB0cmFuc2xhdGVPcGVyYXRvcnNcbiAgICogICBwYXJ0aWNpcGFudCBwYXJzZUNvbmRpdGlvblxuICAgKlxuICAgKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29uZGl0aW9uKVxuICAgKlxuICAgKiAgIE5vdGUgb3ZlciBTdGF0ZW1lbnQ6IEV4dHJhY3QgY29uZGl0aW9uIHBhcnRzXG4gICAqXG4gICAqICAgYWx0IFNpbXBsZSBjb21wYXJpc29uIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj50cmFuc2xhdGVPcGVyYXRvcnM6IHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcilcbiAgICogICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5TdGF0ZW1lbnQ6IFJldHVybiBQb3N0Z3JlU1FMIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBjb25kaXRpb24gd2l0aCBjb2x1bW4sIG9wZXJhdG9yLCBhbmQgdmFsdWVcbiAgICogICBlbHNlIE5PVCBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQWRkIE5PVCB0byBjb25kaXRpb25zXG4gICAqICAgZWxzZSBBTkQvT1Igb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oYXR0cjEpXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24pXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENvbWJpbmUgY29uZGl0aW9ucyB3aXRoIEFORC9PUlxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIFN0YXRlbWVudC0tPj5TdGF0ZW1lbnQ6IFJldHVybiBjb25kaXRpb25zIGFycmF5XG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb24oXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlKCk6IFR5cGVPUk1RdWVyeTxNPiB7XG4gICAgICBjb25zdCBzcWxPcGVyYXRvciA9IHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcik7XG4gICAgICBjb25zdCBhdHRyUmVmID0gYCR7YXR0cjF9JHtjb3VudGVyfWA7XG4gICAgICBjb25zdCBxdWVyeVN0ciA9IGAke3RhYmxlTmFtZX0uJHthdHRyMX0gJHtzcWxPcGVyYXRvcn0gOiR7YXR0clJlZn1gO1xuICAgICAgY29uc3QgdmFsdWVzID0ge1xuICAgICAgICBbYXR0clJlZl06IGNvbXBhcmlzb24sXG4gICAgICB9O1xuICAgICAgc3dpdGNoIChjb25kaXRpb25hbE9wKSB7XG4gICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5hbmRXaGVyZShxdWVyeVN0ciwgdmFsdWVzKSBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLk9SOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIub3JXaGVyZShxdWVyeVN0ciwgdmFsdWVzKSBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBPcGVyYXRvci5OT1Q6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9UIG9wZXJhdG9yIG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLndoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICApID09PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIHBhcnNlKCk7XG4gICAgfVxuICAgIC8vIEZvciBOT1Qgb3BlcmF0b3JcbiAgICBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgIH1cbiAgICAvLyBGb3IgQU5EL09SIG9wZXJhdG9yc1xuICAgIGVsc2Uge1xuICAgICAgcWIgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPiwgdGFibGVOYW1lLCBxYiwgKytjb3VudGVyKVxuICAgICAgICAucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT47XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgY29tcGFyaXNvbixcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICBxYixcbiAgICAgICAgKytjb3VudGVyLFxuICAgICAgICBvcGVyYXRvclxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgZGF0YWJhc2Ugc2VxdWVuY2UgZm9yIFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIFNlcXVlbmNlfXMsIGRlbGVnYXRpbmcgdG8gdGhlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0gdG8gZmV0Y2ggYW5kIGluY3JlbWVudCB2YWx1ZXMgd2hpbGUgaGFuZGxpbmcgdHlwZSBwYXJzaW5nIGFuZCBlcnJvciB0cmFuc2xhdGlvbi5cbiAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIFRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKG5hbWUsIHR5cGUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnksIGV0Yy4pLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zLlxuICogQGNsYXNzIFR5cGVPUk1TZXF1ZW5jZVxuICogQGltcGxlbWVudHMgU2VxdWVuY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW5kIHVzZSBhIFR5cGVPUk0tYmFja2VkIHNlcXVlbmNlXG4gKiBjb25zdCBzZXEgPSBuZXcgVHlwZU9STVNlcXVlbmNlKHsgbmFtZTogXCJ1c2VyX2lkX3NlcVwiLCB0eXBlOiBcIk51bWJlclwiLCBzdGFydFdpdGg6IDEsIGluY3JlbWVudEJ5OiAxIH0sIGFkYXB0ZXIpO1xuICogY29uc3QgbmV4dElkID0gYXdhaXQgc2VxLm5leHQoKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTZXEgYXMgVHlwZU9STVNlcXVlbmNlXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqICAgQXBwLT4+U2VxOiBuZXh0KClcbiAqICAgU2VxLT4+U2VxOiBjdXJyZW50KClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KFNFTEVDVCBjdXJyZW50X3ZhbHVlIC4uLilcbiAqICAgQWRhcHRlci0+PkRCOiBRdWVyeSBjdXJyZW50IHZhbHVlXG4gKiAgIERCLS0+PkFkYXB0ZXI6IGN1cnJlbnRfdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0+PlNlcTogaW5jcmVtZW50KGN1cnJlbnQpXG4gKiAgIFNlcS0+PkFkYXB0ZXI6IHJhdyhuZXh0dmFsKG5hbWUpKVxuICogICBBZGFwdGVyLT4+REI6IG5leHR2YWwoKVxuICogICBEQi0tPj5BZGFwdGVyOiBuZXh0IHZhbHVlXG4gKiAgIEFkYXB0ZXItLT4+U2VxOiB2YWx1ZVxuICogICBTZXEtLT4+QXBwOiBwYXJzZWQgbmV4dCB2YWx1ZVxuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVNlcXVlbmNlIGV4dGVuZHMgU2VxdWVuY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsXG4gICAgcHJvdGVjdGVkIGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VxOiBhbnkgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBTRUxFQ1QgY3VycmVudF92YWx1ZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5zZXF1ZW5jZXMgV0hFUkUgc2VxdWVuY2VfbmFtZSA9ICQxYCxcbiAgICAgICAgdmFsdWVzOiBbbmFtZV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKHNlcS5jdXJyZW50X3ZhbHVlIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5hZGFwdGVyLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUge0BsaW5rIFNlcXVlbmNlfSB2YWx1ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMudHlwZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGluY3JlbWVudHMgdGhlIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTZXF1ZW5jZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gY3VycmVudFxuICAgKiBAcGFyYW0gY291bnRcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbmNyZW1lbnQoXG4gICAgY3VycmVudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIGNvdW50PzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyB0eXBlLCBpbmNyZW1lbnRCeSwgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHR5cGUgIT09IFwiTnVtYmVyXCIgJiYgdHlwZSAhPT0gXCJCaWdJbnRcIilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ2Fubm90IGluY3JlbWVudCBzZXF1ZW5jZSBvZiB0eXBlICR7dHlwZX0gd2l0aCAke2NvdW50fWBcbiAgICAgICk7XG4gICAgbGV0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICB0cnkge1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBuZXh0dmFsKCQxKTtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIG5leHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBDUkVBVEUgU0VRVUVOQ0UgSUYgTk9UIEVYSVNUUyAkMSBTVEFSVCBXSVRIICQyIElOQ1JFTUVOVCBCWSAkMyBOTyBDWUNMRTtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lLCBzdGFydFdpdGgsIGluY3JlbWVudEJ5XSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0IGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgdGhlIG5leHQgdmFsdWUgaW4gdGggc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIGNhbGxzIHtAbGluayBTZXF1ZW5jZSNwYXJzZX0gb24gdGhlIGN1cnJlbnQgdmFsdWVcbiAgICogZm9sbG93ZWQgYnkge0BsaW5rIFNlcXVlbmNlI2luY3JlbWVudH1cbiAgICpcbiAgICovXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5jdXJyZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50KGN1cnJlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSAoYXdhaXQgdGhpcy5jdXJyZW50KCkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBpbmNyZW1lbnRCeSA9IHRoaXMucGFyc2UodGhpcy5vcHRpb25zLmluY3JlbWVudEJ5KSBhcyBudW1iZXI7XG4gICAgY29uc3QgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50ID0gYXdhaXQgdGhpcy5pbmNyZW1lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgKHRoaXMucGFyc2UoY291bnQpIGFzIG51bWJlcikgKiBpbmNyZW1lbnRCeVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2U6IChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IGNvdW50OyBpKyspIHtcbiAgICAgIHJhbmdlLnB1c2goY3VycmVudCArIGluY3JlbWVudEJ5ICogKHRoaXMucGFyc2UoaSkgYXMgbnVtYmVyKSk7XG4gICAgfVxuICAgIGlmIChyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSAhPT0gbmV4dClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzY2FsY3VsYXRpb24gb2YgcmFuZ2VcIik7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmRleE1ldGFkYXRhLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZXBvc2l0b3J5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVmYXVsdFNlcGFyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleFxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBuYW1lIGZvciBhIENvdWNoREIgaW5kZXggYnkgY29tYmluaW5nIG5hbWUgcGFydHMsIGNvbXBvc2l0aW9ucywgYW5kIGRpcmVjdGlvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZSAtIEFycmF5IG9mIG5hbWUgcGFydHMgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW2RpcmVjdGlvbl0gLSBPcHRpb25hbCBzb3J0IGRpcmVjdGlvbiBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBpbmNsdWRlIGluIHRoZSBpbmRleCBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj1EZWZhdWx0U2VwYXJhdG9yXSAtIFRoZSBzZXBhcmF0b3IgdG8gdXNlIGJldHdlZW4gcGFydHMgb2YgdGhlIGluZGV4IG5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBpbmRleCBuYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhOYW1lKFxuICBuYW1lOiBzdHJpbmdbXSxcbiAgZGlyZWN0aW9uPzogT3JkZXJEaXJlY3Rpb24sXG4gIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdLFxuICBzZXBhcmF0b3IgPSBEZWZhdWx0U2VwYXJhdG9yXG4pIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYW1lLm1hcCgobikgPT4gKG4gPT09IFR5cGVPUk1LZXlzLlRBQkxFID8gXCJ0YWJsZVwiIDogbikpLFxuICAgIC4uLihjb21wb3NpdGlvbnMgfHwgW10pLFxuICAgIC4uLihkaXJlY3Rpb24gPyBbZGlyZWN0aW9uXSA6IFtdKSxcbiAgICBUeXBlT1JNS2V5cy5JTkRFWCxcbiAgXS5qb2luKHNlcGFyYXRvcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGZvciBtb2RlbHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgQ291Y2hEQiBpbmRleCBjb25maWd1cmF0aW9ucyBiYXNlZCBvbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHByb3ZpZGVkIG1vZGVsc1xuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWxcbiAqIEBwYXJhbSBtb2RlbHMgLSBBcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gZ2VuZXJhdGUgaW5kZXhlcyBmb3JcbiAqIEByZXR1cm4ge1R5cGVPUk1RdWVyeX0gQXJyYXkgb2YgQ291Y2hEQiBpbmRleCBjb25maWd1cmF0aW9uc1xuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleGVzXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhOYW1lXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqXG4gKiAgIENhbGxlci0+PmdlbmVyYXRlSW5kZXhlczogbW9kZWxzXG4gKlxuICogICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgYmFzZSB0YWJsZSBpbmRleFxuICogICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4TmFtZTogW0NvdWNoREJLZXlzLlRBQkxFXVxuICogICBnZW5lcmF0ZUluZGV4TmFtZS0tPj5nZW5lcmF0ZUluZGV4ZXM6IHRhYmxlTmFtZVxuICogICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSB0YWJsZSBpbmRleCBjb25maWdcbiAqXG4gKiAgIGxvb3AgRm9yIGVhY2ggbW9kZWxcbiAqICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5SZXBvc2l0b3J5OiBHZXQgaW5kZXhlcyBtZXRhZGF0YVxuICogICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiBpbmRleCBtZXRhZGF0YVxuICpcbiAqICAgICBsb29wIEZvciBlYWNoIGluZGV4IGluIG1ldGFkYXRhXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBFeHRyYWN0IGluZGV4IHByb3BlcnRpZXNcbiAqICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCB0YWJsZSBuYW1lXG4gKiAgICAgICBSZXBvc2l0b3J5LS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKlxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogRGVmaW5lIG5lc3RlZCBnZW5lcmF0ZSBmdW5jdGlvblxuICpcbiAqICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ2FsbCBnZW5lcmF0ZSgpIGZvciBkZWZhdWx0IG9yZGVyXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgaW5kZXggbmFtZSBhbmQgY29uZmlnXG4gKlxuICogICAgICAgYWx0IEhhcyBkaXJlY3Rpb25zXG4gKiAgICAgICAgIGxvb3AgRm9yIGVhY2ggZGlyZWN0aW9uXG4gKiAgICAgICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKGRpcmVjdGlvbilcbiAqICAgICAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgb3JkZXJlZCBpbmRleCBjb25maWdcbiAqICAgICAgICAgZW5kXG4gKiAgICAgICBlbmRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogICBnZW5lcmF0ZUluZGV4ZXMtLT4+Q2FsbGVyOiBBcnJheSBvZiBpbmRleCBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuKTogVHlwZU9STVF1ZXJ5W10ge1xuICBjb25zdCB0YWJsZU5hbWUgPSBnZW5lcmF0ZUluZGV4TmFtZShbVHlwZU9STUtleXMuVEFCTEVdKTtcbiAgY29uc3QgaW5kZXhlczogUmVjb3JkPHN0cmluZywgVHlwZU9STVF1ZXJ5PiA9IHt9O1xuICBpbmRleGVzW3RhYmxlTmFtZV0gPSB7XG4gICAgcXVlcnk6IGBgLFxuICAgIHZhbHVlczogW10sXG4gIH07XG5cbiAgbW9kZWxzLmZvckVhY2goKG0pID0+IHtcbiAgICBjb25zdCBpbmQ6IFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+ID0gUmVwb3NpdG9yeS5pbmRleGVzKG0pO1xuICAgIE9iamVjdC5lbnRyaWVzKGluZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuXG4gICAgICBsZXQgeyBjb21wb3NpdGlvbnMgfSA9ICh2YWx1ZSBhcyBhbnkpW2tdO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShtKTtcbiAgICAgIGNvbXBvc2l0aW9ucyA9IGNvbXBvc2l0aW9ucyB8fCBbXTtcblxuICAgICAgZnVuY3Rpb24gZ2VuZXJhdGUoKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBba2V5LCAuLi4oY29tcG9zaXRpb25zIGFzIFtdKSwgUGVyc2lzdGVuY2VLZXlzLklOREVYXS5qb2luKFxuICAgICAgICAgIERlZmF1bHRTZXBhcmF0b3JcbiAgICAgICAgKTtcblxuICAgICAgICBpbmRleGVzW25hbWVdID0ge1xuICAgICAgICAgIHF1ZXJ5OiBgQ1JFQVRFIElOREVYICQxIE9OICQyICgkMyk7YCxcbiAgICAgICAgICB2YWx1ZXM6IFtuYW1lLCB0YWJsZU5hbWUsIGtleV0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRlKCk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpbmRleGVzKTtcbn1cbiIsImltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFJlcG9zaXRvcnksIHVzZXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIGVuZm9yY2VEQkRlY29yYXRvcnMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRmxhZ3MsIFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBiYWNrZWQgYnkgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBmb3IgYSBnaXZlbiBNb2RlbCB1c2luZyB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSwgaW5jbHVkaW5nIGJ1bGsgb3BlcmF0aW9ucyBhbmQgcXVlcnkgYnVpbGRlciBhY2Nlc3Mgd2hpbGUgcHJlc2VydmluZyBEZWNhZi50cyByZXBvc2l0b3J5IHNlbWFudGljcy5cbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsIHRoYXQgdGhpcyByZXBvc2l0b3J5IHdpbGwgbWFuYWdlLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgYWRhcHRlciB1c2VkIHRvIGV4ZWN1dGUgcGVyc2lzdGVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRoZSBNb2RlbCBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LlxuICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBiYXNlIFJlcG9zaXRvcnkuXG4gKiBAY2xhc3MgVHlwZU9STVJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGluZyBhIHJlcG9zaXRvcnlcbiAqIGNvbnN0IHJlcG8gPSBuZXcgVHlwZU9STVJlcG9zaXRvcnk8VXNlcj4oYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgcmVhZCA9IGF3YWl0IHJlcG8ucmVhZChjcmVhdGVkLmlkKTtcbiAqXG4gKiAvLyBCdWxrIGNyZWF0ZVxuICogYXdhaXQgcmVwby5jcmVhdGVBbGwoW25ldyBVc2VyKHsgbmFtZTogXCJBXCIgfSksIG5ldyBVc2VyKHsgbmFtZTogXCJCXCIgfSldKTtcbiAqXG4gKiAvLyBVc2luZyB0aGUgcXVlcnkgYnVpbGRlclxuICogY29uc3QgcWIgPSByZXBvLnF1ZXJ5QnVpbGRlcigpO1xuICogY29uc3Qgcm93cyA9IGF3YWl0IHFiLndoZXJlKFwibmFtZSA9IDpuYW1lXCIsIHsgbmFtZTogXCJBbGljZVwiIH0pLmdldE1hbnkoKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgVHlwZU9STS9EYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlKG1vZGVsLCBwaylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgLi4uYXJncylcbiAqICAgQWRhcHRlci0+PkRCOiBJTlNFUlQgLi4uXG4gKiAgIERCLS0+PkFkYXB0ZXI6IHJvd1xuICogICBBZGFwdGVyLS0+PlJlcG86IHJvd1xuICogICBSZXBvLT4+QWRhcHRlcjogcmV2ZXJ0KHJvdywgY2xhenosIHBrLCBpZClcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBtb2RlbFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuQHVzZXMoVHlwZU9STUZsYXZvdXIpXG5leHBvcnQgY2xhc3MgVHlwZU9STVJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gIE0sXG4gIFR5cGVPUk1RdWVyeTxNLCBhbnk+LFxuICBBZGFwdGVyPERhdGFTb3VyY2VPcHRpb25zLCBUeXBlT1JNUXVlcnksIFR5cGVPUk1GbGFncywgQ29udGV4dDxUeXBlT1JNRmxhZ3M+PixcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBBZGFwdGVyPFxuICAgICAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgICBUeXBlT1JNUXVlcnksXG4gICAgICBUeXBlT1JNRmxhZ3MsXG4gICAgICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbiAgICA+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBUeXBlT1JNIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSByZXBvc2l0b3J5IGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFNlbGVjdFF1ZXJ5QnVpbGRlciBib3VuZCB0byB0aGlzIHJlcG9zaXRvcnkncyBlbnRpdHkgZm9yIGFkdmFuY2VkIHF1ZXJ5aW5nLlxuICAgKiBAcmV0dXJuIHtRdWVyeUJ1aWxkZXI8YW55Pn0gQSBUeXBlT1JNIFNlbGVjdFF1ZXJ5QnVpbGRlciBpbnN0YW5jZS5cbiAgICovXG4gIHF1ZXJ5QnVpbGRlcigpOiBRdWVyeUJ1aWxkZXI8YW55PiB7XG4gICAgY29uc3QgcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgYW55KS5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkoXG4gICAgICB0aGlzLmNsYXNzW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhc3NdXG4gICAgKTtcbiAgICByZXR1cm4gcmVwby5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbmQgcGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsLCBkZWxlZ2F0ZXMgaW5zZXJ0aW9uIHRvIHRoZSBhZGFwdGVyLCBhbmQgcmVoeWRyYXRlcyB0aGUgcGVyc2lzdGVkIHN0YXRlIGJhY2sgaW50byBhIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCxcbiAgICAgIG1vZGVsIGFzIGFueSxcbiAgICAgIHRoaXMucGssXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBsZXQgYzogQ29udGV4dDxUeXBlT1JNRmxhZ3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxlbmd0aCkgYyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXSBhcyBDb250ZXh0PFR5cGVPUk1GbGFncz47XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkIGFzIHN0cmluZyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIHRoaXMucGssXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkLCB0cmFuc2llbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgbW9kZWwgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhbmQgcHJlcGFyZXMgbW9kZWxzIGZvciBidWxrIGNyZWF0aW9uLlxuICAgKiBAc3VtbWFyeSBBcHBsaWVzIGRlY29yYXRvci1iYXNlZCB2YWxpZGF0aW9ucyBhbmQgcmV0dXJucyB0cmFuc2Zvcm1lZCBtb2RlbHMgd2l0aCBjb250ZXh0IGFyZ3MgZm9yIGNyZWF0ZUFsbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8W01bXSwgLi4uYW55W11dPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgZm9yd2FyZGVkIGFyZ3MgdHVwbGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG5cbiAgICBtb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzXG4gICAgICAubWFwKChtKSA9PlxuICAgICAgICBtLmhhc0Vycm9ycyhcbiAgICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWxzIGF0IG9uY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzLCBwZXJzaXN0cywgYW5kIHJlaHlkcmF0ZXMgYSBiYXRjaCBvZiBtb2RlbHMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGNyZWF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICBtb2RlbHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgbXVsdGlwbGUgbW9kZWxzIGJ5IHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbGlzdCBvZiBtb2RlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQga2V5cy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcmV0cmlldmVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAga2V5cyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpOiBudW1iZXIpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgYSBiYXRjaCBvZiBtb2RlbCB1cGRhdGVzIGFuZCByZXR1cm5zIHRoZWlyIHJlaHlkcmF0ZWQgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSB1cGRhdGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIG1vZGVscyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZWQubWFwKCh1OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpOiBudW1iZXIpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIGxpc3Qgb2YgbW9kZWxzIGJ5IHRoZWlyIHByaW1hcnkga2V5cyBhbmQgcmV0dXJucyB0aGVpciBsYXN0IHBlcnNpc3RlZCBzdGF0ZXMuXG4gICAqIEBwYXJhbSB7KHN0cmluZ1tdfG51bWJlcltdKX0ga2V5cyBUaGUgcHJpbWFyeSBrZXlzIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlLFxuICBFdmVudFN1YnNjcmliZXIsXG4gIEluc2VydEV2ZW50LFxuICBSZW1vdmVFdmVudCxcbiAgVXBkYXRlRXZlbnQsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBFdmVudElkcywgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gZXZlbnQgc3Vic2NyaWJlciB0aGF0IGZvcndhcmRzIGVudGl0eSBsaWZlY3ljbGUgZXZlbnRzIHRvIHRoZSBhZGFwdGVyLlxuICogQHN1bW1hcnkgTGlzdGVucyBmb3IgaW5zZXJ0LCB1cGRhdGUsIGFuZCByZW1vdmUgZXZlbnRzIGVtaXR0ZWQgYnkgVHlwZU9STSBhbmQgbm90aWZpZXMgdGhlIERlY2FmLnRzIGFkYXB0ZXIgc28gdGhhdCBvYnNlcnZlcnMgY2FuIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBwcm9wYWdhdGUgZXZlbnRzIGFuZCBsb29rIHVwIG1ldGFkYXRhLlxuICogQGNsYXNzXG4gKiBAZXhhbXBsZVxuICogLy8gUmVnaXN0ZXJpbmcgdGhlIHN1YnNjcmliZXIgd2hlbiBjcmVhdGluZyBhIERhdGFTb3VyY2VcbiAqIC8vIGRhdGFTb3VyY2VPcHRpb25zLnN1YnNjcmliZXJzID0gW25ldyBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyKGFkYXB0ZXIpXTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFR5cGVPUk1cbiAqICAgcGFydGljaXBhbnQgU3Vic2NyaWJlciBhcyBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJzXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJJbnNlcnQoZW50aXR5KVxuICogICBTdWJzY3JpYmVyLT4+QWRhcHRlcjogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKiAgIEFkYXB0ZXItPj5PYnNlcnZlcnM6IG5vdGlmeSh0YWJsZSwgQ1JFQVRFLCBbaWRdKVxuICpcbiAqICAgVHlwZU9STS0+PlN1YnNjcmliZXI6IGFmdGVyVXBkYXRlKGV2ZW50KVxuICogICBTdWJzY3JpYmVyLT4+QWRhcHRlcjogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKiAgIEFkYXB0ZXItPj5PYnNlcnZlcnM6IG5vdGlmeSh0YWJsZSwgVVBEQVRFLCBbaWRdKVxuICpcbiAqICAgVHlwZU9STS0+PlN1YnNjcmliZXI6IGFmdGVyUmVtb3ZlKGV2ZW50KVxuICogICBTdWJzY3JpYmVyLT4+QWRhcHRlcjogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKiAgIEFkYXB0ZXItPj5PYnNlcnZlcnM6IG5vdGlmeSh0YWJsZSwgREVMRVRFLCBbaWRdKVxuICovXG5ARXZlbnRTdWJzY3JpYmVyKClcbmV4cG9ydCBjbGFzcyBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIGltcGxlbWVudHMgRW50aXR5U3Vic2NyaWJlckludGVyZmFjZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBoYW5kbGVyOiAoXG4gICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICAgIGlkczogRXZlbnRJZHNcbiAgICApID0+IHZvaWRcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwb3N0LWluc2VydCBldmVudHMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNyZWF0ZSBvcGVyYXRpb24gZm9yIHRoZSBpbnNlcnRlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7SW5zZXJ0RXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gaW5zZXJ0IGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlckluc2VydChldmVudDogSW5zZXJ0RXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtcmVtb3ZlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgZGVsZXRlIG9wZXJhdGlvbiBmb3IgdGhlIHJlbW92ZWQgZW50aXR5LlxuICAgKiBAcGFyYW0ge1JlbW92ZUV2ZW50PGFueT59IGV2ZW50IFRoZSBUeXBlT1JNIHJlbW92ZSBldmVudC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fHZvaWR9IEEgcHJvbWlzZSB3aGVuIGFzeW5jIG9yIHZvaWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYWZ0ZXJSZW1vdmUoZXZlbnQ6IFJlbW92ZUV2ZW50PGFueT4pOiBQcm9taXNlPGFueT4gfCB2b2lkIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChldmVudC5lbnRpdHkuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtldmVudC5lbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgdGhpcy5oYW5kbGVyKHRhYmxlTmFtZSwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsIFtldmVudC5lbnRpdHlJZCBhcyBhbnldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwb3N0LXVwZGF0ZSBldmVudHMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhbiB1cGRhdGUgb3BlcmF0aW9uIGZvciB0aGUgbW9kaWZpZWQgZW50aXR5LlxuICAgKiBAcGFyYW0ge1VwZGF0ZUV2ZW50PGFueT59IGV2ZW50IFRoZSBUeXBlT1JNIHVwZGF0ZSBldmVudC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fHZvaWR9IEEgcHJvbWlzZSB3aGVuIGFzeW5jIG9yIHZvaWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYWZ0ZXJVcGRhdGUoZXZlbnQ6IFVwZGF0ZUV2ZW50PGFueT4pOiBQcm9taXNlPGFueT4gfCB2b2lkIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChldmVudC5kYXRhYmFzZUVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLlVQREFURSwgW1xuICAgICAgKGV2ZW50LmVudGl0eSBhcyBhbnkpW1wiaWRcIl0gYXMgYW55LFxuICAgIF0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaXNwYXRjaCwgRXZlbnRJZHMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGF0YS1zb3VyY2UvRGF0YVNvdXJjZU9wdGlvbnNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FdmVudFN1YnNjcmliZXIgfSBmcm9tIFwiLi9UeXBlT1JNRXZlbnRTdWJzY3JpYmVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERpc3BhdGNoZXIgZm9yIFR5cGVPUk0tZHJpdmVuIGNoYW5nZSBldmVudHMuXG4gKiBAc3VtbWFyeSBTdWJzY3JpYmVzIGEgVHlwZU9STSBEYXRhU291cmNlIHdpdGggYSBjdXN0b20gRW50aXR5U3Vic2NyaWJlciB0byBub3RpZnkgb2JzZXJ2ZXJzIHdoZW4gcmVjb3JkcyBhcmUgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dD01MDAwXSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5pdGlhbGl6YXRpb24gcmV0cmllcy5cbiAqIEBjbGFzcyBUeXBlT1JNRGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBkaXNwYXRjaGVyIGZvciBhIFR5cGVPUk0gRGF0YVNvdXJjZVxuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgVHlwZU9STURpc3BhdGNoKCk7XG4gKiBhd2FpdCBkaXNwYXRjaC5vYnNlcnZlKGFkYXB0ZXIsIGFkYXB0ZXIuZGF0YVNvdXJjZS5vcHRpb25zKTtcbiAqXG4gKiAvLyBUaGUgZGlzcGF0Y2hlciByZWdpc3RlcnMgYSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIGFuZCBub3RpZmllcyBvYnNlcnZlcnMgd2hlbiBlbnRpdGllcyBjaGFuZ2UuXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIERpc3BhdGNoIHtcbiAqICAgICAraW5pdGlhbGl6ZSgpXG4gKiAgICAgK3VwZGF0ZU9ic2VydmVycygpXG4gKiAgIH1cbiAqICAgY2xhc3MgVHlwZU9STURpc3BhdGNoIHtcbiAqICAgICAtb2JzZXJ2ZXJMYXN0VXBkYXRlPzogc3RyaW5nXG4gKiAgICAgLWF0dGVtcHRDb3VudGVyOiBudW1iZXJcbiAqICAgICAtdGltZW91dDogbnVtYmVyXG4gKiAgICAgK2NvbnN0cnVjdG9yKHRpbWVvdXQpXG4gKiAgICAgI25vdGlmaWNhdGlvbkhhbmRsZXIoKVxuICogICAgICNpbml0aWFsaXplKClcbiAqICAgfVxuICogICBEaXNwYXRjaCA8fC0tIFR5cGVPUk1EaXNwYXRjaFxuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STURpc3BhdGNoIGV4dGVuZHMgRGlzcGF0Y2g8RGF0YVNvdXJjZU9wdGlvbnM+IHtcbiAgcHJpdmF0ZSBvYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgYXR0ZW1wdENvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aW1lb3V0ID0gNTAwMCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBUeXBlT1JNIG5vdGlmaWNhdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgKHRyYW5zbGF0ZWQgZnJvbSBUeXBlT1JNIGV2ZW50cykgYW5kIG5vdGlmaWVzIG9ic2VydmVycyBhYm91dCByZWNvcmQgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZHMgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBub3RpZmljYXRpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgUG9zdGdyZVNRTERpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMb2dnZXJcbiAgICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICAgKiAgIE5vdGUgb3ZlciBEOiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBmcm9tIFBvc3RncmVTUUxcbiAgICogICBELT4+RDogUGFyc2Ugbm90aWZpY2F0aW9uIHBheWxvYWRcbiAgICogICBELT4+RDogRXh0cmFjdCB0YWJsZSwgb3BlcmF0aW9uLCBhbmQgaWRzXG4gICAqICAgRC0+Pk86IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpXG4gICAqICAgRC0+PkQ6IFVwZGF0ZSBvYnNlcnZlckxhc3RVcGRhdGVcbiAgICogICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgZGlzcGF0Y2hcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBub3RpZmljYXRpb25IYW5kbGVyKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIGlkczogRXZlbnRJZHNcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMubm90aWZpY2F0aW9uSGFuZGxlcik7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vdGlmeSBvYnNlcnZlcnNcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcyk7XG4gICAgICB0aGlzLm9ic2VydmVyTGFzdFVwZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGxvZy52ZXJib3NlKGBPYnNlcnZlciByZWZyZXNoIGRpc3BhdGNoZWQgYnkgJHtvcGVyYXRpb259IGZvciAke3RhYmxlfWApO1xuICAgICAgbG9nLmRlYnVnKGBwa3M6ICR7aWRzfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHByb2Nlc3Mgbm90aWZpY2F0aW9uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZGlzcGF0Y2hlciBhbmQgc3Vic2NyaWJlcyB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyB0aGUgVHlwZU9STUV2ZW50U3Vic2NyaWJlciBvbiB0aGUgRGF0YVNvdXJjZSBhbmQgbG9ncyB0aGUgc3Vic2NyaXB0aW9uIGxpZmVjeWNsZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIFR5cGVPUk1EaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMb2dnZXJcbiAgICogICBELT4+UzogQ2FsbCBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBTLT4+UzogQ2hlY2sgYWRhcHRlciBhbmQgbmF0aXZlXG4gICAqICAgYWx0IE5vIGFkYXB0ZXIgb3IgbmF0aXZlXG4gICAqICAgICBTLS0+PlM6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICogICBTLT4+RFM6IGluaXRpYWxpemUoKVxuICAgKiAgIFMtPj5EUzogc3Vic2NyaWJlcnMucHVzaChUeXBlT1JNRXZlbnRTdWJzY3JpYmVyKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBEUy0tPj5TOiBTdWJzY3JpcHRpb24gZXN0YWJsaXNoZWRcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZXNvbHZlc1xuICAgKiAgICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIHN1YnNjcmlwdGlvblxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIERTLS0+PlM6IEVycm9yXG4gICAqICAgICBTLS0+PkQ6IFByb21pc2UgcmVqZWN0c1xuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gc3Vic2NyaWJlVG9UeXBlT1JNKHRoaXM6IFR5cGVPUk1EaXNwYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMubmF0aXZlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBhZGFwdGVyL25hdGl2ZSBvYnNlcnZlZCBmb3IgZGlzcGF0Y2hgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFhZGFwdGVyLmRhdGFTb3VyY2UuaXNJbml0aWFsaXplZClcbiAgICAgICAgICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIGFkYXB0ZXIuZGF0YVNvdXJjZS5zdWJzY3JpYmVycy5wdXNoKFxuICAgICAgICAgIG5ldyBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyKHRoaXMubm90aWZpY2F0aW9uSGFuZGxlci5iaW5kKHRoaXMpKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICAgIC5jYWxsKHRoaXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFN1YnNjcmliZWQgdG8gVHlwZU9STSBub3RpZmljYXRpb25zYCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9uczogJHtlfWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgbWV0aG9kIHRvIHJlbGVhc2UgcmVzb3VyY2VzIHdoZW4gdGhlIGRpc3BhdGNoZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZFxuICAgKi9cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgLy8gaWYgKHRoaXMuYWRhcHRlcikge1xuICAgIC8vXG4gICAgLy8gICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuICAgIC8vICAgYXdhaXQgYWRhcHRlci5kYXRhU291cmNlLmRlc3Ryb3koKTtcbiAgICAvLyB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbHVtbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvQ29sdW1uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0luZGV4TWV0YWRhdGFBcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW10sXG4gIGluZGV4ZXM/OiBJbmRleE1ldGFkYXRhQXJnc1tdXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgIChjOiBSZWxhdGlvbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgaWYgKGluZGV4ZXMpIHtcbiAgICBjb25zdCBpbmR4ID0gaW5kZXhlcy5maWx0ZXIoXG4gICAgICAoYzogSW5kZXhNZXRhZGF0YUFyZ3MpID0+XG4gICAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgKGMuY29sdW1ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgKTtcbiAgICBpbmR4LmZvckVhY2goKGkpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oaSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoV2lkdGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhXaWR0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwiZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzaW1wbGUtZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzZXRcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB8ICgodHlwZT86IGFueSkgPT4gRnVuY3Rpb24pXG4gICAgfCBDb2x1bW5UeXBlXG4gICAgfCAoQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9ucyksXG4gIG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBvYmplY3QsIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgdHlwZSA9IDxDb2x1bW5UeXBlPnR5cGVPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gPENvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucztcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIENvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gc3BlY2lmeSBIU1RPUkUgdHlwZSBpZiBjb2x1bW4gaXMgSFNUT1JFXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gXCJoc3RvcmVcIiAmJiAhb3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgb3B0aW9ucy5oc3RvcmVUeXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gT2JqZWN0ID8gXCJvYmplY3RcIiA6IFwic3RyaW5nXCI7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gcmVnaXN0ZXIgYW4gZW1iZWRkZWRcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbWJlZGRlZHMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgaXNBcnJheTogcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gQXJyYXkgfHwgb3B0aW9ucy5hcnJheSA9PT0gdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVmaXggOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgdHlwZTogdHlwZU9yT3B0aW9ucyBhcyAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gICAgICB9IGFzIEVtYmVkZGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVnaXN0ZXIgYSByZWd1bGFyIGNvbHVtblxuXG4gICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGNvbHVtbnM6IFtwcm9wZXJ0eU5hbWVdLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIFwicmVndWxhclwiLFxuICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnMsXG4gICAgICAgIG9wdGlvbnMudW5pcXVlID8gbWV0YWRhdGEuaW5kaWNlcyA6IHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZ2VuZXJhdGVkXG4gICAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJ1cGRhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uKG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMgfHwge30sXG4gICAgICBcImNyZWF0ZURhdGVcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG4gIH07XG59XG4iLCJleHBvcnQgY2xhc3MgT2JqZWN0VXRpbHMge1xuICAvKipcbiAgICogQ2hlY2tzIGlmIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAgICogV2UgY2Fubm90IHVzZSBpbnN0YW5jZW9mIGJlY2F1c2UgaXQgaGFzIHByb2JsZW1zIHdoZW4gcnVubmluZyBvbiBkaWZmZXJlbnQgY29udGV4dHMuXG4gICAqIEFuZCB3ZSBkb24ndCBzaW1wbHkgdXNlIHR5cGVvZiBiZWNhdXNlIHR5cGVvZiBudWxsID09PSBcIm9iamVjdFwiLlxuICAgKi9cbiAgc3RhdGljIGlzT2JqZWN0KHZhbDogYW55KTogdmFsIGlzIG9iamVjdCB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdFdpdGhOYW1lKHZhbDogYW55KTogdmFsIGlzIG9iamVjdCAmIHsgbmFtZTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiB2YWxbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVPih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVSwgVj4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlMSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTIgVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMyBUaGUgdGhpcmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVSwgViwgVz4oXG4gICAgdGFyZ2V0OiBULFxuICAgIHNvdXJjZTE6IFUsXG4gICAgc291cmNlMjogVixcbiAgICBzb3VyY2UzOiBXXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZXMgT25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBhc3NpZ24odGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IGFueVtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSkpIHtcbiAgICAgICAgKHRhcmdldCBhcyBhbnkpW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL1xuICAvLyAvKipcbiAgLy8gICogQ29udmVydHMgTWl4ZWRMaXN0PFQ+IHRvIHN0cmljdGx5IGFuIGFycmF5IG9mIGl0cyBUIGl0ZW1zLlxuICAvLyAgKi9cbiAgLy8gc3RhdGljIG1peGVkTGlzdFRvQXJyYXk8VD4obGlzdDogTWl4ZWRMaXN0PFQ+KTogVFtdIHtcbiAgLy8gICBpZiAobGlzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGlzdCA9PT0gXCJvYmplY3RcIikge1xuICAvLyAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChcbiAgLy8gICAgICAgKGtleSkgPT4gKGxpc3QgYXMgeyBba2V5OiBzdHJpbmddOiBUIH0pW2tleV1cbiAgLy8gICAgICk7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHJldHVybiBsaXN0O1xuICAvLyAgIH1cbiAgLy8gfVxufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4sIGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgcmVsYXRpb25UeXBlOiBcIm9uZS10by1vbmVcIixcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogQSBvbmUtdG8tbWFueSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MixcbiAqIGJ1dCBFbnRpdHkyIGhhcyBvbmx5IG9uZSBFbnRpdHkxLiBFbnRpdHkyIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZiBFbnRpdHkxIG9uIGl0c1xuICogc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBOb3cgdHJ5IHRvIGRldGVybWluZSBpZiBpdCBpcyBhIGxhenkgcmVsYXRpb24uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIEEgbWFueS10by1vbmUgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgRW50aXR5MiwgYnV0XG4gKiBFbnRpdHkyIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZlxuICogRW50aXR5MiBvbiBpdHMgc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvT25lPFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gTm93IHRyeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsYXp5IHJlbGF0aW9uLlxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tb25lXCIsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE1hbnktdG8tbWFueSBpcyBhIHR5cGUgb2YgcmVsYXRpb25zaGlwIHdoZW4gRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MiwgYW5kIEVudGl0eTIgY2FuIGhhdmVcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBUbyBhY2hpZXZlIGl0LCB0aGlzIHR5cGUgb2YgcmVsYXRpb24gY3JlYXRlcyBhIGp1bmN0aW9uIHRhYmxlLCB3aGVyZSBpdCBzdG9yYWdlXG4gKiBlbnRpdHkxIGFuZCBlbnRpdHkyIGlkcy4gVGhpcyBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBub3cgdHJ5IHRvIGRldGVybWluZSBpdCBpdHMgbGF6eSByZWxhdGlvblxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW1hbnlcIixcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBvcHRpb25zOiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInV1aWRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInJvd2lkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaWRlbnRpdHlcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3lPck9wdGlvbnM/OlxuICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgIHwgXCJ1dWlkXCJcbiAgICB8IFwicm93aWRcIlxuICAgIHwgXCJpZGVudGl0eVwiXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzpcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IG9wdGlvbnM6IENvbHVtbk9wdGlvbnMgPSB7fTtcbiAgbGV0IHN0cmF0ZWd5OiBcImluY3JlbWVudFwiIHwgXCJ1dWlkXCIgfCBcInJvd2lkXCIgfCBcImlkZW50aXR5XCI7XG4gIGlmIChzdHJhdGVneU9yT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RyYXRlZ3lPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICBzdHJhdGVneSA9IHN0cmF0ZWd5T3JPcHRpb25zIGFzXG4gICAgICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgICAgICB8IFwidXVpZFwiXG4gICAgICAgIHwgXCJyb3dpZFwiXG4gICAgICAgIHwgXCJpZGVudGl0eVwiO1xuXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KHN0cmF0ZWd5T3JPcHRpb25zKSkge1xuICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgfVxuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QobWF5YmVPcHRpb25zKSkgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiIHx8IHN0cmF0ZWd5ID09PSBcImlkZW50aXR5XCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInJvd2lkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgXCJyZWd1bGFyXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG4gIFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBwcmltYXJ5IGtleSBjb2x1bW4ncyBvcHRpb25zLlxuICogSWYgc3BlY2lmaWVkLCB0aGUgbnVsbGFibGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gZmFsc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFByaW1hcnlDb2x1bW5PcHRpb25zID0gQ29sdW1uT3B0aW9ucyAmIHsgbnVsbGFibGU/OiBmYWxzZSB9O1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGU/OiBDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IENvbHVtblR5cGUgfCBQcmltYXJ5Q29sdW1uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gU3RyaW5nIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBCb29sZWFuIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBOdW1iZXJcbiAgICApIHtcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zIGFzIENvbHVtblR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCA8UHJpbWFyeUNvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFByaW1hcnlDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGNvbnN0IHJlZmxlY3RNZXRhZGF0YVR5cGUgPVxuICAgICAgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhXG4gICAgICAgID8gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgJiYgcmVmbGVjdE1ldGFkYXRhVHlwZSkgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBjaGVjayBpZiBjb2x1bW4gaXMgbm90IG51bGxhYmxlLCBiZWNhdXNlIHdlIGNhbm5vdCBhbGxvdyBhIHByaW1hcnkga2V5IHRvIGJlIG51bGxhYmxlXG4gICAgaWYgKG9wdGlvbnMubnVsbGFibGUpXG4gICAgICB0aHJvdyBuZXcgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIFwicmVndWxhclwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcblxuICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIHN0cmF0ZWd5OlxuICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgOiBcImluY3JlbWVudFwiLFxuICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IEVudGl0eU9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZU1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvVGFibGVNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkob3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkobmFtZT86IHN0cmluZywgb3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkoXG4gIG5hbWVPck9wdGlvbnM/OiBzdHJpbmcgfCBFbnRpdHlPcHRpb25zLFxuICBtYXliZU9wdGlvbnM/OiBFbnRpdHlPcHRpb25zXG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIChPYmplY3RVdGlscy5pc09iamVjdChuYW1lT3JPcHRpb25zKVxuICAgICAgPyAobmFtZU9yT3B0aW9ucyBhcyBFbnRpdHlPcHRpb25zKVxuICAgICAgOiBtYXliZU9wdGlvbnMpIHx8IHt9O1xuICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBuYW1lT3JPcHRpb25zIDogb3B0aW9ucy5uYW1lO1xuXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFibGVzID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRhYmxlcztcbiAgICB0YWJsZXMucHVzaCh7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBcInJlZ3VsYXJcIixcbiAgICAgIG9yZGVyQnk6IG9wdGlvbnMub3JkZXJCeSA/IG9wdGlvbnMub3JkZXJCeSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuZ2luZTogb3B0aW9ucy5lbmdpbmUgPyBvcHRpb25zLmVuZ2luZSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlID8gb3B0aW9ucy5kYXRhYmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHNjaGVtYTogb3B0aW9ucy5zY2hlbWEgPyBvcHRpb25zLnNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgIHN5bmNocm9uaXplOiBvcHRpb25zLnN5bmNocm9uaXplLFxuICAgICAgd2l0aG91dFJvd2lkOiBvcHRpb25zLndpdGhvdXRSb3dpZCxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/IG9wdGlvbnMuY29tbWVudCA6IHVuZGVmaW5lZCxcbiAgICB9IGFzIFRhYmxlTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbEtleXMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuZXhwb3J0IGNvbnN0IEJhc2VLZXkgPSBcImRlY2FmXCI7XG5cbmZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbiAgc3BsaXR0ZXIgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogdm9pZCB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQ6IFJlY29yZDxhbnksIGFueT4gPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmICghKGtleSBpbiBjdXJyZW50KSkge1xuICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICBjdXJyZW50W2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxNZXRhZGF0YSA9IHtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdmFsaWRhdGlvbj86IFJlY29yZDxzdHJpbmcsIGFueVtdPjtcbiAgcmVsYXRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZ2VuZXJhdGVkPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcGs6IHN0cmluZztcbiAgZmtzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgaW5kZXhlcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICBwcml2YXRlIHN0YXRpYyBfbWV0YWRhdGE6IFJlY29yZDxzeW1ib2wsIE1vZGVsTWV0YWRhdGE+ID0ge307XG5cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIHN0YXRpYyBiYXNlS2V5ID0gQmFzZUtleTtcbiAgc3RhdGljIG1pcnJvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldFByb3BlcnRpZXMobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5wcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHN0YXRpYyBwayhtb2RlbDogQ29uc3RydWN0b3I8YW55Pikge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhLnBrKVswXTtcbiAgfVxuXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcyhtb2RlbCwgcHJvcClbMF07XG4gIH1cblxuICBzdGF0aWMgdHlwZXMobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZykge1xuICAgIGxldCBkZXNpZ25UeXBlOiBhbnkgPSB0aGlzLmdldChtb2RlbCwgYHByb3BlcnRpZXMuJHtwcm9wfWApO1xuICAgIGlmICghZGVzaWduVHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtwcm9wfSBub3QgZm91bmQgaW4gJHttb2RlbC5uYW1lfWApO1xuICAgIGRlc2lnblR5cGUgPSBbZGVzaWduVHlwZV07XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkge1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgICBpZiAobWV0YS52YWxpZGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBtZXRhLnZhbGlkYXRpb247XG4gICAgICAgIGlmICh2YWxpZGF0aW9uW1ZhbGlkYXRpb25LZXlzLlRZUEVdKVxuICAgICAgICAgIGRlc2lnblR5cGUgPSBkZXNpZ25UeXBlLmNvbmNhdCh2YWxpZGF0aW9uW1ZhbGlkYXRpb25LZXlzLlRZUEVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2lnblR5cGUuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IE1vZGVsTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nKTogYW55O1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgcmV0dXJuIGdldFZhbHVlQnlTcGxpdHRlcih0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLCBrZXksIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG5cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSA9IHt9IGFzIGFueTtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdmFsdWUsIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFzc2lnbihcbiAgICBtb2RlbDogb2JqZWN0LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm9wPzogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIE1ldGFkYXRhLnNldChtb2RlbCBhcyBhbnksIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcm9wZXJ0eShtb2RlbDogb2JqZWN0LCBwcm9wOiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShNb2RlbEtleXMuVFlQRSwgbW9kZWwsIHByb3ApO1xuICAgIHJldHVybiBhc3NpZ24oYHByb3BlcnR5LiR7cHJvcH1gLCBkZXNpZ25UeXBlKShtb2RlbCwgcHJvcCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDYXNjYWRlLFxuICBDYXNjYWRlTWV0YWRhdGEsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgZmluYWwsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBzZXF1ZW5jZU5hbWVGb3JNb2RlbCxcbiAgdHlwZSBTZXF1ZW5jZU9wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHJlc2VydmVkQXR0cmlidXRlcywgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcywgc3BsaXRFYWdlclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluc2VydFJlc3VsdCxcbiAgUmVsYXRpb25PcHRpb25zLFxuICBKb2luQ29sdW1uLFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG4gIFZlcnNpb25Db2x1bW4sXG4gIEpvaW5UYWJsZSxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uT3B0aW9ucyxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW5PcHRpb25zLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NvbHVtblwiO1xuaW1wb3J0IHsgVXBkYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBDcmVhdGVEYXRlQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmltcG9ydCB7IE9uZVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvT25lXCI7XG5pbXBvcnQgeyBPbmVUb01hbnkgfSBmcm9tIFwiLi9vdmVycmlkZXMvT25lVG9NYW55XCI7XG5pbXBvcnQgeyBNYW55VG9PbmUgfSBmcm9tIFwiLi9vdmVycmlkZXMvTWFueVRvT25lXCI7XG5pbXBvcnQgeyBNYW55VG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb01hbnlcIjtcbmltcG9ydCB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtblwiO1xuaW1wb3J0IHsgUHJpbWFyeUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvRW50aXR5XCI7XG5pbXBvcnQgeyBhc3NpZ24sIE1ldGFkYXRhLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgVHlwZU9STVJlcG9zaXRvcnk8TT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gIGRhdGE6IGFueSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwidXNlclwiKTtcbiAgICBtb2RlbFtrZXldID0gdXNlciBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBUeXBlT1JNLWJhY2tlZCBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgRGVjYWYudHMgQWRhcHRlciBvdmVyIGEgVHlwZU9STSBEYXRhU291cmNlLCBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeS9zdGF0ZW1lbnQgZmFjdG9yaWVzLCBzZXF1ZW5jZSBtYW5hZ2VtZW50LCBlcnJvciBwYXJzaW5nLCBhbmQgZGVjb3JhdGlvbiBoZWxwZXJzLlxuICogQHRlbXBsYXRlIFkgVGhlIG5hdGl2ZSBjb25maWd1cmF0aW9uIHR5cGUgKFR5cGVPUk0gRGF0YVNvdXJjZU9wdGlvbnMpLlxuICogQHRlbXBsYXRlIEYgVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAcGFyYW0ge0RhdGFTb3VyY2VPcHRpb25zfSBzY29wZSBUaGUgRGF0YVNvdXJjZSBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIFRoZSBmbGF2b3VyIG9mIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBUeXBlT1JNQWRhcHRlcih7IHR5cGU6ICdwb3N0Z3JlcycsIC8qIC4uLiAqXFwvIH0pO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKiBjb25zdCByZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5BZGFwdGVyOiBuZXcgVHlwZU9STUFkYXB0ZXIob3B0cylcbiAqICAgQWRhcHRlci0+PkRTOiBpbml0aWFsaXplKClcbiAqICAgQXBwLT4+QWRhcHRlcjogcmVwb3NpdG9yeSgpXG4gKiAgIEFkYXB0ZXItLT4+QXBwOiBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlL2NyZWF0ZS9yZXZlcnRcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBNb2RlbFxuICogICBSZXBvLS0+PkFwcDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gIFR5cGVPUk1RdWVyeSxcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBwcml2YXRlIF9kYXRhU291cmNlPzogRGF0YVNvdXJjZTtcblxuICBnZXQgZGF0YVNvdXJjZSgpOiBEYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuZmxhdm91cik7XG4gICAgICB0aGlzLl9kYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5uYXRpdmUsIHtcbiAgICAgICAgICBlbnRpdGllczogbW9kZWxzLm1hcCgoYykgPT4gY1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjXSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcbiAgfVxuICAvLyBwcm90ZWN0ZWQgZGF0YVNvdVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFTb3VyY2VPcHRpb25zLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKG9wdGlvbnMsIFR5cGVPUk1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFR5cGVPUk1GbGFncz5cbiAgKTogUHJvbWlzZTxUeXBlT1JNRmxhZ3M+IHtcbiAgICBjb25zdCBmID0gYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpO1xuICAgIGNvbnN0IG5ld09iajogYW55ID0ge1xuICAgICAgdXNlcjogKGF3YWl0IFR5cGVPUk1BZGFwdGVyLmdldEN1cnJlbnRVc2VyKHRoaXMuZGF0YVNvdXJjZSkpIGFzIHN0cmluZyxcbiAgICB9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoKTtcblxuICAgIGNvbnN0IGV4Y2VwdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobSkuaWQ7XG4gICAgICBleGNlcHRpb25zLnB1c2gocGsgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8XG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgKSB7XG4gICAgICBjb25zdCBkZWNzID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIG0sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgKGRlYzogYW55KSA9PlxuICAgICAgICAgICAgZGVjLmtleSA9PT0gREJLZXlzLlRJTUVTVEFNUCAmJlxuICAgICAgICAgICAgZGVjLnByb3BzLm9wZXJhdGlvbi5pbmRleE9mKG9wZXJhdGlvbikgIT09IC0xXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWMpIHtcbiAgICAgICAgICBhY2N1bVtrZXldID0gZGVjLnByb3BzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgZXhjZXB0aW9ucy5wdXNoKC4uLk9iamVjdC5rZXlzKGRlY3MpKTtcbiAgICB9XG5cbiAgICBuZXdPYmouaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID0gKFxuICAgICAgZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgPyBmLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA6IFtdXG4gICAgKS5jb25jYXQoLi4uZXhjZXB0aW9ucyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZiwgbmV3T2JqKSBhcyBUeXBlT1JNRmxhZ3M7XG4gIH1cblxuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogVHlwZU9STURpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1EaXNwYXRjaCgpO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFR5cGVPUk1SZXBvc2l0b3J5PE0+PiB7XG4gICAgcmV0dXJuIFR5cGVPUk1SZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVzIHN0YXRlbWVudCBmb3IgcXVlcnlpbmdcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlIGZvciBidWlsZGluZyBxdWVyaWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7VHlwZU9STVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogVHlwZU9STVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TdGF0ZW1lbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTFNlcXVlbmNlIGluc3RhbmNlIGZvciBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBTZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlciBieSBjcmVhdGluZyBpbmRleGVzIGZvciBhbGwgbWFuYWdlZCBtb2RlbHNcbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGRhdGFiYXNlIGluZGV4ZXMgZm9yIGFsbCBtb2RlbHMgbWFuYWdlZCBieSB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkcyA9IHRoaXMuZGF0YVNvdXJjZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHMuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgbG9nLnZlcmJvc2UoYCR7dGhpcy5mbGF2b3VyfSBhZGFwdGVyIGluaXRpYWxpemVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgaW5kZXhlcyBmb3IgdGhlIGdpdmVuIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBkYXRhYmFzZSBpbmRleGVzIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Li4uQ29uc3RydWN0b3I8TT59IG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICovXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBUeXBlT1JNUXVlcnlbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIkJFR0lOXCIpO1xuXG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KGluZGV4LnF1ZXJ5LCBpbmRleC52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJDT01NSVRcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBleGVjdXRlIHJhdyBTUUwgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcSAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihxOiBUeXBlT1JNUXVlcnkpOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yYXcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVlcnksIHZhbHVlcyB9ID0gcTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYGV4ZWN1dGluZyBxdWVyeTogJHsocXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikuZ2V0U3FsKCl9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTSxcbiAgICBjaGlsZCA9IGZhbHNlXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcblxuICAgIHByZXBhcmVkLnJlY29yZCA9IE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBIHx8IHRoaXMuaXNSZXNlcnZlZChrZXkpKVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKE1vZGVsLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnByZXBhcmUodmFsdWUsIGZpbmRQcmltYXJ5S2V5KHZhbHVlKS5pZCwgdHJ1ZSkucmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy9kbyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IubmFtZVxuICAgICk7XG4gICAgaWYgKCFjb25zdHIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gbm90IGZvdW5kIGluIHJlZ2lzdHJ5YFxuICAgICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBjaGlsZFxuICAgICAgPyBuZXcgKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0oKVxuICAgICAgOiBuZXcgY29uc3RyKCk7XG4gICAgaWYgKGNoaWxkKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkuZm9yRWFjaChcbiAgICAgIChba2V5LCB2YWxdKSA9PiAocmVzdWx0W2tleSBhcyBrZXlvZiB0eXBlb2YgcmVzdWx0XSA9IHZhbClcbiAgICApO1xuICAgIHByZXBhcmVkLnJlY29yZCA9IHJlc3VsdDtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBvYmopXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke3R5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBhIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlcG8uZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBgUmVjb3JkIGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7UmVwb3NpdG9yeS50YWJsZShtKX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHJlYWQgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gcHJpbWFyeSBrZXkgY29sdW1cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlYWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnMobSk7XG5cbiAgICAgIGNvbnN0IHE6IEZpbmRPbmVPcHRpb25zID0ge1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIFtwa106IGlkLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGlvbnM6IHJlbGF0aW9ucyxcbiAgICAgICAgbG9hZFJlbGF0aW9uSWRzOiB7XG4gICAgICAgICAgcmVsYXRpb25zOiBub25FYWdlcixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSAoYXdhaXQgcmVwby5maW5kT25lT3JGYWlsKHEpKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byB1cGRhdGUgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMucmVhZCh0YWJsZU5hbWUsIGlkLCBwayk7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVsZXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBJbnNlcnRSZXN1bHQgPSBhd2FpdCByZXBvLmluc2VydChtb2RlbCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHJlc3VsdC5pZGVudGlmaWVycy5tYXAoKGlkKSA9PiBpZC5pZCksXG4gICAgICAgIFwiaWRcIlxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWQubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiByZXBvLmZpbmRCeSh7IFtwa106IEluKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgbVtwa10sIG0sIHBrLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwodGFibGVOYW1lLCBpZHMsIHBrKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkcyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBhbmQgY29udmVydHMgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICovXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gVHlwZU9STUFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBpbiBQb3N0Z3JlU1FMXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhdHRyLm1hdGNoKHJlc2VydmVkQXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW4gZXJyb3IgYW5kIGNvbnZlcnQgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXMgYmFzZWQgb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VFcnJvclxuICAgKiAgIHBhcnRpY2lwYW50IEVycm9yVHlwZXNcbiAgICpcbiAgICogICBDYWxsZXItPj5wYXJzZUVycm9yOiBlcnIsIHJlYXNvblxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBDaGVjayBpZiBlcnIgaXMgYWxyZWFkeSBhIEJhc2VFcnJvclxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBwYXJzZUVycm9yLS0+PkNhbGxlcjogcmV0dXJuIGVyclxuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBmcm9tIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvZGUgbWF0Y2hlcyBcImR1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHNcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29kZSBtYXRjaGVzIFwiZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgY29kZSBwcm9wZXJ0eVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBhbmQgcmVhc29uXG4gICAqICAgZWxzZVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFVzZSBlcnIubWVzc2FnZSBhcyBjb2RlXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFN3aXRjaCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVcbiAgICogICBhbHQgY29kZSBpcyAyMzUwNSAodW5pcXVlX3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyAyMzUwMyAoZm9yZWlnbl9rZXlfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDAxICh1bmRlZmluZWRfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDI3MDMgKHVuZGVmaW5lZF9jb2x1bW4pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDcgKGR1cGxpY2F0ZV90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAxNiAoaW52YWxpZF90YWJsZV9kZWZpbml0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbmRleEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgIGVsc2VcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgY29uc3QgY29kZTogc3RyaW5nID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuXG4gICAgaWYgKGNvZGUubWF0Y2goL2R1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHMvZykpXG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgaWYgKGNvZGUubWF0Y2goL2RvZXMgbm90IGV4aXN0fG5vdCBmb3VuZHxDb3VsZCBub3QgZmluZC9nKSlcbiAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcblxuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgICAgICBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IHR5cGUgPVxuICAgICAgICAgIG9wdGlvbnMudHlwZSB8fCBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgcHJvcGVydHkgJHtwcm9wfSBvZiAke29yaWdpbmFsLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgc2VxdWVuY2VOYW1lRm9yTW9kZWwob3JpZ2luYWwsIFwicGtcIik7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwibnVtZXJpY1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwidmFyY2hhclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUNvbHVtbih7XG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUgYXMgQ29sdW1uVHlwZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKShvcmlnaW5hbCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHBrS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihNb2RlbEtleXMuQVRUUklCVVRFKVxuICAgICAgLmV4dGVuZChwcm9wZXJ0eSgpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAY29sdW1uKFwiY29sdW1uTmFtZVwiKSA9PiBAQ29sdW1uKHtuYW1lOiBcImNvbHVtbk5hbWVcIn0pXG4gICAgY29uc3QgY29sdW1uS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY29sdW1uS2V5KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1tKG5hbWU6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKG5hbWUpIG9wdHMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBjb25zdCBwayA9IE1ldGFkYXRhLmdldChvYmosIFwicGtcIik7XG4gICAgICAgICAgICBpZiAocGsgIT09IHByb3ApIHtcbiAgICAgICAgICAgICAgb3B0cy5udWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uKG9wdHMpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXJnc1sxXTtcbiAgICAgICAgICByZXR1cm4gW2NvbHVtbk5hbWVdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHVuaXF1ZSA9PiBAQ29sdW1uKHt1bmlxdWU6IHRydWV9KVxuICAgIGNvbnN0IHVuaXF1ZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVuaXF1ZUtleSlcbiAgICAgIC5kZWZpbmUocHJvcE1ldGFkYXRhKHVuaXF1ZUtleSwge30pKVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEByZXF1aXJlZCA9PiBAQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pXG4gICAgY29uc3QgcmVxdWlyZWRLZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocmVxdWlyZWRLZXkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHZlcnNpb24gPT4gQFZlcnNpb25Db2x1bW4oKVxuICAgIGNvbnN0IHZlcnNpb25LZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVkVSU0lPTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodmVyc2lvbktleSlcbiAgICAgIC5kZWZpbmUodHlwZShOdW1iZXIubmFtZSksIFZlcnNpb25Db2x1bW4oKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgICAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICBwcm9wTWV0YWRhdGEodGltZXN0YW1wS2V5LCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBlbHNlIGRlY29yYXRvcnMucHVzaChyZWFkb25seSgpKTtcbiAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0aW1lc3RhbXBLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIH0pXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAoLi4ub3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGltZXN0YW1wKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChvcHMuaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb09uZShjbGF6eikgPT4gQE9uZVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5Db2x1bW5PcHRzPzogSm9pbkNvbHVtbk9wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luQ29sdW1uT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgT25lVG9PbmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luQ29sdW1uKFxuICAgICAgICAgICAgICBqb2luQ29sdW1uT3B0cyB8fCBtZXRhZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlDb25zdHJhaW50TmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6ICh1bmRlZmluZWQgYXMgYW55KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9NYW55KGNsYXp6KSA9PiBAT25lVG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG5cbiAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvTWFueUtleSwgbWV0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBPbmVUb01hbnlXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIE9uZVRvTWFueShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGF6eiA9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGRlYy5wcm9wcy5jbGFzcyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWRlYy5wcm9wcy5jbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlYy5wcm9wcy5jbGFzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGRlYy5wcm9wcy5jbGFzcztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBDcm9zcyByZWxhdGlvbiBub3QgZm91bmQuIERpZCB5b3UgdXNlIEBtYW55VG9PbmUgb24gdGhlICR7Y2xhenoubmFtZX0/YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb09uZShjbGF6eikgPT4gQE1hbnlUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE1hbnlUb09uZVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIHJldHVybiBNYW55VG9PbmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBsZXQgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0RGVjKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIFR5cGUgRGVmaW5pdGlvbiBmb3VuZCBmb3IgJHtrfSBpbiAke20uY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGxpc3REZWMuY2xhenpbMF0oKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgY3Jvc3NSZWxhdGlvbktleSA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKVxuICAgICAgICAgICAgICAgICAgICApLmlkIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvTWFueShjbGF6eikgPT4gQE1hbnlUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE1hbnlUb01hbnkoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luVGFibGUoam9pblRhYmxlT3B0cyBhcyBhbnkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBpbmRleCgpID0+IEBJbmRleCgpXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLklOREVYKVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gaW5kZXgoXG4gICAgICAgICAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10gfCBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgbmFtZT86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW5kZXgob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvc2l0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICBuYW1lID0gY29tcG9zaXRpb25zO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9ucyAmJiBkaXJlY3Rpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgIVtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10uaW5jbHVkZXMoZCBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSBkaXJlY3Rpb25zIGFzIHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBJbmRleChbcHJvcCwgLi4uY29tcG9zaXRpb25zXSkob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEluZGV4KCkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGUsIHt9KSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICAgIC8vIGFzc2lnbihgcGsuJHtwcm9wfWAsIG9wdGlvbnMpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZSwge30pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChUeXBlT1JNRmxhdm91cik7XG4iLCJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cblR5cGVPUk1BZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXhlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcXVlbmNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBpbnRlZ3JhdGlvbiBmb3IgRGVjYWYudHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgVHlwZU9STS1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlY2FmLnRzIGRhdGEgYWNjZXNzIGFic3RyYWN0aW9ucywgaW5jbHVkaW5nIHRoZSBhZGFwdGVyLCByZXBvc2l0b3J5LCBzdGF0ZW1lbnQgYnVpbGRlciwgcGFnaW5hdGlvbiB1dGlsaXRpZXMsIGluZGV4IGhlbHBlcnMsIGFuZCB0eXBlIGRlZmluaXRpb25zLiBLZXkgZXhwb3J0cyBpbmNsdWRlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIHtAbGluayBUeXBlT1JNUmVwb3NpdG9yeX0sIHtAbGluayBUeXBlT1JNU3RhdGVtZW50fSwge0BsaW5rIFR5cGVPUk1QYWdpbmF0b3J9LCBhbmQgaW5kZXggZ2VuZXJhdGlvbiB1dGlsaXRpZXMuXG4gKiBAbW9kdWxlIGZvci10eXBlb3JtXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbi5cbiAqIEBzdW1tYXJ5IFRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgZm9yLXR5cGVvcm0gcGFja2FnZS5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkJhc2VFcnJvciIsIlNRTE9wZXJhdG9yIiwiUGFnaW5hdG9yIiwiTW9kZWxLZXlzIiwiUGFnaW5nRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlF1ZXJ5RXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiUmVwb3NpdG9yeSIsIlJlZmxlY3Rpb24iLCJQZXJzaXN0ZW5jZUtleXMiLCJNb2RlbCIsIlN0YXRlbWVudCIsIk9yZGVyRGlyZWN0aW9uIiwiR3JvdXBPcGVyYXRvciIsIk9wZXJhdG9yIiwiU2VxdWVuY2UiLCJOb3RGb3VuZEVycm9yIiwiRGVmYXVsdFNlcGFyYXRvciIsIlR5cGVPUk1SZXBvc2l0b3J5IiwiQ29udGV4dCIsIk9wZXJhdGlvbktleXMiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiVmFsaWRhdGlvbkVycm9yIiwiX19kZWNvcmF0ZSIsInVzZXMiLCJBZGFwdGVyIiwiRXZlbnRTdWJzY3JpYmVyIiwiRGlzcGF0Y2giLCJWYWxpZGF0aW9uS2V5cyIsIlVuc3VwcG9ydGVkRXJyb3IiLCJnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIiwiQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yIiwiUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvciIsIkRhdGFTb3VyY2UiLCJEQktleXMiLCJDb25mbGljdEVycm9yIiwiSW4iLCJDb25uZWN0aW9uRXJyb3IiLCJMb2dnaW5nIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFUyIsIkRlY29yYXRpb24iLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwicHJvcE1ldGFkYXRhIiwic2VxdWVuY2VOYW1lRm9yTW9kZWwiLCJhcHBseSIsIlZhbGlkYXRpb24iLCJ0eXBlIiwiVmVyc2lvbkNvbHVtbiIsIlVwZGF0ZVZhbGlkYXRpb25LZXlzIiwiZGF0ZSIsIkRCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJDYXNjYWRlIiwicHJvcCIsIkpvaW5Db2x1bW4iLCJsaXN0IiwiSm9pblRhYmxlIiwiSW5kZXgiLCJvbkNyZWF0ZSIsIm9uQ3JlYXRlVXBkYXRlIiwiZmluYWwiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7OztJQUtHO0FBQ0ksVUFBTSxrQkFBa0IsR0FDN0I7QUFFSyxVQUFNLGNBQWMsR0FBRztJQUU5Qjs7Ozs7Ozs7Ozs7OztJQWFHO0lBQ0g7Ozs7OztJQU1HO0FBQ0ksVUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBQSxTQUFTLEVBQUUsR0FBRztJQUNkLElBQUEsRUFBRSxFQUFFLElBQUk7SUFDUixJQUFBLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUEsT0FBTyxFQUFFLFlBQVk7SUFDckIsSUFBQSxLQUFLLEVBQUUsWUFBWTtJQUNuQixJQUFBLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLElBQUEsUUFBUSxFQUFFLGVBQWU7SUFDekIsSUFBQSxLQUFLLEVBQUUsT0FBTzs7O0lDdENoQjs7Ozs7Ozs7Ozs7Ozs7OztJQWdCRztJQUNHLE1BQU8sVUFBVyxTQUFRQSxzQkFBUyxDQUFBO0lBQ3ZDLElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7WUFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsQztJQUNEOztJQ25CRDs7Ozs7SUFLRztBQUNTQztJQUFaLENBQUEsVUFBWSxXQUFXLEVBQUE7SUFDckIsSUFBQSxXQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsR0FBVztJQUNYLElBQUEsV0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLElBQWdCO0lBQ2hCLElBQUEsV0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLEdBQWU7SUFDZixJQUFBLFdBQUEsQ0FBQSxvQkFBQSxDQUFBLEdBQUEsSUFBeUI7SUFDekIsSUFBQSxXQUFBLENBQUEsY0FBQSxDQUFBLEdBQUEsR0FBa0I7SUFDbEIsSUFBQSxXQUFBLENBQUEsdUJBQUEsQ0FBQSxHQUFBLElBQTRCO0lBQzVCLElBQUEsV0FBQSxDQUFBLElBQUEsQ0FBQSxHQUFBLElBQVM7SUFDVCxJQUFBLFdBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLFdBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0lBQ2IsSUFBQSxXQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtJQUNmLElBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1CO0lBQ25CLElBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1CO0lBQ25CLElBQUEsV0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCO0lBQzNCLElBQUEsV0FBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCO0lBQ2pCLElBQUEsV0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCO0lBQ3pCLElBQUEsV0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7SUFDWCxJQUFBLFdBQUEsQ0FBQSxLQUFBLENBQUEsR0FBQSxLQUFXO0lBQ1gsSUFBQSxXQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtJQUNmLENBQUMsRUFuQldBLG1CQUFXLEtBQVhBLG1CQUFXLEdBQUEsRUFBQSxDQUFBLENBQUE7O0lDUnZCOzs7OztJQUtHO0FBQ0ksVUFBTSxpQkFBaUIsR0FBRztJQUVqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNCRztBQUNJLFVBQU0sZUFBZSxHQUF5QztRQUNuRSxLQUFLLEVBQUVBLG1CQUFXLENBQUMsS0FBSztRQUN4QixTQUFTLEVBQUVBLG1CQUFXLENBQUMsU0FBUztRQUNoQyxNQUFNLEVBQUVBLG1CQUFXLENBQUMsWUFBWTtRQUNoQyxTQUFTLEVBQUVBLG1CQUFXLENBQUMscUJBQXFCO1FBQzVDLE9BQU8sRUFBRUEsbUJBQVcsQ0FBQyxTQUFTO1FBQzlCLFVBQVUsRUFBRUEsbUJBQVcsQ0FBQyxrQkFBa0I7UUFDMUMsT0FBTyxFQUFFQSxtQkFBVyxDQUFDLE9BQU87SUFDNUIsSUFBQSxHQUFHLEVBQUUsS0FBSztRQUNWLEVBQUUsRUFBRUEsbUJBQVcsQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sRUFBRUEsbUJBQVcsQ0FBQyxPQUFPO1FBQzVCLFdBQVcsRUFBRUEsbUJBQVcsQ0FBQyxXQUFXO0lBQ3BDLElBQUEsTUFBTSxFQUFFLEdBQUc7SUFDWCxJQUFBLE9BQU8sRUFBRSxJQUFJO1FBQ2IsSUFBSSxFQUFFQSxtQkFBVyxDQUFDLElBQUk7UUFDdEIsS0FBSyxFQUFFQSxtQkFBVyxDQUFDLEtBQUs7O0lBRzFCOzs7Ozs7Ozs7SUFTRztBQUNJLFVBQU0sb0JBQW9CLEdBQTJCO0lBQzFELElBQUEsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFBLEVBQUUsRUFBRSxJQUFJOztJQUdWOzs7Ozs7O0lBT0c7QUFDSSxVQUFNLFlBQVksR0FBMkI7SUFDbEQsSUFBQSxJQUFJLEVBQUUsTUFBTTs7O0lDcEVkOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztJQUNHLE1BQU8sZ0JBQXFDLFNBQVFDLGNBSXpELENBQUE7SUFDQzs7OztJQUlHO0lBQ0gsSUFBQSxJQUFhLEtBQUssR0FBQTtZQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXO1FBQ3pCO0lBRUE7Ozs7SUFJRztJQUNILElBQUEsSUFBYSxLQUFLLEdBQUE7WUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWTtRQUMxQjtJQUlBLElBQUEsSUFBYyxJQUFJLEdBQUE7SUFDaEIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsT0FBMEIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDQyw2QkFBUyxDQUFDLE1BQWlDLENBQUMsQ0FDeEQ7WUFDSDtZQUNBLE9BQU8sSUFBSSxDQUFDLE1BQU07UUFDcEI7SUFFQTs7Ozs7OztJQU9HO0lBQ0gsSUFBQSxXQUFBLENBQ0UsT0FBdUIsRUFDdkIsS0FBbUIsRUFDbkIsSUFBWSxFQUNaLEtBQXFCLEVBQUE7WUFFckIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUNwQztJQUVBOzs7OztJQUtHO0lBQ08sSUFBQSxPQUFPLENBQUMsWUFBMEIsRUFBQTtJQUMxQyxRQUFBLE1BQU0sS0FBSyxHQUFpQixFQUFFLEdBQUcsWUFBWSxFQUFFO0lBQy9DLFFBQUEsT0FBTyxLQUFLO1FBQ2Q7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQStCRztJQUVILElBQUEsTUFBTSxJQUFJLENBQUMsSUFBQSxHQUFlLENBQUMsRUFBQTtZQUN6QixNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTs7WUFHdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQztZQUMxQztJQUVBLFFBQUEsTUFBTSxJQUFJLEdBQXVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUN4RCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSTtnQkFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ2hCLFNBQUEsQ0FBQzs7WUFJRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUVqRCxRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3QixRQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO0lBQUUsWUFBQSxNQUFNLElBQUlDLGdCQUFXLENBQUMsNkJBQTZCLENBQUM7WUFFckUsTUFBTSxLQUFLLEdBQUdDLDJCQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7SUFFNUIsUUFBQSxNQUFNLE9BQU87OztJQUdYLFFBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsS0FBSTtnQkFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEUsUUFBQSxDQUFDLENBQUM7SUFFSixRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSTtJQUN4QixRQUFBLE9BQU8sT0FBeUI7UUFDbEM7SUFDRDs7SUNwSkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThCRztJQUNHLFNBQVUsa0JBQWtCLENBQ2hDLFFBQWtDLEVBQUE7UUFFbEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUM7SUFDN0QsUUFBQSxJQUFJLEVBQUU7SUFBRSxZQUFBLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM5QjtJQUNBLElBQUEsTUFBTSxJQUFJQyxlQUFVLENBQ2xCLG1EQUFtRCxRQUFRLENBQUEsQ0FBRSxDQUM5RDtJQUNIOztJQ3hDQTs7Ozs7Ozs7Ozs7Ozs7SUFjRztJQUNHLFNBQVUsd0JBQXdCLENBQUMsT0FBd0IsRUFBQTtJQUMvRCxJQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzFDLElBQUEsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDL0IsSUFBSSxLQUFLLEVBQUU7SUFDVCxZQUFBLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLO2dCQUNuQixPQUFPLEdBQUcsQ0FBQztZQUNiO1FBQ0Y7SUFDQSxJQUFBLE1BQU0sS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPO0lBRXpFLElBQUEsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU07SUFFNUIsSUFBQSxPQUFPLE9BQU87SUFDaEI7YUFFZ0IsbUJBQW1CLENBQ2pDLENBQWlCLEVBQ2pCLFFBQTZCLEVBQUUsRUFBQTtJQUUvQixJQUFBLElBQUksUUFBVztJQUNmLElBQUEsSUFBSTtJQUNGLFFBQUEsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFO1FBQ3BCO1FBQUUsT0FBTyxDQUFVLEVBQUU7WUFDbkIsTUFBTSxJQUFJQywwQkFBYSxDQUNyQixDQUFBLDRCQUFBLEVBQStCLENBQUMsQ0FBQyxJQUFJLENBQUEsaUNBQUEsRUFBb0MsQ0FBQyxDQUFBLENBQUUsQ0FDN0U7UUFDSDtRQUNBLE1BQU0sSUFBSSxHQUFHQyxlQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwQyxJQUFBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTO0lBQzFDLElBQUEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ2pCLFFBQUEsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0QjtRQUNBLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQzNCLENBQUMsS0FBa0QsRUFBRSxJQUFJLEtBQUk7WUFDM0QsTUFBTSxVQUFVLEdBQUdDLHFCQUFVLENBQUMscUJBQXFCLENBQ2pERCxlQUFVLENBQUMsR0FBRyxDQUFDRSxvQkFBZSxDQUFDLFFBQVEsQ0FBQyxFQUN4QyxRQUFRLEVBQ1IsSUFBSSxFQUNKLElBQUksQ0FDTDtJQUNELFFBQUEsSUFDRSxDQUFDLFVBQVU7Z0JBQ1gsQ0FBQyxVQUFVLENBQUMsVUFBVTtJQUN0QixZQUFBLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNO2dCQUU3QixNQUFNLElBQUlILDBCQUFhLENBQ3JCLENBQUEsaUNBQUEsRUFBb0MsSUFBSSxDQUFBLFVBQUEsRUFBYSxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FDOUQ7SUFDSCxRQUFBLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDbEMsTUFBTSxJQUFJQSwwQkFBYSxDQUNyQixDQUFBLHVDQUFBLEVBQTBDLElBQUksQ0FBQSxVQUFBLEVBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFFLENBQ3BFO1lBQ0gsTUFBTSxTQUFTLEdBQVEsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsUUFBQSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVE7SUFDdEMsUUFBQSxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFDakMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO0lBQUUsWUFBQSxLQUFLLEdBQUdJLHlCQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBbUI7WUFDekUsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFO0lBQy9ELFFBQUEsSUFBSSxDQUFDLEtBQUs7Z0JBQ1IsTUFBTSxJQUFJSiwwQkFBYSxDQUNyQixDQUFBLGtDQUFBLEVBQXFDLElBQUksQ0FBQSxVQUFBLEVBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFFLENBQy9EO1lBRUgsSUFBSSxDQUFDLEtBQUssRUFBRTtJQUNWLFlBQUEsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzNCO2lCQUFPO0lBQ0wsWUFBQSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDNUI7WUFFQSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ2xDLFlBQUEsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ2pFLFlBQUEsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ3JELGdCQUFBLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFBLEVBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQSxDQUFFLENBQUM7b0JBQy9ELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzNDO0lBRUEsWUFBQSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7SUFDcEIsZ0JBQUEsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFBLEVBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQSxDQUFFLENBQUM7b0JBQ25ELEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUMvQjtZQUNGO0lBRUEsUUFBQSxPQUFPLEtBQUs7UUFDZCxDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FDaEM7SUFDRCxJQUFBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUztJQUN6QixJQUFBLE9BQU8sU0FBUztJQUNsQjs7SUN4RkE7Ozs7Ozs7Ozs7Ozs7Ozs7SUFnQkc7SUFDRyxNQUFPLGdCQUFxQyxTQUFRSyxjQUl6RCxDQUFBO0lBR0MsSUFBQSxXQUFBLENBQVksT0FBdUIsRUFBQTtZQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2hCO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUEyQ0c7UUFDTyxLQUFLLEdBQUE7SUFDYixRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUdKLGVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUNyRCxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtJQUVqQyxRQUFBLE1BQU0sQ0FBQyxHQUEyQztJQUNoRCxZQUFBLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO3FCQUNqQixhQUFhLENBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQ0wsNkJBQVMsQ0FBQyxNQUF3QyxDQUFDO3FCQUV0RSxrQkFBa0IsQ0FBQyxTQUFTLENBQTBCO2FBQzFEO1lBRUQsSUFBSSxJQUFJLENBQUMsY0FBYztnQkFDckIsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQSxFQUFHLFNBQVMsQ0FBQSxDQUFBLEVBQUksQ0FBVyxDQUFBLENBQUUsQ0FBQyxDQUM5RDs7Z0JBQ0UsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUUvQixJQUFJLElBQUksQ0FBQyxjQUFjO0lBQ3JCLFlBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUMzQixJQUFJLENBQUMsY0FBYyxFQUNuQixTQUFTLEVBQ1QsQ0FBQyxDQUFDLEtBQWdDLENBQ25DLENBQUMsS0FBeUM7SUFFN0MsUUFBQSxJQUFJLFdBQXFDO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtJQUN2QixZQUFBLFdBQVcsR0FBRztvQkFDWixDQUFBLEVBQUcsU0FBUyxJQUFJRSwyQkFBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQVksQ0FBQSxDQUFFO0lBQ2hELGdCQUFBUSxtQkFBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQVc7aUJBQzFDOztJQUVELFlBQUEsV0FBVyxHQUFHO29CQUNaLENBQUEsRUFBRyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQVcsQ0FBQSxDQUFFO0lBQ25ELGdCQUFBLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFvQjtpQkFDeEQ7SUFFSCxRQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUksQ0FBQyxDQUFDLEtBQWlDLENBQUMsT0FBTyxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQ3RFLFFBQUEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO0lBQ3RCLFlBQUEsQ0FBQyxDQUFDLEtBQUssR0FBSSxDQUFDLENBQUMsS0FBaUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUMxRTtpQkFBTztJQUNMLFlBQUEsR0FBRyxDQUFDLEtBQUssQ0FDUCxxREFBcUQsaUJBQWlCLENBQUEsQ0FBRSxDQUN6RTtnQkFDRCxDQUFDLENBQUMsS0FBSyxHQUFJLENBQUMsQ0FBQyxLQUFpQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztZQUN6RTs7WUFHQSxJQUFJLElBQUksQ0FBQyxjQUFjO0lBQ3JCLFlBQUEsQ0FBQyxDQUFDLEtBQUssR0FBSSxDQUFDLENBQUMsS0FBaUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUUxRSxRQUFBLE9BQU8sQ0FBUTtRQUNqQjtJQUVBOzs7Ozs7O0lBT0c7UUFDSCxNQUFNLFFBQVEsQ0FBSSxJQUFZLEVBQUE7SUFDNUIsUUFBQSxJQUFJO0lBQ0YsWUFBQSxNQUFNLEtBQUssR0FBaUIsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDeEMsTUFBTSxnQkFBZ0IsR0FBdUIsRUFBRTtJQUMvQyxZQUFBLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUF5QztnQkFDekQsSUFBSSxJQUFJLENBQUMsY0FBYztvQkFDckIsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDdkQsSUFBSSxDQUFDLGNBQWMsRUFDbkJMLGVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUNwQztnQkFFSCxJQUFJLElBQUksQ0FBQyxlQUFlO29CQUN0QixnQkFBZ0IsQ0FBQyxLQUFLLEdBQUc7SUFDdkIsb0JBQUEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO3FCQUN2RDtJQUVWLFlBQUEsT0FBTyxJQUFJLGdCQUFnQixDQUN6QixJQUFJLENBQUMsT0FBYyxFQUNuQixnQkFBdUIsRUFDdkIsSUFBSSxFQUNKLElBQUksQ0FBQyxZQUFZLENBQ2xCO1lBQ0g7WUFBRSxPQUFPLENBQU0sRUFBRTtJQUNmLFlBQUEsTUFBTSxJQUFJRCwwQkFBYSxDQUFDLENBQUMsQ0FBQztZQUM1QjtRQUNGO0lBRUE7Ozs7Ozs7SUFPRztRQUNLLGFBQWEsQ0FBQyxDQUFNLEVBQUUsTUFBZSxFQUFBO1lBQzNDLElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssV0FBVyxFQUFFO0lBQ3BDLFlBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JFO0lBQ0EsUUFBQSxPQUFPLENBQUM7UUFDVjtJQUVBOzs7Ozs7SUFNRztRQUNNLE1BQU0sR0FBRyxDQUFJLFFBQXlCLEVBQUE7SUFDN0MsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDLFFBQUEsR0FBRyxDQUFDLEtBQUssQ0FDUCxDQUFBLHFCQUFBLEVBQXlCLFFBQVEsQ0FBQyxLQUEwQyxDQUFDLE1BQU0sRUFBRSxDQUFBLENBQUUsQ0FDeEY7SUFFRCxRQUFBLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzs7WUFFdEUsUUFBUSxDQUFDLEtBQUssR0FDWixRQUFRLENBQUMsS0FDVixDQUFDLGNBQWMsQ0FBQztJQUNmLFlBQUEsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixZQUFBLGVBQWUsRUFBRTtJQUNmLGdCQUFBLFNBQVMsRUFBRSxRQUFRO0lBQ3BCLGFBQUE7SUFDRixTQUFBLENBQVE7O1lBRVQsUUFBUSxNQUNOLFFBQVEsQ0FBQyxLQUNWLENBQUMsT0FBTyxFQUFFO1FBQ2I7UUFFVSwyQkFBMkIsQ0FDbkMsU0FBdUIsRUFDdkIsU0FBaUIsRUFDakIsT0FBTyxHQUFHLENBQUMsRUFDWCxhQUF3QyxFQUFBO0lBRXhDLFFBQUEsTUFBTSxJQUFJQSwwQkFBYSxDQUFDLGlCQUFpQixDQUFDO1FBQzVDO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThCRztRQUNPLGNBQWMsQ0FDdEIsU0FBdUIsRUFDdkIsU0FBaUIsRUFDakIsRUFBMkIsRUFDM0IsT0FBTyxHQUFHLENBQUMsRUFDWCxhQUF3QyxFQUFBO1lBRXhDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLFNBSXZDO0lBRUQsUUFBQSxTQUFTLEtBQUssR0FBQTtJQUNaLFlBQUEsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ2hELFlBQUEsTUFBTSxPQUFPLEdBQUcsQ0FBQSxFQUFHLEtBQUssQ0FBQSxFQUFHLE9BQU8sRUFBRTtnQkFDcEMsTUFBTSxRQUFRLEdBQUcsQ0FBQSxFQUFHLFNBQVMsQ0FBQSxDQUFBLEVBQUksS0FBSyxDQUFBLENBQUEsRUFBSSxXQUFXLENBQUEsRUFBQSxFQUFLLE9BQU8sQ0FBQSxDQUFFO0lBQ25FLFlBQUEsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsQ0FBQyxPQUFPLEdBQUcsVUFBVTtpQkFDdEI7Z0JBQ0QsUUFBUSxhQUFhO29CQUNuQixLQUFLTyxrQkFBYSxDQUFDLEdBQUc7d0JBQ3BCLE9BQU87NEJBQ0wsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBUTt5QkFDNUM7b0JBQ0gsS0FBS0Esa0JBQWEsQ0FBQyxFQUFFO3dCQUNuQixPQUFPOzRCQUNMLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQVE7eUJBQzNDO29CQUNILEtBQUtDLGFBQVEsQ0FBQyxHQUFHO0lBQ2Ysb0JBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztJQUNqRCxnQkFBQTt3QkFDRSxPQUFPOzRCQUNMLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQVE7eUJBQ3pDOztZQUVQO1lBRUEsSUFDRSxDQUFDRCxrQkFBYSxDQUFDLEdBQUcsRUFBRUEsa0JBQWEsQ0FBQyxFQUFFLEVBQUVDLGFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQ3pELFFBQXlCLENBQzFCLEtBQUssRUFBRSxFQUNSO2dCQUNBLE9BQU8sS0FBSyxFQUFFO1lBQ2hCOztJQUVLLGFBQUEsSUFBSSxRQUFRLEtBQUtBLGFBQVEsQ0FBQyxHQUFHLEVBQUU7SUFDbEMsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDO1lBQ2pEOztpQkFFSztJQUNILFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBcUIsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTztJQUNyRSxpQkFBQSxLQUF5QztJQUM1QyxZQUFBLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FDeEIsVUFBVSxFQUNWLFNBQVMsRUFDVCxFQUFFLEVBQ0YsRUFBRSxPQUFPLEVBQ1QsUUFBUSxDQUNUO1lBQ0g7UUFDRjtJQUNEOztJQ3BVRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBOEJHO0lBQ0csTUFBTyxlQUFnQixTQUFRQyxhQUFRLENBQUE7UUFDM0MsV0FBQSxDQUNFLE9BQXdCLEVBQ2QsT0FBdUIsRUFBQTtZQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBRkosSUFBQSxDQUFBLE9BQU8sR0FBUCxPQUFPO1FBR25CO0lBRUE7OztJQUdHO0lBQ0gsSUFBQSxNQUFNLE9BQU8sR0FBQTtJQUNYLFFBQUEsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPO0lBQzdCLFFBQUEsSUFBSTtnQkFDRixNQUFNLEdBQUcsR0FBUSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ3RDLGdCQUFBLEtBQUssRUFBRSxDQUFBLCtFQUFBLENBQWlGO29CQUN4RixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDZixhQUFBLENBQUM7Z0JBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFnQyxDQUFDO1lBQ3pEO1lBQUUsT0FBTyxDQUFVLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQzNDO1FBQ0Y7SUFFQTs7Ozs7SUFLRztJQUNLLElBQUEsS0FBSyxDQUFDLEtBQStCLEVBQUE7SUFDM0MsUUFBQSxPQUFPQSxhQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUN0RDtJQUVBOzs7Ozs7O0lBT0c7SUFDSyxJQUFBLE1BQU0sU0FBUyxDQUNyQixPQUFpQyxFQUNqQyxLQUFjLEVBQUE7SUFFZCxRQUFBLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTztJQUMzRCxRQUFBLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUTtnQkFDeEMsTUFBTSxJQUFJVCwwQkFBYSxDQUNyQixDQUFBLGtDQUFBLEVBQXFDLElBQUksQ0FBQSxNQUFBLEVBQVMsS0FBSyxDQUFBLENBQUUsQ0FDMUQ7SUFDSCxRQUFBLElBQUksSUFBOEI7SUFDbEMsUUFBQSxJQUFJO0lBQ0YsWUFBQSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1QixnQkFBQSxLQUFLLEVBQUUsQ0FBQSxtQkFBQSxDQUFxQjtvQkFDNUIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2YsYUFBQSxDQUFDO1lBQ0o7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLElBQUksRUFBRSxDQUFDLFlBQVlVLDBCQUFhLENBQUM7SUFBRSxnQkFBQSxNQUFNLENBQUM7SUFDMUMsWUFBQSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1QixnQkFBQSxLQUFLLEVBQUUsQ0FBQSx3RUFBQSxDQUEwRTtJQUNqRixnQkFBQSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQztJQUN2QyxhQUFBLENBQUM7WUFDSjtJQUVBLFFBQUEsT0FBTyxJQUFnQztRQUN6QztJQUVBOzs7OztJQUtHO0lBQ0gsSUFBQSxNQUFNLElBQUksR0FBQTtJQUNSLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFO0lBQ3BDLFFBQUEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNoQztRQUVBLE1BQU0sS0FBSyxDQUFDLEtBQWEsRUFBQTtZQUN2QixNQUFNLE9BQU8sSUFBSSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBVztJQUNoRCxRQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQVc7SUFDbEUsUUFBQSxNQUFNLElBQUksR0FBNkIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUN6RCxPQUFPLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQVksR0FBRyxXQUFXLENBQzVDO1lBQ0QsTUFBTSxLQUFLLEdBQWlDLEVBQUU7SUFDOUMsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3ZDLFlBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFZLENBQUM7WUFDL0Q7WUFDQSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUk7SUFDbEMsWUFBQSxNQUFNLElBQUlWLDBCQUFhLENBQUMseUJBQXlCLENBQUM7SUFDcEQsUUFBQSxPQUFPLEtBQUs7UUFDZDtJQUNEOztJQ3hIRDs7Ozs7Ozs7O0lBU0c7SUFDSCxTQUFTLGlCQUFpQixDQUN4QixJQUFjLEVBQ2QsU0FBMEIsRUFDMUIsWUFBdUIsRUFDdkIsU0FBUyxHQUFHVyw2QkFBZ0IsRUFBQTtRQUU1QixPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQUMsS0FBSyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxRQUFBLElBQW9CLEVBQUUsQ0FBQztJQUN2QixRQUFBLElBQThCLEVBQUUsQ0FBQztJQUNqQyxRQUFBLFdBQVcsQ0FBQyxLQUFLO0lBQ2xCLEtBQUEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ25CO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE4Q0c7SUFDRyxTQUFVLGVBQWUsQ0FDN0IsTUFBd0IsRUFBQTtRQUV4QixNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBaUMsRUFBRTtRQUNoRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUc7SUFDbkIsUUFBQSxLQUFLLEVBQUUsQ0FBQSxDQUFFO0lBQ1QsUUFBQSxNQUFNLEVBQUUsRUFBRTtTQUNYO0lBRUQsSUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFJO1lBQ25CLE1BQU0sR0FBRyxHQUFrQ1YsZUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDaEUsUUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFJO2dCQUMzQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFL0IsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFJLEtBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sU0FBUyxHQUFHQSxlQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyQyxZQUFBLFlBQVksR0FBRyxZQUFZLElBQUksRUFBRTtJQUVqQyxZQUFBLFNBQVMsUUFBUSxHQUFBO0lBQ2YsZ0JBQUEsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBSSxZQUFtQixFQUFFRSxvQkFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDckVRLDZCQUFnQixDQUNqQjtvQkFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7SUFDZCxvQkFBQSxLQUFLLEVBQUUsQ0FBQSwyQkFBQSxDQUE2QjtJQUNwQyxvQkFBQSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQztxQkFDL0I7Z0JBQ0g7SUFFQSxZQUFBLFFBQVEsRUFBRTtJQUNaLFFBQUEsQ0FBQyxDQUFDO0lBQ0osSUFBQSxDQUFDLENBQUM7SUFDRixJQUFBLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDL0I7O0lDbEdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNDRztBQUVVQyw2QkFBaUIsR0FBdkIsTUFBTSxpQkFBbUMsU0FBUVgsZUFNdkQsQ0FBQTtJQUNDLElBQUEsV0FBQSxDQUNFLE9BS0MsRUFDRCxLQUFxQixFQUNyQixHQUFHLElBQVcsRUFBQTtZQUVkLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2hDO0lBRUE7Ozs7SUFJRztRQUNILFlBQVksR0FBQTtJQUNWLFFBQUEsTUFBTSxJQUFJLEdBQUksSUFBSSxDQUFDLE9BQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDTCw2QkFBUyxDQUFDLE1BQWlDLENBQUMsQ0FDeEQ7SUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFO1FBQ2xDO0lBRUE7Ozs7OztJQU1HO0lBQ00sSUFBQSxNQUFNLE1BQU0sQ0FBQyxLQUFRLEVBQUUsR0FBRyxJQUFXLEVBQUE7O1lBRTVDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3BFLFFBQUEsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQy9CLElBQUksQ0FBQyxLQUFhLENBQUNBLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLEVBQUUsRUFDRixLQUFZLEVBQ1osSUFBSSxDQUFDLEVBQUUsRUFDUCxHQUFHLElBQUksQ0FDUjtZQUNELElBQUksQ0FBQyxHQUFzQyxTQUFTO1lBQ3BELElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBMEI7SUFDbkUsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN4QixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsRUFBRSxFQUNQLEVBQUUsRUFDRixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQzNEO1FBQ0g7SUFFQTs7Ozs7O0lBTUc7UUFDTSxNQUFNLElBQUksQ0FDakIsRUFBNEI7O0lBRTVCLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM5QixJQUFJLENBQUMsS0FBYSxDQUFDQSw2QkFBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxFQUFZLEVBQ1osSUFBSSxDQUFDLEVBQVksQ0FDbEI7SUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0Q7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVcsRUFBQTs7WUFFNUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDcEUsUUFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDL0IsSUFBSSxDQUFDLEtBQWEsQ0FBQ0EsNkJBQVMsQ0FBQyxNQUFNLENBQVEsRUFDNUMsRUFBRSxFQUNGLEtBQUssRUFDTCxJQUFJLENBQUMsRUFBRSxFQUNQLEdBQUcsSUFBSSxDQUNSO1lBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7UUFDM0U7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sTUFBTSxDQUNuQixFQUE0QixFQUM1QixHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2hDLElBQUksQ0FBQyxLQUFhLENBQUNBLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLEVBQVksRUFDWixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUjtJQUNELFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMzRDtJQUVBOzs7Ozs7SUFNRztJQUNnQixJQUFBLE1BQU0sZUFBZSxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVcsRUFBQTtZQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNaUIsb0JBQU8sQ0FBQyxJQUFJLENBQ3BDQywwQkFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEI7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFFeEQsUUFBQSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFJO2dCQUNyQixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyQixZQUFBLE1BQU1DLGdDQUFtQixDQUN2QixJQUFJLEVBQ0osV0FBVyxDQUFDLE9BQU8sRUFDbkIsQ0FBQyxFQUNERCwwQkFBYSxDQUFDLE1BQU0sRUFDcEJBLDBCQUFhLENBQUMsRUFBRSxDQUNqQjtJQUNELFlBQUEsT0FBTyxDQUFDO1lBQ1YsQ0FBQyxDQUFDLENBQ0g7WUFDRCxNQUFNLE1BQU0sR0FBRztpQkFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQ0wsQ0FBQyxDQUFDLFNBQVMsQ0FDVCxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSxDQUFDLENBQ2xFO2lCQUVGLE1BQU0sQ0FBQyxDQUFDLEtBQXlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSTtJQUMxQyxZQUFBLElBQUksQ0FBQztvQkFDSCxLQUFLO3dCQUNILE9BQU8sS0FBSyxLQUFLOzhCQUNiLEtBQUssR0FBRyxDQUFBLEtBQUEsRUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBOzhCQUNsQyxNQUFNLENBQUMsQ0FBQSxFQUFBLEVBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBLENBQUU7SUFDbEMsWUFBQSxPQUFPLEtBQUs7WUFDZCxDQUFDLEVBQUUsU0FBUyxDQUFDO0lBQ2YsUUFBQSxJQUFJLE1BQU07SUFBRSxZQUFBLE1BQU0sSUFBSUUsNEJBQWUsQ0FBQyxNQUFNLENBQUM7WUFDN0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDdEM7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sU0FBUyxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVcsRUFBQTtZQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07SUFBRSxZQUFBLE9BQU8sTUFBTTtZQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEUsUUFBQSxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckMsUUFBQSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDM0MsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ25DLElBQUksQ0FBQyxLQUFhLENBQUNwQiw2QkFBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxHQUEwQixFQUMxQixNQUFNLEVBQ04sR0FBRyxJQUFJLENBQ1I7SUFDRCxRQUFBLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBb0IsQ0FBQyxDQUN2RTtRQUNIO0lBRUE7Ozs7OztJQU1HO0lBQ00sSUFBQSxNQUFNLE9BQU8sQ0FDcEIsSUFBeUIsRUFDekIsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUN2QyxJQUFJLENBQUMsS0FBYSxDQUFDQSw2QkFBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxJQUFJLEVBQ0osSUFBSSxDQUFDLEVBQVksRUFDakIsR0FBRyxJQUFJLENBQ1I7SUFDRCxRQUFBLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQXNCLEVBQUUsQ0FBUyxLQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRDtRQUNIO0lBRUE7Ozs7OztJQU1HO0lBQ00sSUFBQSxNQUFNLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUE7WUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDekMsSUFBSSxDQUFDLEtBQWEsQ0FBQ0EsNkJBQVMsQ0FBQyxNQUFNLENBQVEsRUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3hCLE1BQU0sRUFDTixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUjtJQUNELFFBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEtBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUMzRDtRQUNIO0lBRUE7Ozs7OztJQU1HO0lBQ00sSUFBQSxNQUFNLFNBQVMsQ0FDdEIsSUFBeUIsRUFDekIsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN6QyxJQUFJLENBQUMsS0FBYSxDQUFDQSw2QkFBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxJQUFJLEVBQ0osSUFBSSxDQUFDLEVBQVksRUFDakIsR0FBRyxJQUFJLENBQ1I7SUFDRCxRQUFBLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQXNCLEVBQUUsQ0FBUyxLQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRDtRQUNIOztBQTlQV2dCLDZCQUFpQixHQUFBSyxnQkFBQSxDQUFBO1FBRDdCQyxTQUFJLENBQUMsY0FBYyxDQUFDOytDQVNSQyxZQUFPLEVBQUEsTUFBQSxFQUFBLE1BQUEsQ0FBQTtJQVJQLENBQUEsRUFBQVAseUJBQWlCLENBK1A3Qjs7SUM5U0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJCRztJQUVJLElBQU0sc0JBQXNCLEdBQTVCLE1BQU0sc0JBQXNCLENBQUE7SUFDakMsSUFBQSxXQUFBLENBQ3FCLE9BSVYsRUFBQTtZQUpVLElBQUEsQ0FBQSxPQUFPLEdBQVAsT0FBTztRQUt6QjtJQUVIOzs7OztJQUtHO0lBQ0gsSUFBQSxXQUFXLENBQUMsS0FBdUIsRUFBQTtJQUNqQyxRQUFBLE1BQU0sV0FBVyxHQUFHUix5QkFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDNUQsUUFBQSxJQUFJLENBQUMsV0FBVztJQUNkLFlBQUEsTUFBTSxJQUFJSiwwQkFBYSxDQUNyQixDQUFBLDhCQUFBLEVBQWlDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQSxDQUFFLENBQ2pFO1lBQ0gsTUFBTSxTQUFTLEdBQUdDLGVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBRS9DLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUVhLDBCQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQWUsQ0FBQyxDQUFDO1FBQ3hFO0lBRUE7Ozs7O0lBS0c7SUFDSCxJQUFBLFdBQVcsQ0FBQyxLQUF1QixFQUFBO0lBQ2pDLFFBQUEsTUFBTSxXQUFXLEdBQUdWLHlCQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUM1RCxRQUFBLElBQUksQ0FBQyxXQUFXO0lBQ2QsWUFBQSxNQUFNLElBQUlKLDBCQUFhLENBQ3JCLENBQUEsOEJBQUEsRUFBaUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FDakU7WUFDSCxNQUFNLFNBQVMsR0FBR0MsZUFBVSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFFL0MsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRWEsMEJBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBZSxDQUFDLENBQUM7UUFDeEU7SUFFQTs7Ozs7SUFLRztJQUNILElBQUEsV0FBVyxDQUFDLEtBQXVCLEVBQUE7SUFDakMsUUFBQSxNQUFNLFdBQVcsR0FBR1YseUJBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ3BFLFFBQUEsSUFBSSxDQUFDLFdBQVc7SUFDZCxZQUFBLE1BQU0sSUFBSUosMEJBQWEsQ0FDckIsQ0FBQSw4QkFBQSxFQUFpQyxLQUFLLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUEsQ0FBRSxDQUN6RTtZQUNILE1BQU0sU0FBUyxHQUFHQyxlQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUUvQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFYSwwQkFBYSxDQUFDLE1BQU0sRUFBRTtJQUNsRCxZQUFBLEtBQUssQ0FBQyxNQUFjLENBQUMsSUFBSSxDQUFRO0lBQ25DLFNBQUEsQ0FBQztRQUNKO0tBQ0Q7SUE3RFksc0JBQXNCLEdBQUFHLGdCQUFBLENBQUE7SUFEbEMsSUFBQUcsdUJBQWUsRUFBRTs7SUFDTCxDQUFBLEVBQUEsc0JBQXNCLENBNkRsQzs7SUMvRkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBMEJHO0lBQ0csTUFBTyxlQUFnQixTQUFRQyxhQUEyQixDQUFBO0lBSTlELElBQUEsV0FBQSxDQUFvQixVQUFVLElBQUksRUFBQTtJQUNoQyxRQUFBLEtBQUssRUFBRTtZQURXLElBQUEsQ0FBQSxPQUFPLEdBQVAsT0FBTztZQUZuQixJQUFBLENBQUEsY0FBYyxHQUFXLENBQUM7UUFJbEM7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBa0JHO0lBQ08sSUFBQSxNQUFNLG1CQUFtQixDQUNqQyxLQUFhLEVBQ2IsU0FBd0IsRUFDeEIsR0FBYSxFQUFBO0lBRWIsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEQsUUFBQSxJQUFJOztnQkFFRixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDbEQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBLCtCQUFBLEVBQWtDLFNBQVMsQ0FBQSxLQUFBLEVBQVEsS0FBSyxDQUFBLENBQUUsQ0FBQztJQUN2RSxZQUFBLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUEsQ0FBRSxDQUFDO1lBQzFCO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUEsQ0FBRSxDQUFDO1lBQ25EO1FBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXlCRztJQUNnQixJQUFBLE1BQU0sVUFBVSxHQUFBO0lBQ2pDLFFBQUEsZUFBZSxrQkFBa0IsR0FBQTtnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0lBQ2pDLGdCQUFBLE1BQU0sSUFBSXJCLDBCQUFhLENBQUMsQ0FBQSx1Q0FBQSxDQUF5QyxDQUFDO2dCQUNwRTtJQUVBLFlBQUEsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQXlCO0lBRTlDLFlBQUEsSUFBSTtJQUNGLGdCQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWE7SUFDbkMsb0JBQUEsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtvQkFFdkMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNqQyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDaEU7Z0JBQ0g7Z0JBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsZ0JBQUEsTUFBTSxJQUFJQSwwQkFBYSxDQUFDLENBQVUsQ0FBQztnQkFDckM7WUFDRjtZQUVBO2lCQUNHLElBQUksQ0FBQyxJQUFJO2lCQUNULElBQUksQ0FBQyxNQUFLO0lBQ1QsWUFBQSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBLG1DQUFBLENBQXFDLENBQUM7SUFDdEQsUUFBQSxDQUFDO0lBQ0EsYUFBQSxLQUFLLENBQUMsQ0FBQyxDQUFVLEtBQUk7SUFDcEIsWUFBQSxNQUFNLElBQUlBLDBCQUFhLENBQ3JCLGlEQUFpRCxDQUFDLENBQUEsQ0FBRSxDQUNyRDtJQUNILFFBQUEsQ0FBQyxDQUFDO1FBQ047SUFFQTs7SUFFRztRQUNJLE9BQU8sR0FBQTs7Ozs7O1FBTWQ7SUFDRDs7YUMxSWUsbUJBQW1CLENBQ2pDLE1BQVcsRUFDWCxRQUFnQixFQUNoQixPQUE2QixFQUFBO1FBRTdCLElBQUksS0FBSyxHQUFXLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQXFCLEVBQUUsQ0FBQyxLQUFJO1lBQ3ZELEtBQUssR0FBRyxDQUFDO1lBQ1QsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsWUFBWSxLQUFLLFFBQVE7SUFDM0QsSUFBQSxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07SUFBRSxRQUFBLE9BQU8sRUFBRTtJQUMzQixJQUFBLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDM0MsQ0FBQyxLQUEwQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFJO1lBQ3pDLFFBQVEsR0FBRztJQUNULFlBQUEsS0FBSyxVQUFVO0lBQ2IsZ0JBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUc7b0JBQ2hCO2dCQUNGLEtBQUtzQixrQ0FBYyxDQUFDLElBQUk7O29CQUV0QjtJQUNGLFlBQUE7SUFDRSxnQkFBQSxNQUFNLElBQUlDLHFCQUFnQixDQUN4QixzQ0FBc0MsR0FBRyxDQUFBLENBQUUsQ0FDNUM7O0lBRUwsUUFBQSxPQUFPLEtBQUs7UUFDZCxDQUFDLEVBQ0QsRUFBRSxDQUNIO0lBQ0g7YUFFZ0Isb0JBQW9CLENBQ2xDLE1BQVcsRUFDWCxRQUFnQixFQUNoQixPQUE2QixFQUM3QixPQUFBLEdBQWUsRUFBRSxFQUNqQixJQUFBLEdBQWUsU0FBUyxFQUN4QixTQUFpQyxFQUNqQyxPQUE2QixFQUFBO1FBRTdCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3pCLENBQUMsQ0FBcUIsS0FDcEIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxRQUFRLENBQ3JEO1FBRUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxDQUF1QixLQUN0QixDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FDckQ7UUFFRCxJQUFJLE9BQU8sRUFBRTtZQUNYLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3pCLENBQUMsQ0FBb0IsS0FDbkIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUssQ0FBQyxDQUFDLE9BQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUNwRTtJQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSTtJQUNqQixZQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUMzQixRQUFBLENBQUMsQ0FBQztRQUNKO0lBRUEsSUFBQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNqQixNQUFNLElBQUl2QiwwQkFBYSxDQUNyQixDQUFBLHFCQUFBLEVBQXdCLFFBQVEsQ0FBQSx5QkFBQSxFQUE0QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBRSxDQUM1RztJQUNILElBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDakIsTUFBTSxJQUFJQSwwQkFBYSxDQUNyQixDQUFBLHVCQUFBLEVBQTBCLFFBQVEsQ0FBQSx5QkFBQSxFQUE0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBRSxDQUMzRztJQUNILElBQUEsSUFBSSxNQUE2RDtRQUVqRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ1gsWUFBQSxNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQUEsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBQSxJQUFJLEVBQUUsSUFBSTtJQUNWLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDSyxTQUFBLENBQUM7WUFDeEI7UUFDRjtJQUFPLFNBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7SUFDdkIsUUFBQSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLElBQUksS0FBSyxTQUFTO0lBQ3BCLFlBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0lBQ3BDLGdCQUFBLEtBQUssRUFBRSxJQUFJO0lBQ1gsZ0JBQUEsUUFBUSxFQUFFLElBQUk7SUFDZCxnQkFBQSxVQUFVLEVBQUUsSUFBSTtJQUNoQixnQkFBQSxZQUFZLEVBQUUsSUFBSTtJQUNuQixhQUFBLENBQUM7UUFDTjtRQUVBLElBQUksSUFBSSxDQUFDLE1BQU07SUFDYixRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxLQUEwQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFJO2dCQUN6QyxRQUFRLEdBQUc7SUFDVCxnQkFBQSxLQUFLLFVBQVU7SUFDYixvQkFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRzt3QkFDaEI7OztJQUlKLFlBQUEsT0FBTyxLQUFLO1lBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FDSDtJQUVILElBQUEsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTFCLElBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFO1lBQ3ZDLEtBQUssRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtJQUN4QyxRQUFBLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBQSxVQUFVLEVBQUUsSUFBSTtJQUNoQixRQUFBLFlBQVksRUFBRSxJQUFJO0lBQ25CLEtBQUEsQ0FBQztJQUNKOztJQ2FBOzs7SUFHRztJQUNHLFNBQVUsTUFBTSxDQUNwQixhQUcyQyxFQUMzQyxPQUErQyxFQUFBO1FBRS9DLE9BQU8sVUFBVSxNQUFjLEVBQUUsWUFBaUIsRUFBQTs7SUFFaEQsUUFBQSxJQUFJLElBQTRCO1lBQ2hDLElBQ0UsT0FBTyxhQUFhLEtBQUssUUFBUTtJQUNqQyxZQUFBLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFDbkM7Z0JBQ0EsSUFBSSxHQUFlLGFBQWE7WUFDbEM7aUJBQU8sSUFBSSxhQUFhLEVBQUU7Z0JBQ3hCLE9BQU8sR0FBa0IsYUFBYTtJQUN0QyxZQUFBLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSTtZQUMzQjtJQUNBLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQW1COztJQUczQyxRQUFBLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sSUFBSyxPQUFlLENBQUM7a0JBQ3ZCLE9BQWUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxZQUFZO2tCQUNoRSxTQUFTO1lBQ2YsSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7O2dCQUU5QixJQUFJLEdBQUcsbUJBQW1COztJQUc1QixRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7SUFBRSxZQUFBLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSTs7WUFHOUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO0lBQ2xELFlBQUEsT0FBTyxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsS0FBSyxNQUFNLEdBQUcsUUFBUSxHQUFHLFFBQVE7SUFFM0UsUUFBQSxJQUFJLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFBRTs7SUFFdkMsWUFBQXdCLDhCQUFzQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDdEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0lBQzFCLGdCQUFBLFlBQVksRUFBRSxZQUFZO29CQUMxQixPQUFPLEVBQUUsbUJBQW1CLEtBQUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSTtJQUNoRSxnQkFBQSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTOztJQUVqRSxnQkFBQSxJQUFJLEVBQUUsYUFBeUM7SUFDeEIsYUFBQSxDQUFDO1lBQzVCO2lCQUFPOzs7Z0JBSUwsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO0lBQ2YsZ0JBQUEsTUFBTSxJQUFJQyxnQ0FBd0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDOztJQUcxRCxZQUFBLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJO0lBQ3pCLGdCQUFBRCw4QkFBc0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVzt3QkFDMUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ3hCLGlCQUFBLENBQUM7SUFFSixZQUFBLE1BQU0sUUFBUSxHQUFHQSw4QkFBc0IsRUFBRTtJQUN6QyxZQUFBLG9CQUFvQixDQUNsQixNQUFNLENBQUMsV0FBVyxFQUNsQixZQUFZLEVBQ1osUUFBUSxDQUFDLE9BQU8sRUFDaEIsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLENBQUMsU0FBUyxFQUNsQixPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUM5QztJQUVELFlBQUEsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQ3JCLGdCQUFBQSw4QkFBc0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ3hDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVztJQUMxQixvQkFBQSxZQUFZLEVBQUUsWUFBWTtJQUMxQixvQkFBQSxRQUFRLEVBQ04sT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLOzhCQUN6QixPQUFPLENBQUM7SUFDViwwQkFBRSxXQUFXO0lBQ08saUJBQUEsQ0FBQztnQkFDN0I7WUFDRjtJQUNGLElBQUEsQ0FBQztJQUNIOztJQzFOTSxTQUFVLGdCQUFnQixDQUFDLE9BQXVCLEVBQUE7UUFDdEQsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBO0lBQzdDLFFBQUEsTUFBTSxRQUFRLEdBQUdBLDhCQUFzQixFQUFFO1lBQ3pDLG9CQUFvQixDQUNsQixNQUFNLENBQUMsV0FBVyxFQUNsQixZQUFZLEVBQ1osUUFBUSxDQUFDLE9BQU8sRUFDTCxFQUFFLEVBQ2IsWUFBWSxFQUNaLFFBQVEsQ0FBQyxTQUFTLENBQ25CO0lBQ0gsSUFBQSxDQUFDO0lBQ0g7O0lDWk0sU0FBVSxnQkFBZ0IsQ0FBQyxPQUF1QixFQUFBO1FBQ3RELE9BQU8sVUFBVSxNQUFXLEVBQUUsWUFBaUIsRUFBQTtJQUM3QyxRQUFBLE1BQU0sUUFBUSxHQUFHQSw4QkFBc0IsRUFBRTtZQUN6QyxvQkFBb0IsQ0FDbEIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsWUFBWSxFQUNaLFFBQVEsQ0FBQyxPQUFPLEVBQ0wsRUFBRSxFQUNiLFlBQVksRUFDWixRQUFRLENBQUMsU0FBUyxDQUNuQjtJQUNILElBQUEsQ0FBQztJQUNIOztVQ2ZhLFdBQVcsQ0FBQTtJQUN0Qjs7OztJQUlHO1FBQ0gsT0FBTyxRQUFRLENBQUMsR0FBUSxFQUFBO1lBQ3RCLE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQ2hEO0lBRUE7Ozs7SUFJRztRQUNILE9BQU8sZ0JBQWdCLENBQUMsR0FBUSxFQUFBO0lBQzlCLFFBQUEsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUztRQUM3RTtJQWtDQTs7Ozs7SUFLRztJQUNILElBQUEsT0FBTyxNQUFNLENBQUMsTUFBYyxFQUFFLEdBQUcsT0FBYyxFQUFBO0lBQzdDLFFBQUEsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQzVCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNwRCxNQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDdEM7WUFDRjtRQUNGO0lBY0Q7O0lDckREOzs7SUFHRzthQUNhLFFBQVEsQ0FDdEIsb0JBQThELEVBQzlELG9CQUFzRSxFQUN0RSxPQUF5QixFQUFBOztJQUd6QixJQUFBLElBQUksbUJBQWtEO0lBQ3RELElBQUEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDOUMsT0FBTyxHQUFvQixvQkFBb0I7UUFDakQ7YUFBTztZQUNMLG1CQUFtQixHQUFHLG9CQUEyQjtRQUNuRDtRQUVBLE9BQU8sVUFBVSxNQUFXLEVBQUUsWUFBaUIsRUFBQTtJQUM3QyxRQUFBLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sR0FBRyxFQUFxQjs7SUFHN0MsUUFBQSxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7WUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUssT0FBZSxDQUFDLFdBQVcsRUFBRTs7SUFFdEQsWUFBQSxNQUFNLGFBQWEsR0FBSSxPQUFlLENBQUMsV0FBVyxDQUNoRCxhQUFhLEVBQ2IsTUFBTSxFQUNOLFlBQVksQ0FDYjtJQUNELFlBQUEsSUFDRSxhQUFhO0lBQ2IsZ0JBQUEsT0FBTyxhQUFhLENBQUMsSUFBSSxLQUFLLFFBQVE7SUFDdEMsZ0JBQUEsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTO29CQUU5QyxNQUFNLEdBQUcsSUFBSTtZQUNqQjtJQUVBLFFBQUEsTUFBTSxJQUFJLEdBQUdBLDhCQUFzQixFQUFFO1lBQ3JDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUNyQixPQUFPLEVBQ1AsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNwRTtJQUNELFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVztJQUMxQixZQUFBLFlBQVksRUFBRSxZQUFZOztJQUUxQixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxZQUFZLEVBQUUsWUFBWTtJQUMxQixZQUFBLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsWUFBQSxtQkFBbUIsRUFBRSxtQkFBbUI7SUFDeEMsWUFBQSxPQUFPLEVBQUUsT0FBTztJQUNPLFNBQUEsQ0FBQztJQUM1QixJQUFBLENBQUM7SUFDSDs7SUMxRUE7Ozs7SUFJRzthQUNhLFNBQVMsQ0FDdkIsb0JBQThELEVBQzlELFdBQTBDLEVBQzFDLE9BQXlCLEVBQUE7UUFFekIsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBO0lBQzdDLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQXFCOztZQUc3QyxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJO1lBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFLLE9BQWUsQ0FBQyxXQUFXLEVBQUU7O0lBRXRELFlBQUEsTUFBTSxhQUFhLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FDaEQsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLENBQ2I7SUFDRCxZQUFBLElBQ0UsYUFBYTtJQUNiLGdCQUFBLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RDLGdCQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUztvQkFFOUMsTUFBTSxHQUFHLElBQUk7WUFDakI7SUFFQSxRQUFBLE1BQU0sSUFBSSxHQUFHQSw4QkFBc0IsRUFBRTtZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDckIsT0FBTyxFQUNQLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEU7SUFDRCxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDMUIsWUFBQSxZQUFZLEVBQUUsWUFBWTs7SUFFMUIsWUFBQSxNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQUEsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBQSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLFlBQUEsbUJBQW1CLEVBQUUsV0FBVztJQUNoQyxZQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ08sU0FBQSxDQUFDO0lBQzVCLElBQUEsQ0FBQztJQUNIOztJQ3hCQTs7OztJQUlHO2FBQ2EsU0FBUyxDQUN2QixvQkFBOEQsRUFDOUQsb0JBQXNFLEVBQ3RFLE9BQXlCLEVBQUE7O0lBR3pCLElBQUEsSUFBSSxtQkFBa0Q7SUFDdEQsSUFBQSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUM5QyxPQUFPLEdBQW9CLG9CQUFvQjtRQUNqRDthQUFPO1lBQ0wsbUJBQW1CLEdBQUcsb0JBQTJCO1FBQ25EO1FBRUEsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBO0lBQzdDLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQXFCOztZQUc3QyxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJO1lBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFLLE9BQWUsQ0FBQyxXQUFXLEVBQUU7O0lBRXRELFlBQUEsTUFBTSxhQUFhLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FDaEQsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLENBQ2I7SUFDRCxZQUFBLElBQ0UsYUFBYTtJQUNiLGdCQUFBLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RDLGdCQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUztvQkFFOUMsTUFBTSxHQUFHLElBQUk7WUFDakI7SUFFQSxRQUFBLE1BQU0sSUFBSSxHQUFHQSw4QkFBc0IsRUFBRTtZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDckIsT0FBTyxFQUNQLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEU7SUFDRCxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDMUIsWUFBQSxZQUFZLEVBQUUsWUFBWTs7SUFFMUIsWUFBQSxZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLFlBQUEsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDTyxTQUFBLENBQUM7SUFDNUIsSUFBQSxDQUFDO0lBQ0g7O0lDdERBOzs7O0lBSUc7YUFDYSxVQUFVLENBQ3hCLG9CQUE4RCxFQUM5RCxvQkFBc0UsRUFDdEUsT0FBeUIsRUFBQTs7SUFHekIsSUFBQSxJQUFJLG1CQUFrRDtJQUN0RCxJQUFBLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQzlDLE9BQU8sR0FBb0Isb0JBQW9CO1FBQ2pEO2FBQU87WUFDTCxtQkFBbUIsR0FBRyxvQkFBMkI7UUFDbkQ7UUFFQSxPQUFPLFVBQVUsTUFBVyxFQUFFLFlBQWlCLEVBQUE7SUFDN0MsUUFBQSxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLEdBQUcsRUFBcUI7O0lBRzdDLFFBQUEsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJO1lBQ2xDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFLLE9BQWUsQ0FBQyxXQUFXLEVBQUU7O0lBRXRELFlBQUEsTUFBTSxhQUFhLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FDaEQsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLENBQ2I7SUFDRCxZQUFBLElBQ0UsYUFBYTtJQUNiLGdCQUFBLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RDLGdCQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUztvQkFFOUMsTUFBTSxHQUFHLElBQUk7WUFDakI7SUFFQSxRQUFBLE1BQU0sSUFBSSxHQUFHQSw4QkFBc0IsRUFBRTtZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDckIsT0FBTyxFQUNQLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEU7SUFDRCxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDMUIsWUFBQSxZQUFZLEVBQUUsWUFBWTs7SUFFMUIsWUFBQSxZQUFZLEVBQUUsY0FBYztJQUM1QixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLFlBQUEsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDTyxTQUFBLENBQUM7SUFDNUIsSUFBQSxDQUFDO0lBQ0g7O0lDOUJBOzs7O0lBSUc7SUFDRyxTQUFVLHNCQUFzQixDQUNwQyxpQkFPeUMsRUFDekMsWUFHeUMsRUFBQTs7UUFHekMsTUFBTSxPQUFPLEdBQWtCLEVBQUU7SUFDakMsSUFBQSxJQUFJLFFBQXFEO1FBQ3pELElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVE7Z0JBQ3ZDLFFBQVEsR0FBRyxpQkFJRztJQUVoQixRQUFBLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUMzQyxRQUFRLEdBQUcsV0FBVztJQUN0QixZQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDO1lBQzNDO1FBQ0Y7YUFBTztZQUNMLFFBQVEsR0FBRyxXQUFXO1FBQ3hCO0lBQ0EsSUFBQSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0lBQUUsUUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7UUFFNUUsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBOztJQUU3QyxRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUNqQixJQUFJLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxLQUFLLFVBQVUsRUFBRTtJQUN2RCxnQkFBQSxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU07Z0JBQ3ZCO0lBQU8saUJBQUEsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFO0lBQzlCLGdCQUFBLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTTtnQkFDdkI7SUFBTyxpQkFBQSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7SUFDL0IsZ0JBQUEsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLO2dCQUN0QjtZQUNGOztJQUdBLFFBQUEsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJO0lBRXRCLFFBQUEsTUFBTSxRQUFRLEdBQUdBLDhCQUFzQixFQUFFO0lBQ3pDLFFBQUEsb0JBQW9CLENBQ2xCLE1BQU0sQ0FBQyxXQUFXLEVBQ2xCLFlBQVksRUFDWixRQUFRLENBQUMsT0FBTyxFQUNoQixPQUFPLEVBQ1AsU0FBUyxFQUNULFFBQVEsQ0FBQyxTQUFTLENBQ25COztJQUVELFFBQUFBLDhCQUFzQixFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDeEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0lBQzFCLFlBQUEsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBQSxRQUFRLEVBQUUsUUFBUTtJQUNNLFNBQUEsQ0FBQztJQUM3QixJQUFBLENBQUM7SUFDSDs7SUNwRkE7Ozs7SUFJRztJQUNHLFNBQVUsYUFBYSxDQUMzQixhQUFpRCxFQUNqRCxPQUE4QixFQUFBO1FBRTlCLE9BQU8sVUFBVSxNQUFXLEVBQUUsWUFBaUIsRUFBQTs7SUFFN0MsUUFBQSxJQUFJLElBQTRCO1lBQ2hDLElBQ0UsT0FBTyxhQUFhLEtBQUssUUFBUTtJQUNqQyxZQUFBLGFBQWEsS0FBSyxNQUFNO0lBQ3hCLFlBQUEsYUFBYSxLQUFLLE9BQU87Z0JBQ3pCLGFBQWEsS0FBSyxNQUFNLEVBQ3hCO2dCQUNBLElBQUksR0FBRyxhQUEyQjtZQUNwQztpQkFBTztnQkFDTCxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQXdCLGFBQWEsQ0FBQztZQUNsRTtJQUNBLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQTBCOztJQUdsRCxRQUFBLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sSUFBSyxPQUFlLENBQUM7a0JBQ3ZCLE9BQWUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxZQUFZO2tCQUNoRSxTQUFTO1lBQ2YsSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7Z0JBQUUsSUFBSSxHQUFHLG1CQUFtQjs7SUFHNUQsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJO0lBQUUsWUFBQSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUk7O1lBRzlDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtJQUFFLFlBQUEsTUFBTSxJQUFJQyxnQ0FBd0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDOztZQUczRSxJQUFJLE9BQU8sQ0FBQyxRQUFRO0lBQ2xCLFlBQUEsTUFBTSxJQUFJQywwQ0FBa0MsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDOztJQUdwRSxRQUFBLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSTtJQUV0QixRQUFBLE1BQU0sUUFBUSxHQUFHRiw4QkFBc0IsRUFBRTtJQUN6QyxRQUFBLG9CQUFvQixDQUNsQixNQUFNLENBQUMsV0FBVyxFQUNsQixZQUFZLEVBQ1osUUFBUSxDQUFDLE9BQU8sRUFDaEIsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLENBQUMsU0FBUyxDQUNuQjtJQUVELFFBQUEsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQ3JCLFlBQUFBLDhCQUFzQixFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDeEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0lBQzFCLGdCQUFBLFlBQVksRUFBRSxZQUFZO0lBQzFCLGdCQUFBLFFBQVEsRUFDTixPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUs7MEJBQ3pCLE9BQU8sQ0FBQztJQUNWLHNCQUFFLFdBQVc7SUFDTyxhQUFBLENBQUM7WUFDN0I7SUFDRixJQUFBLENBQUM7SUFDSDs7SUNwRkE7OztJQUdHO0lBQ0csU0FBVSxNQUFNLENBQ3BCLGFBQXNDLEVBQ3RDLFlBQTRCLEVBQUE7UUFFNUIsTUFBTSxPQUFPLEdBR1UsRUFBRTtJQUN6QixJQUFBLE1BQU0sSUFBSSxHQUF1RCxPQUFPLENBQUMsSUFBSTtJQUU3RSxJQUFBLE9BQU8sVUFBVSxNQUFNLEVBQUE7SUFDckIsUUFBQSxNQUFNLE1BQU0sR0FBR0EsOEJBQXNCLEVBQUUsQ0FBQyxNQUFNO1lBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDVixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxJQUFJLEVBQUUsSUFBSTtJQUNWLFlBQUEsSUFBSSxFQUFFLFNBQVM7SUFDZixZQUFBLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUztJQUN0RCxZQUFBLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUztJQUNuRCxZQUFBLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUztJQUN6RCxZQUFBLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUztnQkFDbkQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUNoQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7SUFDbEMsWUFBQSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVM7SUFDbEMsU0FBQSxDQUFDO0lBQ3pCLElBQUEsQ0FBQztJQUNIOztJQ3ZDTyxNQUFNLGlCQUFpQixHQUFHLEdBQUc7SUFDN0IsTUFBTSxPQUFPLEdBQUcsT0FBTztJQUU5QixTQUFTLGtCQUFrQixDQUN6QixHQUF3QixFQUN4QixJQUFZLEVBQ1osV0FBbUIsaUJBQWlCLEVBQUE7UUFFcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsR0FBRztJQUVqQixJQUFBLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQ0UsT0FBTyxLQUFLLElBQUk7SUFDaEIsWUFBQSxPQUFPLEtBQUssU0FBUztnQkFDckIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztJQUVuRCxZQUFBLE9BQU8sU0FBUztJQUNsQixRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3hCO0lBRUEsSUFBQSxPQUFPLE9BQU87SUFDaEI7SUFFQSxTQUFTLGtCQUFrQixDQUN6QixHQUF3QixFQUN4QixJQUFZLEVBQ1osS0FBVSxFQUNWLFFBQVEsR0FBRyxpQkFBaUIsRUFBQTtRQUU1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLE9BQU8sR0FBcUIsR0FBRztJQUVuQyxJQUFBLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO0lBQ3RCLFFBQUEsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRTtJQUNyQixZQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CO0lBQ0EsUUFBQSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN4QjtJQUVBLElBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztJQUN4QztVQVlhLFFBQVEsQ0FBQTtpQkFDSixJQUFBLENBQUEsU0FBUyxHQUFrQyxFQUFFLENBQUM7aUJBRXRELElBQUEsQ0FBQSxRQUFRLEdBQUcsaUJBQWlCLENBQUM7aUJBQzdCLElBQUEsQ0FBQSxPQUFPLEdBQUcsT0FBTyxDQUFDO2lCQUNsQixJQUFBLENBQUEsTUFBTSxHQUFZLElBQUksQ0FBQztJQUU5QixJQUFBLFdBQUEsR0FBQSxFQUF1QjtRQUV2QixPQUFPLGFBQWEsQ0FBQyxLQUF1QixFQUFBO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQzVCLFFBQUEsSUFBSSxDQUFDLElBQUk7SUFBRSxZQUFBLE9BQU8sU0FBUztZQUMzQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNyQztRQUVBLE9BQU8sRUFBRSxDQUFDLEtBQXVCLEVBQUE7WUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDNUIsUUFBQSxJQUFJLENBQUMsSUFBSTtJQUFFLFlBQUEsT0FBTyxTQUFTO1lBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDO0lBRUEsSUFBQSxPQUFPLElBQUksQ0FBQyxLQUF1QixFQUFFLElBQVksRUFBQTtZQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQztJQUVBLElBQUEsT0FBTyxLQUFLLENBQUMsS0FBdUIsRUFBRSxJQUFZLEVBQUE7SUFDaEQsUUFBQSxJQUFJLFVBQVUsR0FBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFBLFdBQUEsRUFBYyxJQUFJLENBQUEsQ0FBRSxDQUFDO0lBQzNELFFBQUEsSUFBSSxDQUFDLFVBQVU7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFBLFNBQUEsRUFBWSxJQUFJLENBQUEsY0FBQSxFQUFpQixLQUFLLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FBQztJQUNoRSxRQUFBLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQyxRQUFBLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDbkMsWUFBQSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7SUFDbkIsZ0JBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVU7SUFDbEMsZ0JBQUEsSUFBSSxVQUFVLENBQUNGLGtDQUFjLENBQUMsSUFBSSxDQUFDO0lBQ2pDLG9CQUFBLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQ0Esa0NBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkU7WUFDRjtJQUNBLFFBQUEsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNuQztJQUlBLElBQUEsT0FBTyxHQUFHLENBQUMsS0FBdUIsRUFBRSxHQUFZLEVBQUE7WUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFBRSxZQUFBLE9BQU8sU0FBUztJQUM3QyxRQUFBLElBQUksQ0FBQyxHQUFHO0lBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLFFBQUEsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZFO0lBRUEsSUFBQSxPQUFPLEdBQUcsQ0FBQyxLQUF1QixFQUFFLEdBQVcsRUFBRSxLQUFVLEVBQUE7WUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFBRSxZQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBUztZQUMvRCxJQUNFLElBQUksQ0FBQyxNQUFNO0lBQ1gsWUFBQSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUMxRDtnQkFDQSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO0lBQ3pDLGdCQUFBLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLGdCQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLGdCQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2YsZ0JBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzlCLGFBQUEsQ0FBQztZQUNKO0lBQ0EsUUFBQSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2RTs7SUFHSSxTQUFVLE1BQU0sQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFBO1FBQzVDLE9BQU8sU0FBUyxNQUFNLENBQ3BCLEtBQWE7O1FBRWIsSUFBVTs7UUFFVixVQUErQixFQUFBO1lBRS9CLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBWSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7SUFDeEMsSUFBQSxDQUFDO0lBQ0g7YUFFZ0IsUUFBUSxHQUFBO0lBQ3RCLElBQUEsT0FBTyxTQUFTLFFBQVEsQ0FBQyxLQUFhLEVBQUUsSUFBUyxFQUFBO0lBQy9DLFFBQUEsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQzFCLDZCQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDdEUsUUFBQSxPQUFPLE1BQU0sQ0FBQyxDQUFBLFNBQUEsRUFBWSxJQUFJLENBQUEsQ0FBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDNUQsSUFBQSxDQUFDO0lBQ0g7O0lDcERPLGVBQWUsOEJBQThCLENBS2xELE9BQThCLEVBQzlCLElBQVMsRUFDVCxHQUFZLEVBQ1osS0FBUSxFQUFBO0lBRVIsSUFBQSxJQUFJO1lBQ0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDaEMsUUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBcUI7O1FBRXBDO1FBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsUUFBQSxNQUFNLElBQUlJLDBCQUFhLENBQ3JCLGdFQUFnRSxDQUNqRTtRQUNIO0lBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQStCRztJQUNHLE1BQU8sY0FBZSxTQUFRbUIsWUFLbkMsQ0FBQTtJQUdDLElBQUEsSUFBSSxVQUFVLEdBQUE7SUFDWixRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNyQixNQUFNLE1BQU0sR0FBR0EsWUFBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzNDLFlBQUEsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJUSxrQkFBVSxDQUMvQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7SUFDekIsZ0JBQUEsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDL0IsNkJBQVMsQ0FBQyxNQUF3QixDQUFDLENBQUM7SUFDbkUsYUFBQSxDQUFDLENBQ0g7WUFDSDtZQUNBLE9BQU8sSUFBSSxDQUFDLFdBQVc7UUFDekI7O1FBR0EsV0FBQSxDQUFZLE9BQTBCLEVBQUUsS0FBYyxFQUFBO0lBQ3BELFFBQUEsS0FBSyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDO1FBQ3ZDO0lBRW1CLElBQUEsTUFBTSxLQUFLLENBQzVCLFNBQXdCLEVBQ3hCLEtBQXFCLEVBQ3JCLEtBQTRCLEVBQUE7SUFFNUIsUUFBQSxNQUFNLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7SUFDcEQsUUFBQSxNQUFNLE1BQU0sR0FBUTtnQkFDbEIsSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVc7YUFDdkU7SUFDRCxRQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFO1lBRXJCLE1BQU0sVUFBVSxHQUFhLEVBQUU7SUFDL0IsUUFBQSxJQUFJLFNBQVMsS0FBS2tCLDBCQUFhLENBQUMsTUFBTSxFQUFFO2dCQUN0QyxNQUFNLEVBQUUsR0FBR2hCLDJCQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUMvQixZQUFBLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBWSxDQUFDO1lBQy9CO0lBRUEsUUFBQSxJQUNFLFNBQVMsS0FBS2dCLDBCQUFhLENBQUMsTUFBTTtJQUNsQyxZQUFBLFNBQVMsS0FBS0EsMEJBQWEsQ0FBQyxNQUFNLEVBQ2xDO0lBQ0EsWUFBQSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQTBCLEVBQUUsR0FBRyxLQUFJO0lBQ3JFLGdCQUFBLE1BQU0sSUFBSSxHQUFHWixxQkFBVSxDQUFDLHFCQUFxQixDQUMzQ29CLGtDQUFjLENBQUMsT0FBTyxFQUN0QixDQUFDLEVBQ0QsR0FBRyxFQUNILElBQUksQ0FDTDtJQUNELGdCQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUM5QixDQUFDLEdBQVEsS0FDUCxHQUFHLENBQUMsR0FBRyxLQUFLTSxtQkFBTSxDQUFDLFNBQVM7SUFDNUIsb0JBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FDaEQ7b0JBQ0QsSUFBSSxHQUFHLEVBQUU7SUFDUCxvQkFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUs7b0JBQ3hCO0lBQ0EsZ0JBQUEsT0FBTyxLQUFLO2dCQUNkLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBRU4sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkM7WUFFQSxNQUFNLENBQUMsMkJBQTJCLEdBQUcsQ0FDbkMsQ0FBQyxDQUFDLDJCQUEyQixHQUFHLENBQUMsQ0FBQywyQkFBMkIsR0FBRyxFQUFFLEVBQ2xFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUN2QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBaUI7UUFDakQ7UUFHbUIsUUFBUSxHQUFBO1lBQ3pCLE9BQU8sSUFBSSxlQUFlLEVBQUU7UUFDOUI7UUFHUyxVQUFVLEdBQUE7SUFDakIsUUFBQSxPQUFPaEIseUJBQWlCO1FBQzFCO0lBRUE7Ozs7O0lBS0c7UUFFSCxTQUFTLEdBQUE7SUFDUCxRQUFBLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFDbkM7SUFFQTs7Ozs7SUFLRztJQUVHLElBQU4sTUFBTSxRQUFRLENBQUMsT0FBd0IsRUFBQTtJQUNyQyxRQUFBLE9BQU8sSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztRQUMzQztJQUVBOzs7O0lBSUc7SUFDSCxJQUFBLE1BQU0sVUFBVSxHQUFBO0lBQ2QsUUFBQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVTtJQUMxQixRQUFBLElBQUk7SUFDRixZQUFBLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUN2QjtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztJQUNBLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN6QyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUEsRUFBRyxJQUFJLENBQUMsT0FBTyxDQUFBLG9CQUFBLENBQXNCLENBQUM7UUFDcEQ7SUFFQTs7Ozs7O0lBTUc7SUFFYSxJQUFOLE1BQU0sS0FBSyxDQUNuQixHQUFHLE1BQXdCLEVBQUE7SUFFM0IsUUFBQSxNQUFNLE9BQU8sR0FBbUIsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUV2RCxRQUFBLElBQUk7Z0JBQ0YsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFFcEMsWUFBQSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtJQUMzQixnQkFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDeEQ7Z0JBRUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDdkM7WUFBRSxPQUFPLENBQVUsRUFBRTtnQkFDbkIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDdkMsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFQTs7Ozs7O0lBTUc7UUFDTSxNQUFNLEdBQUcsQ0FBSSxDQUFlLEVBQUE7SUFDbkMsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDLFFBQUEsSUFBSTtJQUNGLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtJQUFFLGdCQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDeEU7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7SUFDQSxRQUFBLElBQUk7SUFDRixZQUFBLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQztnQkFDM0IsR0FBRyxDQUFDLEtBQUssQ0FDUCxDQUFBLGlCQUFBLEVBQXFCLEtBQTRDLENBQUMsTUFBTSxFQUFFLENBQUEsQ0FBRSxDQUM3RTtJQUNELFlBQUEsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQzNELFlBQUEsT0FBTyxRQUFhO1lBQ3RCO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFUyxJQUFBLE9BQU8sQ0FDZCxLQUFRLEVBQ1IsRUFBVyxFQUNYLEtBQUssR0FBRyxLQUFLLEVBQUE7WUFNYixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFFekMsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQ3RELENBQUMsS0FBMEIsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSTtnQkFDM0MsSUFBSSxHQUFHLEtBQUtULG9CQUFlLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQzFELGdCQUFBLE9BQU8sS0FBSztJQUNkLFlBQUEsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO0lBQ3ZCLGdCQUFBLE9BQU8sS0FBSztnQkFDZDtJQUVBLFlBQUEsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFO29CQUN6QixLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQztJQUFPLGlCQUFBLElBQUlDLHlCQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQy9CLGdCQUFBLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRU4sMkJBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTTtnQkFDcEU7cUJBQU87b0JBQ0wsUUFBUSxPQUFPLEtBQUs7SUFDbEIsb0JBQUEsS0FBSyxRQUFRO0lBQ1gsd0JBQUEsS0FBSyxHQUFHLENBQUEsRUFBRyxLQUFLLENBQUEsQ0FBRTs0QkFDbEI7OztnQkFJTjtJQUNBLFlBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7SUFDbEIsWUFBQSxPQUFPLEtBQUs7WUFDZCxDQUFDLEVBQ0QsRUFBRSxDQUNIO0lBQ0QsUUFBQSxNQUFNLE1BQU0sR0FBaUNNLHlCQUFLLENBQUMsR0FBRyxDQUNwRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDdkI7SUFDRCxRQUFBLElBQUksQ0FBQyxNQUFNO2dCQUNULE1BQU0sSUFBSUosMEJBQWEsQ0FDckIsQ0FBQSxNQUFBLEVBQVMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUEsc0JBQUEsQ0FBd0IsQ0FDeEQ7WUFDSCxNQUFNLE1BQU0sR0FBRztrQkFDWCxJQUFLLE1BQWMsQ0FBQ0osNkJBQVMsQ0FBQyxNQUE2QixDQUFDO0lBQzlELGNBQUUsSUFBSSxNQUFNLEVBQUU7SUFDaEIsUUFBQSxJQUFJLEtBQUs7SUFDUCxZQUFBLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRTtJQUMzQyxnQkFBQSxZQUFZLEVBQUUsS0FBSztJQUNuQixnQkFBQSxVQUFVLEVBQUUsS0FBSztJQUNqQixnQkFBQSxLQUFLLEVBQUcsTUFBYyxDQUFDQSw2QkFBUyxDQUFDLE1BQTZCLENBQUM7SUFDL0QsZ0JBQUEsUUFBUSxFQUFFLEtBQUs7SUFDaEIsYUFBQSxDQUFDO0lBQ0osUUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLEdBQTBCLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FDM0Q7SUFDRCxRQUFBLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTTtJQUN4QixRQUFBLE9BQU8sUUFBUTtRQUNqQjtRQUVTLE1BQU0sQ0FDYixHQUF3QixFQUN4QixLQUE4QixFQUM5QixFQUFXLEVBQ1gsRUFBNEIsRUFDNUIsU0FBK0IsRUFBQTtJQUUvQixRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDckMsSUFBSSxTQUFTLEVBQUU7SUFDYixZQUFBLEdBQUcsQ0FBQyxPQUFPLENBQ1QsQ0FBQSxnQ0FBQSxFQUFtQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFFLENBQ3ZFO0lBQ0QsWUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFJO29CQUMvQyxJQUFJLEdBQUcsSUFBSSxHQUFHO3dCQUNaLE1BQU0sSUFBSUksMEJBQWEsQ0FDckIsQ0FBQSxtQkFBQSxFQUFzQixHQUFHLENBQUEseUJBQUEsRUFBNEIsT0FBTyxLQUFLLEtBQUssUUFBUSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFBLHNCQUFBLENBQXdCLENBQzVIO0lBQ0YsZ0JBQUEsR0FBUyxDQUFDLEdBQWMsQ0FBQyxHQUFHLEdBQUc7SUFDbEMsWUFBQSxDQUFDLENBQUM7WUFDSjtJQUVBLFFBQUEsT0FBTyxJQUFLLEtBQXdCLENBQUMsR0FBRyxDQUFDO1FBQzNDO0lBRUE7Ozs7Ozs7O0lBUUc7UUFDTSxNQUFNLE1BQU0sQ0FDbkIsU0FBaUIsRUFDakIsRUFBbUIsRUFDbkIsS0FBMEIsRUFDMUIsRUFBVTs7SUFFVixJQUFBLEdBQUcsSUFBVyxFQUFBO1lBRWQsTUFBTSxDQUFDLEdBQXVCLFNBQTBDO1lBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM3QyxRQUFBLElBQUksT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFO0lBQzdCLFlBQUEsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ2xDLGdCQUFBLEtBQUssRUFBRTt3QkFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ1QsaUJBQUE7SUFDRixhQUFBLENBQUM7Z0JBQ0YsSUFBSSxRQUFRLEVBQUU7SUFDWixnQkFBQSxNQUFNLElBQUk2QiwwQkFBYSxDQUNyQixDQUFBLCtCQUFBLEVBQWtDNUIsZUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxVQUFBLEVBQWEsRUFBRSxDQUFBLENBQUUsQ0FDdkU7Z0JBQ0g7WUFDRjtJQUNBLFFBQUEsSUFBSTtJQUNGLFlBQUEsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQy9CO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFQTs7Ozs7OztJQU9HO0lBQ00sSUFBQSxNQUFNLElBQUksQ0FDakIsU0FBaUIsRUFDakIsRUFBbUIsRUFDbkIsRUFBVSxFQUFBO1lBRVYsTUFBTSxDQUFDLEdBQXVCLFNBQTBDO0lBQ3hFLFFBQUEsSUFBSSxNQUFXO0lBQ2YsUUFBQSxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFdEQsWUFBQSxNQUFNLENBQUMsR0FBbUI7SUFDeEIsZ0JBQUEsS0FBSyxFQUFFO3dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDVCxpQkFBQTtJQUNELGdCQUFBLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLGdCQUFBLGVBQWUsRUFBRTtJQUNmLG9CQUFBLFNBQVMsRUFBRSxRQUFRO0lBQ3BCLGlCQUFBO2lCQUNGO2dCQUNELE1BQU0sSUFBSSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQXdCO1lBQy9EO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO0lBQ0EsUUFBQSxPQUFPLE1BQU07UUFDZjtJQUVBOzs7Ozs7OztJQVFHO1FBQ00sTUFBTSxNQUFNLENBQ25CLFNBQWlCLEVBQ2pCLEVBQW1CLEVBQ25CLEtBQTBCLEVBQzFCLEVBQVU7O0lBRVYsSUFBQSxHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsR0FBdUIsU0FBMEM7SUFDeEUsUUFBQSxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM3QyxZQUFBLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDekI7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVBOzs7Ozs7O0lBT0c7SUFDTSxJQUFBLE1BQU0sTUFBTSxDQUNuQixTQUFpQixFQUNqQixFQUFtQixFQUNuQixFQUFVOztJQUVWLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLENBQUMsR0FBdUIsU0FBMEM7SUFDeEUsUUFBQSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEQsUUFBQSxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs7Z0JBRTdDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDakMsWUFBQSxPQUFPLEtBQUs7WUFDZDtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO0lBRVMsSUFBQSxNQUFNLFNBQVMsQ0FDdEIsU0FBaUIsRUFDakIsRUFBdUIsRUFDdkIsS0FBNEI7O0lBRTVCLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLENBQUMsR0FBdUIsU0FBMEM7SUFDeEUsUUFBQSxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxNQUFNLEdBQWlCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3JELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsU0FBUyxFQUNULE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDckMsSUFBSSxDQUNMO1lBQ0g7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVTLElBQUEsTUFBTSxPQUFPLENBQ3BCLFNBQWlCLEVBQ2pCLEVBQWdDLEVBQ2hDLEVBQVU7O0lBRVYsSUFBQSxHQUFHLElBQVcsRUFBQTtZQUVkLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTTtJQUFFLFlBQUEsT0FBTyxFQUFFO1lBRXpCLE1BQU0sQ0FBQyxHQUF1QixTQUEwQztJQUN4RSxRQUFBLElBQUk7Z0JBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzdDLFlBQUEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUc2QixVQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QztZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO0lBRVMsSUFBQSxNQUFNLFNBQVMsQ0FDdEIsU0FBaUIsRUFDakIsR0FBd0IsRUFDeEIsS0FBNEIsRUFDNUIsRUFBVSxFQUNWLEdBQUcsSUFBVyxFQUFBO1lBRWQsTUFBTSxNQUFNLEdBQUcsRUFBRTtJQUNqQixRQUFBLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNsRTtJQUNBLFFBQUEsT0FBTyxNQUFNO1FBQ2Y7SUFFUyxJQUFBLE1BQU0sU0FBUyxDQUN0QixTQUFpQixFQUNqQixHQUFpQyxFQUNqQyxFQUFVOztJQUVWLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07SUFBRSxZQUFBLE9BQU8sRUFBRTtZQUMxQixNQUFNLENBQUMsR0FBdUIsU0FBMEM7SUFDeEUsUUFBQSxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM3QyxZQUFBLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNyRCxZQUFBLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDdEIsWUFBQSxPQUFPLE1BQU07WUFDZjtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO0lBRUE7Ozs7OztJQU1HO1FBQ0gsVUFBVSxDQUFDLEdBQW1CLEVBQUUsTUFBZSxFQUFBO1lBQzdDLE9BQU8sY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1FBQy9DO0lBRUE7Ozs7O0lBS0c7SUFDZ0IsSUFBQSxVQUFVLENBQUMsSUFBWSxFQUFBO1lBQ3hDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDekM7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBeURHO0lBQ08sSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFtQixFQUFFLE1BQWUsRUFBQTtZQUM5RCxJQUFJLEdBQUcsWUFBWXJDLHNCQUFTO0lBQUUsWUFBQSxPQUFPLEdBQVU7SUFDL0MsUUFBQSxNQUFNLElBQUksR0FBVyxPQUFPLEdBQUcsS0FBSyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPO0lBRWhFLFFBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDO0lBQzdDLFlBQUEsT0FBTyxJQUFJb0MsMEJBQWEsQ0FBQyxJQUFJLENBQUM7SUFDaEMsUUFBQSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUM7SUFDeEQsWUFBQSxPQUFPLElBQUluQiwwQkFBYSxDQUFDLElBQUksQ0FBQzs7SUFHaEMsUUFBQSxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7O2dCQUVyQixLQUFLLE9BQU8sQ0FBQztnQkFDYixLQUFLLE9BQU8sQ0FBQztnQkFDYixLQUFLLE9BQU87SUFDVixnQkFBQSxPQUFPLElBQUltQiwwQkFBYSxDQUFDLE1BQWdCLENBQUM7O2dCQUc1QyxLQUFLLE9BQU8sQ0FBQztnQkFDYixLQUFLLE9BQU87SUFDVixnQkFBQSxPQUFPLElBQUluQiwwQkFBYSxDQUFDLE1BQWdCLENBQUM7O2dCQUc1QyxLQUFLLE9BQU87SUFDVixnQkFBQSxPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQzs7SUFHNUIsWUFBQTtvQkFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0lBQ3hDLG9CQUFBLE9BQU8sSUFBSXFCLG9CQUFlLENBQUMsR0FBRyxDQUFDO0lBQ2pDLGdCQUFBLE9BQU8sSUFBSS9CLDBCQUFhLENBQUMsR0FBRyxDQUFDOztRQUVuQztJQUVBLElBQUEsYUFBYSxPQUFPLENBQUMsTUFBeUIsRUFBQTtJQUM1QyxRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUkyQixrQkFBVSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWE7SUFBRSxZQUFBLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRTtJQUM5QyxRQUFBLE9BQU8sR0FBRztRQUNaO0lBRUEsSUFBQSxhQUFhLGNBQWMsQ0FDekIsVUFBc0IsRUFDdEIsTUFBYyxFQUFBO1lBRWQsTUFBTSxHQUFHLEdBQUdLLGVBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM1QyxRQUFBLEdBQUcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLE1BQU0sQ0FBQSxDQUFFLENBQUM7SUFDMUMsUUFBQSxJQUFJO2dCQUNGLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsTUFBTSxDQUFBLENBQUUsQ0FBQztJQUNuRCxZQUFBLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLE1BQU0sQ0FBQSxDQUFFLENBQUM7WUFDeEM7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVBLElBQUEsYUFBYSxvQkFBb0IsQ0FDL0IsVUFBc0IsRUFDdEIsSUFBWSxFQUFBO1lBRVosTUFBTSxHQUFHLEdBQUdBLGVBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ2xELFFBQUEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBLHdCQUFBLENBQTBCLENBQUM7SUFDdkMsUUFBQSxJQUFJO2dCQUNGLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7O0FBZU4sQ0FBQSxDQUFBLENBQ0s7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQixrREFBa0QsSUFBSSxDQUFBLENBQUEsQ0FBRyxDQUMxRDtnQkFDRCxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUM7O0FBRXBCLFFBQUEsQ0FBQSxDQUFDO0lBQ0osWUFBQSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUEsdUJBQUEsQ0FBeUIsQ0FBQztZQUNyQztZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO1FBRUEsYUFBYSxjQUFjLENBQ3pCLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCxJQUFhLEVBQUE7SUFFYixRQUFBLElBQUk7SUFDRixZQUFBLElBQUksSUFBSTtvQkFBRSxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQSxTQUFBLENBQVcsQ0FBQztnQkFDbEUsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixNQUFNLENBQUEsQ0FBRSxDQUFDO1lBQ25EO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7UUFFQSxhQUFhLFVBQVUsQ0FDckIsVUFBc0IsRUFDdEIsTUFBYyxFQUNkLElBQVksRUFDWixRQUFnQixFQUFBO0lBRWhCLFFBQUEsSUFBSTtnQkFDRixNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQSxZQUFBLEVBQWUsSUFBSSxDQUFBLGdCQUFBLEVBQW1CLFFBQVEsQ0FBQSxDQUFBLENBQUcsQ0FBQztnQkFDekUsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUEsMEJBQUEsRUFBNkIsTUFBTSxDQUFBLElBQUEsRUFBTyxJQUFJLENBQUEsQ0FBRSxDQUFDO2dCQUV4RSxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQSxDQUFFLENBQUM7Z0JBQ2pFLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsSUFBSSxDQUFBLENBQUUsQ0FBQztnQkFDbEUsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQiwwREFBMEQsSUFBSSxDQUFBLENBQUUsQ0FDakU7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQiw2REFBNkQsSUFBSSxDQUFBLENBQUUsQ0FDcEU7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQiw2REFBNkQsSUFBSSxDQUFBLENBQUUsQ0FDcEU7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQiwrRUFBK0UsSUFBSSxDQUFBLENBQUUsQ0FDdEY7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUNwQixrRkFBa0YsSUFBSSxDQUFBLENBQUUsQ0FDekY7WUFDSDtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO1FBRUEsYUFBYSxVQUFVLENBQ3JCLE1BQWtCLEVBQ2xCLElBQVksRUFDWixLQUFhLEVBQUE7SUFFYixRQUFBLElBQUk7Z0JBQ0YsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUEsa0JBQUEsRUFBcUIsSUFBSSxDQUFBLElBQUEsRUFBTyxLQUFLLENBQUEsQ0FBRSxDQUFDO2dCQUMzRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLGtEQUFrRCxJQUFJLENBQUEsQ0FBRSxDQUN6RDtnQkFDRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLElBQUksQ0FBQSxDQUFFLENBQUM7Z0JBQzlELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDaEIsZ0VBQWdFLElBQUksQ0FBQSxDQUFFLENBQ3ZFO2dCQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDaEIsZ0VBQWdFLElBQUksQ0FBQSxDQUFFLENBQ3ZFO2dCQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDaEIsQ0FBQSxrQ0FBQSxFQUFxQyxLQUFLLENBQUEsNENBQUEsRUFBK0MsSUFBSSxDQUFBLENBQUUsQ0FDaEc7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUNoQixDQUFBLGtDQUFBLEVBQXFDLEtBQUssQ0FBQSwrQ0FBQSxFQUFrRCxJQUFJLENBQUEsQ0FBQSxDQUFHLENBQ3BHO2dCQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDaEIsQ0FBQSxrQ0FBQSxFQUFxQyxLQUFLLENBQUEsK0NBQUEsRUFBa0QsSUFBSSxDQUFBLENBQUUsQ0FDbkc7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUEsUUFBQSxDQUFVLENBQUM7Z0JBQ25ELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFBLENBQUEsQ0FBRyxDQUFDO1lBQ3JEO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7UUFFUSxPQUFPLG1CQUFtQixDQUNoQyxJQUFZLEVBQ1osSUFBYSxFQUNiLElBQUksR0FBRyxLQUFLLEVBQUE7SUFFWixRQUFBLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRTtJQUN4QixZQUFBLEtBQUssUUFBUTtJQUNYLGdCQUFBLE9BQU8sSUFBSSxHQUFHLGtCQUFrQixHQUFHLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUztJQUM5RCxZQUFBLEtBQUssUUFBUTtvQkFDWCxPQUFPLElBQUksR0FBRyxvQkFBb0IsR0FBRyxTQUFTO0lBQ2hELFlBQUEsS0FBSyxTQUFTO0lBQ1osZ0JBQUEsT0FBTyxTQUFTO0lBQ2xCLFlBQUEsS0FBSyxNQUFNO0lBQ1QsZ0JBQUEsT0FBTyxXQUFXO0lBQ3BCLFlBQUEsS0FBSyxRQUFRO29CQUNYLE9BQU8sSUFBSSxHQUFHLG9CQUFvQixHQUFHLFFBQVE7Z0JBQy9DLFNBQVM7b0JBQ1AsTUFBTSxDQUFDLEdBQUc1Qix5QkFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxFQUFFO0lBQ0wsb0JBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7SUFDbEIsb0JBQUEsTUFBTSxJQUFJLEdBQUdGLHFCQUFVLENBQUMsb0JBQW9CLENBQzFDLEVBQUUsRUFDRkosMkJBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQ3RCO3dCQUNELE9BQU87SUFDTCx3QkFBQSxLQUFLLEVBQUUsQ0FBQztJQUNSLHdCQUFBLE1BQU0sRUFBRSxJQUFJO3lCQUNiO29CQUNIO0lBQ0EsZ0JBQUEsTUFBTSxJQUFJRSwwQkFBYSxDQUFDLHFCQUFxQixJQUFJLENBQUEsQ0FBRSxDQUFDO2dCQUN0RDs7UUFFSjtRQUVRLE9BQU8seUJBQXlCLENBQ3RDLElBQVksRUFDWixJQUFZLEVBQ1osSUFBYSxFQUNiLEdBQVcsRUFDWCxPQUF5QixFQUFBO1lBRXpCLFFBQVEsR0FBRztnQkFDVCxLQUFLc0Isa0NBQWMsQ0FBQyxRQUFRO0lBQzFCLGdCQUFBLE9BQU8sVUFBVTtnQkFDbkIsS0FBS0Esa0NBQWMsQ0FBQyxVQUFVO0lBQzVCLGdCQUFBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7SUFDdkQsb0JBQUEsT0FBTyxFQUFFO29CQUNYO29CQUNBLE9BQU8sQ0FBQSxDQUFBLEVBQUssT0FBcUMsQ0FBQ0Esa0NBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRztnQkFDakYsS0FBS0Esa0NBQWMsQ0FBQyxVQUFVO0lBQzVCLGdCQUFBLE9BQU8sQ0FBQSxXQUFBLEVBQWMsSUFBSSxDQUFBLGdDQUFBLEVBQW1DLElBQUksQ0FBQSxLQUFBLEVBQVMsT0FBcUMsQ0FBQ0Esa0NBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQSxDQUFBLENBQUc7Z0JBQzlJLEtBQUtBLGtDQUFjLENBQUMsT0FBTztnQkFDM0IsS0FBS0Esa0NBQWMsQ0FBQyxHQUFHO2dCQUN2QixLQUFLQSxrQ0FBYyxDQUFDLEtBQUs7SUFDdkIsZ0JBQUEsT0FBTyxDQUFBLFdBQUEsRUFBYyxJQUFJLENBQUEsc0JBQUEsRUFBeUIsSUFBSSxPQUFPLHdCQUF3QixDQUFFLE9BQW1DLENBQUNBLGtDQUFjLENBQUMsT0FBTyxDQUFXLENBQUMsSUFBSTtnQkFDbkssS0FBS0Esa0NBQWMsQ0FBQyxJQUFJO2dCQUN4QixLQUFLQSxrQ0FBYyxDQUFDLElBQUk7SUFDdEIsZ0JBQUEsT0FBTyxFQUFFO2dCQUNYLEtBQUtBLGtDQUFjLENBQUMsR0FBRztJQUNyQixnQkFBQSxPQUFPLENBQUEsV0FBQSxFQUFjLElBQUksQ0FBQSxDQUFBLEVBQUksR0FBRyxpQkFBaUIsSUFBSSxDQUFBLElBQUEsRUFBUSxPQUErQixDQUFDQSxrQ0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHO2dCQUNySCxLQUFLQSxrQ0FBYyxDQUFDLEdBQUc7SUFDckIsZ0JBQUEsT0FBTyxDQUFBLFdBQUEsRUFBYyxJQUFJLENBQUEsQ0FBQSxFQUFJLEdBQUcsaUJBQWlCLElBQUksQ0FBQSxJQUFBLEVBQVEsT0FBK0IsQ0FBQ0Esa0NBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRztnQkFDckgsS0FBS0Esa0NBQWMsQ0FBQyxRQUFRO0lBQzVCLFlBQUE7SUFDRSxnQkFBQSxNQUFNLElBQUl0QiwwQkFBYSxDQUFDLHFCQUFxQixHQUFHLENBQUEsQ0FBRSxDQUFDOztRQUV6RDtRQUVRLE9BQU8sd0JBQXdCLENBQ3JDLElBQVksRUFDWixLQUF5QixFQUN6QixFQUFVLEVBQ1YsR0FBb0IsRUFDcEIsT0FBMEIsRUFBQTtZQUUxQixNQUFNLFNBQVMsR0FBR0MsZUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDekMsUUFBQSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTztZQUMzQixNQUFNLFVBQVUsR0FBRyxDQUFBLEVBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsR0FBRyxFQUFFLENBQUEsRUFBRyxPQUFPLENBQUMsTUFBTSxHQUFHLG9CQUFvQixHQUFHLEVBQUUsQ0FBQSxDQUFFO0lBQy9HLFFBQUEsUUFBUSxDQUFBLFNBQUEsRUFBWSxHQUFHLENBQUEsQ0FBRTtnQkFDdkIsS0FBS0Usb0JBQWUsQ0FBQyxVQUFVO29CQUM3QixPQUFPLENBQUEsYUFBQSxFQUFnQixJQUFJLENBQUEsYUFBQSxFQUFnQixTQUFTLElBQUksRUFBRSxDQUFBLENBQUEsRUFBSSxVQUFVLENBQUEsQ0FBRTtJQUM1RSxZQUFBO0lBQ0UsZ0JBQUEsTUFBTSxJQUFJSCwwQkFBYSxDQUFDLDBCQUEwQixHQUFHLENBQUEsQ0FBRSxDQUFDOztRQUU5RDtJQUVBLElBQUEsYUFBYSxXQUFXLENBQ3RCLE1BQWtCLEVBQ2xCLEtBQXFCLEVBQUE7WUFFckIsTUFBTSxNQUFNLEdBQXFDLEVBQUU7SUFDbkQsUUFBQSxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxTQUFTLEdBQUdDLGVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBR0gsMkJBQWMsQ0FBQyxDQUFDLENBQUM7WUFFaEMsSUFBSSxJQUFhLEVBQUUsTUFBYztZQUNqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFnQjtJQUMvRCxRQUFBLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFO0lBQzdCLFlBQUEsSUFDRSxPQUFRLElBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVO0lBQ3pDLGdCQUFBLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO29CQUMvQixJQUFJLEtBQUssYUFBYSxFQUN0QjtvQkFDQTtnQkFDRjtJQUVBLFlBQUEsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFO0lBQ2xCLFlBQUEsTUFBTSxHQUFHRyxlQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBRTlDLE1BQU0sT0FBTyxHQUFHQyxxQkFBVSxDQUFDLHFCQUFxQixDQUM5Q29CLGtDQUFjLENBQUMsT0FBTyxFQUN0QixDQUFDLEVBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLEtBQUssRUFDTCxJQUFJLENBQ0w7SUFFRCxZQUFBLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUM3QyxDQUFDLEtBQTBCLEVBQUUsRUFBRSxLQUFJO0lBQ2pDLGdCQUFBLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtJQUN6QixnQkFBQSxJQUFJLEdBQUcsS0FBSzFCLDZCQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDMEIsa0NBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUN6RCxvQkFBQSxLQUFLLENBQUNBLGtDQUFjLENBQUMsSUFBSSxDQUFDLEdBQUc7SUFDM0Isd0JBQUEsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQWMsQ0FBQzs0QkFDbkMsT0FBTyxFQUFFVywwQ0FBc0IsQ0FBQyxJQUFJO0lBQ3BDLHdCQUFBLFdBQVcsRUFBRSw4Q0FBOEM7eUJBQzVEO29CQUNIO0lBQU8scUJBQUEsSUFBSSxHQUFHLEtBQUtYLGtDQUFjLENBQUMsSUFBSSxFQUFFOztJQUV0QyxvQkFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztvQkFDcEI7SUFDQSxnQkFBQSxPQUFPLEtBQUs7Z0JBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FDSDtnQkFFRCxNQUFNLE1BQU0sR0FBR3BCLHFCQUFVLENBQUMscUJBQXFCLENBQzdDRCxlQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUMzQixDQUFDLEVBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLElBQUksRUFDSixJQUFJLENBQ0w7Z0JBRUQsTUFBTSxLQUFLLEdBQWEsRUFBRTtnQkFDMUIsTUFBTSxXQUFXLEdBQWEsRUFBRTtnQkFDaEMsTUFBTSxXQUFXLEdBQWEsRUFBRTtnQkFDaEMsSUFBSSxRQUFRLEdBQTZCLFNBQVM7Z0JBQ2xELElBQUksVUFBVSxHQUFtQyxTQUFTO0lBQzFELFlBQUEsSUFBSSxPQUFZO2dCQUVoQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3JDLGdCQUFBLFFBQVEsR0FBRyxhQUFhLENBQUNxQixrQ0FBYyxDQUFDLElBQUksQ0FBaUI7b0JBRTdELElBQUksQ0FBQyxRQUFRLEVBQUU7SUFDYixvQkFBQSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUEsd0JBQUEsQ0FBMEIsQ0FBQztvQkFDN0M7SUFFQSxnQkFBQSxJQUFJLFVBQVUsR0FHWixJQUFJLENBQUMsbUJBQW1CLENBQ3RCLE9BQVEsUUFBUSxDQUFDLFdBQXFCLENBQUMsQ0FBQyxDQUFDLEtBQUs7SUFDNUMsc0JBQUcsUUFBUSxDQUFDLFdBQW1CLENBQUMsQ0FBQyxDQUFDOzBCQUMvQixRQUFRLENBQUMsV0FBbUIsQ0FBQyxDQUFDLENBQUMsRUFDcEMsSUFBSSxDQUNMO0lBQ0gsZ0JBQUEsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7SUFDbEMsb0JBQUEsVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtvQkFDcEM7SUFDQSxnQkFBQSxJQUFJLE9BQU8sR0FHVCxVQUFVLENBQUMsS0FFZ0Q7SUFFN0QsZ0JBQUEsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7SUFDL0Isb0JBQUEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQzFCLHdCQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO3dCQUN0Qjs7O0lBSUEsb0JBQUEsSUFBSTtJQUNGLHdCQUFBLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBMkI7SUFDbkQsd0JBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLEVBQUU7SUFDMUIsd0JBQUEsT0FBTyxHQUFHeEIsMkJBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0Isd0JBQUEsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDaEMsVUFBVSxDQUFDLE1BQWdCLEVBQzNCLEtBQUssRUFDTCxJQUFJLENBQ0w7NEJBQ0QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7d0JBQzVDO3dCQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLHdCQUFBLElBQUksRUFBRSxDQUFDLFlBQVkrQiwwQkFBYSxDQUFDO0lBQUUsNEJBQUEsTUFBTSxDQUFDO3dCQUM1QztvQkFDRjtvQkFFQSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXO0lBQ3pDLHNCQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QixzQkFBRSxRQUFRLENBQUMsV0FBVztJQUN4QixnQkFBQSxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFO29CQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ2xELE1BQU0sRUFDTixFQUFTLEVBQ1QsSUFBSSxFQUNKUCxrQ0FBYyxDQUFDLFVBQVUsRUFDeEIsYUFBYSxDQUNaQSxrQ0FBYyxDQUFDLFVBQVUsQ0FDSSxJQUFJO0lBQ2pDLG9CQUFBLENBQUNBLGtDQUFjLENBQUMsVUFBVSxHQUFHLEdBQUc7SUFDakMsaUJBQUEsQ0FDRjtvQkFFRCxNQUFNLENBQUMsR0FBRyxDQUFBLEVBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQSxFQUFHLGFBQWEsQ0FBQSxDQUFFO29CQUVoRCxJQUFJLElBQUksRUFBRTtJQUNSLG9CQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNsQjt5QkFBTztJQUNMLG9CQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNmO0lBRUEsZ0JBQUEsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUM3RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQ0YsQ0FBQyxDQUFDQSxrQ0FBYyxDQUFDLElBQUksRUFBRUEsa0NBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBUSxDQUFDLENBQ3ZFLEVBQUU7SUFDRCxvQkFBQSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQy9DLE1BQU0sRUFDTixFQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxLQUFLLENBQ047SUFDRCxvQkFBQSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDdkMsd0JBQUEsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7d0JBQzlCOzZCQUFPOzRCQUNMLElBQUksVUFBVSxFQUFFO0lBQ2QsNEJBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7NEJBQ3hCO3dCQUNGO29CQUNGO2dCQUNGOzs7SUFJQSxZQUFBLElBQWEsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtJQUNqRCxnQkFBQSxJQUFJLENBQUMsUUFBUTtJQUFFLG9CQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQSx3QkFBQSxDQUEwQixDQUFDO0lBQzFELGdCQUFBLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtJQUN6QyxvQkFBQSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLFNBQVM7SUFDaEMsb0JBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUM5QyxNQUFNLEVBQ04sVUFBZ0MsRUFDaEMsT0FBTyxDQUFDLEVBQUUsRUFDVixHQUFzQixFQUN0QixLQUFxQyxDQUN0QztJQUNELG9CQUFBLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTtJQUNwQyx3QkFBQSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzt3QkFDOUI7NkJBQU87SUFDTCx3QkFBQSxNQUFNLElBQUl0QiwwQkFBYSxDQUFDLHlCQUF5QixHQUFHLENBQUEsQ0FBRSxDQUFDO3dCQUN6RDtvQkFDRjtnQkFDRjtJQUVBLFlBQUEsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHO0lBQ3hCLGdCQUFBLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN0QixnQkFBQSxNQUFNLEVBQUUsRUFBRTtJQUNWLGdCQUFBLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLGdCQUFBLFdBQVcsRUFBRSxXQUFXO0lBQ3hCLGdCQUFBLFdBQVcsRUFBRSxXQUFXO2lCQUN6QjtZQUNIO1lBRUEsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwRCxNQUFNLFdBQVcsR0FBRztJQUNqQixhQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNO2lCQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVc7aUJBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDZCxNQUFNLFdBQVcsR0FBRztJQUNqQixhQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNO2lCQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVc7aUJBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDZCxRQUFBLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQztZQUNqQyxJQUFJLFdBQVcsRUFBRTtJQUNmLFlBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDeEI7WUFDQSxNQUFNLFdBQVcsR0FBRyxDQUFBLGFBQUEsRUFBZ0IsU0FBUyxDQUFBLEVBQUEsRUFBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQSxDQUFHO0lBQ3hGLFFBQUEsSUFBSTtJQUNGLFlBQUEsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztJQUMvQixZQUFBLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDaEIsaUNBQWlDLFNBQVM7c0NBQ1osU0FBUzs7QUFFRiw0Q0FBQSxDQUFBLENBQ3RDO1lBQ0g7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7SUFDQSxRQUFBLE9BQU8sTUFBTTtRQUNmO0lBRUEsSUFBQSxhQUFhLGNBQWMsQ0FBQyxNQUFrQixFQUFBO1lBQzVDLE1BQU0sV0FBVyxHQUFHLENBQUEsb0JBQUEsQ0FBc0I7SUFDMUMsUUFBQSxJQUFJO2dCQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDOUMsWUFBQSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZO1lBQy9CO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFQSxJQUFBLE9BQWdCLFVBQVUsR0FBQTtZQUN4QixLQUFLLENBQUMsVUFBVSxFQUFFOztZQUdsQixNQUFNLFFBQVEsR0FBR21CLFlBQU8sQ0FBQyxHQUFHLENBQUNoQixvQkFBZSxDQUFDLEtBQUssQ0FBQztJQUNuRCxRQUFBK0IsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFFBQVE7SUFDWixhQUFBLE1BQU0sQ0FBQyxDQUFDLFFBQWEsS0FDcEIsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDdEMsNkJBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUM7SUFFakQsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxLQUFLLEdBQUdLLGVBQVUsQ0FBQyxHQUFHLENBQUMyQixtQkFBTSxDQUFDLEVBQUUsQ0FBQztZQUV2QyxTQUFTLEtBQUssQ0FBQyxPQUF3QixFQUFBO0lBQ3JDLFlBQUEsT0FBTyxTQUFTLEtBQUssQ0FBQyxRQUFhLEVBQUUsSUFBUyxFQUFBO0lBQzVDLGdCQUFBLE1BQU0sVUFBVSxHQUFVO0lBQ3hCLG9CQUFBTyw0QkFBUSxFQUFFO0lBQ1Ysb0JBQUFDLHFCQUFRLEVBQUU7SUFDVixvQkFBQUMsZ0NBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO0lBQzVCLG9CQUFBLE1BQU0sQ0FBQyxDQUFBLEdBQUEsRUFBTSxJQUFJLENBQUEsQ0FBRSxFQUFFLE9BQU8sQ0FBQztxQkFDOUI7SUFDRCxnQkFBQSxJQUFJLElBQUksR0FDTixPQUFPLENBQUMsSUFBSSxJQUFJbkMscUJBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ2pFLGdCQUFBLElBQUksQ0FBQyxJQUFJO3dCQUNQLE1BQU0sSUFBSUYsMEJBQWEsQ0FDckIsQ0FBQSxzQ0FBQSxFQUF5QyxJQUFJLENBQUEsSUFBQSxFQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUEsQ0FBRSxDQUNwRTtJQUNILGdCQUFBLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtJQUNyQixvQkFBQSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJc0MseUJBQW9CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztJQUNqRSxvQkFBQSxVQUFVLENBQUMsSUFBSSxDQUNiLHNCQUFzQixDQUFDO0lBQ3JCLHdCQUFBLElBQUksRUFBRSxJQUFJO0lBQ1gscUJBQUEsQ0FBQyxDQUNIO29CQUNIO3lCQUFPO0lBQ0wsb0JBQUEsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFO0lBQ3hCLHdCQUFBLEtBQUssUUFBUTtnQ0FDWCxJQUFJLEdBQUcsU0FBUztnQ0FDaEI7SUFDRix3QkFBQSxLQUFLLFFBQVE7Z0NBQ1gsSUFBSSxHQUFHLFNBQVM7Z0NBQ2hCO0lBQ0Ysd0JBQUEsS0FBSyxRQUFRO2dDQUNYLElBQUksR0FBRyxRQUFRO2dDQUNmO0lBQ0Ysd0JBQUE7SUFDRSw0QkFBQSxNQUFNLElBQUl0QywwQkFBYSxDQUFDLHFCQUFxQixJQUFJLENBQUEsQ0FBRSxDQUFDOztJQUV4RCxvQkFBQSxVQUFVLENBQUMsSUFBSSxDQUNiLGFBQWEsQ0FBQztJQUNaLHdCQUFBLElBQUksRUFBRSxJQUFrQjtJQUN4Qix3QkFBQSxNQUFNLEVBQUUsSUFBSTtJQUNiLHFCQUFBLENBQUMsQ0FDSDtvQkFDSDtvQkFDQSxPQUFPdUMsZ0JBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7SUFDN0MsWUFBQSxDQUFDO1lBQ0g7SUFFQSxRQUFBTCw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsS0FBSztJQUNULGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsS0FBSzthQUNqQjtJQUNBLGFBQUEsS0FBSyxFQUFFO0lBRVYsUUFBQUEsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztJQUNsQyxhQUFBLEdBQUcsQ0FBQ3RDLDZCQUFTLENBQUMsU0FBUztpQkFDdkIsTUFBTSxDQUFDLFFBQVEsRUFBRTtJQUNqQixhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLFNBQVMsR0FBR3VCLFlBQU8sQ0FBQyxHQUFHLENBQUNoQixvQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNyRCxRQUFBK0IsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFNBQVM7SUFDYixhQUFBLE1BQU0sQ0FBQztJQUNOLFlBQUEsU0FBUyxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQVksRUFBQTtJQUNyQyxnQkFBQSxPQUFPLFNBQVMsTUFBTSxDQUFDLEdBQVEsRUFBRSxJQUFTLEVBQUE7d0JBQ3hDLE1BQU0sSUFBSSxHQUFrQixFQUFFO0lBQzlCLG9CQUFBLElBQUksSUFBSTtJQUFFLHdCQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSTt3QkFDMUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQ2xDLG9CQUFBLElBQUksRUFBRSxLQUFLLElBQUksRUFBRTtJQUNmLHdCQUFBLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSTt3QkFDdEI7d0JBQ0EsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNoQyxnQkFBQSxDQUFDO2dCQUNILENBQUM7SUFDRCxZQUFBLFNBQVMsRUFBRSxDQUFDLElBQVcsS0FBSTtJQUN6QixnQkFBQSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUMxQixPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNyQixDQUFDO2FBQ0Y7SUFDQSxhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLFNBQVMsR0FBR2YsWUFBTyxDQUFDLEdBQUcsQ0FBQ2hCLG9CQUFlLENBQUMsTUFBTSxDQUFDO0lBQ3JELFFBQUErQiw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsU0FBUztJQUNiLGFBQUEsTUFBTSxDQUFDRyxnQ0FBWSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7aUJBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0IsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxXQUFXLEdBQUdHLDhCQUFVLENBQUMsR0FBRyxDQUFDbEIsa0NBQWMsQ0FBQyxRQUFRLENBQUM7SUFDM0QsUUFBQVksOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFdBQVc7aUJBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNsQyxhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLFVBQVUsR0FBR2pDLGVBQVUsQ0FBQyxHQUFHLENBQUMyQixtQkFBTSxDQUFDLE9BQU8sQ0FBQztJQUNqRCxRQUFBTSw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsVUFBVTtpQkFDZCxNQUFNLENBQUNPLHdCQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFQyxxQkFBYSxFQUFFO0lBQ3pDLGFBQUEsS0FBSyxFQUFFO1lBRVYsU0FBUyxtQkFBbUIsQ0FBQyxHQUFXLEVBQUE7SUFDdEMsWUFBQSxPQUFPQyxpQ0FBb0IsQ0FBQyxPQUFPLEdBQUcsR0FBRztZQUMzQzs7WUFHQSxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQ2YsbUJBQU0sQ0FBQyxTQUFTLENBQUM7SUFFMUQsUUFBQSxTQUFTLEVBQUUsQ0FBQyxTQUEwQixFQUFFLE1BQWMsRUFBQTtJQUNwRCxZQUFBLE1BQU0sVUFBVSxHQUFVO29CQUN4QmdCLHdCQUFJLENBQUMsTUFBTSxFQUFFQyxtQ0FBeUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ3RELGdCQUFBViw0QkFBUSxDQUFDVSxtQ0FBeUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO29CQUN0RFIsZ0NBQVksQ0FBQ0csOEJBQVUsQ0FBQyxHQUFHLENBQUNaLG1CQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFDN0Msb0JBQUEsU0FBUyxFQUFFLFNBQVM7SUFDcEIsb0JBQUEsTUFBTSxFQUFFLE1BQU07cUJBQ2YsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUNkLDBCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtJQUNoRCxnQkFBQSxVQUFVLENBQUMsSUFBSSxDQUNidUIsZ0NBQVksQ0FBQyxZQUFZLEVBQUU7SUFDekIsb0JBQUEsT0FBTyxFQUFFUSxtQ0FBeUIsQ0FBQyxTQUFTLENBQUMsT0FBTztJQUNyRCxpQkFBQSxDQUFDLENBQ0g7O0lBQ0UsZ0JBQUEsVUFBVSxDQUFDLElBQUksQ0FBQ1QscUJBQVEsRUFBRSxDQUFDO0lBQ2hDLFlBQUEsT0FBT0csZ0JBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUM3QjtJQUVBLFFBQUFMLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxZQUFZO0lBQ2hCLGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsRUFBRTthQUNkO0lBQ0EsYUFBQSxNQUFNLENBQUM7SUFDTixZQUFBLFNBQVMsRUFBRSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEdBQW9CLEVBQUE7SUFDbkQsZ0JBQUEsT0FBTyxTQUFTLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFBO3dCQUMzQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUNwQiwwQkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7SUFDMUMsd0JBQUEsT0FBTyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDdEMsb0JBQUEsT0FBTyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDdEMsZ0JBQUEsQ0FBQztnQkFDSCxDQUFDO0lBQ0QsWUFBQSxTQUFTLEVBQUUsQ0FBQyxJQUFXLEtBQUk7SUFDekIsZ0JBQUEsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixDQUFDO2FBQ0Y7SUFDQSxhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLFdBQVcsR0FBR2IsZUFBVSxDQUFDLEdBQUcsQ0FBQ0Usb0JBQWUsQ0FBQyxVQUFVLENBQUM7SUFDOUQsUUFBQStCLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxXQUFXO0lBQ2YsYUFBQSxNQUFNLENBQUM7SUFDTixZQUFBLFNBQVMsRUFBRSxTQUFTLFFBQVEsQ0FDMUIsS0FBa0QsRUFDbEQsT0FBd0IsRUFDeEIsUUFBaUIsRUFDakIsY0FBa0MsRUFDbEMsRUFBVyxFQUFBO0lBRVgsZ0JBQUEsTUFBTSxRQUFRLEdBQXNCO0lBQ2xDLG9CQUFBLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUksS0FBYTtJQUMvQyxvQkFBQSxPQUFPLEVBQUUsT0FBTztJQUNoQixvQkFBQSxRQUFRLEVBQUUsUUFBUTtxQkFDbkI7SUFDRCxnQkFBQSxJQUFJLGNBQWM7SUFBRSxvQkFBQSxRQUFRLENBQUMsU0FBUyxHQUFHLGNBQWM7SUFDdkQsZ0JBQUEsSUFBSSxFQUFFO0lBQUUsb0JBQUEsUUFBUSxDQUFDLElBQUksR0FBRyxFQUFFO0lBQzFCLGdCQUFBLE1BQU0sT0FBTyxHQUFvQjtJQUMvQixvQkFBQSxPQUFPLEVBQ0wsT0FBTyxDQUFDLE1BQU0sS0FBS1ksWUFBTyxDQUFDLE9BQU87SUFDbEMsd0JBQUEsT0FBTyxDQUFDLE1BQU0sS0FBS0EsWUFBTyxDQUFDLE9BQU87d0JBQ3BDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxTQUFTO3dCQUNoRCxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsU0FBUztJQUNoRCxvQkFBQSxRQUFRLEVBQUUsSUFBSTtJQUNkLG9CQUFBLEtBQUssRUFBRSxRQUFRO3FCQUNoQjtvQkFDRCxPQUFPUCxnQkFBSyxDQUNWUSx3QkFBSSxDQUFDNUMsb0JBQWUsQ0FBQyxTQUFTLENBQUMsRUFDL0JzQyx3QkFBSSxDQUFDO3lCQUNGLE9BQU8sS0FBSyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNyQywwQkFBRTtJQUNGLDBCQUFFLEtBQUssQ0FBQyxJQUFJO0lBQ2Qsb0JBQUEsTUFBTSxDQUFDLElBQUk7SUFDWCxvQkFBQSxNQUFNLENBQUMsSUFBSTtJQUNYLG9CQUFBLE1BQU0sQ0FBQyxJQUFJO3FCQUNaLENBQUMsRUFDRkosZ0NBQVksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQ25DLFFBQVEsQ0FDTixNQUFLO3dCQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTs0QkFBRSxLQUFLLEdBQUksS0FBYSxFQUFFO0lBQ3pDLG9CQUFBLElBQUksQ0FBQyxLQUFLLENBQUN6Qyw2QkFBUyxDQUFDLE1BQTRCLENBQUM7SUFDaEQsd0JBQUEsTUFBTSxJQUFJSSwwQkFBYSxDQUNyQix5Q0FBeUMsQ0FDMUM7SUFDSCxvQkFBQSxPQUFPLEtBQUssQ0FBQ0osNkJBQVMsQ0FBQyxNQUE0QixDQUFDO0lBQ3RELGdCQUFBLENBQUMsRUFDRCxDQUFDLEtBQVUsS0FBSTt3QkFDYixNQUFNLEVBQUUsR0FBR0UsMkJBQWMsQ0FBQyxJQUFLLEtBQTBCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDL0Qsb0JBQUEsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNsQixDQUFDLEVBQ0QsT0FBTyxDQUNSLEVBQ0RrRCxrQkFBVSxDQUNSLGNBQWMsSUFBSSxRQUFRLENBQUM7SUFDekIsc0JBQUU7NEJBQ0Usd0JBQXdCLEVBQUUsUUFBUSxDQUFDLElBQUk7SUFDeEM7SUFDSCxzQkFBRyxTQUFpQixDQUN2QixDQUNGO2dCQUNILENBQUM7YUFDRjtJQUNBLGFBQUEsS0FBSyxFQUFFOztZQUdWLE1BQU0sWUFBWSxHQUFHL0MsZUFBVSxDQUFDLEdBQUcsQ0FBQ0Usb0JBQWUsQ0FBQyxXQUFXLENBQUM7SUFDaEUsUUFBQStCLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxZQUFZO0lBQ2hCLGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsU0FBUyxTQUFTLENBQzNCLEtBQWtELEVBQ2xELE9BQXdCLEVBQ3hCLFFBQWlCLEVBQ2pCLGFBQWtFLEVBQ2xFLEVBQVcsRUFBQTtJQUVYLGdCQUFBLE1BQU0sSUFBSSxHQUFzQjtJQUM5QixvQkFBQSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFJLEtBQWE7SUFDL0Msb0JBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsb0JBQUEsUUFBUSxFQUFFLFFBQVE7cUJBQ25CO0lBQ0QsZ0JBQUEsSUFBSSxhQUFhO0lBQUUsb0JBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhO0lBQ2pELGdCQUFBLElBQUksRUFBRTtJQUFFLG9CQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRTtJQUV0QixnQkFBQSxNQUFNLFVBQVUsR0FBRztJQUNqQixvQkFBQWEsd0JBQUksQ0FBQzVDLG9CQUFlLENBQUMsU0FBUyxDQUFDO3dCQUMvQjhDLHdCQUFJLENBQUMsS0FBSyxDQUFDO0lBQ1gsb0JBQUFaLGdDQUFZLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNoQyxvQkFBQSxTQUFTLGdCQUFnQixDQUFDLEdBQVEsRUFBRSxJQUFTLEVBQUE7SUFDM0Msd0JBQUEsTUFBTSxPQUFPLEdBQW9CO0lBQy9CLDRCQUFBLE9BQU8sRUFDTCxPQUFPLENBQUMsTUFBTSxLQUFLUyxZQUFPLENBQUMsT0FBTztJQUNsQyxnQ0FBQSxPQUFPLENBQUMsTUFBTSxLQUFLQSxZQUFPLENBQUMsT0FBTztnQ0FDcEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFNBQVM7Z0NBQ2hELFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxTQUFTO0lBQ2hELDRCQUFBLFFBQVEsRUFBRSxJQUFJO0lBQ2QsNEJBQUEsS0FBSyxFQUFFLFFBQVE7NkJBQ2hCOzRCQUNELE9BQU8sU0FBUyxDQUNkLE1BQUs7Z0NBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO29DQUFFLEtBQUssR0FBSSxLQUFhLEVBQUU7SUFDekMsNEJBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQ2xELDZCQUFTLENBQUMsTUFBNEIsQ0FBQztJQUNoRCxnQ0FBQSxNQUFNLElBQUlJLDBCQUFhLENBQ3JCLHlDQUF5QyxDQUMxQztJQUNILDRCQUFBLE9BQU8sS0FBSyxDQUFDSiw2QkFBUyxDQUFDLE1BQTRCLENBQUM7SUFDdEQsd0JBQUEsQ0FBQyxFQUNELENBQUMsS0FBVSxLQUFJO2dDQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQ0FBRSxLQUFLLEdBQUksS0FBYSxFQUFFO0lBQ3pDLDRCQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUssS0FBMEIsRUFBRTtJQUMzQyw0QkFBQSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJO29DQUNqRCxNQUFNLElBQUksR0FBR00scUJBQVUsQ0FBQyxxQkFBcUIsQ0FDM0NELGVBQVUsQ0FBQyxHQUFHLENBQUNFLG9CQUFlLENBQUMsV0FBVyxDQUFDLEVBQzNDLENBQUMsRUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUNMO0lBQ0QsZ0NBQUEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07SUFDdEQsb0NBQUEsT0FBTyxLQUFLO29DQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29DQUM5QixNQUFNLEtBQUssR0FDVCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVU7SUFDckMsb0NBQUEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNmLHNDQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSztJQUNqQixzQ0FBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUs7b0NBQ3JCLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUk7SUFDNUMsNEJBQUEsQ0FBQyxDQUFDO0lBQ0YsNEJBQUEsSUFBSSxDQUFDLGdCQUFnQjtvQ0FDbkIsTUFBTSxJQUFJSCwwQkFBYSxDQUNyQixDQUFBLHdEQUFBLEVBQTJELEtBQUssQ0FBQyxJQUFJLENBQUEsQ0FBQSxDQUFHLENBQ3pFO0lBQ0gsNEJBQUEsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7NEJBQ2hDLENBQUMsRUFDRCxPQUFPLENBQ1IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO3dCQUNkLENBQUM7cUJBQ0Y7SUFDRCxnQkFBQSxPQUFPdUMsZ0JBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsQ0FBQzthQUNGO0lBQ0EsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxZQUFZLEdBQUd0QyxlQUFVLENBQUMsR0FBRyxDQUFDRSxvQkFBZSxDQUFDLFdBQVcsQ0FBQztJQUNoRSxRQUFBK0IsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFlBQVk7SUFDaEIsYUFBQSxNQUFNLENBQUM7SUFDTixZQUFBLFNBQVMsRUFBRSxTQUFTLFNBQVMsQ0FDM0IsS0FBa0QsRUFDbEQsT0FBd0IsRUFDeEIsUUFBaUIsRUFDakIsYUFBa0UsRUFDbEUsRUFBVyxFQUFBO0lBRVgsZ0JBQUEsTUFBTSxRQUFRLEdBQXNCO0lBQ2xDLG9CQUFBLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFXO0lBQ2xELG9CQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLG9CQUFBLFFBQVEsRUFBRSxRQUFRO3FCQUNuQjtJQUNELGdCQUFBLElBQUksYUFBYTtJQUFFLG9CQUFBLFFBQVEsQ0FBQyxTQUFTLEdBQUcsYUFBYTtJQUNyRCxnQkFBQSxJQUFJLEVBQUU7SUFBRSxvQkFBQSxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUU7SUFDMUIsZ0JBQUEsTUFBTSxPQUFPLEdBQW9CO0lBQy9CLG9CQUFBLE9BQU8sRUFDTCxPQUFPLENBQUMsTUFBTSxLQUFLWSxZQUFPLENBQUMsT0FBTztJQUNsQyx3QkFBQSxPQUFPLENBQUMsTUFBTSxLQUFLQSxZQUFPLENBQUMsT0FBTzt3QkFDcEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFdBQVc7d0JBQ2xELFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxXQUFXO0lBQ2xELG9CQUFBLFFBQVEsRUFBRSxJQUFJO0lBQ2Qsb0JBQUEsS0FBSyxFQUFFLFFBQVE7cUJBQ2hCO29CQUNELE9BQU9QLGdCQUFLLENBQ1ZRLHdCQUFJLENBQUM1QyxvQkFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQnNDLHdCQUFJLENBQUM7eUJBQ0YsT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JDLDBCQUFFO0lBQ0YsMEJBQUUsS0FBSyxDQUFDLElBQUk7SUFDZCxvQkFBQSxNQUFNLENBQUMsSUFBSTtJQUNYLG9CQUFBLE1BQU0sQ0FBQyxJQUFJO0lBQ1gsb0JBQUEsTUFBTSxDQUFDLElBQUk7SUFDWixpQkFBQSxDQUFDLEVBQ0ZKLGdDQUFZLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxFQUNwQyxTQUFTLGdCQUFnQixDQUFDLEdBQVEsRUFBRSxJQUFTLEVBQUE7d0JBQzNDLE9BQU8sU0FBUyxDQUNkLE1BQUs7NEJBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO2dDQUFFLEtBQUssR0FBSSxLQUFhLEVBQUU7SUFDekMsd0JBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQ3pDLDZCQUFTLENBQUMsTUFBNEIsQ0FBQztJQUNoRCw0QkFBQSxNQUFNLElBQUlJLDBCQUFhLENBQ3JCLHlDQUF5QyxDQUMxQztJQUNILHdCQUFBLE9BQU8sS0FBSyxDQUFDSiw2QkFBUyxDQUFDLE1BQTRCLENBQUM7SUFDdEQsb0JBQUEsQ0FBQyxFQUNELENBQUMsS0FBVSxLQUFJOzRCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtnQ0FBRSxLQUFLLEdBQUksS0FBYSxFQUFFO0lBQ3pDLHdCQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUssS0FBMEIsRUFBRTtJQUMzQyx3QkFBQSxJQUFJLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJO2dDQUMvQyxNQUFNLElBQUksR0FBR00scUJBQVUsQ0FBQyxxQkFBcUIsQ0FDM0NELGVBQVUsQ0FBQyxHQUFHLENBQUNFLG9CQUFlLENBQUMsV0FBVyxDQUFDLEVBQzNDLENBQUMsRUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUNMO0lBQ0QsNEJBQUEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07SUFDdEQsZ0NBQUEsT0FBTyxLQUFLO0lBQ2QsNEJBQUEsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDakNxQyw4QkFBVSxDQUFDLEdBQUcsQ0FBQ2xCLGtDQUFjLENBQUMsSUFBSSxDQUFDLEVBQ25DLENBQUMsRUFDRCxDQUFDLENBQ0Y7SUFDRCw0QkFBQSxJQUFJLENBQUMsT0FBTztJQUNWLGdDQUFBLE1BQU0sSUFBSXRCLDBCQUFhLENBQ3JCLENBQUEsNkJBQUEsRUFBZ0MsQ0FBQyxDQUFBLElBQUEsRUFBTyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQSxDQUFFLENBQzdEO2dDQUNILE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJO0lBQ3BDLDRCQUFBLE9BQU8sSUFBSSxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSTtJQUN0Qyx3QkFBQSxDQUFDLENBQUM7SUFDRix3QkFBQSxJQUFJLENBQUMsZ0JBQWdCO2dDQUNuQixnQkFBZ0IsR0FBR0YsMkJBQWMsQ0FDL0IsSUFBSyxLQUEwQixFQUFFLENBQ2xDLENBQUMsRUFBWTtJQUNoQix3QkFBQSxPQUFPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDaEMsQ0FBQyxFQUNELE9BQU8sQ0FDUixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDZCxnQkFBQSxDQUFDLENBQ0Y7Z0JBQ0gsQ0FBQzthQUNGO0lBQ0EsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxhQUFhLEdBQUdHLGVBQVUsQ0FBQyxHQUFHLENBQUNFLG9CQUFlLENBQUMsWUFBWSxDQUFDO0lBQ2xFLFFBQUErQiw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsYUFBYTtJQUNqQixhQUFBLE1BQU0sQ0FBQztJQUNOLFlBQUEsU0FBUyxFQUFFLFNBQVMsVUFBVSxDQUM1QixLQUFrRCxFQUNsRCxPQUF3QixFQUN4QixRQUFpQixFQUNqQixhQUFnQyxFQUNoQyxFQUFXLEVBQUE7SUFFWCxnQkFBQSxNQUFNLFFBQVEsR0FBc0I7SUFDbEMsb0JBQUEsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBSSxLQUFhO0lBQy9DLG9CQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLG9CQUFBLFFBQVEsRUFBRSxRQUFRO3FCQUNuQjtJQUNELGdCQUFBLElBQUksYUFBYTtJQUFFLG9CQUFBLFFBQVEsQ0FBQyxTQUFTLEdBQUcsYUFBYTtJQUNyRCxnQkFBQSxJQUFJLEVBQUU7SUFBRSxvQkFBQSxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUU7SUFDMUIsZ0JBQUEsTUFBTSxPQUFPLEdBQW9CO0lBQy9CLG9CQUFBLE9BQU8sRUFDTCxPQUFPLENBQUMsTUFBTSxLQUFLWSxZQUFPLENBQUMsT0FBTztJQUNsQyx3QkFBQSxPQUFPLENBQUMsTUFBTSxLQUFLQSxZQUFPLENBQUMsT0FBTzt3QkFDcEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFNBQVM7d0JBQ2hELFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxTQUFTO0lBQ2hELG9CQUFBLFFBQVEsRUFBRSxJQUFJO0lBQ2Qsb0JBQUEsS0FBSyxFQUFFLFFBQVE7cUJBQ2hCO29CQUNELE9BQU9QLGdCQUFLLENBQ1ZRLHdCQUFJLENBQUM1QyxvQkFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQjhDLHdCQUFJLENBQUMsS0FBSyxDQUFDLEVBQ1haLGdDQUFZLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxFQUNyQyxVQUFVLENBQ1IsTUFBSzt3QkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7NEJBQUUsS0FBSyxHQUFJLEtBQWEsRUFBRTtJQUN6QyxvQkFBQSxJQUFJLENBQUMsS0FBSyxDQUFDekMsNkJBQVMsQ0FBQyxNQUE0QixDQUFDO0lBQ2hELHdCQUFBLE1BQU0sSUFBSUksMEJBQWEsQ0FDckIseUNBQXlDLENBQzFDO0lBQ0gsb0JBQUEsT0FBTyxLQUFLLENBQUNKLDZCQUFTLENBQUMsTUFBNEIsQ0FBQztJQUN0RCxnQkFBQSxDQUFDLEVBQ0QsQ0FBQyxLQUFVLEtBQUk7d0JBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJOzRCQUFFLEtBQUssR0FBSSxLQUFhLEVBQUU7d0JBQ3pDLE1BQU0sRUFBRSxHQUFHRSwyQkFBYyxDQUFDLElBQUssS0FBMEIsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUMvRCxvQkFBQSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2xCLENBQUMsRUFDRCxPQUFPLENBQ1IsRUFDRG9ELGlCQUFTLENBQUMsYUFBb0IsQ0FBQyxDQUNoQztnQkFDSCxDQUFDO2FBQ0Y7SUFDQSxhQUFBLEtBQUssRUFBRTs7SUFHVixRQUFBaEIsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztJQUNsQyxhQUFBLEdBQUcsQ0FBQy9CLG9CQUFlLENBQUMsS0FBSztJQUN6QixhQUFBLE1BQU0sQ0FBQztJQUNOLFlBQUEsU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUN2QixVQUFpRCxFQUNqRCxZQUFnQzs7Z0JBRWhDLElBQWEsRUFBQTtJQUViLGdCQUFBLE9BQU8sU0FBUyxLQUFLLENBQUMsR0FBUSxFQUFFLElBQVMsRUFBQTtJQUN2QyxvQkFBQSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTs0QkFFbEMsVUFBVSxHQUFHLFNBQVM7NEJBQ3RCLFlBQVksR0FBRyxTQUFTO3dCQUMxQjtJQUNBLG9CQUFBLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFOzRCQUVwQyxZQUFZLEdBQUcsU0FBUzt3QkFDMUI7SUFDQSxvQkFBQSxJQUFJLENBQUMsWUFBWSxJQUFJLFVBQVUsRUFBRTs0QkFDL0IsSUFDRSxVQUFVLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBQyxLQUNBLENBQUMsQ0FBQ0csbUJBQWMsQ0FBQyxHQUFHLEVBQUVBLG1CQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQVEsQ0FBQyxDQUMvRCxFQUNEO2dDQUNBLFlBQVksR0FBRyxVQUFzQjtnQ0FDckMsVUFBVSxHQUFHLFNBQVM7NEJBQ3hCO3dCQUNGO0lBRUEsb0JBQUEsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtJQUN2Qyx3QkFBQSxPQUFPNkMsYUFBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7d0JBQzVDO0lBRUEsb0JBQUEsT0FBT0EsYUFBSyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztJQUMzQixnQkFBQSxDQUFDO2dCQUNILENBQUM7YUFDRjtJQUNBLGFBQUEsS0FBSyxFQUFFO1lBRVYsTUFBTSxZQUFZLEdBQUdsRCxlQUFVLENBQUMsR0FBRyxDQUFDRSxvQkFBZSxDQUFDLFVBQVUsQ0FBQztZQUMvRCxNQUFNLFlBQVksR0FBR0YsZUFBVSxDQUFDLEdBQUcsQ0FBQ0Usb0JBQWUsQ0FBQyxVQUFVLENBQUM7SUFDL0QsUUFBQStCLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxZQUFZO0lBQ2hCLGFBQUEsTUFBTSxDQUNMa0IscUJBQVEsQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLENBQUMsRUFDNUNqQiw0QkFBUSxFQUFFLEVBQ1ZFLGdDQUFZLENBQUMsWUFBWSxFQUFFLEVBQUU7O0lBRTlCO0lBQ0EsYUFBQSxLQUFLLEVBQUU7SUFFVixRQUFBSCw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsWUFBWTtJQUNoQixhQUFBLE1BQU0sQ0FDTG1CLDJCQUFjLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDLEVBQ2xEbEIsNEJBQVEsRUFBRSxFQUNWRSxnQ0FBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7SUFFL0IsYUFBQSxLQUFLLEVBQUU7UUFDWjtJQUNEO0FBLzZDb0JwQixvQkFBQSxDQUFBO0lBRGxCLElBQUFxQyxVQUFLLEVBQUU7Ozs4Q0FDdUIsZUFBZTtJQUU3QyxDQUFBLEVBQUEsY0FBQSxDQUFBLFNBQUEsRUFBQSxVQUFBLEVBQUEsSUFBQSxDQUFBO0FBR1FyQyxvQkFBQSxDQUFBO0lBRFIsSUFBQXFDLFVBQUssRUFBRTs7OztJQUdQLENBQUEsRUFBQSxjQUFBLENBQUEsU0FBQSxFQUFBLFlBQUEsRUFBQSxJQUFBLENBQUE7QUFTRHJDLG9CQUFBLENBQUE7SUFEQyxJQUFBcUMsVUFBSyxFQUFFOzs7OENBQ3NCLGdCQUFnQjtJQUU3QyxDQUFBLEVBQUEsY0FBQSxDQUFBLFNBQUEsRUFBQSxXQUFBLEVBQUEsSUFBQSxDQUFBO0FBU0tyQyxvQkFBQSxDQUFBO0lBREwsSUFBQXFDLFVBQUssRUFBRTs7OztJQUdQLENBQUEsRUFBQSxjQUFBLENBQUEsU0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLENBQUE7QUEwQmVyQyxvQkFBQSxDQUFBO0lBRGYsSUFBQXFDLFVBQUssRUFBRTs7OztJQWtCUCxDQUFBLEVBQUEsY0FBQSxDQUFBLFNBQUEsRUFBQSxPQUFBLEVBQUEsSUFBQSxDQUFBO0FBeTJDSG5DLGdCQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQzs7SUMzb0RsQyxjQUFjLENBQUMsVUFBVSxFQUFFO0lBYTNCOzs7O0lBSUc7SUFFSDs7Ozs7SUFLRztBQUNJLFVBQU0sT0FBTyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==