jsii-pacmak 1.57.0 → 1.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/bin/jsii-pacmak.d.ts +1 -0
  2. package/bin/jsii-pacmak.d.ts.map +1 -0
  3. package/bin/jsii-pacmak.js +10 -10
  4. package/bin/jsii-pacmak.js.map +1 -0
  5. package/lib/builder.d.ts +1 -0
  6. package/lib/builder.d.ts.map +1 -0
  7. package/lib/builder.js +2 -2
  8. package/lib/builder.js.map +1 -0
  9. package/lib/dependency-graph.d.ts +1 -0
  10. package/lib/dependency-graph.d.ts.map +1 -0
  11. package/lib/dependency-graph.js +7 -11
  12. package/lib/dependency-graph.js.map +1 -0
  13. package/lib/generator.d.ts +1 -0
  14. package/lib/generator.d.ts.map +1 -0
  15. package/lib/generator.js +4 -6
  16. package/lib/generator.js.map +1 -0
  17. package/lib/index.d.ts +1 -0
  18. package/lib/index.d.ts.map +1 -0
  19. package/lib/index.js +12 -7
  20. package/lib/index.js.map +1 -0
  21. package/lib/logging.d.ts +1 -0
  22. package/lib/logging.d.ts.map +1 -0
  23. package/lib/logging.js +1 -1
  24. package/lib/logging.js.map +1 -0
  25. package/lib/markdown.d.ts +1 -0
  26. package/lib/markdown.d.ts.map +1 -0
  27. package/lib/markdown.js +5 -9
  28. package/lib/markdown.js.map +1 -0
  29. package/lib/naming-util.d.ts +1 -0
  30. package/lib/naming-util.d.ts.map +1 -0
  31. package/lib/naming-util.js +1 -1
  32. package/lib/naming-util.js.map +1 -0
  33. package/lib/npm-modules.d.ts +1 -0
  34. package/lib/npm-modules.d.ts.map +1 -0
  35. package/lib/npm-modules.js +8 -9
  36. package/lib/npm-modules.js.map +1 -0
  37. package/lib/packaging.d.ts +1 -0
  38. package/lib/packaging.d.ts.map +1 -0
  39. package/lib/packaging.js +3 -4
  40. package/lib/packaging.js.map +1 -0
  41. package/lib/target.d.ts +1 -0
  42. package/lib/target.d.ts.map +1 -0
  43. package/lib/target.js +5 -7
  44. package/lib/target.js.map +1 -0
  45. package/lib/targets/_utils.d.ts +1 -0
  46. package/lib/targets/_utils.d.ts.map +1 -0
  47. package/lib/targets/_utils.js +4 -5
  48. package/lib/targets/_utils.js.map +1 -0
  49. package/lib/targets/dotnet/dotnetdocgenerator.d.ts +1 -0
  50. package/lib/targets/dotnet/dotnetdocgenerator.d.ts.map +1 -0
  51. package/lib/targets/dotnet/dotnetdocgenerator.js +8 -10
  52. package/lib/targets/dotnet/dotnetdocgenerator.js.map +1 -0
  53. package/lib/targets/dotnet/dotnetgenerator.d.ts +1 -0
  54. package/lib/targets/dotnet/dotnetgenerator.d.ts.map +1 -0
  55. package/lib/targets/dotnet/dotnetgenerator.js +11 -19
  56. package/lib/targets/dotnet/dotnetgenerator.js.map +1 -0
  57. package/lib/targets/dotnet/dotnetruntimegenerator.d.ts +1 -0
  58. package/lib/targets/dotnet/dotnetruntimegenerator.d.ts.map +1 -0
  59. package/lib/targets/dotnet/dotnetruntimegenerator.js +2 -3
  60. package/lib/targets/dotnet/dotnetruntimegenerator.js.map +1 -0
  61. package/lib/targets/dotnet/dotnettyperesolver.d.ts +1 -0
  62. package/lib/targets/dotnet/dotnettyperesolver.d.ts.map +1 -0
  63. package/lib/targets/dotnet/dotnettyperesolver.js +10 -14
  64. package/lib/targets/dotnet/dotnettyperesolver.js.map +1 -0
  65. package/lib/targets/dotnet/filegenerator.d.ts +1 -0
  66. package/lib/targets/dotnet/filegenerator.d.ts.map +1 -0
  67. package/lib/targets/dotnet/filegenerator.js +5 -5
  68. package/lib/targets/dotnet/filegenerator.js.map +1 -0
  69. package/lib/targets/dotnet/nameutils.d.ts +1 -0
  70. package/lib/targets/dotnet/nameutils.d.ts.map +1 -0
  71. package/lib/targets/dotnet/nameutils.js +3 -3
  72. package/lib/targets/dotnet/nameutils.js.map +1 -0
  73. package/lib/targets/dotnet.d.ts +1 -0
  74. package/lib/targets/dotnet.d.ts.map +1 -0
  75. package/lib/targets/dotnet.js +8 -8
  76. package/lib/targets/dotnet.js.map +1 -0
  77. package/lib/targets/go/comparators.d.ts +1 -0
  78. package/lib/targets/go/comparators.d.ts.map +1 -0
  79. package/lib/targets/go/comparators.js +1 -1
  80. package/lib/targets/go/comparators.js.map +1 -0
  81. package/lib/targets/go/dependencies.d.ts +1 -0
  82. package/lib/targets/go/dependencies.d.ts.map +1 -0
  83. package/lib/targets/go/dependencies.js +1 -1
  84. package/lib/targets/go/dependencies.js.map +1 -0
  85. package/lib/targets/go/documentation.d.ts +2 -0
  86. package/lib/targets/go/documentation.d.ts.map +1 -0
  87. package/lib/targets/go/documentation.js +10 -1
  88. package/lib/targets/go/documentation.js.map +1 -0
  89. package/lib/targets/go/emit-context.d.ts +1 -0
  90. package/lib/targets/go/emit-context.d.ts.map +1 -0
  91. package/lib/targets/go/emit-context.js +1 -1
  92. package/lib/targets/go/emit-context.js.map +1 -0
  93. package/lib/targets/go/package.d.ts +5 -5
  94. package/lib/targets/go/package.d.ts.map +1 -0
  95. package/lib/targets/go/package.js +26 -28
  96. package/lib/targets/go/package.js.map +1 -0
  97. package/lib/targets/go/readme-file.d.ts +4 -2
  98. package/lib/targets/go/readme-file.d.ts.map +1 -0
  99. package/lib/targets/go/readme-file.js +7 -13
  100. package/lib/targets/go/readme-file.js.map +1 -0
  101. package/lib/targets/go/runtime/class-constructor.d.ts +1 -0
  102. package/lib/targets/go/runtime/class-constructor.d.ts.map +1 -0
  103. package/lib/targets/go/runtime/class-constructor.js +6 -6
  104. package/lib/targets/go/runtime/class-constructor.js.map +1 -0
  105. package/lib/targets/go/runtime/constants.d.ts +1 -0
  106. package/lib/targets/go/runtime/constants.d.ts.map +1 -0
  107. package/lib/targets/go/runtime/constants.js +1 -1
  108. package/lib/targets/go/runtime/constants.js.map +1 -0
  109. package/lib/targets/go/runtime/emit-arguments.d.ts +1 -0
  110. package/lib/targets/go/runtime/emit-arguments.d.ts.map +1 -0
  111. package/lib/targets/go/runtime/emit-arguments.js +3 -3
  112. package/lib/targets/go/runtime/emit-arguments.js.map +1 -0
  113. package/lib/targets/go/runtime/function-call.d.ts +1 -0
  114. package/lib/targets/go/runtime/function-call.d.ts.map +1 -0
  115. package/lib/targets/go/runtime/function-call.js +2 -3
  116. package/lib/targets/go/runtime/function-call.js.map +1 -0
  117. package/lib/targets/go/runtime/index.d.ts +1 -0
  118. package/lib/targets/go/runtime/index.d.ts.map +1 -0
  119. package/lib/targets/go/runtime/index.js +7 -3
  120. package/lib/targets/go/runtime/index.js.map +1 -0
  121. package/lib/targets/go/runtime/method-call.d.ts +1 -0
  122. package/lib/targets/go/runtime/method-call.d.ts.map +1 -0
  123. package/lib/targets/go/runtime/method-call.js +5 -5
  124. package/lib/targets/go/runtime/method-call.js.map +1 -0
  125. package/lib/targets/go/runtime/property-access.d.ts +1 -0
  126. package/lib/targets/go/runtime/property-access.d.ts.map +1 -0
  127. package/lib/targets/go/runtime/property-access.js +5 -5
  128. package/lib/targets/go/runtime/property-access.js.map +1 -0
  129. package/lib/targets/go/runtime/util.d.ts +1 -0
  130. package/lib/targets/go/runtime/util.d.ts.map +1 -0
  131. package/lib/targets/go/runtime/util.js +1 -1
  132. package/lib/targets/go/runtime/util.js.map +1 -0
  133. package/lib/targets/go/types/class.d.ts +1 -0
  134. package/lib/targets/go/types/class.d.ts.map +1 -0
  135. package/lib/targets/go/types/class.js +11 -17
  136. package/lib/targets/go/types/class.js.map +1 -0
  137. package/lib/targets/go/types/enum.d.ts +1 -0
  138. package/lib/targets/go/types/enum.d.ts.map +1 -0
  139. package/lib/targets/go/types/enum.js +1 -1
  140. package/lib/targets/go/types/enum.js.map +1 -0
  141. package/lib/targets/go/types/go-type-reference.d.ts +1 -0
  142. package/lib/targets/go/types/go-type-reference.d.ts.map +1 -0
  143. package/lib/targets/go/types/go-type-reference.js +10 -14
  144. package/lib/targets/go/types/go-type-reference.js.map +1 -0
  145. package/lib/targets/go/types/go-type.d.ts +1 -0
  146. package/lib/targets/go/types/go-type.d.ts.map +1 -0
  147. package/lib/targets/go/types/go-type.js +1 -1
  148. package/lib/targets/go/types/go-type.js.map +1 -0
  149. package/lib/targets/go/types/index.d.ts +1 -0
  150. package/lib/targets/go/types/index.d.ts.map +1 -0
  151. package/lib/targets/go/types/index.js +7 -3
  152. package/lib/targets/go/types/index.js.map +1 -0
  153. package/lib/targets/go/types/interface.d.ts +1 -0
  154. package/lib/targets/go/types/interface.d.ts.map +1 -0
  155. package/lib/targets/go/types/interface.js +8 -11
  156. package/lib/targets/go/types/interface.js.map +1 -0
  157. package/lib/targets/go/types/struct.d.ts +1 -0
  158. package/lib/targets/go/types/struct.d.ts.map +1 -0
  159. package/lib/targets/go/types/struct.js +2 -2
  160. package/lib/targets/go/types/struct.js.map +1 -0
  161. package/lib/targets/go/types/type-member.d.ts +1 -0
  162. package/lib/targets/go/types/type-member.d.ts.map +1 -0
  163. package/lib/targets/go/types/type-member.js +13 -15
  164. package/lib/targets/go/types/type-member.js.map +1 -0
  165. package/lib/targets/go/util.d.ts +1 -0
  166. package/lib/targets/go/util.d.ts.map +1 -0
  167. package/lib/targets/go/util.js +5 -8
  168. package/lib/targets/go/util.js.map +1 -0
  169. package/lib/targets/go/version-file.d.ts +1 -0
  170. package/lib/targets/go/version-file.d.ts.map +1 -0
  171. package/lib/targets/go/version-file.js +1 -1
  172. package/lib/targets/go/version-file.js.map +1 -0
  173. package/lib/targets/go.d.ts +1 -0
  174. package/lib/targets/go.d.ts.map +1 -0
  175. package/lib/targets/go.js +4 -4
  176. package/lib/targets/go.js.map +1 -0
  177. package/lib/targets/index.d.ts +1 -0
  178. package/lib/targets/index.d.ts.map +1 -0
  179. package/lib/targets/index.js +3 -3
  180. package/lib/targets/index.js.map +1 -0
  181. package/lib/targets/java.d.ts +1 -0
  182. package/lib/targets/java.d.ts.map +1 -0
  183. package/lib/targets/java.js +70 -84
  184. package/lib/targets/java.js.map +1 -0
  185. package/lib/targets/js.d.ts +1 -0
  186. package/lib/targets/js.d.ts.map +1 -0
  187. package/lib/targets/js.js +2 -2
  188. package/lib/targets/js.js.map +1 -0
  189. package/lib/targets/python/requirements-dev.txt +2 -3
  190. package/lib/targets/python/type-name.d.ts +1 -0
  191. package/lib/targets/python/type-name.d.ts.map +1 -0
  192. package/lib/targets/python/type-name.js +63 -62
  193. package/lib/targets/python/type-name.js.map +1 -0
  194. package/lib/targets/python/util.d.ts +1 -0
  195. package/lib/targets/python/util.d.ts.map +1 -0
  196. package/lib/targets/python/util.js +1 -1
  197. package/lib/targets/python/util.js.map +1 -0
  198. package/lib/targets/python.d.ts +1 -0
  199. package/lib/targets/python.d.ts.map +1 -0
  200. package/lib/targets/python.js +108 -108
  201. package/lib/targets/python.js.map +1 -0
  202. package/lib/targets/version-utils.d.ts +1 -0
  203. package/lib/targets/version-utils.d.ts.map +1 -0
  204. package/lib/targets/version-utils.js +6 -7
  205. package/lib/targets/version-utils.js.map +1 -0
  206. package/lib/timer.d.ts +1 -0
  207. package/lib/timer.d.ts.map +1 -0
  208. package/lib/timer.js +1 -1
  209. package/lib/timer.js.map +1 -0
  210. package/lib/toposort.d.ts +1 -0
  211. package/lib/toposort.d.ts.map +1 -0
  212. package/lib/toposort.js +1 -1
  213. package/lib/toposort.js.map +1 -0
  214. package/lib/util.d.ts +1 -0
  215. package/lib/util.d.ts.map +1 -0
  216. package/lib/util.js +15 -18
  217. package/lib/util.js.map +1 -0
  218. package/lib/version.d.ts +3 -2
  219. package/lib/version.d.ts.map +1 -0
  220. package/lib/version.js +4 -4
  221. package/lib/version.js.map +1 -0
  222. package/package.json +16 -23
@@ -82,7 +82,7 @@ class JavaBuilder {
82
82
  logging.debug(`Generating aggregate Java source dir at ${tmpDir}`);
83
83
  const ret = [];
84
84
  const generatedModules = modules
85
- .map((module) => ({ module, relativeName: util_1.slugify(module.name) }))
85
+ .map((module) => ({ module, relativeName: (0, util_1.slugify)(module.name) }))
86
86
  .map(({ module, relativeName }) => ({
87
87
  module,
88
88
  relativeName,
@@ -168,10 +168,10 @@ class JavaBuilder {
168
168
  const allDepsOutputDirs = new Set();
169
169
  const resolvedModules = this.modules.map(async (mod) => ({
170
170
  module: mod,
171
- localBuildDirs: await target_1.findLocalBuildDirs(mod.moduleDirectory, this.targetName),
171
+ localBuildDirs: await (0, target_1.findLocalBuildDirs)(mod.moduleDirectory, this.targetName),
172
172
  }));
173
173
  for await (const { module, localBuildDirs } of resolvedModules) {
174
- util_1.setExtend(allDepsOutputDirs, localBuildDirs);
174
+ (0, util_1.setExtend)(allDepsOutputDirs, localBuildDirs);
175
175
  // Also include output directory where we're building to, in case we build multiple packages into
176
176
  // the same output directory.
177
177
  allDepsOutputDirs.add(path.join(module.outputDirectory, this.options.languageSubdirectory ? this.targetName : ''));
@@ -249,7 +249,7 @@ class Java extends target_1.Target {
249
249
  static toPackageInfos(assm) {
250
250
  const groupId = assm.targets.java.maven.groupId;
251
251
  const artifactId = assm.targets.java.maven.artifactId;
252
- const releaseVersion = version_utils_1.toReleaseVersion(assm.version, index_1.TargetName.JAVA);
252
+ const releaseVersion = (0, version_utils_1.toReleaseVersion)(assm.version, index_1.TargetName.JAVA);
253
253
  const url = `https://repo1.maven.org/maven2/${groupId.replace(/\./g, '/')}/${artifactId}/${assm.version}/`;
254
254
  return {
255
255
  java: {
@@ -290,7 +290,6 @@ class Java extends target_1.Target {
290
290
  return { java: `import ${[options.package, ...name].join('.')};` };
291
291
  }
292
292
  async build(sourceDir, outDir) {
293
- var _a;
294
293
  const url = `file://${outDir}`;
295
294
  const mvnArguments = new Array();
296
295
  for (const arg of Object.keys(this.arguments)) {
@@ -300,7 +299,7 @@ class Java extends target_1.Target {
300
299
  mvnArguments.push(`--${arg.slice(4)}`);
301
300
  mvnArguments.push(this.arguments[arg].toString());
302
301
  }
303
- await util_1.shell('mvn', [
302
+ await (0, util_1.shell)('mvn', [
304
303
  // If we don't run in verbose mode, turn on quiet mode
305
304
  ...(this.arguments.verbose ? [] : ['--quiet']),
306
305
  '--batch-mode',
@@ -313,7 +312,7 @@ class Java extends target_1.Target {
313
312
  env: {
314
313
  // Twiddle the JVM settings a little for Maven. Delaying JIT compilation
315
314
  // brings down Maven execution time by about 1/3rd (15->10s, 30->20s)
316
- MAVEN_OPTS: `${(_a = process.env.MAVEN_OPTS) !== null && _a !== void 0 ? _a : ''} -XX:+TieredCompilation -XX:TieredStopAtLevel=1`,
315
+ MAVEN_OPTS: `${process.env.MAVEN_OPTS ?? ''} -XX:+TieredCompilation -XX:TieredStopAtLevel=1`,
317
316
  },
318
317
  retry: { maxAttempts: 5 },
319
318
  });
@@ -360,7 +359,7 @@ class JavaGenerator extends generator_1.Generator {
360
359
  return methodName;
361
360
  }
362
361
  if (JavaGenerator.RESERVED_KEYWORDS.includes(methodName)) {
363
- return `do${naming_util_1.jsiiToPascalCase(methodName)}`;
362
+ return `do${(0, naming_util_1.jsiiToPascalCase)(methodName)}`;
364
363
  }
365
364
  return methodName;
366
365
  }
@@ -378,13 +377,12 @@ class JavaGenerator extends generator_1.Generator {
378
377
  return path.join('src', 'main', 'resources', dir);
379
378
  }
380
379
  onBeginClass(cls, abstract) {
381
- var _a, _b;
382
380
  this.openFileIfNeeded(cls);
383
381
  this.addJavaDocs(cls, { api: 'type', fqn: cls.fqn });
384
382
  const classBase = this.getClassBase(cls);
385
383
  const extendsExpression = classBase ? ` extends ${classBase}` : '';
386
384
  let implementsExpr = '';
387
- if ((_b = (_a = cls.interfaces) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0 > 0) {
385
+ if (cls.interfaces?.length ?? 0 > 0) {
388
386
  implementsExpr = ` implements ${cls
389
387
  .interfaces.map((x) => this.toNativeFqn(x))
390
388
  .join(', ')}`;
@@ -490,8 +488,7 @@ class JavaGenerator extends generator_1.Generator {
490
488
  * Only emit package-info in case this is a submodule
491
489
  */
492
490
  onBeginNamespace(ns) {
493
- var _a;
494
- const submodule = (_a = this.assembly.submodules) === null || _a === void 0 ? void 0 : _a[ns];
491
+ const submodule = this.assembly.submodules?.[ns];
495
492
  if (submodule) {
496
493
  this.emitSubmodulePackageInfo(this.assembly, ns);
497
494
  }
@@ -500,11 +497,10 @@ class JavaGenerator extends generator_1.Generator {
500
497
  /* noop */
501
498
  }
502
499
  onBeginInterface(ifc) {
503
- var _a;
504
500
  this.openFileIfNeeded(ifc);
505
501
  this.addJavaDocs(ifc, { api: 'type', fqn: ifc.fqn });
506
502
  // all interfaces always extend JsiiInterface so we can identify that it is a jsii interface.
507
- const interfaces = (_a = ifc.interfaces) !== null && _a !== void 0 ? _a : [];
503
+ const interfaces = ifc.interfaces ?? [];
508
504
  const bases = [
509
505
  'software.amazon.jsii.JsiiSerializable',
510
506
  ...interfaces.map((x) => this.toNativeFqn(x)),
@@ -541,20 +537,21 @@ class JavaGenerator extends generator_1.Generator {
541
537
  const returnType = method.returns
542
538
  ? this.toDecoratedJavaType(method.returns)
543
539
  : 'void';
540
+ const methodName = JavaGenerator.safeJavaMethodName(method.name);
544
541
  this.addJavaDocs(method, {
545
542
  api: 'member',
546
543
  fqn: ifc.fqn,
547
- memberName: method.name,
544
+ memberName: methodName,
548
545
  });
549
546
  this.emitStabilityAnnotations(method);
550
- this.code.line(`${returnType} ${method.name}(${this.renderMethodParameters(method)});`);
547
+ this.code.line(`${returnType} ${methodName}(${this.renderMethodParameters(method)});`);
551
548
  }
552
549
  onInterfaceMethodOverload(ifc, overload, _originalMethod) {
553
550
  this.onInterfaceMethod(ifc, overload);
554
551
  }
555
552
  onInterfaceProperty(ifc, prop) {
556
553
  const getterType = this.toDecoratedJavaType(prop);
557
- const propName = naming_util_1.jsiiToPascalCase(JavaGenerator.safeJavaPropertyName(prop.name));
554
+ const propName = (0, naming_util_1.jsiiToPascalCase)(JavaGenerator.safeJavaPropertyName(prop.name));
558
555
  // for unions we only generate overloads for setters, not getters.
559
556
  this.code.line();
560
557
  this.addJavaDocs(prop, {
@@ -609,7 +606,6 @@ class JavaGenerator extends generator_1.Generator {
609
606
  * @see https://github.com/aws/jsii/issues/2256
610
607
  */
611
608
  emitMultiplyInheritedOptionalProperties(ifc) {
612
- var _a, _b;
613
609
  if (ifc.interfaces == null || ifc.interfaces.length <= 1) {
614
610
  // Nothing to do if we don't have parent interfaces, or if we have exactly one
615
611
  return;
@@ -618,14 +614,13 @@ class JavaGenerator extends generator_1.Generator {
618
614
  .map(allOptionalProps.bind(this))
619
615
  // Calculate how many direct parents brought a given optional property
620
616
  .reduce((histogram, entry) => {
621
- var _a;
622
617
  for (const [name, spec] of Object.entries(entry)) {
623
- histogram[name] = (_a = histogram[name]) !== null && _a !== void 0 ? _a : { spec, count: 0 };
618
+ histogram[name] = histogram[name] ?? { spec, count: 0 };
624
619
  histogram[name].count += 1;
625
620
  }
626
621
  return histogram;
627
622
  }, {});
628
- const localProps = new Set((_b = (_a = ifc.properties) === null || _a === void 0 ? void 0 : _a.map((prop) => prop.name)) !== null && _b !== void 0 ? _b : []);
623
+ const localProps = new Set(ifc.properties?.map((prop) => prop.name) ?? []);
629
624
  for (const { spec, count } of Object.values(inheritedOptionalProps)) {
630
625
  if (count < 2 || localProps.has(spec.name)) {
631
626
  continue;
@@ -633,15 +628,14 @@ class JavaGenerator extends generator_1.Generator {
633
628
  this.onInterfaceProperty(ifc, spec);
634
629
  }
635
630
  function allOptionalProps(fqn) {
636
- var _a, _b;
637
631
  const type = this.findType(fqn);
638
632
  const result = {};
639
- for (const prop of (_a = type.properties) !== null && _a !== void 0 ? _a : []) {
633
+ for (const prop of type.properties ?? []) {
640
634
  // Adding artifical "overrides" here for code-gen quality's sake.
641
635
  result[prop.name] = { ...prop, overrides: type.fqn };
642
636
  }
643
637
  // Include optional properties of all super interfaces in the result
644
- for (const base of (_b = type.interfaces) !== null && _b !== void 0 ? _b : []) {
638
+ for (const base of type.interfaces ?? []) {
645
639
  for (const [name, prop] of Object.entries(allOptionalProps.call(this, base))) {
646
640
  if (!(name in result)) {
647
641
  result[name] = prop;
@@ -660,7 +654,7 @@ class JavaGenerator extends generator_1.Generator {
660
654
  this.code.openFile(packageInfoFile);
661
655
  this.code.line('/**');
662
656
  if (mod.readme) {
663
- for (const line of jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(mod.readme.markdown, {
657
+ for (const line of (0, jsii_rosetta_1.markDownToJavaDoc)(this.convertSamplesInMarkdown(mod.readme.markdown, {
664
658
  api: 'moduleReadme',
665
659
  moduleFqn: mod.name,
666
660
  })).split('\n')) {
@@ -678,9 +672,8 @@ class JavaGenerator extends generator_1.Generator {
678
672
  this.code.closeFile(packageInfoFile);
679
673
  }
680
674
  emitSubmodulePackageInfo(assembly, moduleFqn) {
681
- var _a, _b;
682
- const mod = (_a = assembly.submodules) === null || _a === void 0 ? void 0 : _a[moduleFqn];
683
- if (!((_b = mod === null || mod === void 0 ? void 0 : mod.readme) === null || _b === void 0 ? void 0 : _b.markdown)) {
675
+ const mod = assembly.submodules?.[moduleFqn];
676
+ if (!mod?.readme?.markdown) {
684
677
  return;
685
678
  }
686
679
  const { packageName } = translateFqn(assembly, moduleFqn);
@@ -688,7 +681,7 @@ class JavaGenerator extends generator_1.Generator {
688
681
  this.code.openFile(packageInfoFile);
689
682
  this.code.line('/**');
690
683
  if (mod.readme) {
691
- for (const line of jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(mod.readme.markdown, {
684
+ for (const line of (0, jsii_rosetta_1.markDownToJavaDoc)(this.convertSamplesInMarkdown(mod.readme.markdown, {
692
685
  api: 'moduleReadme',
693
686
  moduleFqn,
694
687
  })).split('\n')) {
@@ -700,8 +693,7 @@ class JavaGenerator extends generator_1.Generator {
700
693
  this.code.closeFile(packageInfoFile);
701
694
  }
702
695
  emitMavenPom(assm, fingerprint) {
703
- var _a;
704
- if (!((_a = assm.targets) === null || _a === void 0 ? void 0 : _a.java)) {
696
+ if (!assm.targets?.java) {
705
697
  throw new Error(`Assembly ${assm.name} does not declare a java target`);
706
698
  }
707
699
  const comment = fingerprint
@@ -841,7 +833,7 @@ class JavaGenerator extends generator_1.Generator {
841
833
  */
842
834
  function makeVersion(version, suffix) {
843
835
  if (!suffix) {
844
- return version_utils_1.toReleaseVersion(version, index_1.TargetName.JAVA);
836
+ return (0, version_utils_1.toReleaseVersion)(version, index_1.TargetName.JAVA);
845
837
  }
846
838
  if (!suffix.startsWith('-') && !suffix.startsWith('.')) {
847
839
  throw new Error(`versionSuffix must start with '-' or '.', but received ${suffix}`);
@@ -849,24 +841,23 @@ class JavaGenerator extends generator_1.Generator {
849
841
  return `${version}${suffix}`;
850
842
  }
851
843
  function mavenDependencies() {
852
- var _a, _b, _c;
853
844
  const dependencies = new Array();
854
- for (const [depName, version] of Object.entries((_a = this.assembly.dependencies) !== null && _a !== void 0 ? _a : {})) {
855
- const dep = (_b = this.assembly.dependencyClosure) === null || _b === void 0 ? void 0 : _b[depName];
856
- if (!((_c = dep === null || dep === void 0 ? void 0 : dep.targets) === null || _c === void 0 ? void 0 : _c.java)) {
845
+ for (const [depName, version] of Object.entries(this.assembly.dependencies ?? {})) {
846
+ const dep = this.assembly.dependencyClosure?.[depName];
847
+ if (!dep?.targets?.java) {
857
848
  throw new Error(`Assembly ${assm.name} depends on ${depName}, which does not declare a java target`);
858
849
  }
859
850
  dependencies.push({
860
851
  groupId: dep.targets.java.maven.groupId,
861
852
  artifactId: dep.targets.java.maven.artifactId,
862
- version: version_utils_1.toMavenVersionRange(version, dep.targets.java.maven.versionSuffix),
853
+ version: (0, version_utils_1.toMavenVersionRange)(version, dep.targets.java.maven.versionSuffix),
863
854
  });
864
855
  }
865
856
  // The JSII java runtime base classes
866
857
  dependencies.push({
867
858
  groupId: 'software.amazon.jsii',
868
859
  artifactId: 'jsii-runtime',
869
- version: version_utils_1.toMavenVersionRange(`^${version_1.VERSION}`),
860
+ version: (0, version_utils_1.toMavenVersionRange)(`^${version_1.VERSION}`),
870
861
  });
871
862
  // Provides @org.jetbrains.*
872
863
  dependencies.push({
@@ -885,8 +876,7 @@ class JavaGenerator extends generator_1.Generator {
885
876
  return dependencies;
886
877
  }
887
878
  function mavenDevelopers() {
888
- var _a;
889
- return [assm.author, ...((_a = assm.contributors) !== null && _a !== void 0 ? _a : [])].map(toDeveloper);
879
+ return [assm.author, ...(assm.contributors ?? [])].map(toDeveloper);
890
880
  function toDeveloper(person) {
891
881
  const developer = {
892
882
  [person.organization ? 'organization' : 'name']: person.name,
@@ -918,8 +908,7 @@ class JavaGenerator extends generator_1.Generator {
918
908
  }
919
909
  }
920
910
  emitStaticInitializer(cls) {
921
- var _a;
922
- const consts = ((_a = cls.properties) !== null && _a !== void 0 ? _a : []).filter((x) => x.const);
911
+ const consts = (cls.properties ?? []).filter((x) => x.const);
923
912
  if (consts.length === 0) {
924
913
  return;
925
914
  }
@@ -955,7 +944,7 @@ class JavaGenerator extends generator_1.Generator {
955
944
  const setterTypes = this.toDecoratedJavaTypes(prop, {
956
945
  covariant: prop.static,
957
946
  });
958
- const propName = naming_util_1.jsiiToPascalCase(JavaGenerator.safeJavaPropertyName(prop.name));
947
+ const propName = (0, naming_util_1.jsiiToPascalCase)(JavaGenerator.safeJavaPropertyName(prop.name));
959
948
  const modifiers = [defaultImpl ? 'default' : this.renderAccessLevel(prop)];
960
949
  if (prop.static)
961
950
  modifiers.push('static');
@@ -1143,7 +1132,7 @@ class JavaGenerator extends generator_1.Generator {
1143
1132
  .join(', ')}`);
1144
1133
  for (const property of type.allProperties.filter((prop) => prop.abstract &&
1145
1134
  // Only checking the getter - java.lang.Object has no setters.
1146
- !isJavaLangObjectMethodName(`get${naming_util_1.jsiiToPascalCase(prop.name)}`) &&
1135
+ !isJavaLangObjectMethodName(`get${(0, naming_util_1.jsiiToPascalCase)(prop.name)}`) &&
1147
1136
  (prop.parentType.fqn === type.fqn ||
1148
1137
  !hasDefaultInterfaces(prop.assembly)))) {
1149
1138
  this.emitProperty(type.spec, property.spec, property.definingType.spec, {
@@ -1191,9 +1180,8 @@ class JavaGenerator extends generator_1.Generator {
1191
1180
  }
1192
1181
  }
1193
1182
  toJavaProp(property, definingType, inherited) {
1194
- var _a;
1195
1183
  const safeName = JavaGenerator.safeJavaPropertyName(property.name);
1196
- const propName = naming_util_1.jsiiToPascalCase(safeName);
1184
+ const propName = (0, naming_util_1.jsiiToPascalCase)(safeName);
1197
1185
  return {
1198
1186
  docs: property.docs,
1199
1187
  spec: property,
@@ -1209,12 +1197,11 @@ class JavaGenerator extends generator_1.Generator {
1209
1197
  forMarshalling: true,
1210
1198
  })}.class`,
1211
1199
  javaTypes: this.toJavaTypes(property.type, { covariant: true }),
1212
- immutable: (_a = property.immutable) !== null && _a !== void 0 ? _a : false,
1200
+ immutable: property.immutable ?? false,
1213
1201
  inherited,
1214
1202
  };
1215
1203
  }
1216
1204
  emitClassBuilder(cls) {
1217
- var _a, _b, _c, _d;
1218
1205
  // Not rendering if there is no initializer, or if the initializer is protected or variadic
1219
1206
  if (cls.initializer == null || cls.initializer.protected) {
1220
1207
  return;
@@ -1234,7 +1221,7 @@ class JavaGenerator extends generator_1.Generator {
1234
1221
  return false;
1235
1222
  }
1236
1223
  const paramType = this.reflectAssembly.tryFindType(param.type.fqn);
1237
- return paramType === null || paramType === void 0 ? void 0 : paramType.isDataType();
1224
+ return paramType?.isDataType();
1238
1225
  });
1239
1226
  // Not rendering if there is no struct parameter
1240
1227
  if (firstStruct == null) {
@@ -1254,7 +1241,7 @@ class JavaGenerator extends generator_1.Generator {
1254
1241
  this.code.line();
1255
1242
  this.code.line('/**');
1256
1243
  // eslint-disable-next-line prettier/prettier
1257
- this.code.line(` * ${_utils_1.stabilityPrefixFor(cls.initializer)}A fluent builder for {@link ${builtType}}.`);
1244
+ this.code.line(` * ${(0, _utils_1.stabilityPrefixFor)(cls.initializer)}A fluent builder for {@link ${builtType}}.`);
1258
1245
  this.code.line(' */');
1259
1246
  this.emitStabilityAnnotations(cls.initializer);
1260
1247
  this.code.openBlock(`public static final class ${BUILDER_CLASS_NAME} implements software.amazon.jsii.Builder<${builtType}>`);
@@ -1262,7 +1249,7 @@ class JavaGenerator extends generator_1.Generator {
1262
1249
  for (const params of computeOverrides(positionalParams)) {
1263
1250
  const dummyMethod = {
1264
1251
  docs: {
1265
- stability: (_b = (_a = cls.initializer.docs) === null || _a === void 0 ? void 0 : _a.stability) !== null && _b !== void 0 ? _b : (_c = cls.docs) === null || _c === void 0 ? void 0 : _c.stability,
1252
+ stability: cls.initializer.docs?.stability ?? cls.docs?.stability,
1266
1253
  returns: `a new instance of {@link ${BUILDER_CLASS_NAME}}.`,
1267
1254
  },
1268
1255
  name: 'create',
@@ -1308,7 +1295,7 @@ class JavaGenerator extends generator_1.Generator {
1308
1295
  name: fieldName,
1309
1296
  docs: {
1310
1297
  ...prop.spec.docs,
1311
- stability: (_d = prop.spec.docs) === null || _d === void 0 ? void 0 : _d.stability,
1298
+ stability: prop.spec.docs?.stability,
1312
1299
  returns: '{@code this}',
1313
1300
  },
1314
1301
  parameters: [
@@ -1367,16 +1354,15 @@ class JavaGenerator extends generator_1.Generator {
1367
1354
  this.code.closeBlock();
1368
1355
  }
1369
1356
  emitBuilderSetter(prop, builderName, parentType) {
1370
- var _a, _b, _c, _d;
1371
1357
  for (const type of prop.javaTypes) {
1372
1358
  this.code.line();
1373
1359
  this.code.line('/**');
1374
1360
  this.code.line(` * Sets the value of {@link ${parentType.name}#${getterFor(prop.fieldName)}}`);
1375
- const summary = (_b = (_a = prop.docs) === null || _a === void 0 ? void 0 : _a.summary) !== null && _b !== void 0 ? _b : 'the value to be set';
1361
+ const summary = prop.docs?.summary ?? 'the value to be set';
1376
1362
  this.code.line(` * ${paramJavadoc(prop.fieldName, prop.nullable, summary)}`);
1377
- if (((_c = prop.docs) === null || _c === void 0 ? void 0 : _c.remarks) != null) {
1363
+ if (prop.docs?.remarks != null) {
1378
1364
  const indent = ' '.repeat(7 + prop.fieldName.length);
1379
- const remarks = jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(prop.docs.remarks, {
1365
+ const remarks = (0, jsii_rosetta_1.markDownToJavaDoc)(this.convertSamplesInMarkdown(prop.docs.remarks, {
1380
1366
  api: 'member',
1381
1367
  fqn: prop.definingType.fqn,
1382
1368
  memberName: prop.jsiiName,
@@ -1386,7 +1372,7 @@ class JavaGenerator extends generator_1.Generator {
1386
1372
  }
1387
1373
  }
1388
1374
  this.code.line(' * @return {@code this}');
1389
- if ((_d = prop.docs) === null || _d === void 0 ? void 0 : _d.deprecated) {
1375
+ if (prop.docs?.deprecated) {
1390
1376
  this.code.line(` * @deprecated ${prop.docs.deprecated}`);
1391
1377
  }
1392
1378
  this.code.line(' */');
@@ -1452,13 +1438,12 @@ class JavaGenerator extends generator_1.Generator {
1452
1438
  // enforced by Typescript constraints.
1453
1439
  const propsByName = {};
1454
1440
  function collectProps(currentIfc, isBaseClass = false) {
1455
- var _a, _b;
1456
- for (const property of (_a = currentIfc.properties) !== null && _a !== void 0 ? _a : []) {
1441
+ for (const property of currentIfc.properties ?? []) {
1457
1442
  const javaProp = this.toJavaProp(property, currentIfc, isBaseClass);
1458
1443
  propsByName[javaProp.propName] = javaProp;
1459
1444
  }
1460
1445
  // add props of base struct
1461
- for (const base of (_b = currentIfc.interfaces) !== null && _b !== void 0 ? _b : []) {
1446
+ for (const base of currentIfc.interfaces ?? []) {
1462
1447
  collectProps.call(this, this.findType(base), true);
1463
1448
  }
1464
1449
  }
@@ -1650,22 +1635,21 @@ class JavaGenerator extends generator_1.Generator {
1650
1635
  }
1651
1636
  // eslint-disable-next-line complexity
1652
1637
  addJavaDocs(doc, apiLoc, defaultText) {
1653
- var _a, _b, _c, _d;
1654
1638
  if (!defaultText &&
1655
- Object.keys((_a = doc.docs) !== null && _a !== void 0 ? _a : {}).length === 0 &&
1656
- !((_b = doc.parameters) !== null && _b !== void 0 ? _b : []).some((p) => { var _a; return Object.keys((_a = p.docs) !== null && _a !== void 0 ? _a : {}).length !== 0; })) {
1639
+ Object.keys(doc.docs ?? {}).length === 0 &&
1640
+ !(doc.parameters ?? []).some((p) => Object.keys(p.docs ?? {}).length !== 0)) {
1657
1641
  return;
1658
1642
  }
1659
- const docs = (doc.docs = (_c = doc.docs) !== null && _c !== void 0 ? _c : {});
1643
+ const docs = (doc.docs = doc.docs ?? {});
1660
1644
  const paras = [];
1661
1645
  if (docs.summary) {
1662
- paras.push(_utils_1.renderSummary(docs));
1646
+ paras.push((0, _utils_1.renderSummary)(docs));
1663
1647
  }
1664
1648
  else if (defaultText) {
1665
1649
  paras.push(defaultText);
1666
1650
  }
1667
1651
  if (docs.remarks) {
1668
- paras.push(jsii_rosetta_1.markDownToJavaDoc(this.convertSamplesInMarkdown(docs.remarks, apiLoc)).trimRight());
1652
+ paras.push((0, jsii_rosetta_1.markDownToJavaDoc)(this.convertSamplesInMarkdown(docs.remarks, apiLoc)).trimRight());
1669
1653
  }
1670
1654
  if (docs.default) {
1671
1655
  paras.push(`Default: ${docs.default}`); // NOTE: there is no annotation in JavaDoc for this
@@ -1684,14 +1668,14 @@ class JavaGenerator extends generator_1.Generator {
1684
1668
  //
1685
1669
  // Hence, we just resort to HTML-encoding everything (same as we do for code
1686
1670
  // examples that have been translated from MarkDown).
1687
- paras.push(jsii_rosetta_1.markDownToJavaDoc(['```', convertedExample, '```'].join('\n')));
1671
+ paras.push((0, jsii_rosetta_1.markDownToJavaDoc)(['```', convertedExample, '```'].join('\n')));
1688
1672
  }
1689
1673
  const tagLines = [];
1690
1674
  if (docs.returns) {
1691
1675
  tagLines.push(`@return ${docs.returns}`);
1692
1676
  }
1693
1677
  if (docs.see) {
1694
- tagLines.push(`@see ${docs.see}`);
1678
+ tagLines.push(`@see <a href="${escape(docs.see)}">${escape(docs.see)}</a>`);
1695
1679
  }
1696
1680
  if (docs.deprecated) {
1697
1681
  tagLines.push(`@deprecated ${docs.deprecated}`);
@@ -1701,7 +1685,7 @@ class JavaGenerator extends generator_1.Generator {
1701
1685
  const method = doc;
1702
1686
  if (method.parameters) {
1703
1687
  for (const param of method.parameters) {
1704
- const summary = (_d = param.docs) === null || _d === void 0 ? void 0 : _d.summary;
1688
+ const summary = param.docs?.summary;
1705
1689
  tagLines.push(paramJavadoc(param.name, param.optional, summary));
1706
1690
  }
1707
1691
  }
@@ -1931,12 +1915,11 @@ class JavaGenerator extends generator_1.Generator {
1931
1915
  return `${this.toNativeFqn(moduleName)}.${MODULE_CLASS_NAME}`;
1932
1916
  }
1933
1917
  emitModuleFile(mod) {
1934
- var _a, _b, _c;
1935
1918
  const moduleName = mod.name;
1936
1919
  const moduleClass = this.makeModuleClass(moduleName);
1937
1920
  const { filePath: moduleResFile, name: moduleResName } = this.toJavaResourcePath(mod, `${mod.name}.${MODULE_CLASS_NAME}`);
1938
1921
  this.code.openFile(moduleResFile);
1939
- for (const fqn of Object.keys((_a = this.assembly.types) !== null && _a !== void 0 ? _a : {})) {
1922
+ for (const fqn of Object.keys(this.assembly.types ?? {})) {
1940
1923
  this.code.line(`${fqn}=${this.toNativeFqn(fqn, { binaryName: true })}`);
1941
1924
  }
1942
1925
  this.code.closeFile(moduleResFile);
@@ -1949,7 +1932,7 @@ class JavaGenerator extends generator_1.Generator {
1949
1932
  this.code.openFile(moduleFile);
1950
1933
  this.code.line(`package ${this.toNativeName(mod).packageName};`);
1951
1934
  this.code.line();
1952
- if (Object.keys((_b = mod.dependencies) !== null && _b !== void 0 ? _b : {}).length > 0) {
1935
+ if (Object.keys(mod.dependencies ?? {}).length > 0) {
1953
1936
  this.code.line('import static java.util.Arrays.asList;');
1954
1937
  this.code.line();
1955
1938
  }
@@ -1963,7 +1946,7 @@ class JavaGenerator extends generator_1.Generator {
1963
1946
  this.code.line('import java.nio.charset.StandardCharsets;');
1964
1947
  this.code.line();
1965
1948
  this.code.line('import java.util.HashMap;');
1966
- if (Object.keys((_c = mod.dependencies) !== null && _c !== void 0 ? _c : {}).length > 0) {
1949
+ if (Object.keys(mod.dependencies ?? {}).length > 0) {
1967
1950
  this.code.line('import java.util.List;');
1968
1951
  }
1969
1952
  this.code.line('import java.util.Map;');
@@ -2102,11 +2085,11 @@ class JavaGenerator extends generator_1.Generator {
2102
2085
  this.code.line(`@javax.annotation.Generated(value = "${generator}"${date})`);
2103
2086
  }
2104
2087
  convertExample(example, api) {
2105
- const translated = this.rosetta.translateExample(api, example, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly));
2088
+ const translated = this.rosetta.translateExample(api, example, jsii_rosetta_1.TargetLanguage.JAVA, (0, jsii_rosetta_1.enforcesStrictMode)(this.assembly));
2106
2089
  return translated.source;
2107
2090
  }
2108
2091
  convertSamplesInMarkdown(markdown, api) {
2109
- return this.rosetta.translateSnippetsInMarkdown(api, markdown, jsii_rosetta_1.TargetLanguage.JAVA, jsii_rosetta_1.enforcesStrictMode(this.assembly));
2092
+ return this.rosetta.translateSnippetsInMarkdown(api, markdown, jsii_rosetta_1.TargetLanguage.JAVA, (0, jsii_rosetta_1.enforcesStrictMode)(this.assembly));
2110
2093
  }
2111
2094
  /**
2112
2095
  * Fins the Java FQN of the default implementation interfaces that should be implemented when a new
@@ -2268,8 +2251,7 @@ function computeOverrides(allParams) {
2268
2251
  * Return the native package name from an assembly
2269
2252
  */
2270
2253
  function packageNameFromAssembly(assm) {
2271
- var _a, _b;
2272
- const javaPackage = (_b = (_a = assm.targets) === null || _a === void 0 ? void 0 : _a.java) === null || _b === void 0 ? void 0 : _b.package;
2254
+ const javaPackage = assm.targets?.java?.package;
2273
2255
  if (!javaPackage) {
2274
2256
  throw new Error(`The module ${assm.name} does not have a java.package setting`);
2275
2257
  }
@@ -2298,7 +2280,6 @@ function packageNameFromAssembly(assm) {
2298
2280
  * multiple elements if the FQN indicated a nested type.
2299
2281
  */
2300
2282
  function translateFqn(assm, originalFqn) {
2301
- var _a, _b, _c;
2302
2283
  const implicitPackageNames = new Array();
2303
2284
  const typeNames = new Array();
2304
2285
  // We work ourselves upward through the FQN until we've found an explicit package
@@ -2306,16 +2287,16 @@ function translateFqn(assm, originalFqn) {
2306
2287
  let fqn = originalFqn;
2307
2288
  while (fqn !== '' && fqn !== assm.name) {
2308
2289
  const [parentFqn, lastPart] = splitNamespace(fqn);
2309
- const submodule = (_a = assm.submodules) === null || _a === void 0 ? void 0 : _a[fqn];
2290
+ const submodule = assm.submodules?.[fqn];
2310
2291
  if (submodule) {
2311
- const explicitPackage = (_c = (_b = submodule.targets) === null || _b === void 0 ? void 0 : _b.java) === null || _c === void 0 ? void 0 : _c.package;
2292
+ const explicitPackage = submodule.targets?.java?.package;
2312
2293
  if (explicitPackage) {
2313
2294
  packageName = explicitPackage;
2314
2295
  // We can stop recursing, types cannot be the parent of a module and nothing upwards can change
2315
2296
  // the package name anymore
2316
2297
  break;
2317
2298
  }
2318
- implicitPackageNames.unshift(`.${case_utils_1.toSnakeCase(lastPart)}`);
2299
+ implicitPackageNames.unshift(`.${(0, case_utils_1.toSnakeCase)(lastPart)}`);
2319
2300
  }
2320
2301
  else {
2321
2302
  // If it's not a submodule, it must be a type.
@@ -2340,8 +2321,7 @@ function translateFqn(assm, originalFqn) {
2340
2321
  * @returns true if the Jsii$Default interfaces can be used
2341
2322
  */
2342
2323
  function hasDefaultInterfaces(assembly) {
2343
- var _a, _b, _c;
2344
- return !!((_c = (_b = (_a = assembly.metadata) === null || _a === void 0 ? void 0 : _a.jsii) === null || _b === void 0 ? void 0 : _b.pacmak) === null || _c === void 0 ? void 0 : _c.hasDefaultInterfaces);
2324
+ return !!assembly.metadata?.jsii?.pacmak?.hasDefaultInterfaces;
2345
2325
  }
2346
2326
  /**
2347
2327
  * Whecks whether a name corresponds to a method on `java.lang.Object`. It is not
@@ -2376,4 +2356,10 @@ function splitNamespace(ns) {
2376
2356
  }
2377
2357
  return [ns.slice(0, dot), ns.slice(dot + 1)];
2378
2358
  }
2379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImphdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLCtCQUErQjtBQUMvQix5REFBdUQ7QUFDdkQsK0JBQStCO0FBRS9CLCtDQU1zQjtBQUN0Qiw2QkFBNkI7QUFDN0IseUNBQXlDO0FBR3pDLDRDQUF5QztBQUN6QyxzQ0FBc0M7QUFDdEMsZ0RBQWtEO0FBRWxELHNDQUttQjtBQUNuQixrQ0FBNkQ7QUFDN0Qsd0NBQW1EO0FBQ25ELHFDQUE2RDtBQUM3RCxtREFBd0U7QUFFeEUsbUNBQXFDO0FBRXJDLG9HQUFvRztBQUNwRyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVyRCxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxvQ0FBb0MsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxxQ0FBcUMsQ0FBQztBQUMzRCxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQztBQUV0RDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsV0FBVztJQUd0QixZQUNtQixPQUE4QixFQUM5QixPQUFxQjtRQURyQixZQUFPLEdBQVAsT0FBTyxDQUF1QjtRQUM5QixZQUFPLEdBQVAsT0FBTyxDQUFjO1FBSnZCLGVBQVUsR0FBRyxNQUFNLENBQUM7SUFLbEMsQ0FBQztJQUVHLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDekIsdURBQXVEO1lBQ3ZELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsTUFBTSxFQUNOLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQ3ZDLENBQ0YsQ0FDRixDQUFDO1lBQ0YsT0FBTztTQUNSO1FBRUQsa0dBQWtHO1FBQ2xHLE1BQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7UUFDNUMsSUFBSTtZQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUN6RCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztZQUNGLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFaEMsc0dBQXNHO1lBQ3RHLGdCQUFnQjtZQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlELE1BQU0sYUFBYSxHQUFHLE1BQU0sY0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3JELE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1lBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUVoQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDekIsYUFBYSxDQUFDLFNBQVMsRUFDdkIsYUFBYSxDQUFDLE1BQU0sQ0FDckIsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7Z0JBQ3RCLE1BQU0sY0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN2QztTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsSUFBSSxDQUNWLHVDQUF1QyxXQUFXO2lCQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7aUJBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNoQixDQUFDO1lBQ0YsTUFBTSxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQzlCLE1BQWtCLEVBQ2xCLE9BQXFCLEVBQ3JCLEtBQWE7UUFFYixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQ3RDLE9BQThCLEVBQzlCLE9BQXFCO1FBRXJCLE9BQU8sY0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBYyxFQUFFLEVBQUU7WUFDM0MsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO1lBRXZDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTztpQkFDN0IsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDakUsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLE1BQU07Z0JBQ04sWUFBWTtnQkFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO2FBQzNDLENBQUMsQ0FBQztpQkFDRixHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUMzQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtnQkFDTixZQUFZO2FBQ2IsQ0FBQyxDQUFDLENBQ0osQ0FBQztZQUVKLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksZ0JBQWdCLEVBQUU7Z0JBQzdELEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ1AsaUJBQWlCLEVBQUUsWUFBWTtvQkFDL0Isb0JBQW9CLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDO29CQUNuRCxxQkFBcUIsRUFBRSxNQUFNLENBQUMsZUFBZTtpQkFDOUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FDN0IsTUFBTSxFQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUNwQyxDQUFDO1lBQ0YsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFckQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBYSxFQUFFLFdBQXFCO1FBQ3JFLE1BQU0sWUFBWSxHQUFHLFVBQVU7YUFDNUIsTUFBTSxDQUNMO1lBQ0UsT0FBTyxFQUFFO2dCQUNQLFFBQVEsRUFBRSxtQ0FBbUM7Z0JBQzdDLFlBQVksRUFBRSwyQ0FBMkM7Z0JBQ3pELHFCQUFxQixFQUNuQixnRkFBZ0Y7Z0JBQ2xGLFVBQVUsRUFBRTtvQkFDViw0QkFBNEIsc0JBQVksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO2lCQUMxRTtnQkFFRCxZQUFZLEVBQUUsT0FBTztnQkFDckIsU0FBUyxFQUFFLEtBQUs7Z0JBRWhCLE9BQU8sRUFBRSxzQkFBc0I7Z0JBQy9CLFVBQVUsRUFBRSxjQUFjO2dCQUMxQixPQUFPLEVBQUUsT0FBTztnQkFFaEIsT0FBTyxFQUFFO29CQUNQLE1BQU0sRUFBRSxXQUFXO2lCQUNwQjthQUNGO1NBQ0YsRUFDRCxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FDdEI7YUFDQSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6QixPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUM1QyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsYUFBcUIsRUFDckIsUUFBZ0M7UUFFaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVDLDJDQUEyQztRQUMzQyxvREFBb0Q7UUFDcEQsK0NBQStDO1FBQy9DLG1EQUFtRDtRQUNuRCxFQUFFO1FBQ0YsbUZBQW1GO1FBQ25GLCtFQUErRTtRQUMvRSwwQ0FBMEM7UUFFMUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQy9CLGFBQWEsRUFDYixHQUFHLENBQUMsb0JBQW9CLENBQ3pCLENBQUM7WUFDRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxFQUN6QyxHQUFHLENBQUMsb0JBQW9CLENBQ3pCLENBQUM7WUFFRixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxDQUFDLFdBQW1CO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0I7WUFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDekMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFhO1FBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTlDLHVFQUF1RTtRQUN2RSwrREFBK0Q7UUFDL0QscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSxtQ0FBbUM7UUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRTVDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkQsTUFBTSxFQUFFLEdBQUc7WUFDWCxjQUFjLEVBQUUsTUFBTSwyQkFBa0IsQ0FDdEMsR0FBRyxDQUFDLGVBQWUsRUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FDaEI7U0FDRixDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksZUFBZSxFQUFFO1lBQzlELGdCQUFTLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFN0MsaUdBQWlHO1lBQ2pHLDZCQUE2QjtZQUM3QixpQkFBaUIsQ0FBQyxHQUFHLENBQ25CLElBQUksQ0FBQyxJQUFJLENBQ1AsTUFBTSxDQUFDLGVBQWUsRUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUN6RCxDQUNGLENBQUM7U0FDSDtRQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVqRCxxRUFBcUU7UUFDckUsc0JBQXNCO1FBQ3RCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSw4QkFBOEIsRUFBRSxDQUFDO1FBQ2hFLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxVQUFVO2FBQ3hCLE1BQU0sQ0FDTDtZQUNFLFFBQVEsRUFBRTtnQkFDUixRQUFRLEVBQUUsbUNBQW1DO2dCQUM3QyxZQUFZLEVBQUUsMkNBQTJDO2dCQUN6RCxxQkFBcUIsRUFDbkIsd0ZBQXdGO2dCQUMxRixVQUFVLEVBQUU7b0JBQ1YsNEJBQTRCLHNCQUFZLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtpQkFDMUU7Z0JBQ0QsZ0RBQWdEO2dCQUNoRCxlQUFlLEVBQUUsS0FBSztnQkFDdEIseUVBQXlFO2dCQUN6RSxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQztnQkFDekQscURBQXFEO2dCQUNyRCxRQUFRLEVBQUU7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLEVBQUUsRUFBRSxXQUFXO3dCQUNmLFlBQVksRUFBRTs0QkFDWixVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQ0FDcEMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQztnQ0FDdEMsR0FBRyxFQUFFLFVBQVUsSUFBSSxFQUFFOzZCQUN0QixDQUFDLENBQUM7eUJBQ0o7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsY0FBYyxFQUFFO29CQUNkLGFBQWEsRUFBRSxXQUFXO2lCQUMzQjthQUNGO1NBQ0YsRUFDRCxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FDdEI7YUFDQSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6QixPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBa0IsRUFBRSxPQUFxQjtRQUMxRCxPQUFPLElBQUksSUFBSSxDQUFDO1lBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFVBQVUsRUFBRSxNQUFNLENBQUMsZUFBZTtZQUNsQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdSRCxrQ0E2UkM7QUFtQkQ7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLE1BQWtCO0lBQy9DLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBUSxDQUFDLElBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQzdELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBUSxDQUFDLElBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ25FLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBcUIsSUFBSyxTQUFRLGVBQU07SUFxRHRDLFlBQW1CLE9BQXNCO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUF4RE0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFtQjtRQUc5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLElBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFRLENBQUMsSUFBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsZ0NBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxrQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sR0FBRyxHQUFHLGtDQUFrQyxPQUFPLENBQUMsT0FBTyxDQUMzRCxLQUFLLEVBQ0wsR0FBRyxDQUNKLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQztRQUNuQyxPQUFPO1lBQ0wsSUFBSSxFQUFFO2dCQUNKLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixHQUFHO2dCQUNILEtBQUssRUFBRTtvQkFDTCxjQUFjLEVBQUU7d0JBQ2QsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsSUFBSSxFQUFFLFVBQVU7NkJBQ2IsTUFBTSxDQUFDOzRCQUNOLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTt5QkFDN0QsQ0FBQzs2QkFDRCxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7NkJBQ3JCLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7cUJBQzNDO29CQUNELGVBQWUsRUFBRSxJQUFJLE9BQU8sSUFBSSxVQUFVLFFBQVEsY0FBYyxHQUFHO29CQUNuRSxZQUFZLEVBQUU7d0JBQ1osUUFBUSxFQUFFLEtBQUs7d0JBQ2YsSUFBSSxFQUFFLFVBQVU7NkJBQ2IsTUFBTSxDQUFDOzRCQUNOLFVBQVUsRUFBRTtnQ0FDVixVQUFVLEVBQUUsT0FBTztnQ0FDbkIsT0FBTyxFQUFFLFVBQVU7Z0NBQ25CLE1BQU0sRUFBRSxjQUFjOzZCQUN2Qjt5QkFDRixDQUFDOzZCQUNELEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs2QkFDckIsT0FBTyxDQUFDLDBCQUEwQixFQUFFLEVBQUUsQ0FBQztxQkFDM0M7b0JBQ0QsY0FBYyxFQUFFLDBCQUEwQixPQUFPLGNBQWMsVUFBVSxlQUFlLGNBQWMsT0FBTztvQkFDN0csaUJBQWlCLEVBQUUsWUFBWSxPQUFPLElBQUksVUFBVSxJQUFJLGNBQWMsR0FBRztpQkFDMUU7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQWUsRUFBRSxPQUFZO1FBQzNELE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDckUsQ0FBQztJQVVNLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBaUIsRUFBRSxNQUFjOztRQUNsRCxNQUFNLEdBQUcsR0FBRyxVQUFVLE1BQU0sRUFBRSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDM0IsU0FBUzthQUNWO1lBQ0QsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsTUFBTSxZQUFLLENBQ1QsS0FBSyxFQUNMO1lBQ0Usc0RBQXNEO1lBQ3RELEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLGNBQWM7WUFDZCxHQUFHLFlBQVk7WUFDZixRQUFRO1lBQ1IsOENBQThDLEdBQUcsRUFBRTtZQUNuRCxxQkFBcUI7U0FDdEIsRUFDRDtZQUNFLEdBQUcsRUFBRSxTQUFTO1lBQ2QsR0FBRyxFQUFFO2dCQUNILHdFQUF3RTtnQkFDeEUscUVBQXFFO2dCQUNyRSxVQUFVLEVBQUUsR0FDVixNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxtQ0FBSSxFQUM1QixpREFBaUQ7YUFDbEQ7WUFDRCxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1NBQzFCLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTlGRCx1QkE4RkM7QUFFRCxxQkFBcUI7QUFDckIscUJBQXFCO0FBQ3JCLHFCQUFxQjtBQUVyQixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztBQUNwQyxNQUFNLDBCQUEwQixHQUFHLFlBQVksQ0FBQztBQUNoRCxNQUFNLDRCQUE0QixHQUFHLGNBQWMsQ0FBQztBQStDcEQsTUFBTSxhQUFjLFNBQVEscUJBQVM7SUF5R25DLFlBQW9DLE9BQWdCO1FBQ2xELEtBQUssQ0FBQyxFQUFFLHVDQUF1QyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFEdkIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQVZwRDs7Ozs7V0FLRztRQUNjLHNCQUFpQixHQUU5QixFQUFFLENBQUM7SUFJUCxDQUFDO0lBOUNEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxZQUFvQjtRQUN0RCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLE9BQU8sWUFBWSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzFELE9BQU8sR0FBRyxZQUFZLE9BQU8sQ0FBQztTQUMvQjtRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBa0I7UUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBRUQsSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3hELE9BQU8sS0FBSyw4QkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQW9CUyxlQUFlLENBQUMsSUFBbUIsRUFBRSxXQUFvQjtRQUNqRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVTLGFBQWEsQ0FBQyxJQUFtQixFQUFFLFdBQW9CO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxHQUFrQjtRQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRVMsWUFBWSxDQUFDLEdBQW1CLEVBQUUsUUFBaUI7O1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXJELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVuRSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsZ0JBQUksR0FBRyxDQUFDLFVBQVUsMENBQUUsTUFBTSxtQ0FBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLGNBQWMsR0FBRyxlQUFlLEdBQUc7aUJBQ2hDLFVBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHVDQUF1QyxJQUFJLENBQUMsV0FBVyxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUNyRixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2pCLFNBQVMsS0FBSyxHQUFHLFNBQVMsVUFBVSxHQUFHLENBQUMsSUFBSSxHQUFHLGlCQUFpQixHQUFHLGNBQWMsRUFBRSxDQUNwRixDQUFDO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsVUFBVSxDQUFDLEdBQW1CO1FBQ3RDLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFzQixDQUFDO1lBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEI7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFUyxhQUFhLENBQUMsR0FBbUIsRUFBRSxNQUF3QjtRQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWpCLGlGQUFpRjtRQUNqRixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QyxzREFBc0Q7UUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUMsUUFBUTtZQUN6QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2pCLEdBQUcsc0JBQXNCLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQ2xFLE1BQU0sQ0FDUCxHQUFHLENBQ0wsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLGlFQUFpRSxDQUNsRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1oscUVBQXFFLElBQUksQ0FBQyx5QkFBeUIsQ0FDakcsTUFBTSxDQUNQLElBQUksQ0FDTixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRVMscUJBQXFCLENBQzdCLEdBQW1CLEVBQ25CLFFBQXFCLEVBQ3JCLG9CQUFpQztRQUVqQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsT0FBTyxDQUNmLElBQW9CLEVBQ3BCLEtBQW9CLEVBQ3BCLE1BQWdDO1FBRWhDLFVBQVU7SUFDWixDQUFDO0lBRVMsVUFBVSxDQUFDLEdBQW1CLEVBQUUsSUFBbUI7UUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxHQUFtQixFQUFFLElBQW1CO1FBQ2pFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNPLGVBQWUsQ0FDdkIsR0FBbUIsRUFDbkIsSUFBbUIsRUFDbkIsTUFBK0I7UUFFL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFUyxRQUFRLENBQUMsR0FBbUIsRUFBRSxNQUFtQjtRQUN6RCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRVMsZ0JBQWdCLENBQ3hCLEdBQW1CLEVBQ25CLFFBQXFCLEVBQ3JCLGVBQTRCO1FBRTVCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFUyxjQUFjLENBQUMsR0FBbUIsRUFBRSxNQUFtQjtRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRVMsc0JBQXNCLENBQzlCLEdBQW1CLEVBQ25CLFFBQXFCLEVBQ3JCLGVBQTRCO1FBRTVCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFUyxXQUFXLENBQUMsR0FBa0I7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osdUNBQXVDLElBQUksQ0FBQyxXQUFXLGtCQUFrQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQ3JGLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDUyxTQUFTLENBQUMsR0FBa0I7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNTLFlBQVksQ0FBQyxVQUF5QixFQUFFLE1BQXVCO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3ZCLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1lBQ25CLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSTtTQUN4QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGdCQUFnQixDQUFDLEVBQVU7O1FBQ25DLE1BQU0sU0FBUyxTQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSwwQ0FBRyxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVTLGNBQWMsQ0FBQyxHQUFXO1FBQ2xDLFVBQVU7SUFDWixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsR0FBdUI7O1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXJELDZGQUE2RjtRQUM3RixNQUFNLFVBQVUsU0FBRyxHQUFHLENBQUMsVUFBVSxtQ0FBSSxFQUFFLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUc7WUFDWix1Q0FBdUM7WUFDdkMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHVDQUF1QyxJQUFJLENBQUMsV0FBVyxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUNyRixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osb0NBQW9DLEdBQUcsQ0FBQyxJQUFJLElBQUksMEJBQTBCLFNBQVMsQ0FDcEYsQ0FBQztRQUNGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsU0FBUyxLQUFLLGNBQWMsR0FBRyxDQUFDLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFUyxjQUFjLENBQUMsR0FBdUI7UUFDOUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxELElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FDeEMsR0FBRyxDQUFDLEdBQUcsQ0FDaUIsQ0FBQztZQUUzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLHlFQUF5RTtZQUN6RSx3REFBd0Q7WUFDeEQsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QztTQUNGO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVTLGlCQUFpQixDQUFDLEdBQXVCLEVBQUUsTUFBbUI7UUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTztZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDMUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3ZCLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1lBQ1osVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixHQUFHLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVTLHlCQUF5QixDQUNqQyxHQUF1QixFQUN2QixRQUFxQixFQUNyQixlQUE0QjtRQUU1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxHQUF1QixFQUFFLElBQW1CO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLFFBQVEsR0FBRyw4QkFBZ0IsQ0FDL0IsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDOUMsQ0FBQztRQUVGLGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1lBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ3RCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM3QjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsVUFBVSxPQUFPLFFBQVEsSUFBSSxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN4QjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLE9BQU8sUUFBUSxLQUFLLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7b0JBQ3JCLEdBQUcsRUFBRSxRQUFRO29CQUNiLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztvQkFDWixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7aUJBQ3RCLENBQUMsQ0FBQztnQkFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQzdCO29CQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7b0JBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixtQkFBbUIsUUFBUSxVQUFVLElBQUksU0FBUyxDQUNuRCxDQUFDO29CQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLDJGQUEyRixRQUFRLElBQUksSUFBSSwyQkFBMkIsQ0FDdkksQ0FBQztvQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLFFBQVEsVUFBVSxJQUFJLFVBQVUsQ0FBQyxDQUFDO2lCQUM3RDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssdUNBQXVDLENBQUMsR0FBdUI7O1FBQ3JFLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3hELDhFQUE4RTtZQUM5RSxPQUFPO1NBQ1I7UUFDRCxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxVQUFVO2FBQzFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsc0VBQXNFO2FBQ3JFLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTs7WUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLG1DQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLEVBQUUsRUFBcUUsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxhQUFDLEdBQUcsQ0FBQyxVQUFVLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksb0NBQUssRUFBRSxDQUFDLENBQUM7UUFDM0UsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUNuRSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLFNBQVM7YUFDVjtZQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFFRCxTQUFTLGdCQUFnQixDQUFzQixHQUFXOztZQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBdUIsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBa0MsRUFBRSxDQUFDO1lBQ2pELEtBQUssTUFBTSxJQUFJLFVBQUksSUFBSSxDQUFDLFVBQVUsbUNBQUksRUFBRSxFQUFFO2dCQUN4QyxpRUFBaUU7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3REO1lBQ0Qsb0VBQW9FO1lBQ3BFLEtBQUssTUFBTSxJQUFJLFVBQUksSUFBSSxDQUFDLFVBQVUsbUNBQUksRUFBRSxFQUFFO2dCQUN4QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FDdkMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FDbEMsRUFBRTtvQkFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUU7d0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7cUJBQ3JCO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVPLHVCQUF1QixDQUFDLEdBQWtCO1FBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ2IsT0FBTztTQUNSO1FBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDekMsR0FBRyxFQUNILEdBQUcsR0FBRyxDQUFDLElBQUksZUFBZSxDQUMzQixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ2QsS0FBSyxNQUFNLElBQUksSUFBSSxnQ0FBaUIsQ0FDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNqRCxHQUFHLEVBQUUsY0FBYztnQkFDbkIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJO2FBQ3BCLENBQUMsQ0FDSCxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNoRTtTQUNGO1FBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQiwyRkFBMkY7WUFDM0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztTQUN6RDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFFBQXVCLEVBQUUsU0FBaUI7O1FBQ3pFLE1BQU0sR0FBRyxTQUFHLFFBQVEsQ0FBQyxVQUFVLDBDQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLElBQUksUUFBQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsTUFBTSwwQ0FBRSxRQUFRLENBQUEsRUFBRTtZQUMxQixPQUFPO1NBQ1I7UUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUN6QyxRQUFRLEVBQ1IsR0FBRyxTQUFTLGVBQWUsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNkLEtBQUssTUFBTSxJQUFJLElBQUksZ0NBQWlCLENBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDakQsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLFNBQVM7YUFDVixDQUFDLENBQ0gsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEU7U0FDRjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQW1CLEVBQUUsV0FBb0I7O1FBQzVELElBQUksUUFBQyxJQUFJLENBQUMsT0FBTywwQ0FBRSxJQUFJLENBQUEsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksaUNBQWlDLENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sT0FBTyxHQUFHLFdBQVc7WUFDekIsQ0FBQyxDQUFDO2dCQUNFLFVBQVUsRUFBRTtvQkFDViw0QkFBNEIsc0JBQVksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUN6RSxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7aUJBQ3REO2FBQ0Y7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osVUFBVTthQUNQLE1BQU0sQ0FDTDtZQUNFLE9BQU8sRUFBRTtnQkFDUCxRQUFRLEVBQUUsbUNBQW1DO2dCQUM3QyxZQUFZLEVBQUUsMkNBQTJDO2dCQUN6RCxxQkFBcUIsRUFDbkIsK0VBQStFO2dCQUVqRixHQUFHLE9BQU87Z0JBRVYsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLElBQUksRUFBRSwwQ0FBMEM7Z0JBQ2hELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUVsQixRQUFRLEVBQUU7b0JBQ1IsT0FBTyxFQUFFLFVBQVUsRUFBRTtpQkFDdEI7Z0JBRUQsVUFBVSxFQUFFO29CQUNWLFNBQVMsRUFBRSxlQUFlLEVBQUU7aUJBQzdCO2dCQUVELEdBQUcsRUFBRTtvQkFDSCxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDaEUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRztpQkFDekI7Z0JBRUQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUN4QyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQzlDLE9BQU8sRUFBRSxXQUFXLENBQ2xCLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FDdEM7Z0JBQ0QsU0FBUyxFQUFFLEtBQUs7Z0JBRWhCLFVBQVUsRUFBRSxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRTtnQkFFdkQsWUFBWSxFQUFFLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFFMUQsS0FBSyxFQUFFO29CQUNMLE9BQU8sRUFBRTt3QkFDUCxNQUFNLEVBQUU7NEJBQ047Z0NBQ0UsT0FBTyxFQUFFLDBCQUEwQjtnQ0FDbkMsVUFBVSxFQUFFLHVCQUF1QjtnQ0FDbkMsT0FBTyxFQUFFLE9BQU87Z0NBQ2hCLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs2QkFDaEQ7NEJBQ0Q7Z0NBQ0UsT0FBTyxFQUFFLDBCQUEwQjtnQ0FDbkMsVUFBVSxFQUFFLGtCQUFrQjtnQ0FDOUIsT0FBTyxFQUFFLE9BQU87Z0NBQ2hCLGFBQWEsRUFBRTtvQ0FDYixPQUFPLEVBQUU7d0NBQ1AsS0FBSyxFQUFFLElBQUk7d0NBQ1gsUUFBUSxFQUFFOzRDQUNSLCtCQUErQixFQUFFLElBQUk7NENBQ3JDLDhCQUE4QixFQUFFLElBQUk7eUNBQ3JDO3FDQUNGO2lDQUNGOzZCQUNGOzRCQUNEO2dDQUNFLE9BQU8sRUFBRSwwQkFBMEI7Z0NBQ25DLFVBQVUsRUFBRSxxQkFBcUI7Z0NBQ2pDLE9BQU8sRUFBRSxPQUFPO2dDQUNoQixVQUFVLEVBQUU7b0NBQ1YsU0FBUyxFQUFFO3dDQUNULEVBQUUsRUFBRSxnQkFBZ0I7d0NBQ3BCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7cUNBQ3ZCO2lDQUNGOzZCQUNGOzRCQUNEO2dDQUNFLE9BQU8sRUFBRSwwQkFBMEI7Z0NBQ25DLFVBQVUsRUFBRSxzQkFBc0I7Z0NBQ2xDLE9BQU8sRUFBRSxPQUFPO2dDQUNoQixVQUFVLEVBQUU7b0NBQ1YsU0FBUyxFQUFFO3dDQUNULEVBQUUsRUFBRSxpQkFBaUI7d0NBQ3JCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7cUNBQ3ZCO2lDQUNGO2dDQUNELGFBQWEsRUFBRTtvQ0FDYixXQUFXLEVBQUUsS0FBSztvQ0FDbEIsSUFBSSxFQUFFLFdBQVc7b0NBQ2pCLGtCQUFrQixFQUFFO3dDQUNsQixrRkFBa0Y7d0NBQ2xGLG1GQUFtRjt3Q0FDbkYsMEJBQTBCO3dDQUMxQixPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztxQ0FDN0I7b0NBQ0QsMkZBQTJGO29DQUMzRiwrQkFBK0I7b0NBQy9CLGlCQUFpQixFQUFFO3dDQUNqQiwwQkFBMEI7d0NBQzFCLDJCQUEyQjtxQ0FDNUI7aUNBQ0Y7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsT0FBTyxFQUFFLDBCQUEwQjtnQ0FDbkMsVUFBVSxFQUFFLHVCQUF1QjtnQ0FDbkMsT0FBTyxFQUFFLFVBQVU7Z0NBQ25CLFVBQVUsRUFBRTtvQ0FDVixTQUFTLEVBQUU7d0NBQ1QsRUFBRSxFQUFFLGVBQWU7d0NBQ25CLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7d0NBQzFCLGFBQWEsRUFBRTs0Q0FDYixLQUFLLEVBQUU7Z0RBQ0wsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFOzZDQUN4Qzt5Q0FDRjtxQ0FDRjtpQ0FDRjs2QkFDRjs0QkFDRDtnQ0FDRSxPQUFPLEVBQUUsbUJBQW1CO2dDQUM1QixVQUFVLEVBQUUsdUJBQXVCO2dDQUNuQyxPQUFPLEVBQUUsT0FBTztnQ0FDaEIsYUFBYSxFQUFFO29DQUNiLGtCQUFrQixFQUFFLEtBQUs7aUNBQzFCOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixFQUNELEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUN0QjthQUNBLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFL0I7Ozs7OztXQU1HO1FBQ0gsU0FBUyxXQUFXLENBQUMsT0FBZSxFQUFFLE1BQWU7WUFDbkQsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDWCxPQUFPLGdDQUFnQixDQUFDLE9BQU8sRUFBRSxrQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN0RCxNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxNQUFNLEVBQUUsQ0FDbkUsQ0FBQzthQUNIO1lBQ0QsT0FBTyxHQUFHLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBRUQsU0FBUyxpQkFBaUI7O1lBQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxFQUFtQixDQUFDO1lBQ2xELEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxPQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksbUNBQUksRUFBRSxDQUNqQyxFQUFFO2dCQUNELE1BQU0sR0FBRyxTQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLDBDQUFHLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLFFBQUMsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE9BQU8sMENBQUUsSUFBSSxDQUFBLEVBQUU7b0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2IsWUFBWSxJQUFJLENBQUMsSUFBSSxlQUFlLE9BQU8sd0NBQXdDLENBQ3BGLENBQUM7aUJBQ0g7Z0JBQ0QsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDaEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO29CQUN2QyxVQUFVLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7b0JBQzdDLE9BQU8sRUFBRSxtQ0FBbUIsQ0FDMUIsT0FBTyxFQUNQLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQ3JDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1lBQ0QscUNBQXFDO1lBQ3JDLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLE9BQU8sRUFBRSxzQkFBc0I7Z0JBQy9CLFVBQVUsRUFBRSxjQUFjO2dCQUMxQixPQUFPLEVBQUUsbUNBQW1CLENBQUMsSUFBSSxpQkFBTyxFQUFFLENBQUM7YUFDNUMsQ0FBQyxDQUFDO1lBRUgsNEJBQTRCO1lBQzVCLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixVQUFVLEVBQUUsYUFBYTtnQkFDekIsT0FBTyxFQUFFLGlCQUFpQjthQUMzQixDQUFDLENBQUM7WUFFSCxxREFBcUQ7WUFDckQsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDaEIsVUFBVSxFQUFFLG9EQUFvRDtnQkFDaEUsT0FBTyxFQUFFLGtCQUFrQjtnQkFDM0IsVUFBVSxFQUFFLHNCQUFzQjtnQkFDbEMsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLEtBQUssRUFBRSxTQUFTO2FBQ2pCLENBQUMsQ0FBQztZQUVILE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxTQUFTLGVBQWU7O1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBQyxJQUFJLENBQUMsWUFBWSxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwRSxTQUFTLFdBQVcsQ0FBQyxNQUFtQjtnQkFDdEMsTUFBTSxTQUFTLEdBQVE7b0JBQ3JCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDNUQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUU7aUJBQzlCLENBQUM7Z0JBQ0YsMkdBQTJHO2dCQUMzRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ2hCLFNBQVMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDaEM7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFO29CQUNkLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUN4RCxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNkO2dCQUNELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRUQ7OztXQUdHO1FBQ0gsU0FBUyxVQUFVO1lBQ2pCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUNMLElBQUksSUFBSTtnQkFDTixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFlBQVksRUFBRSxNQUFNO2dCQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDbkUsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxHQUFtQjs7UUFDL0MsTUFBTSxNQUFNLEdBQUcsT0FBQyxHQUFHLENBQUMsVUFBVSxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZCLE9BQU87U0FDUjtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sU0FBUyxHQUFHLGlEQUFpRCxTQUFTLFlBQVksSUFBSSxDQUFDLElBQUksTUFBTSxRQUFRLEdBQUcsQ0FBQztZQUNuSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixHQUFHLFNBQVMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUNuQyxTQUFTLEVBQ1QsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsUUFBUSxDQUNkLEdBQUcsQ0FDTCxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBbUI7UUFDekMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztJQUNsRyxDQUFDO0lBRU8saUJBQWlCLENBQUMsVUFBcUIsRUFBRSxJQUFtQjtRQUNsRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEdBQUcsRUFBRSxRQUFRO1lBQ2IsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLGlCQUFpQixRQUFRLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sWUFBWSxDQUNsQixHQUFjLEVBQ2QsSUFBbUIsRUFDbkIsWUFBdUIsRUFDdkIsRUFDRSxXQUFXLEdBQUcsS0FBSyxFQUNuQixLQUFLLEdBQUcsS0FBSyxFQUNiLGFBQWEsR0FBRyxJQUFJLEVBQ3BCLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsTUFNMUIsRUFBRTtRQUVOLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFO1lBQ2xELFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyw4QkFBZ0IsQ0FDL0IsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDOUMsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkMsa0VBQWtFO1FBQ2xFLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDN0I7WUFDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsT0FBTyxRQUFRLElBQUksQ0FBQztZQUMxRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQzthQUNqQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxTQUFTLENBQUM7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNmLFNBQVMsR0FBRyxpREFBaUQsSUFBSSxDQUFDLFVBQVUsQ0FDMUUsR0FBRyxDQUNKLFVBQVUsQ0FBQztpQkFDYjtxQkFBTTtvQkFDTCxTQUFTLEdBQUcsd0NBQXdDLENBQUM7aUJBQ3REO2dCQUVELFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUMzRCxjQUFjLEVBQUUsSUFBSTtpQkFDckIsQ0FBQyxHQUFHLENBQUM7Z0JBRU4sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osVUFBVSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUN0RSxDQUFDO2dCQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDeEI7U0FDRjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxFQUFFO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtvQkFDckIsR0FBRyxFQUFFLFFBQVE7b0JBQ2IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO29CQUNaLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDdEIsQ0FBQyxDQUFDO2dCQUNILElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzdCO2dCQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUNqQyxHQUFHLENBQ0osWUFBWSxRQUFRLFVBQVUsSUFBSSxTQUFTLENBQUM7Z0JBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2lCQUNqQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO29CQUVuQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ2YsU0FBUyxJQUFJLGlEQUFpRCxTQUFTLFVBQVUsQ0FBQztxQkFDbkY7eUJBQU07d0JBQ0wsU0FBUyxJQUFJLHdDQUF3QyxDQUFDO3FCQUN2RDtvQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUTt3QkFDekIsQ0FBQyxDQUFDLE9BQU87d0JBQ1QsQ0FBQyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQztvQkFDMUUsU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQztvQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQ3hCO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyxVQUFVLENBQ2hCLEdBQWMsRUFDZCxNQUFtQixFQUNuQixFQUNFLFdBQVcsR0FBRyxLQUFLLEVBQ25CLEtBQUssR0FBRyxLQUFLLEVBQ2IsU0FBUyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxNQUNxQyxFQUFFO1FBRXZFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMxQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRVgsTUFBTSxTQUFTLEdBQUc7WUFDaEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7U0FDekQsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE1BQU07WUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVc7WUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZFLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQUcsR0FBRyxVQUFVLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FDMUUsTUFBTSxDQUNQLEdBQUcsQ0FBQztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsR0FBRyxFQUFFLFFBQVE7WUFDYixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7U0FDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3QjtRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssU0FBUyxDQUFDLElBQStDO1FBQy9ELE1BQU0sSUFBSSxHQUFHLDBCQUEwQixDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osZ0ZBQWdGLENBQ2pGLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFO1lBQ3JELGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xFLGtGQUFrRjtZQUNsRixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDakQ7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ25DLENBQUMsQ0FBQyxzREFBc0QsY0FBYyxDQUFDLElBQUksQ0FDdkUsSUFBSSxDQUNMLEVBQUU7WUFDTCxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FDbkMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN2QixDQUFDLENBQUMsZUFBZSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM1QyxDQUFDLENBQUMsRUFDTixFQUFFLENBQUM7UUFFUCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUM7UUFFNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLFVBQVUsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2pCLGFBQWEsSUFBSSxtREFBbUQsQ0FDckUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QixzQkFBc0I7UUFDdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDakQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksQ0FBQyxRQUFRO1lBQ2IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRztnQkFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQzdCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQzFDLEVBQUU7WUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLCtFQUErRTtZQUMvRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO2dCQUNoRSxLQUFLLEVBQUUsSUFBSTtnQkFDWCxTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDLENBQUM7U0FDSjtRQUVELHVCQUF1QjtRQUN2QixLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUNoRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1QsTUFBTSxDQUFDLFFBQVE7WUFDZixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHO2dCQUNqQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDL0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDNUMsRUFBRTtZQUNELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDeEIsK0VBQStFO1lBQy9FLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRXJFLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3ZFLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtvQkFDM0MsS0FBSyxFQUFFLElBQUk7b0JBQ1gsU0FBUyxFQUFFLElBQUk7aUJBQ2hCLENBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxJQUEyQjtRQUMzRCxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUV2RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLGlEQUFpRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQy9ELENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsYUFBYSw0QkFBNEIsWUFBWSxjQUFjO2FBQ2hFLElBQUksRUFBRTthQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNoQixDQUFDO1FBRUYsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDOUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksQ0FBQyxRQUFRO1lBQ2IsOERBQThEO1lBQzlELENBQUMsMEJBQTBCLENBQUMsTUFBTSw4QkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHO2dCQUMvQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUMxQyxFQUFFO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RFLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRTthQUNsQyxDQUFDLENBQUM7U0FDSjtRQUNELEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ3pDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsUUFBUTtZQUNmLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUN4QyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHO2dCQUNqQyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUM1QyxFQUFFO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RDLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRTthQUNsQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVPLHdCQUF3QixDQUFDLE1BQXlCO1FBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osd0VBQXdFLE1BQU0sQ0FDNUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3RCLEdBQUcsQ0FDTCxDQUFDO1NBQ0g7UUFDRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVTtZQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFDdEI7WUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQjtRQUVELFNBQVMsTUFBTSxDQUFDLFNBQXlCO1lBQ3ZDLFFBQVEsU0FBUyxFQUFFO2dCQUNqQixLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVTtvQkFDNUIsT0FBTyxZQUFZLENBQUM7Z0JBQ3RCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO29CQUM5QixPQUFPLGNBQWMsQ0FBQztnQkFDeEIsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7b0JBQzFCLDBFQUEwRTtvQkFDMUUsMkRBQTJEO29CQUMzRCxPQUFPLFFBQVEsQ0FBQztnQkFDbEIsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07b0JBQ3hCLE9BQU8sUUFBUSxDQUFDO2dCQUNsQjtvQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixTQUFnQixFQUFFLENBQUMsQ0FBQzthQUNoRTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUNoQixRQUF1QixFQUN2QixZQUF1QixFQUN2QixTQUFrQjs7UUFFbEIsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyw4QkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLElBQUksRUFBRSxRQUFRO1lBQ2QsWUFBWTtZQUNaLFFBQVE7WUFDUixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDdkIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUTtZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQzFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDN0MsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pELGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDaEQsY0FBYyxFQUFFLElBQUk7YUFDckIsQ0FBQyxRQUFRO1lBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMvRCxTQUFTLFFBQUUsUUFBUSxDQUFDLFNBQVMsbUNBQUksS0FBSztZQUN0QyxTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxHQUFtQjs7UUFDMUMsMkZBQTJGO1FBQzNGLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDeEQsT0FBTztTQUNSO1FBQ0QscURBQXFEO1FBQ3JELElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO1lBQ3RDLE9BQU87U0FDUjtRQUNELHFEQUFxRDtRQUNyRCxJQUNFLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3BFLElBQUksRUFDSjtZQUNBLE9BQU87U0FDUjtRQUVELDhEQUE4RDtRQUM5RCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUMsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkUsT0FBTyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsVUFBVSxHQUFHO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0RBQWdEO1FBQ2hELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FDN0MsV0FBVyxDQUFDLElBQWdDLENBQUMsR0FBRyxDQUN6QixDQUFDO1FBQzNCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUMzQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUNyRCxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUN0QyxXQUFXLENBQUMsSUFBSSxDQUNqQixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVU7YUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDO2FBQ2hDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNmLEtBQUs7WUFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzlCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQy9DO1lBQ0QsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztTQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVOLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0Qiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osTUFBTSwyQkFBa0IsQ0FDdEIsR0FBRyxDQUFDLFdBQVcsQ0FDaEIsK0JBQStCLFNBQVMsSUFBSSxDQUM5QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsNkJBQTZCLGtCQUFrQiw0Q0FBNEMsU0FBUyxHQUFHLENBQ3hHLENBQUM7UUFFRiwyQkFBMkI7UUFDM0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3ZELE1BQU0sV0FBVyxHQUFnQjtnQkFDL0IsSUFBSSxFQUFFO29CQUNKLFNBQVMsY0FBRSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksMENBQUUsU0FBUyx5Q0FBSSxHQUFHLENBQUMsSUFBSSwwQ0FBRSxTQUFTO29CQUNqRSxPQUFPLEVBQUUsNEJBQTRCLGtCQUFrQixJQUFJO2lCQUM1RDtnQkFDRCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUMvQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztnQkFDWixVQUFVLEVBQUUsV0FBVyxDQUFDLElBQUk7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsaUJBQWlCLGtCQUFrQixXQUFXLE1BQU07aUJBQ2pELEdBQUcsQ0FDRixDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsU0FBUyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFDekQsS0FBSyxDQUFDLFNBQ1IsRUFBRSxDQUNMO2lCQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNqQixDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osY0FBYyxrQkFBa0IsSUFBSSxnQkFBZ0I7aUJBQ2pELEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbEIsQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDeEI7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLGdCQUFnQixFQUFFO1lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLGlCQUFpQixLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFDaEUsS0FBSyxDQUFDLFNBQ1IsR0FBRyxDQUNKLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLFdBQ0UsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUM5QixHQUFHLGFBQWEsSUFBSSxlQUFlLEdBQUcsQ0FDdkMsQ0FBQztRQUVGLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixXQUFXLGtCQUFrQixJQUFJLGdCQUFnQjthQUM5QyxHQUFHLENBQ0YsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLFNBQVMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQ3pELEtBQUssQ0FBQyxTQUNSLEVBQUUsQ0FDTDthQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNqQixDQUFDO1FBQ0YsS0FBSyxNQUFNLEtBQUssSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxTQUFTLE1BQU0sS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDakU7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLGVBQWUsVUFBVSxhQUFhLEtBQUssQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QixTQUFTO1FBQ1QsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUNyQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QyxDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixNQUFNLE1BQU0sR0FBZ0I7Z0JBQzFCLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksRUFBRTtvQkFDSixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDakIsU0FBUyxRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSwwQ0FBRSxTQUFTO29CQUNwQyxPQUFPLEVBQUUsY0FBYztpQkFDeEI7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWO3dCQUNFLElBQUksRUFBRSxTQUFTO3dCQUNmLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYTt3QkFDeEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtxQkFDckI7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFO2dCQUN2RCxTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDLEVBQUU7Z0JBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZCLEdBQUcsRUFBRSxRQUFRO29CQUNiLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUc7b0JBQzFCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDdEIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixVQUFVLGtCQUFrQixJQUFJLFNBQVMsVUFBVSxRQUFRLElBQUksU0FBUyxHQUFHLENBQzVFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osUUFBUSxlQUFlLEdBQ3JCLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDaEMsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLENBQy9CLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDeEI7U0FDRjtRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLGdEQUFnRCxTQUFTLElBQUksQ0FDOUQsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxTQUFTLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RELElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDekIsT0FBTyxXQUFXLENBQUMsUUFBUTtvQkFDekIsQ0FBQyxDQUFDLFFBQVEsZUFBZSxtQkFBbUIsZUFBZSxpQkFBaUI7b0JBQzVFLENBQUMsQ0FBQyxRQUFRLGVBQWUsVUFBVSxDQUFDO2FBQ3ZDO1lBQ0QsT0FBTyxRQUNMLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUUsQ0FBQyxTQUNuRCxFQUFFLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNoRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QixrQ0FBa0M7UUFDbEMsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxhQUFhLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLGVBQWUsV0FBVyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxlQUFlLFVBQVUsYUFBYSxLQUFLLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLElBQWMsRUFDZCxXQUFtQixFQUNuQixVQUE4Qjs7UUFFOUIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osK0JBQStCLFVBQVUsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUN6RCxJQUFJLENBQUMsU0FBUyxDQUNmLEdBQUcsQ0FDTCxDQUFDO1lBQ0YsTUFBTSxPQUFPLGVBQUcsSUFBSSxDQUFDLElBQUksMENBQUUsT0FBTyxtQ0FBSSxxQkFBcUIsQ0FBQztZQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FDN0QsQ0FBQztZQUNGLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxPQUFPLEtBQUksSUFBSSxFQUFFO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLE9BQU8sR0FBRyxnQ0FBaUIsQ0FDL0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUMvQyxHQUFHLEVBQUUsUUFBUTtvQkFDYixHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHO29CQUMxQixVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQzFCLENBQUMsQ0FDSCxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNkLEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDMUMsVUFBSSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxVQUFVLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7YUFDMUQ7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLG1IQUFtSDtZQUNuSCxNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDaEMsSUFBSSxLQUFLLElBQUksQ0FBQyxhQUFhO2dCQUN6QixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHO2dCQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxZQUFZLEtBQUssRUFBRSxFQUFFO2dCQUN2QixzRUFBc0U7Z0JBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7YUFDbEQ7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsVUFBVSxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUNyRSxDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osUUFBUSxJQUFJLENBQUMsU0FBUyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQzdELENBQUM7WUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsU0FBUyxTQUFTLENBQUMsU0FBaUI7WUFDbEMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNuQyxPQUFPLE1BQU0sS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixTQUE2QixFQUM3QixlQUF1QixFQUN2QixLQUFpQjtRQUVqQixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWix1QkFBdUIsa0JBQWtCLGVBQWUsU0FBUyxDQUFDLElBQUksR0FBRyxDQUMxRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsa0JBQWtCLFlBQVksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsa0JBQWtCLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsZ0JBQWdCO1FBRWhCLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQiw2QkFBNkIsa0JBQWtCLDRDQUE0QyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQzdHLENBQUM7UUFFRixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUMzRCxDQUFDO1FBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQzVELENBQUM7UUFFRixnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWiw0RUFBNEUsQ0FDN0UsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLFNBQVMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsZUFBZSxTQUFTLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLGNBQWM7UUFFZCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLGNBQWM7SUFDaEIsQ0FBQztJQUVPLFlBQVksQ0FBQyxHQUF1QjtRQUMxQyw0R0FBNEc7UUFDNUcsNkdBQTZHO1FBQzdHLHNDQUFzQztRQUN0QyxNQUFNLFdBQVcsR0FBaUMsRUFBRSxDQUFDO1FBRXJELFNBQVMsWUFBWSxDQUVuQixVQUE4QixFQUM5QixXQUFXLEdBQUcsS0FBSzs7WUFFbkIsS0FBSyxNQUFNLFFBQVEsVUFBSSxVQUFVLENBQUMsVUFBVSxtQ0FBSSxFQUFFLEVBQUU7Z0JBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDcEUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7YUFDM0M7WUFFRCwyQkFBMkI7WUFDM0IsS0FBSyxNQUFNLElBQUksVUFBSSxVQUFVLENBQUMsVUFBVSxtQ0FBSSxFQUFFLEVBQUU7Z0JBQzlDLFlBQVksQ0FBQyxJQUFJLENBQ2YsSUFBSSxFQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUF1QixFQUN6QyxJQUFJLENBQ0wsQ0FBQzthQUNIO1FBQ0gsQ0FBQztRQUVELFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsRSw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixlQUFlLDBCQUEwQix1REFBdUQsR0FBRyxDQUFDLElBQUksRUFBRSxDQUMzRyxDQUFDO1FBRUYsdUJBQXVCO1FBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FDekUsQ0FBQztRQUVGLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLDJGQUEyRixDQUM1RixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsYUFBYSwwQkFBMEIsbURBQW1ELENBQzNGLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixRQUFRLElBQUksQ0FBQyxTQUFTLDZDQUE2QyxJQUFJLENBQUMsUUFBUSxNQUFNLElBQUksQ0FBQyxlQUFlLElBQUksQ0FDL0csQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixpQ0FBaUM7UUFFakMsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osNEdBQTRHLENBQzdHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsYUFBYSwwQkFBMEIsVUFBVSxrQkFBa0IsV0FBVyxDQUMvRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osaUVBQWlFLENBQ2xFLENBQUM7UUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckIsTUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLGFBQWE7Z0JBQ3ZDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixRQUFRLElBQUksQ0FBQyxTQUFTLE1BQU0sWUFBWSxHQUFHLHNCQUFzQixDQUMvRCxXQUFXLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFDM0IsSUFBSSxDQUNMLEdBQUcsQ0FDTCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLDBCQUEwQjtRQUUxQixVQUFVO1FBQ1YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2pCLGdCQUFnQixJQUFJLENBQUMsYUFBYSxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksQ0FDM0QsQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUVILGtGQUFrRjtRQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQiwrREFBK0QsQ0FDaEUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHdHQUF3RyxDQUN6RyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osd0lBQXdJLENBQ3pJLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxJQUFJLENBQUMsUUFBUSxhQUFhLENBQUMsQ0FBQzthQUNoRTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLDZCQUE2QixJQUFJLENBQUMsUUFBUSxPQUFPLENBQzdFLENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDeEI7U0FDRjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osMElBQTBJLENBQzNJLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHVJQUF1SSxDQUN4SSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsbUJBQW1CO1FBRW5CLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6QywrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsMkJBQTJCO1FBRTNCLFNBQVMsc0JBQXNCLENBQUMsUUFBZ0IsRUFBRSxJQUFjO1lBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsT0FBTyxRQUFRLENBQUM7YUFDakI7WUFDRCxPQUFPLG9DQUFvQyxRQUFRLE1BQU0sSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7UUFDMUYsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLEtBQWlCO1FBQzdELGdFQUFnRTtRQUNoRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRTlDLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWiw0REFBNEQsQ0FDN0QsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osR0FBRyxTQUFTLElBQUksMEJBQTBCLFlBQVksU0FBUyxJQUFJLDBCQUEwQixNQUFNLENBQ3BHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWpCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRO2dCQUM3QixDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLFlBQVksSUFBSSxDQUFDLFNBQVMsVUFBVTtnQkFDNUgsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQztZQUV4RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLFNBQVMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILGtFQUFrRTtRQUNsRSxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUTtZQUN2QyxDQUFDLENBQUMsUUFBUSxTQUFTLENBQUMsU0FBUyxtQkFBbUIsU0FBUyxDQUFDLFNBQVMsZ0JBQWdCLFNBQVMsQ0FBQyxTQUFTLE1BQU07Z0JBQzFHLFFBQVEsU0FBUyxDQUFDLFNBQVMsVUFBVTtZQUN2QyxDQUFDLENBQUMsUUFBUSxTQUFTLENBQUMsU0FBUyxnQkFBZ0IsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFpQjtRQUM1QyxrRUFBa0U7UUFDbEUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFbkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QixTQUFTLGdCQUFnQixDQUFDLElBQWM7WUFDdEMsT0FBTyxJQUFJLENBQUMsUUFBUTtnQkFDbEIsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsbUJBQW1CLElBQUksQ0FBQyxTQUFTLGlCQUFpQjtnQkFDMUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsYUFBYSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBZTtRQUN0QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osV0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxHQUFHLENBQ2pFLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFlO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sUUFBUSxDQUFDLElBQWU7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMzQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwRCxPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBSU8sY0FBYyxDQUFDLElBQW1CLEVBQUUsSUFBd0I7UUFDbEUsTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdkQsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBbUIsR0FBRyx1Q0FBdUMsSUFBSSxDQUFDLFNBQVMsQ0FDekUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQzNCLEVBQUUsQ0FDSixDQUFDO1NBQ0g7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDakIsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUN6QixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2IsT0FBTyxDQUFDO0lBQ1gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQW1CLEVBQUUsR0FBVyxFQUFFLEdBQUcsR0FBRyxNQUFNO1FBQ3ZFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDeEQsR0FBRztZQUNILElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ25CLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUM7U0FDeEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUc7WUFDWixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ3pCLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUU7U0FDbEMsQ0FBQztRQUNGLHFFQUFxRTtRQUNyRSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUVqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxzQ0FBc0M7SUFDOUIsV0FBVyxDQUNqQixHQUFzQixFQUN0QixNQUFtQixFQUNuQixXQUFvQjs7UUFFcEIsSUFDRSxDQUFDLFdBQVc7WUFDWixNQUFNLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3hDLENBQUMsT0FBRSxHQUFtQixDQUFDLFVBQVUsbUNBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMzQyxDQUFDLENBQUMsRUFBRSxFQUFFLFdBQUMsT0FBQSxNQUFNLENBQUMsSUFBSSxPQUFDLENBQUMsQ0FBQyxJQUFJLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUEsRUFBQSxDQUM5QyxFQUNEO1lBQ0EsT0FBTztTQUNSO1FBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFHLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDakM7YUFBTSxJQUFJLFdBQVcsRUFBRTtZQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQ1IsZ0NBQWlCLENBQ2YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQ3BELENBQUMsU0FBUyxFQUFFLENBQ2QsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1EQUFtRDtTQUM1RjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXZCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRW5FLDRFQUE0RTtZQUM1RSwwRUFBMEU7WUFDMUUsRUFBRTtZQUNGLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsaUZBQWlGO1lBQ2pGLGlGQUFpRjtZQUNqRiw2QkFBNkI7WUFDN0IsRUFBRTtZQUNGLDRFQUE0RTtZQUM1RSxxREFBcUQ7WUFDckQsS0FBSyxDQUFDLElBQUksQ0FDUixnQ0FBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDL0QsQ0FBQztTQUNIO1FBRUQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDMUM7UUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDWixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDbkM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsU0FBUztRQUNULElBQUssR0FBbUIsQ0FBQyxVQUFVLEVBQUU7WUFDbkMsTUFBTSxNQUFNLEdBQUcsR0FBa0IsQ0FBQztZQUNsQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFDckMsTUFBTSxPQUFPLFNBQUcsS0FBSyxDQUFDLElBQUksMENBQUUsT0FBTyxDQUFDO29CQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDbEU7YUFDRjtTQUNGO1FBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDbEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQjtZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU8sWUFBWSxDQUFDLEdBQW1CO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ2IsT0FBTyxpQ0FBaUMsQ0FBQztTQUMxQztRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLGFBQWlDLEVBQ2pDLEVBQUUsU0FBUyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFFMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQixPQUFPLEdBQ0wsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUMxQyxtQkFBbUIsQ0FBQztTQUNyQjtRQUNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsYUFBaUMsRUFDakMsRUFBRSxTQUFTLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUM1RCxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ1osR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxTQUFTLEVBQUUsQ0FDekUsQ0FBQztJQUNKLENBQUM7SUFFTyxVQUFVLENBQ2hCLElBQXdCLEVBQ3hCLElBQXdEO1FBRXhELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxrQkFBa0IsQ0FBQztTQUMzQjtRQUNELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFTyxZQUFZLENBQ2xCLElBQXdCLEVBQ3hCLEVBQUUsY0FBYyxHQUFHLEtBQUssRUFBRSxTQUFTLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUVsRCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3ZFLGNBQWM7Z0JBQ2QsU0FBUzthQUNWLENBQUMsQ0FBQztZQUNILFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQzVCLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLO29CQUM1QixPQUFPLDBDQUEwQyxpQkFBaUIsR0FBRyxDQUFDO2dCQUN4RSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRztvQkFDMUIsT0FBTyx5Q0FBeUMsaUJBQWlCLEdBQUcsQ0FBQztnQkFDdkU7b0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FDYixnQ0FBZ0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFXLEVBQUUsQ0FDOUQsQ0FBQzthQUNMO1NBQ0Y7UUFDRCxPQUFPLDRDQUE0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2RSxjQUFjO1lBQ2QsU0FBUztTQUNWLENBQUMsU0FBUyxDQUFDO0lBQ2QsQ0FBQztJQUVPLFdBQVcsQ0FDakIsT0FBMkIsRUFDM0IsRUFBRSxjQUFjLEdBQUcsS0FBSyxFQUFFLFNBQVMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBRWxELElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO2FBQU0sSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO2FBQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDeEM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO2dCQUN6QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO29CQUN4QyxjQUFjO29CQUNkLFNBQVM7aUJBQ1YsQ0FBQyxFQUFFO29CQUNGLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2Y7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU8sZ0JBQWdCLENBQ3RCLEdBQWlDLEVBQ2pDLEVBQ0UsY0FBYyxFQUNkLFNBQVMsR0FDdUM7UUFFbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtZQUNsRSxTQUFTO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxjQUFjLEdBQUcsU0FBUztZQUM5QixDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUNoQyxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQ3BCLFFBQVEsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDM0IsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUs7Z0JBQzVCLE9BQU8sY0FBYztvQkFDbkIsQ0FBQyxDQUFDLGdCQUFnQjtvQkFDbEIsQ0FBQyxDQUFDLGtCQUFrQixjQUFjLEdBQUcsQ0FBQztZQUMxQyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRztnQkFDMUIsT0FBTyxjQUFjO29CQUNuQixDQUFDLENBQUMsZUFBZTtvQkFDakIsQ0FBQyxDQUFDLG1DQUFtQyxjQUFjLEdBQUcsQ0FBQztZQUMzRDtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUNiLGdDQUFnQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQVcsRUFBRSxDQUM3RCxDQUFDO1NBQ0w7UUFFRCxTQUFTLGFBQWEsQ0FBQyxRQUFnQjtZQUNyQyxzRUFBc0U7WUFDdEUsSUFBSSxRQUFRLEtBQUssa0JBQWtCLEVBQUU7Z0JBQ25DLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBQ0QsT0FBTyxhQUFhLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQTZCO1FBQ25ELFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO2dCQUM3QixPQUFPLG1CQUFtQixDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJO2dCQUMxQixPQUFPLG1CQUFtQixDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJO2dCQUMxQixPQUFPLGdEQUFnRCxDQUFDO1lBQzFELEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNO2dCQUM1QixPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNO2dCQUM1QixPQUFPLGtCQUFrQixDQUFDO1lBQzVCLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHO2dCQUN6QixPQUFPLGtCQUFrQixDQUFDO1lBQzVCO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLFNBQWdCLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVPLHlCQUF5QixDQUFDLE1BQXFCO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4RCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3pELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNuQixNQUFNLFlBQVksR0FBRyxtQ0FBbUMsUUFBUSxHQUFHLENBQUM7WUFFcEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLFVBQVUsR0FBRyxtQ0FBbUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDO1lBRXhFLE1BQU0sVUFBVSxHQUNkLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLGtDQUFrQyxZQUFZLEtBQUssVUFBVSxHQUFHO2dCQUNsRSxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ2pCLE9BQU8sS0FBSyxVQUFVLHlCQUF5QixDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBRXZCLFNBQVMsZ0JBQWdCLENBQUMsS0FBcUI7WUFDN0MsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxvQ0FBb0MsUUFBUSxNQUFNLFFBQVEsZ0JBQWdCLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsR0FBdUIsRUFDdkIsTUFBbUIsRUFDbkIsS0FBYztRQUVkLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVuQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxTQUFTLElBQUksa0RBQWtELFNBQVMsVUFBVSxDQUFDO1NBQ3BGO2FBQU07WUFDTCxTQUFTLElBQUksK0JBQ1gsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQ3hCLFNBQVMsQ0FBQztTQUNYO1FBRUQsU0FBUyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1FBRWhDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixTQUFTLElBQUksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUN2RCxjQUFjLEVBQUUsSUFBSTthQUNyQixDQUFDLEVBQUUsQ0FBQztTQUNOO2FBQU07WUFDTCxTQUFTLElBQUksd0NBQXdDLENBQUM7U0FDdkQ7UUFDRCxTQUFTLElBQUksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUUxRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQzdCLFNBQVMsRUFDVCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ3hCLENBQUM7U0FDSDtRQUVELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixPQUFPLFVBQVUsU0FBUyxHQUFHLENBQUM7U0FDL0I7UUFDRCxPQUFPLEdBQUcsU0FBUyxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGNBQWMsQ0FDcEIsU0FBaUIsRUFDakIsSUFBd0IsRUFDeEIsUUFBa0I7UUFFbEIsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEMsSUFBSSxPQUFlLENBQUM7WUFDcEIsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtnQkFDNUIsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUs7b0JBQzVCLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztvQkFDN0IsTUFBTTtnQkFDUixLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRztvQkFDMUIsT0FBTyxHQUFHLGlCQUFpQixDQUFDO29CQUM1QixNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBVyxFQUFFLENBQzlELENBQUM7YUFDTDtZQUNELHVIQUF1SDtZQUN2SCxPQUFPLFFBQVE7Z0JBQ2IsQ0FBQyxDQUFDLGtDQUFrQyxJQUFJLENBQUMsVUFBVSxDQUMvQyxJQUFJLENBQ0wsS0FBSyxTQUFTLGlDQUFpQyxPQUFPLGdCQUFnQjtnQkFDekUsQ0FBQyxDQUFDLHlCQUF5QixPQUFPLElBQUksU0FBUyxHQUFHLENBQUM7U0FDdEQ7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sc0JBQXNCLENBQUMsTUFBcUI7UUFDbEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pDLHVIQUF1SDtnQkFDdkgsTUFBTSxDQUFDLElBQUksQ0FDVCxTQUFTLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUU7b0JBQ25DLFNBQVMsRUFBRyxNQUFzQixDQUFDLE1BQU07aUJBQzFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxhQUFhLENBQUMsb0JBQW9CLENBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQ1AsRUFBRSxDQUNKLENBQUM7YUFDSDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFxQztRQUM3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ25ELENBQUM7SUFFTyxlQUFlLENBQUMsVUFBa0I7UUFDeEMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRU8sY0FBYyxDQUFDLEdBQWtCOztRQUN2QyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckQsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUNwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxPQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUMsRUFBRTtZQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQzFDLFFBQVEsRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNsQixHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFO1lBQ3ZDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7WUFDekIsSUFBSSxFQUFFLGlCQUFpQjtTQUN4QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksTUFBTSxDQUFDLElBQUksT0FBQyxHQUFHLENBQUMsWUFBWSxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDNUMsSUFBSSxNQUFNLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxZQUFZLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2pCLHNCQUFzQixpQkFBaUIscUJBQXFCLENBQzdELENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixpRUFBaUUsQ0FDbEUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLDBCQUEwQixpQkFBaUIsMEJBQTBCLENBQ3RFLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWix1REFBdUQsYUFBYSxLQUFLLENBQzFFLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWiwyRUFBMkUsQ0FDNUUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQix3REFBd0QsQ0FDekQsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsdUJBQXVCO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osOERBQThELENBQy9ELENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWpCLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLGlCQUFpQixJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixVQUFVLFVBQVUsT0FDbEIsR0FBRyxDQUFDLE9BQ04sTUFBTSxpQkFBaUIsWUFBWSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUNuRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU87UUFFL0IsZUFBZTtRQUNmLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQiw0REFBNEQsQ0FDN0QsQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsaUZBQWlGLENBQ2xGLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLGdFQUFnRSxDQUNqRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVoQyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sb0JBQW9CLENBQUMsR0FBbUI7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDakIsYUFBYSxHQUFHLENBQUMsSUFBSSxtREFBbUQsQ0FDekUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNqQixhQUFhLEdBQUcsQ0FBQyxJQUFJLCtFQUErRSxDQUNyRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssV0FBVyxDQUNqQixHQUFXLEVBQ1gsRUFBRSxVQUFVLEtBQThCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtRQUUvRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLDhHQUE4RztRQUM5Ryw0R0FBNEc7UUFDNUcsdUNBQXVDO1FBQ3ZDLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFFckMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwRTtRQUVELE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQzdCLEdBQUcsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxTQUFTLEdBQ2IsUUFBUSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNqRSxPQUFPLEdBQUcsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQWdCTyxZQUFZLENBQ2xCLElBQW1CLEVBQ25CLElBQWdCO1FBRWhCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDdkQ7UUFFRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO1lBQ25DLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDekMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QjtRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCO1lBQ3JDLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUc7WUFDMUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUI7WUFDMUMsQ0FBQyxDQUFDLGVBQWUsc0JBQVksRUFBRTtZQUMvQixDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHdDQUF3QyxTQUFTLElBQUksSUFBSSxHQUFHLENBQzdELENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLE9BQWUsRUFBRSxHQUFnQjtRQUN0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUM5QyxHQUFHLEVBQ0gsT0FBTyxFQUNQLDZCQUFjLENBQUMsSUFBSSxFQUNuQixpQ0FBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ2xDLENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFFBQWdCLEVBQUUsR0FBZ0I7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUM3QyxHQUFHLEVBQ0gsUUFBUSxFQUNSLDZCQUFjLENBQUMsSUFBSSxFQUNuQixpQ0FBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxvQkFBb0IsQ0FDMUIsSUFBK0MsRUFDL0MsRUFBRSxlQUFlLEdBQUcsS0FBSyxLQUFvQyxFQUFFO1FBRS9ELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFakMsSUFDRSxlQUFlO1lBQ2Ysb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQ3RCO1lBQ0EsTUFBTSxDQUFDLEdBQUcsQ0FDUixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLDRCQUE0QixFQUFFLENBQ2hFLENBQUM7U0FDSDthQUFNO1lBQ0wsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FDUixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDRCQUE0QixFQUFFLENBQ2pFLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ25ELE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2xCO2lCQUNGO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN2RCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQjthQUNGO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7QUFqK0VELHlJQUF5STtBQUN6SSxnSkFBZ0o7QUFDaEosK0dBQStHO0FBQ3ZGLCtCQUFpQixHQUFHO0lBQzFDLFVBQVU7SUFDVixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxRQUFRO0lBQ1IsSUFBSTtJQUNKLE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLElBQUk7SUFDSixZQUFZO0lBQ1osUUFBUTtJQUNSLFlBQVk7SUFDWixLQUFLO0lBQ0wsV0FBVztJQUNYLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLE9BQU87SUFDUCxRQUFRO0lBQ1IsY0FBYztJQUNkLE1BQU07SUFDTixPQUFPO0lBQ1AsUUFBUTtJQUNSLFdBQVc7SUFDWCxNQUFNO0lBQ04sS0FBSztJQUNMLE1BQU07SUFDTixVQUFVO0lBQ1YsT0FBTztDQUNSLENBQUM7QUEyN0VKOzs7OztHQUtHO0FBQ0gsU0FBUyw4QkFBOEI7SUFDckMsSUFBSTtRQUNGLHNJQUFzSTtRQUN0SSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUMsSUFBSSxDQUNWLDREQUE0RCxXQUFXLENBQUMsVUFBVSxFQUFFLENBQ3JGLENBQUM7UUFDRixPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUM7S0FDL0I7SUFBQyxNQUFNO1FBQ04sT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsYUFBNkM7SUFDL0QsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNsQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxDQUNMLGFBQWEsQ0FBQyxRQUFRO1FBQ3RCLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDaEQsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsSUFBWSxFQUNaLFFBQWtCLEVBQ2xCLE9BQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9CLElBQUksT0FBTyxFQUFFO1FBQ1gsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNwQztJQUNELElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDYixLQUFLLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7S0FDM0M7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLENBQVM7SUFDOUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNwQixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7S0FDaEI7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUN2QixTQUFjO0lBRWQsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQztZQUMxQixNQUFNLFNBQVMsQ0FBQztZQUNoQixPQUFPLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0JBQzFELG9EQUFvRDtvQkFDcEQsT0FBTztpQkFDUjtnQkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDckQsb0ZBQW9GO2dCQUNwRixJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO29CQUM1QixNQUFNLFNBQVMsQ0FBQztpQkFDakI7YUFDRjtRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUlEOztHQUVHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxJQUFrQjs7SUFDakQsTUFBTSxXQUFXLGVBQUcsSUFBSSxDQUFDLE9BQU8sMENBQUUsSUFBSSwwQ0FBRSxPQUFPLENBQUM7SUFDaEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLGNBQWMsSUFBSSxDQUFDLElBQUksdUNBQXVDLENBQy9ELENBQUM7S0FDSDtJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsU0FBUyxZQUFZLENBQ25CLElBQWtCLEVBQ2xCLFdBQW1COztJQUVuQixNQUFNLG9CQUFvQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUV0QyxpRkFBaUY7SUFDakYsSUFBSSxXQUFXLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEQsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDO0lBQ3RCLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTtRQUN0QyxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVsRCxNQUFNLFNBQVMsU0FBRyxJQUFJLENBQUMsVUFBVSwwQ0FBRyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sZUFBZSxlQUFHLFNBQVMsQ0FBQyxPQUFPLDBDQUFFLElBQUksMENBQUUsT0FBTyxDQUFDO1lBQ3pELElBQUksZUFBZSxFQUFFO2dCQUNuQixXQUFXLEdBQUcsZUFBZSxDQUFDO2dCQUM5QiwrRkFBK0Y7Z0JBQy9GLDJCQUEyQjtnQkFDM0IsTUFBTTthQUNQO1lBQ0Qsb0JBQW9CLENBQUMsT0FBTyxDQUFDLElBQUksd0JBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLDhDQUE4QztZQUM5QyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsR0FBRyxHQUFHLFNBQVMsQ0FBQztLQUNqQjtJQUNELElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRTtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLFdBQVcsYUFBYSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUMxRTtJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsR0FBRyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzdELFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLFFBQTBCOztJQUN0RCxPQUFPLENBQUMsb0JBQUMsUUFBUSxDQUFDLFFBQVEsMENBQUUsSUFBSSwwQ0FBRSxNQUFNLDBDQUFFLG9CQUFvQixDQUFBLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxJQUFZO0lBQzlDLE9BQU8sNkJBQTZCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFDRCxNQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsRUFBVTtJQUNoQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUNqQjtJQUNELE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgY2xvbmUgZnJvbSAnY2xvbmUnO1xuaW1wb3J0IHsgdG9TbmFrZUNhc2UgfSBmcm9tICdjb2RlbWFrZXIvbGliL2Nhc2UtdXRpbHMnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHtcbiAgUm9zZXR0YSxcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIGVuZm9yY2VzU3RyaWN0TW9kZSxcbiAgbWFya0Rvd25Ub0phdmFEb2MsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHhtbGJ1aWxkZXIgZnJvbSAneG1sYnVpbGRlcic7XG5cbmltcG9ydCB7IFRhcmdldEJ1aWxkZXIsIEJ1aWxkT3B0aW9ucyB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgR2VuZXJhdG9yIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBqc2lpVG9QYXNjYWxDYXNlIH0gZnJvbSAnLi4vbmFtaW5nLXV0aWwnO1xuaW1wb3J0IHsgSnNpaU1vZHVsZSB9IGZyb20gJy4uL3BhY2thZ2luZyc7XG5pbXBvcnQge1xuICBQYWNrYWdlSW5mbyxcbiAgVGFyZ2V0LFxuICBmaW5kTG9jYWxCdWlsZERpcnMsXG4gIFRhcmdldE9wdGlvbnMsXG59IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCwgU2NyYXRjaCwgc2x1Z2lmeSwgc2V0RXh0ZW5kIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBWRVJTSU9OLCBWRVJTSU9OX0RFU0MgfSBmcm9tICcuLi92ZXJzaW9uJztcbmltcG9ydCB7IHN0YWJpbGl0eVByZWZpeEZvciwgcmVuZGVyU3VtbWFyeSB9IGZyb20gJy4vX3V0aWxzJztcbmltcG9ydCB7IHRvTWF2ZW5WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQgeyBUYXJnZXROYW1lIH0gZnJvbSAnLi9pbmRleCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHNwZHhMaWNlbnNlTGlzdCA9IHJlcXVpcmUoJ3NwZHgtbGljZW5zZS1saXN0Jyk7XG5cbmNvbnN0IEJVSUxERVJfQ0xBU1NfTkFNRSA9ICdCdWlsZGVyJztcblxuY29uc3QgQU5OX05PVF9OVUxMID0gJ0BvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGwnO1xuY29uc3QgQU5OX05VTExBQkxFID0gJ0BvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlJztcbmNvbnN0IEFOTl9JTlRFUk5BTCA9ICdAc29mdHdhcmUuYW1hem9uLmpzaWkuSW50ZXJuYWwnO1xuXG4vKipcbiAqIEJ1aWxkIEphdmEgcGFja2FnZXMgYWxsIHRvZ2V0aGVyLCBieSBnZW5lcmF0aW5nIGFuIGFnZ3JlZ2F0ZSBQT01cbiAqXG4gKiBUaGlzIHdpbGwgbWFrZSB0aGUgSmF2YSBidWlsZCBhIGxvdCBtb3JlIGVmZmljaWVudCAofjMwMCUpLlxuICpcbiAqIERvIHRoaXMgYnkgY29weWluZyB0aGUgY29kZSBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgZ2VuZXJhdGluZyBhbiBhZ2dyZWdhdGVcbiAqIFBPTSB0aGVyZSwgYW5kIHRoZW4gY29weWluZyB0aGUgYXJ0aWZhY3RzIGJhY2sgaW50byB0aGUgcmVzcGVjdGl2ZSBvdXRwdXRcbiAqIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgY2xhc3MgSmF2YUJ1aWxkZXIgaW1wbGVtZW50cyBUYXJnZXRCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0YXJnZXROYW1lID0gJ2phdmEnO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXM6IHJlYWRvbmx5IEpzaWlNb2R1bGVbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZE1vZHVsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvZGVPbmx5KSB7XG4gICAgICAvLyBTaW1wbGUsIGp1c3QgZ2VuZXJhdGUgY29kZSB0byByZXNwZWN0aXZlIG91dHB1dCBkaXJzXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGhpcy5tb2R1bGVzLm1hcCgobW9kdWxlKSA9PlxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb2R1bGVDb2RlKFxuICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgdGhpcy5vdXRwdXREaXIobW9kdWxlLm91dHB1dERpcmVjdG9yeSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIG1ha2UgYSBzaW5nbGUgdGVtcGRpciB0byBob2xkIGFsbCBzb3VyY2VzLCBidWlsZCB0aGVtIHRvZ2V0aGVyIGFuZCBjb3B5IHRoZW0gYmFjayBvdXRcbiAgICBjb25zdCBzY3JhdGNoRGlyczogQXJyYXk8U2NyYXRjaDxhbnk+PiA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW1wU291cmNlRGlyID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUFnZ3JlZ2F0ZVNvdXJjZURpcihcbiAgICAgICAgdGhpcy5tb2R1bGVzLFxuICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICApO1xuICAgICAgc2NyYXRjaERpcnMucHVzaCh0ZW1wU291cmNlRGlyKTtcblxuICAgICAgLy8gTmVlZCBhbnkgb2xkIG1vZHVsZSBvYmplY3QgdG8gbWFrZSBhIHRhcmdldCB0byBiZSBhYmxlIHRvIGludm9rZSBidWlsZCwgdGhvdWdoIG5vbmUgb2YgaXRzIHNldHRpbmdzXG4gICAgICAvLyB3aWxsIGJlIHVzZWQuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1ha2VUYXJnZXQodGhpcy5tb2R1bGVzWzBdLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgY29uc3QgdGVtcE91dHB1dERpciA9IGF3YWl0IFNjcmF0Y2gubWFrZShhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgIGxvZ2dpbmcuZGVidWcoYEJ1aWxkaW5nIEphdmEgY29kZSB0byAke2Rpcn1gKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmJ1aWxkKHRlbXBTb3VyY2VEaXIuZGlyZWN0b3J5LCBkaXIpO1xuICAgICAgfSk7XG4gICAgICBzY3JhdGNoRGlycy5wdXNoKHRlbXBPdXRwdXREaXIpO1xuXG4gICAgICBhd2FpdCB0aGlzLmNvcHlPdXRBcnRpZmFjdHMoXG4gICAgICAgIHRlbXBPdXRwdXREaXIuZGlyZWN0b3J5LFxuICAgICAgICB0ZW1wU291cmNlRGlyLm9iamVjdCxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xlYW4pIHtcbiAgICAgICAgYXdhaXQgU2NyYXRjaC5jbGVhbnVwQWxsKHNjcmF0Y2hEaXJzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGBFeGNlcHRpb24gb2NjdXJyZWQsIG5vdCBjbGVhbmluZyB1cCAke3NjcmF0Y2hEaXJzXG4gICAgICAgICAgLm1hcCgocykgPT4gcy5kaXJlY3RvcnkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNb2R1bGVDb2RlKFxuICAgIG1vZHVsZTogSnNpaU1vZHVsZSxcbiAgICBvcHRpb25zOiBCdWlsZE9wdGlvbnMsXG4gICAgd2hlcmU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tYWtlVGFyZ2V0KG1vZHVsZSwgb3B0aW9ucyk7XG4gICAgbG9nZ2luZy5kZWJ1ZyhgR2VuZXJhdGluZyBKYXZhIGNvZGUgaW50byAke3doZXJlfWApO1xuICAgIGF3YWl0IHRhcmdldC5nZW5lcmF0ZUNvZGUod2hlcmUsIG1vZHVsZS50YXJiYWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVBZ2dyZWdhdGVTb3VyY2VEaXIoXG4gICAgbW9kdWxlczogcmVhZG9ubHkgSnNpaU1vZHVsZVtdLFxuICAgIG9wdGlvbnM6IEJ1aWxkT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTY3JhdGNoPFRlbXBvcmFyeUphdmFQYWNrYWdlW10+PiB7XG4gICAgcmV0dXJuIFNjcmF0Y2gubWFrZShhc3luYyAodG1wRGlyOiBzdHJpbmcpID0+IHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoYEdlbmVyYXRpbmcgYWdncmVnYXRlIEphdmEgc291cmNlIGRpciBhdCAke3RtcERpcn1gKTtcbiAgICAgIGNvbnN0IHJldDogVGVtcG9yYXJ5SmF2YVBhY2thZ2VbXSA9IFtdO1xuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRNb2R1bGVzID0gbW9kdWxlc1xuICAgICAgICAubWFwKChtb2R1bGUpID0+ICh7IG1vZHVsZSwgcmVsYXRpdmVOYW1lOiBzbHVnaWZ5KG1vZHVsZS5uYW1lKSB9KSlcbiAgICAgICAgLm1hcCgoeyBtb2R1bGUsIHJlbGF0aXZlTmFtZSB9KSA9PiAoe1xuICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICByZWxhdGl2ZU5hbWUsXG4gICAgICAgICAgc291cmNlRGlyOiBwYXRoLmpvaW4odG1wRGlyLCByZWxhdGl2ZU5hbWUpLFxuICAgICAgICB9KSlcbiAgICAgICAgLm1hcCgoeyBtb2R1bGUsIHJlbGF0aXZlTmFtZSwgc291cmNlRGlyIH0pID0+XG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vZHVsZUNvZGUobW9kdWxlLCBvcHRpb25zLCBzb3VyY2VEaXIpLnRoZW4oKCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgIHJlbGF0aXZlTmFtZSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICk7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgeyBtb2R1bGUsIHJlbGF0aXZlTmFtZSB9IG9mIGdlbmVyYXRlZE1vZHVsZXMpIHtcbiAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgIHJlbGF0aXZlU291cmNlRGlyOiByZWxhdGl2ZU5hbWUsXG4gICAgICAgICAgcmVsYXRpdmVBcnRpZmFjdHNEaXI6IG1vZHVsZUFydGlmYWN0c1N1YmRpcihtb2R1bGUpLFxuICAgICAgICAgIG91dHB1dFRhcmdldERpcmVjdG9yeTogbW9kdWxlLm91dHB1dERpcmVjdG9yeSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVBZ2dyZWdhdGVQb20oXG4gICAgICAgIHRtcERpcixcbiAgICAgICAgcmV0Lm1hcCgobSkgPT4gbS5yZWxhdGl2ZVNvdXJjZURpciksXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZU1hdmVuU2V0dGluZ3NGb3JMb2NhbERlcHModG1wRGlyKTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVBZ2dyZWdhdGVQb20od2hlcmU6IHN0cmluZywgbW9kdWxlTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgYWdncmVnYXRlUG9tID0geG1sYnVpbGRlclxuICAgICAgLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHByb2plY3Q6IHtcbiAgICAgICAgICAgICdAeG1sbnMnOiAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJyxcbiAgICAgICAgICAgICdAeG1sbnM6eHNpJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyxcbiAgICAgICAgICAgICdAeHNpOnNjaGVtYUxvY2F0aW9uJzpcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCcsXG4gICAgICAgICAgICAnI2NvbW1lbnQnOiBbXG4gICAgICAgICAgICAgIGBHZW5lcmF0ZWQgYnkganNpaS1wYWNtYWtAJHtWRVJTSU9OX0RFU0N9IG9uICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWAsXG4gICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICBtb2RlbFZlcnNpb246ICc0LjAuMCcsXG4gICAgICAgICAgICBwYWNrYWdpbmc6ICdwb20nLFxuXG4gICAgICAgICAgICBncm91cElkOiAnc29mdHdhcmUuYW1hem9uLmpzaWknLFxuICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ2FnZ3JlZ2F0ZXBvbScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuXG4gICAgICAgICAgICBtb2R1bGVzOiB7XG4gICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlTmFtZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW5jb2Rpbmc6ICdVVEYtOCcgfSxcbiAgICAgIClcbiAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSk7XG5cbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0ZWQgJHt3aGVyZX0vcG9tLnhtbGApO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4od2hlcmUsICdwb20ueG1sJyksIGFnZ3JlZ2F0ZVBvbSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlPdXRBcnRpZmFjdHMoXG4gICAgYXJ0aWZhY3RzUm9vdDogc3RyaW5nLFxuICAgIHBhY2thZ2VzOiBUZW1wb3JhcnlKYXZhUGFja2FnZVtdLFxuICApIHtcbiAgICBsb2dnaW5nLmRlYnVnKCdDb3B5aW5nIG91dCBKYXZhIGFydGlmYWN0cycpO1xuICAgIC8vIFRoZSBhcnRpZmFjdHMgZGlyZWN0b3J5IGxvb2tzIGxpa2UgdGhpczpcbiAgICAvLyAgL3RtcC9YWFgvc29mdHdhcmUvYW1hem9uL2F3c2Nkay9zb21ldGhpbmcvdjEuMi4zXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvZWxzZS92MS4yLjNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9lbnRpcmVseS92MS4yLjNcbiAgICAvL1xuICAgIC8vIFdlIGdldCB0aGUgJ3NvZnR3YXJlL2FtYXpvbi9hd3NjZGsvc29tZXRoaW5nJyBwYXRoIGZyb20gdGhlIHBhY2thZ2UsIGlkZW50aWZ5aW5nXG4gICAgLy8gdGhlIGZpbGVzIHdlIG5lZWQgdG8gY29weSwgaW5jbHVkaW5nIE1hdmVuIG1ldGFkYXRhLiBCdXQgd2UgbmVlZCB0byByZWNyZWF0ZVxuICAgIC8vIHRoZSB3aG9sZSBwYXRoIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LlxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlcy5tYXAoYXN5bmMgKHBrZykgPT4ge1xuICAgICAgICBjb25zdCBhcnRpZmFjdHNTb3VyY2UgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgYXJ0aWZhY3RzUm9vdCxcbiAgICAgICAgICBwa2cucmVsYXRpdmVBcnRpZmFjdHNEaXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c0Rlc3QgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgdGhpcy5vdXRwdXREaXIocGtnLm91dHB1dFRhcmdldERpcmVjdG9yeSksXG4gICAgICAgICAgcGtnLnJlbGF0aXZlQXJ0aWZhY3RzRGlyLFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChhcnRpZmFjdHNEZXN0KTtcbiAgICAgICAgYXdhaXQgZnMuY29weShhcnRpZmFjdHNTb3VyY2UsIGFydGlmYWN0c0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGUgd2hldGhlciBvciBub3QgdG8gYXBwZW5kICdqYXZhJyB0byB0aGUgZ2l2ZW4gb3V0cHV0IGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBvdXRwdXREaXIoZGVjbGFyZWREaXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VTdWJkaXJlY3RvcnlcbiAgICAgID8gcGF0aC5qb2luKGRlY2xhcmVkRGlyLCB0aGlzLnRhcmdldE5hbWUpXG4gICAgICA6IGRlY2xhcmVkRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBtYXZlbiBzZXR0aW5ncyBmaWxlIGZvciB0aGlzIGJ1aWxkLlxuICAgKiBAcGFyYW0gd2hlcmUgVGhlIGdlbmVyYXRlZCBzb3VyY2VzIGRpcmVjdG9yeS4gVGhpcyBpcyB3aGVyZSB1c2VyLnhtbCB3aWxsIGJlIHBsYWNlZC5cbiAgICogQHBhcmFtIGN1cnJlbnRPdXRwdXREaXJlY3RvcnkgVGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeS4gV2lsbCBiZSBhZGRlZCBhcyBhIGxvY2FsIG1hdmVuIHJlcG8uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTWF2ZW5TZXR0aW5nc0ZvckxvY2FsRGVwcyh3aGVyZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od2hlcmUsICd1c2VyLnhtbCcpO1xuXG4gICAgLy8gdHJhdmVyc2UgdGhlIGRlcCBncmFwaCBvZiB0aGlzIG1vZHVsZSBhbmQgZmluZCBhbGwgbW9kdWxlcyB0aGF0IGhhdmVcbiAgICAvLyBhbiA8b3V0ZGlyPi9qYXZhIGRpcmVjdG9yeS4gd2Ugd2lsbCBhZGQgdGhvc2UgYXMgbG9jYWwgbWF2ZW5cbiAgICAvLyByZXBvc2l0b3JpZXMgd2hpY2ggd2lsbCByZXNvbHZlIGluc3RlYWQgb2YgTWF2ZW4gQ2VudHJhbCBmb3IgdGhvc2VcbiAgICAvLyBtb2R1bGUuIHRoaXMgZW5hYmxlcyBidWlsZGluZyBhZ2FpbnN0IGxvY2FsIG1vZHVsZXMgKGkuZS4gaW4gbGVybmFcbiAgICAvLyByZXBvc2l0b3JpZXMgb3IgbGlua2VkIG1vZHVsZXMpLlxuICAgIGNvbnN0IGFsbERlcHNPdXRwdXREaXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCByZXNvbHZlZE1vZHVsZXMgPSB0aGlzLm1vZHVsZXMubWFwKGFzeW5jIChtb2QpID0+ICh7XG4gICAgICBtb2R1bGU6IG1vZCxcbiAgICAgIGxvY2FsQnVpbGREaXJzOiBhd2FpdCBmaW5kTG9jYWxCdWlsZERpcnMoXG4gICAgICAgIG1vZC5tb2R1bGVEaXJlY3RvcnksXG4gICAgICAgIHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICksXG4gICAgfSkpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgeyBtb2R1bGUsIGxvY2FsQnVpbGREaXJzIH0gb2YgcmVzb2x2ZWRNb2R1bGVzKSB7XG4gICAgICBzZXRFeHRlbmQoYWxsRGVwc091dHB1dERpcnMsIGxvY2FsQnVpbGREaXJzKTtcblxuICAgICAgLy8gQWxzbyBpbmNsdWRlIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgd2UncmUgYnVpbGRpbmcgdG8sIGluIGNhc2Ugd2UgYnVpbGQgbXVsdGlwbGUgcGFja2FnZXMgaW50b1xuICAgICAgLy8gdGhlIHNhbWUgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICAgIGFsbERlcHNPdXRwdXREaXJzLmFkZChcbiAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgIG1vZHVsZS5vdXRwdXREaXJlY3RvcnksXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhbmd1YWdlU3ViZGlyZWN0b3J5ID8gdGhpcy50YXJnZXROYW1lIDogJycsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2FsUmVwb3MgPSBBcnJheS5mcm9tKGFsbERlcHNPdXRwdXREaXJzKTtcblxuICAgIC8vIGlmIGphdmEtcnVudGltZSBpcyBjaGVja2VkLW91dCBhbmQgd2UgY2FuIGZpbmQgYSBsb2NhbCByZXBvc2l0b3J5LFxuICAgIC8vIGFkZCBpdCB0byB0aGUgbGlzdC5cbiAgICBjb25zdCBsb2NhbEphdmFSdW50aW1lID0gYXdhaXQgZmluZEphdmFSdW50aW1lTG9jYWxSZXBvc2l0b3J5KCk7XG4gICAgaWYgKGxvY2FsSmF2YVJ1bnRpbWUpIHtcbiAgICAgIGxvY2FsUmVwb3MucHVzaChsb2NhbEphdmFSdW50aW1lKTtcbiAgICB9XG5cbiAgICBsb2dnaW5nLmRlYnVnKCdsb2NhbCBtYXZlbiByZXBvczonLCBsb2NhbFJlcG9zKTtcblxuICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gJ2xvY2FsLWpzaWktbW9kdWxlcyc7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB4bWxidWlsZGVyXG4gICAgICAuY3JlYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICdAeG1sbnMnOiAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJyxcbiAgICAgICAgICAgICdAeG1sbnM6eHNpJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyxcbiAgICAgICAgICAgICdAeHNpOnNjaGVtYUxvY2F0aW9uJzpcbiAgICAgICAgICAgICAgJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1NFVFRJTkdTLzEuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2Qvc2V0dGluZ3MtMS4wLjAueHNkJyxcbiAgICAgICAgICAgICcjY29tbWVudCc6IFtcbiAgICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAvLyBEbyAqbm90KiBhdHRlbXB0IHRvIGFzayB0aGUgdXNlciBmb3Igc3R1ZmYuLi5cbiAgICAgICAgICAgIGludGVyYWN0aXZlTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBVc2UgYSBub24tZGVmYXVsdCBsb2NhbCByZXBvc2l0b3J5IHRvIGlzb2xhdGUgZnJvbSBjYWNoZWQgYXJ0aWZhY3RzLi4uXG4gICAgICAgICAgICBsb2NhbFJlcG9zaXRvcnk6IHBhdGgucmVzb2x2ZSh3aGVyZSwgJy5tMicsICdyZXBvc2l0b3J5JyksXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBsb2NhdGlvbnMgb2YgbG9jYWxseS1zb3VyY2VkIGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgcHJvZmlsZXM6IHtcbiAgICAgICAgICAgICAgcHJvZmlsZToge1xuICAgICAgICAgICAgICAgIGlkOiBwcm9maWxlTmFtZSxcbiAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXM6IHtcbiAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnk6IGxvY2FsUmVwb3MubWFwKChyZXBvKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcmVwby5yZXBsYWNlKC9bXFxcXC86XCI8Pnw/Kl0vZywgJyQnKSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBgZmlsZTovLyR7cmVwb31gLFxuICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aXZlUHJvZmlsZXM6IHtcbiAgICAgICAgICAgICAgYWN0aXZlUHJvZmlsZTogcHJvZmlsZU5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW5jb2Rpbmc6ICdVVEYtOCcgfSxcbiAgICAgIClcbiAgICAgIC5lbmQoeyBwcmV0dHk6IHRydWUgfSk7XG5cbiAgICBsb2dnaW5nLmRlYnVnKGBHZW5lcmF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIHNldHRpbmdzKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIG1ha2VUYXJnZXQobW9kdWxlOiBKc2lpTW9kdWxlLCBvcHRpb25zOiBCdWlsZE9wdGlvbnMpOiBUYXJnZXQge1xuICAgIHJldHVybiBuZXcgSmF2YSh7XG4gICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICBwYWNrYWdlRGlyOiBtb2R1bGUubW9kdWxlRGlyZWN0b3J5LFxuICAgICAgYXNzZW1ibHk6IG1vZHVsZS5hc3NlbWJseSxcbiAgICAgIGZpbmdlcnByaW50OiBvcHRpb25zLmZpbmdlcnByaW50LFxuICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2UsXG4gICAgICBhcmd1bWVudHM6IG9wdGlvbnMuYXJndW1lbnRzLFxuICAgICAgcm9zZXR0YTogb3B0aW9ucy5yb3NldHRhLFxuICAgIH0pO1xuICB9XG59XG5cbmludGVyZmFjZSBUZW1wb3JhcnlKYXZhUGFja2FnZSB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc291cmNlcyBhcmUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdClcbiAgICovXG4gIHJlbGF0aXZlU291cmNlRGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBhcnRpZmFjdHMgd2lsbCBiZSBzdG9yZWQgYWZ0ZXIgYnVpbGQgKHJlbGF0aXZlIHRvIGJ1aWxkIGRpcilcbiAgICovXG4gIHJlbGF0aXZlQXJ0aWZhY3RzRGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBhcnRpZmFjdHMgb3VnaHQgdG8gZ28gZm9yIHRoaXMgcGFydGljdWxhciBtb2R1bGVcbiAgICovXG4gIG91dHB1dFRhcmdldERpcmVjdG9yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgc3ViZGlyZWN0b3J5IG9mIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIHRoZSBhcnRpZmFjdHMgZm9yIHRoaXMgcGFydGljdWxhciBwYWNrYWdlIGFyZSBwcm9kdWNlZFxuICovXG5mdW5jdGlvbiBtb2R1bGVBcnRpZmFjdHNTdWJkaXIobW9kdWxlOiBKc2lpTW9kdWxlKSB7XG4gIGNvbnN0IGdyb3VwSWQgPSBtb2R1bGUuYXNzZW1ibHkudGFyZ2V0cyEuamF2YSEubWF2ZW4uZ3JvdXBJZDtcbiAgY29uc3QgYXJ0aWZhY3RJZCA9IG1vZHVsZS5hc3NlbWJseS50YXJnZXRzIS5qYXZhIS5tYXZlbi5hcnRpZmFjdElkO1xuICByZXR1cm4gYCR7Z3JvdXBJZC5yZXBsYWNlKC9cXC4vZywgJy8nKX0vJHthcnRpZmFjdElkfWA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmEgZXh0ZW5kcyBUYXJnZXQge1xuICBwdWJsaWMgc3RhdGljIHRvUGFja2FnZUluZm9zKGFzc206IHNwZWMuQXNzZW1ibHkpOiB7XG4gICAgW2xhbmd1YWdlOiBzdHJpbmddOiBQYWNrYWdlSW5mbztcbiAgfSB7XG4gICAgY29uc3QgZ3JvdXBJZCA9IGFzc20udGFyZ2V0cyEuamF2YSEubWF2ZW4uZ3JvdXBJZDtcbiAgICBjb25zdCBhcnRpZmFjdElkID0gYXNzbS50YXJnZXRzIS5qYXZhIS5tYXZlbi5hcnRpZmFjdElkO1xuICAgIGNvbnN0IHJlbGVhc2VWZXJzaW9uID0gdG9SZWxlYXNlVmVyc2lvbihhc3NtLnZlcnNpb24sIFRhcmdldE5hbWUuSkFWQSk7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi8ke2dyb3VwSWQucmVwbGFjZShcbiAgICAgIC9cXC4vZyxcbiAgICAgICcvJyxcbiAgICApfS8ke2FydGlmYWN0SWR9LyR7YXNzbS52ZXJzaW9ufS9gO1xuICAgIHJldHVybiB7XG4gICAgICBqYXZhOiB7XG4gICAgICAgIHJlcG9zaXRvcnk6ICdNYXZlbiBDZW50cmFsJyxcbiAgICAgICAgdXJsLFxuICAgICAgICB1c2FnZToge1xuICAgICAgICAgICdBcGFjaGUgTWF2ZW4nOiB7XG4gICAgICAgICAgICBsYW5ndWFnZTogJ3htbCcsXG4gICAgICAgICAgICBjb2RlOiB4bWxidWlsZGVyXG4gICAgICAgICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3k6IHsgZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgdmVyc2lvbjogcmVsZWFzZVZlcnNpb24gfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAucmVwbGFjZSgvPFxcP1xccyp4bWwoXFxzW14+XSspPz5cXHMqL20sICcnKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICdBcGFjaGUgQnVpbGRyJzogYCcke2dyb3VwSWR9OiR7YXJ0aWZhY3RJZH06amFyOiR7cmVsZWFzZVZlcnNpb259J2AsXG4gICAgICAgICAgJ0FwYWNoZSBJdnknOiB7XG4gICAgICAgICAgICBsYW5ndWFnZTogJ3htbCcsXG4gICAgICAgICAgICBjb2RlOiB4bWxidWlsZGVyXG4gICAgICAgICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3k6IHtcbiAgICAgICAgICAgICAgICAgICdAZ3JvdXBJZCc6IGdyb3VwSWQsXG4gICAgICAgICAgICAgICAgICAnQG5hbWUnOiBhcnRpZmFjdElkLFxuICAgICAgICAgICAgICAgICAgJ0ByZXYnOiByZWxlYXNlVmVyc2lvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZW5kKHsgcHJldHR5OiB0cnVlIH0pXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC88XFw/XFxzKnhtbChcXHNbXj5dKyk/PlxccyovbSwgJycpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ0dyb292eSBHcmFwZSc6IGBAR3JhcGVzKFxcbkBHcmFiKGdyb3VwPScke2dyb3VwSWR9JywgbW9kdWxlPScke2FydGlmYWN0SWR9JywgdmVyc2lvbj0nJHtyZWxlYXNlVmVyc2lvbn0nKVxcbilgLFxuICAgICAgICAgICdHcmFkbGUgLyBHcmFpbHMnOiBgY29tcGlsZSAnJHtncm91cElkfToke2FydGlmYWN0SWR9OiR7cmVsZWFzZVZlcnNpb259J2AsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvTmF0aXZlUmVmZXJlbmNlKHR5cGU6IHNwZWMuVHlwZSwgb3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgWywgLi4ubmFtZV0gPSB0eXBlLmZxbi5zcGxpdCgnLicpO1xuICAgIHJldHVybiB7IGphdmE6IGBpbXBvcnQgJHtbb3B0aW9ucy5wYWNrYWdlLCAuLi5uYW1lXS5qb2luKCcuJyl9O2AgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBnZW5lcmF0b3I6IEphdmFHZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IEphdmFHZW5lcmF0b3Iob3B0aW9ucy5yb3NldHRhKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZChzb3VyY2VEaXI6IHN0cmluZywgb3V0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgZmlsZTovLyR7b3V0RGlyfWA7XG4gICAgY29uc3QgbXZuQXJndW1lbnRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBPYmplY3Qua2V5cyh0aGlzLmFyZ3VtZW50cykpIHtcbiAgICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoJ212bi0nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG12bkFyZ3VtZW50cy5wdXNoKGAtLSR7YXJnLnNsaWNlKDQpfWApO1xuICAgICAgbXZuQXJndW1lbnRzLnB1c2godGhpcy5hcmd1bWVudHNbYXJnXS50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzaGVsbChcbiAgICAgICdtdm4nLFxuICAgICAgW1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBydW4gaW4gdmVyYm9zZSBtb2RlLCB0dXJuIG9uIHF1aWV0IG1vZGVcbiAgICAgICAgLi4uKHRoaXMuYXJndW1lbnRzLnZlcmJvc2UgPyBbXSA6IFsnLS1xdWlldCddKSxcbiAgICAgICAgJy0tYmF0Y2gtbW9kZScsXG4gICAgICAgIC4uLm12bkFyZ3VtZW50cyxcbiAgICAgICAgJ2RlcGxveScsXG4gICAgICAgIGAtRD1hbHREZXBsb3ltZW50UmVwb3NpdG9yeT1sb2NhbDo6ZGVmYXVsdDo6JHt1cmx9YCxcbiAgICAgICAgJy0tc2V0dGluZ3M9dXNlci54bWwnLFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC8vIFR3aWRkbGUgdGhlIEpWTSBzZXR0aW5ncyBhIGxpdHRsZSBmb3IgTWF2ZW4uIERlbGF5aW5nIEpJVCBjb21waWxhdGlvblxuICAgICAgICAgIC8vIGJyaW5ncyBkb3duIE1hdmVuIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDEvM3JkICgxNS0+MTBzLCAzMC0+MjBzKVxuICAgICAgICAgIE1BVkVOX09QVFM6IGAke1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTUFWRU5fT1BUUyA/PyAnJ1xuICAgICAgICAgIH0gLVhYOitUaWVyZWRDb21waWxhdGlvbiAtWFg6VGllcmVkU3RvcEF0TGV2ZWw9MWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJldHJ5OiB7IG1heEF0dGVtcHRzOiA1IH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyAjIENPREUgR0VORVJBVE9SICNcbi8vICMjIyMjIyMjIyMjIyMjIyMjI1xuXG5jb25zdCBNT0RVTEVfQ0xBU1NfTkFNRSA9ICckTW9kdWxlJztcbmNvbnN0IElOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FID0gJ0pzaWkkUHJveHknO1xuY29uc3QgSU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRSA9ICdKc2lpJERlZmF1bHQnO1xuXG4vLyBTdHJ1Y3QgdGhhdCBzdG9yZXMgbWV0YWRhdGEgYWJvdXQgYSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkIGluIEphdmEgY29kZSBnZW5lcmF0aW9uLlxuaW50ZXJmYWNlIEphdmFQcm9wIHtcbiAgLy8gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIHByb3BlcnR5XG4gIGRvY3M/OiBzcGVjLkRvY3M7XG5cbiAgLy8gVGhlIG9yaWdpbmFsIEpTSUkgcHJvcGVydHkgc3BlYyB0aGlzIHN0cnVjdCB3YXMgZGVyaXZlZCBmcm9tXG4gIHNwZWM6IHNwZWMuUHJvcGVydHk7XG5cbiAgLy8gVGhlIG9yaWdpbmFsIEpTSUkgdHlwZSB0aGlzIHByb3BlcnR5IHdhcyBkZWZpbmVkIG9uXG4gIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlO1xuXG4gIC8vIENhbm9uaWNhbCBuYW1lIG9mIHRoZSBKYXZhIHByb3BlcnR5IChlZzogJ015UHJvcGVydHknKVxuICBwcm9wTmFtZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBvcmlnaW5hbCBjYW5vbmljYWwgbmFtZSBvZiB0aGUgSlNJSSBwcm9wZXJ0eVxuICBqc2lpTmFtZTogc3RyaW5nO1xuXG4gIC8vIEZpZWxkIG5hbWUgb2YgdGhlIEphdmEgcHJvcGVydHkgKGVnOiAnbXlQcm9wZXJ0eScpXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBqYXZhIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSAoZWc6ICdMaXN0PFN0cmluZz4nKVxuICBmaWVsZEphdmFUeXBlOiBzdHJpbmc7XG5cbiAgLy8gVGhlIGphdmEgdHlwZSBmb3IgdGhlIHBhcmFtZXRlciAoZS5nOiAnTGlzdDw/IGV4dGVuZHMgU29tZVR5cGU+JylcbiAgcGFyYW1KYXZhVHlwZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBOYXRpdmVUeXBlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9wZXJ0eSdzIHR5cGVcbiAgZmllbGROYXRpdmVUeXBlOiBzdHJpbmc7XG5cbiAgLy8gVGhlIHJhdyBjbGFzcyB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkIGZvciBtYXJzaGFsbGluZyAoZWc6ICdMaXN0LmNsYXNzJylcbiAgZmllbGRKYXZhQ2xhc3M6IHN0cmluZztcblxuICAvLyBMaXN0IG9mIHR5cGVzIHRoYXQgdGhlIHByb3BlcnR5IGlzIGFzc2lnbmFibGUgZnJvbS4gVXNlZCB0byBvdmVybG9hZCBzZXR0ZXJzLlxuICBqYXZhVHlwZXM6IHN0cmluZ1tdO1xuXG4gIC8vIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIG9wdGlvbmFsLlxuICBudWxsYWJsZTogYm9vbGVhbjtcblxuICAvLyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiB0cmFuc2l0aXZlbHkgaW5oZXJpdGVkIGZyb20gYSBiYXNlIGNsYXNzLlxuICBpbmhlcml0ZWQ6IGJvb2xlYW47XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVhZC1vbmx5IG9uY2UgaW5pdGlhbGl6ZWQuXG4gIGltbXV0YWJsZTogYm9vbGVhbjtcbn1cblxuY2xhc3MgSmF2YUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIC8vIFdoZW4gdGhlIGNvZGUtZ2VuZXJhdG9yIG5lZWRzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcHJvcGVydHkgb3IgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBtZW1iZXIgb2YgdGhpcyBsaXN0LCB0aGUgbmFtZSB3aWxsXG4gIC8vIGJlIGF1dG9tYXRpY2FsbHkgbW9kaWZpZWQgdG8gYXZvaWQgY29tcGlsZSBlcnJvcnMuIE1vc3Qgb2YgdGhlc2UgYXJlIGphdmEgbGFuZ3VhZ2UgcmVzZXJ2ZWQga2V5d29yZHMuIEluIGFkZGl0aW9uIHRvIHRob3NlLCBhbnkga2V5d29yZHMgdGhhdFxuICAvLyBhcmUgbGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggYXV0by1nZW5lcmF0ZWQgbWV0aG9kcyBvciBwcm9wZXJ0aWVzIChlZzogJ2J1aWxkJykgYXJlIGFsc28gY29uc2lkZXJlZCByZXNlcnZlZC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVTRVJWRURfS0VZV09SRFMgPSBbXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAnYXNzZXJ0JyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ2JyZWFrJyxcbiAgICAnYnVpbGQnLFxuICAgICdieXRlJyxcbiAgICAnY2FzZScsXG4gICAgJ2NhdGNoJyxcbiAgICAnY2hhcicsXG4gICAgJ2NsYXNzJyxcbiAgICAnY29uc3QnLFxuICAgICdjb250aW51ZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkb3VibGUnLFxuICAgICdkbycsXG4gICAgJ2Vsc2UnLFxuICAgICdlbnVtJyxcbiAgICAnZXh0ZW5kcycsXG4gICAgJ2ZhbHNlJyxcbiAgICAnZmluYWwnLFxuICAgICdmaW5hbGx5JyxcbiAgICAnZmxvYXQnLFxuICAgICdmb3InLFxuICAgICdnb3RvJyxcbiAgICAnaWYnLFxuICAgICdpbXBsZW1lbnRzJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW5zdGFuY2VvZicsXG4gICAgJ2ludCcsXG4gICAgJ2ludGVyZmFjZScsXG4gICAgJ2xvbmcnLFxuICAgICduYXRpdmUnLFxuICAgICduZXcnLFxuICAgICdudWxsJyxcbiAgICAncGFja2FnZScsXG4gICAgJ3ByaXZhdGUnLFxuICAgICdwcm90ZWN0ZWQnLFxuICAgICdwdWJsaWMnLFxuICAgICdyZXR1cm4nLFxuICAgICdzaG9ydCcsXG4gICAgJ3N0YXRpYycsXG4gICAgJ3N0cmljdGZwJyxcbiAgICAnc3VwZXInLFxuICAgICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLFxuICAgICd0aGlzJyxcbiAgICAndGhyb3cnLFxuICAgICd0aHJvd3MnLFxuICAgICd0cmFuc2llbnQnLFxuICAgICd0cnVlJyxcbiAgICAndHJ5JyxcbiAgICAndm9pZCcsXG4gICAgJ3ZvbGF0aWxlJyxcbiAgICAnd2hpbGUnLFxuICBdO1xuXG4gIC8qKlxuICAgKiBUdXJucyBhIHJhdyBqYXZhc2NyaXB0IHByb3BlcnR5IG5hbWUgKGVnOiAnZGVmYXVsdCcpIGludG8gYSBzYWZlIEphdmEgcHJvcGVydHkgbmFtZSAoZWc6ICdkZWZhdWx0VmFsdWUnKS5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcmF3IEpTSUkgcHJvcGVydHkgTmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXByb3BlcnR5TmFtZSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICB9XG5cbiAgICBpZiAoSmF2YUdlbmVyYXRvci5SRVNFUlZFRF9LRVlXT1JEUy5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICByZXR1cm4gYCR7cHJvcGVydHlOYW1lfVZhbHVlYDtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJucyBhIHJhdyBqYXZhc2NyaXB0IG1ldGhvZCBuYW1lIChlZzogJ2ltcG9ydCcpIGludG8gYSBzYWZlIEphdmEgbWV0aG9kIG5hbWUgKGVnOiAnZG9JbXBvcnQnKS5cbiAgICogQHBhcmFtIG1ldGhvZE5hbWVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNhZmVKYXZhTWV0aG9kTmFtZShtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIW1ldGhvZE5hbWUpIHtcbiAgICAgIHJldHVybiBtZXRob2ROYW1lO1xuICAgIH1cblxuICAgIGlmIChKYXZhR2VuZXJhdG9yLlJFU0VSVkVEX0tFWVdPUkRTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XG4gICAgICByZXR1cm4gYGRvJHtqc2lpVG9QYXNjYWxDYXNlKG1ldGhvZE5hbWUpfWA7XG4gICAgfVxuICAgIHJldHVybiBtZXRob2ROYW1lO1xuICB9XG5cbiAgLyoqIElmIGZhbHNlLCBAR2VuZXJhdGVkIHdpbGwgbm90IGluY2x1ZGUgZ2VuZXJhdG9yIHZlcnNpb24gbm9yIHRpbWVzdGFtcCAqL1xuICBwcml2YXRlIGVtaXRGdWxsR2VuZXJhdG9ySW5mbz86IGJvb2xlYW47XG4gIHByaXZhdGUgbW9kdWxlQ2xhc3MhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIGFsbCB0aGUgbW9kdWxlcyBldmVyIHJlZmVyZW5jZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4gVGhlc2UgaW5jbHVkZVxuICAgKiBkaXJlY3QgZGVwZW5kZW5jaWVzIGJ1dCBjYW4gcG90ZW50aWFsbHkgYWxzbyBpbmNsdWRlIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLCB3aGVuLFxuICAgKiBmb3IgZXhhbXBsZSwgd2UgbmVlZCB0byByZWZlciB0byB0aGVpciB0eXBlcyB3aGVuIGZsYXR0aW5nIHRoZSBjbGFzcyBoaWVyYXJjaHkgZm9yXG4gICAqIGludGVyZmFjZSBwcm94aWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VkTW9kdWxlczoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBzcGVjLkFzc2VtYmx5Q29uZmlndXJhdGlvbjtcbiAgfSA9IHt9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvc2V0dGE6IFJvc2V0dGEpIHtcbiAgICBzdXBlcih7IGdlbmVyYXRlT3ZlcmxvYWRzRm9yTWV0aG9kV2l0aE9wdGlvbmFsczogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgZmluZ2VycHJpbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mbyA9IGZpbmdlcnByaW50O1xuICAgIHRoaXMubW9kdWxlQ2xhc3MgPSB0aGlzLmVtaXRNb2R1bGVGaWxlKGFzc20pO1xuXG4gICAgdGhpcy5lbWl0QXNzZW1ibHlQYWNrYWdlSW5mbyhhc3NtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIGZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5lbWl0TWF2ZW5Qb20oYXNzbSwgZmluZ2VycHJpbnQpO1xuICAgIGRlbGV0ZSB0aGlzLmVtaXRGdWxsR2VuZXJhdG9ySW5mbztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihtb2Q6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICBjb25zdCBkaXIgPSB0aGlzLnRvTmF0aXZlRnFuKG1vZC5uYW1lKS5yZXBsYWNlKC9cXC4vZywgJy8nKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKCdzcmMnLCAnbWFpbicsICdyZXNvdXJjZXMnLCBkaXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5DbGFzcyhjbHM6IHNwZWMuQ2xhc3NUeXBlLCBhYnN0cmFjdDogYm9vbGVhbikge1xuICAgIHRoaXMub3BlbkZpbGVJZk5lZWRlZChjbHMpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MoY2xzLCB7IGFwaTogJ3R5cGUnLCBmcW46IGNscy5mcW4gfSk7XG5cbiAgICBjb25zdCBjbGFzc0Jhc2UgPSB0aGlzLmdldENsYXNzQmFzZShjbHMpO1xuICAgIGNvbnN0IGV4dGVuZHNFeHByZXNzaW9uID0gY2xhc3NCYXNlID8gYCBleHRlbmRzICR7Y2xhc3NCYXNlfWAgOiAnJztcblxuICAgIGxldCBpbXBsZW1lbnRzRXhwciA9ICcnO1xuICAgIGlmIChjbHMuaW50ZXJmYWNlcz8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICBpbXBsZW1lbnRzRXhwciA9IGAgaW1wbGVtZW50cyAke2Nsc1xuICAgICAgICAuaW50ZXJmYWNlcyEubWFwKCh4KSA9PiB0aGlzLnRvTmF0aXZlRnFuKHgpKVxuICAgICAgICAuam9pbignLCAnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoY2xzKTtcbiAgICBjb25zdCBpbm5lciA9IG5lc3RlZCA/ICcgc3RhdGljJyA6ICcnO1xuICAgIGNvbnN0IGFic1ByZWZpeCA9IGFic3RyYWN0ID8gJyBhYnN0cmFjdCcgOiAnJztcblxuICAgIGlmICghbmVzdGVkKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2Nscy5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljJHtpbm5lcn0ke2Fic1ByZWZpeH0gY2xhc3MgJHtjbHMubmFtZX0ke2V4dGVuZHNFeHByZXNzaW9ufSR7aW1wbGVtZW50c0V4cHJ9YCxcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0SnNpaUluaXRpYWxpemVycyhjbHMpO1xuICAgIHRoaXMuZW1pdFN0YXRpY0luaXRpYWxpemVyKGNscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRDbGFzcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgaWYgKGNscy5hYnN0cmFjdCkge1xuICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKGNscy5mcW4pIGFzIHJlZmxlY3QuQ2xhc3NUeXBlO1xuICAgICAgdGhpcy5lbWl0UHJveHkodHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENsYXNzQnVpbGRlcihjbHMpO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jbG9zZUZpbGVJZk5lZWRlZChjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdGlhbGl6ZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLkluaXRpYWxpemVyKSB7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIC8vIElmIG5lZWRlZCwgcGF0Y2hpbmcgdXAgdGhlIGRvY3VtZW50YXRpb24gdG8gcG9pbnQgdXNlcnMgYXQgdGhlIGJ1aWxkZXIgcGF0dGVyblxuICAgIHRoaXMuYWRkSmF2YURvY3MobWV0aG9kLCB7IGFwaTogJ2luaXRpYWxpemVyJywgZnFuOiBjbHMuZnFuIH0pO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKG1ldGhvZCk7XG5cbiAgICAvLyBBYnN0cmFjdCBjbGFzc2VzIHNob3VsZCBoYXZlIHByb3RlY3RlZCBpbml0aWFsaXplcnNcbiAgICBjb25zdCBpbml0aWFsaXplckFjY2Vzc0xldmVsID0gY2xzLmFic3RyYWN0XG4gICAgICA/ICdwcm90ZWN0ZWQnXG4gICAgICA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgJHtpbml0aWFsaXplckFjY2Vzc0xldmVsfSAke2Nscy5uYW1lfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhcbiAgICAgICAgbWV0aG9kLFxuICAgICAgKX0pYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3N1cGVyKHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlLkpTSUkpOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpRW5naW5lLmdldEluc3RhbmNlKCkuY3JlYXRlTmV3T2JqZWN0KHRoaXMke3RoaXMucmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhcbiAgICAgICAgbWV0aG9kLFxuICAgICAgKX0pO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdGlhbGl6ZXJPdmVybG9hZChcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIG92ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxJbml0aWFsaXplcjogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMub25Jbml0aWFsaXplcihjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpZWxkKFxuICAgIF9jbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIF9wcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIF91bmlvbj86IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICAvKiBub29wICovXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wLmNvbnN0KSB7XG4gICAgICB0aGlzLmVtaXRDb25zdFByb3BlcnR5KGNscywgcHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdFByb3BlcnR5KGNscywgcHJvcCwgY2xzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2luY2Ugd2UgZXhwYW5kIHRoZSB1bmlvbiBzZXR0ZXJzLCB3ZSB3aWxsIHVzZSB0aGlzIGV2ZW50IHRvIG9ubHkgZW1pdCB0aGUgZ2V0dGVyIHdoaWNoIHJldHVybnMgYW4gT2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5lbWl0UHJvcGVydHkoY2xzLCBwcm9wLCBjbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICB0aGlzLmVtaXRNZXRob2QoY2xzLCBtZXRob2QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbk1ldGhvZChjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgdGhpcy5lbWl0TWV0aG9kKGNscywgbWV0aG9kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZE92ZXJsb2FkKFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRoaXMuZW1pdE1ldGhvZChjbHMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoZW5tKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKGVubSwgeyBhcGk6ICd0eXBlJywgZnFuOiBlbm0uZnFuIH0pO1xuICAgIGlmICghdGhpcy5pc05lc3RlZChlbm0pKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGVubSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWkobW9kdWxlID0gJHt0aGlzLm1vZHVsZUNsYXNzfS5jbGFzcywgZnFuID0gXCIke2VubS5mcW59XCIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyBlbnVtICR7ZW5tLm5hbWV9YCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRW5kRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoZW5tKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FbnVtTWVtYmVyKHBhcmVudFR5cGU6IHNwZWMuRW51bVR5cGUsIG1lbWJlcjogc3BlYy5FbnVtTWVtYmVyKSB7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZW1iZXIsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHBhcmVudFR5cGUuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogbWVtYmVyLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMobWVtYmVyKTtcbiAgICB0aGlzLmNvZGUubGluZShgJHttZW1iZXIubmFtZX0sYCk7XG4gIH1cblxuICAvKipcbiAgICogTmFtZXNwYWNlcyBhcmUgaGFuZGxlZCBpbXBsaWNpdGx5IGJ5IG9uQmVnaW5DbGFzcygpLlxuICAgKlxuICAgKiBPbmx5IGVtaXQgcGFja2FnZS1pbmZvIGluIGNhc2UgdGhpcyBpcyBhIHN1Ym1vZHVsZVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQmVnaW5OYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuYXNzZW1ibHkuc3VibW9kdWxlcz8uW25zXTtcbiAgICBpZiAoc3VibW9kdWxlKSB7XG4gICAgICB0aGlzLmVtaXRTdWJtb2R1bGVQYWNrYWdlSW5mbyh0aGlzLmFzc2VtYmx5LCBucyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKF9uczogc3RyaW5nKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5JbnRlcmZhY2UoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICB0aGlzLm9wZW5GaWxlSWZOZWVkZWQoaWZjKTtcbiAgICB0aGlzLmFkZEphdmFEb2NzKGlmYywgeyBhcGk6ICd0eXBlJywgZnFuOiBpZmMuZnFuIH0pO1xuXG4gICAgLy8gYWxsIGludGVyZmFjZXMgYWx3YXlzIGV4dGVuZCBKc2lpSW50ZXJmYWNlIHNvIHdlIGNhbiBpZGVudGlmeSB0aGF0IGl0IGlzIGEganNpaSBpbnRlcmZhY2UuXG4gICAgY29uc3QgaW50ZXJmYWNlcyA9IGlmYy5pbnRlcmZhY2VzID8/IFtdO1xuICAgIGNvbnN0IGJhc2VzID0gW1xuICAgICAgJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlTZXJpYWxpemFibGUnLFxuICAgICAgLi4uaW50ZXJmYWNlcy5tYXAoKHgpID0+IHRoaXMudG9OYXRpdmVGcW4oeCkpLFxuICAgIF0uam9pbignLCAnKTtcblxuICAgIGNvbnN0IG5lc3RlZCA9IHRoaXMuaXNOZXN0ZWQoaWZjKTtcbiAgICBjb25zdCBpbm5lciA9IG5lc3RlZCA/ICcgc3RhdGljJyA6ICcnO1xuICAgIGlmICghbmVzdGVkKSB7XG4gICAgICB0aGlzLmVtaXRHZW5lcmF0ZWRBbm5vdGF0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpKG1vZHVsZSA9ICR7dGhpcy5tb2R1bGVDbGFzc30uY2xhc3MsIGZxbiA9IFwiJHtpZmMuZnFufVwiKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBAc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaS5Qcm94eSgke2lmYy5uYW1lfS4ke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfS5jbGFzcylgLFxuICAgICk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoaWZjKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyR7aW5uZXJ9IGludGVyZmFjZSAke2lmYy5uYW1lfSBleHRlbmRzICR7YmFzZXN9YCxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgdGhpcy5lbWl0TXVsdGlwbHlJbmhlcml0ZWRPcHRpb25hbFByb3BlcnRpZXMoaWZjKTtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIHRoaXMuZW1pdERhdGFUeXBlKGlmYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnJlZmxlY3RBc3NlbWJseS5maW5kVHlwZShcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICkgYXMgcmVmbGVjdC5JbnRlcmZhY2VUeXBlO1xuXG4gICAgICB0aGlzLmVtaXRQcm94eSh0eXBlKTtcbiAgICAgIC8vIFdlIGRvbid0IGVtaXQgSnNpaSREZWZhdWx0IGlmIHRoZSBhc3NlbWJseSBvcHRlZCBvdXQgb2YgaXQgZXhwbGljaXRseS5cbiAgICAgIC8vIFRoaXMgaXMgbW9zdGx5IHRvIGZhY2lsaXRhdGUgY29tcGF0aWJpbGl0eSB0ZXN0aW5nLi4uXG4gICAgICBpZiAoaGFzRGVmYXVsdEludGVyZmFjZXModGhpcy5yZWZsZWN0QXNzZW1ibHkpKSB7XG4gICAgICAgIHRoaXMuZW1pdERlZmF1bHRJbXBsZW1lbnRhdGlvbih0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY2xvc2VGaWxlSWZOZWVkZWQoaWZjKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGhvZC5yZXR1cm5zXG4gICAgICA/IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShtZXRob2QucmV0dXJucylcbiAgICAgIDogJ3ZvaWQnO1xuICAgIHRoaXMuYWRkSmF2YURvY3MobWV0aG9kLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogbWV0aG9kLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMobWV0aG9kKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAke3JldHVyblR5cGV9ICR7bWV0aG9kLm5hbWV9KCR7dGhpcy5yZW5kZXJNZXRob2RQYXJhbWV0ZXJzKG1ldGhvZCl9KTtgLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2RPdmVybG9hZChcbiAgICBpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBvdmVybG9hZDogc3BlYy5NZXRob2QsXG4gICAgX29yaWdpbmFsTWV0aG9kOiBzcGVjLk1ldGhvZCxcbiAgKSB7XG4gICAgdGhpcy5vbkludGVyZmFjZU1ldGhvZChpZmMsIG92ZXJsb2FkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZVByb3BlcnR5KGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgY29uc3QgZ2V0dGVyVHlwZSA9IHRoaXMudG9EZWNvcmF0ZWRKYXZhVHlwZShwcm9wKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IGpzaWlUb1Bhc2NhbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgKTtcblxuICAgIC8vIGZvciB1bmlvbnMgd2Ugb25seSBnZW5lcmF0ZSBvdmVybG9hZHMgZm9yIHNldHRlcnMsIG5vdCBnZXR0ZXJzLlxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhwcm9wLCB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogcHJvcC5uYW1lLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKHByb3ApO1xuICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICBpZiAocHJvcC5vdmVycmlkZXMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgZGVmYXVsdCAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KClgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdyZXR1cm4gbnVsbDsnKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KCk7YCk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wLmltbXV0YWJsZSkge1xuICAgICAgY29uc3Qgc2V0dGVyVHlwZXMgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKHByb3ApO1xuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHNldHRlclR5cGVzKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgZnFuOiBpZmMuZnFuLFxuICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9wLm9wdGlvbmFsKSB7XG4gICAgICAgICAgaWYgKHByb3Aub3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAc29mdHdhcmUuYW1hem9uLmpzaWkuT3B0aW9uYWwnKTtcbiAgICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAgICAgYGRlZmF1bHQgdm9pZCBzZXQke3Byb3BOYW1lfShmaW5hbCAke3R5cGV9IHZhbHVlKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgICAgIGB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oXCIndm9pZCBcIiArIGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgXCIjc2V0JHtwcm9wTmFtZX0oJHt0eXBlfSknIGlzIG5vdCBpbXBsZW1lbnRlZCFcIik7YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYHZvaWQgc2V0JHtwcm9wTmFtZX0oZmluYWwgJHt0eXBlfSB2YWx1ZSk7YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBsb2NhbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tXG4gICAqIG11bHRpcGxlIGRpc3RpbmN0IHBhcmVudCB0eXBlcy4gVGhpcyByZW12b2VzIHRoZSBkZWZhdWx0IG1ldGhvZCBkaXNwYXRjaFxuICAgKiBhbWJpZ3VpdHkgdGhhdCB3b3VsZCBvdGhlcndpc2UgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBpZmMgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIHRvIGJlIHByb2Nlc3NlZC5cblxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjI1NlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TXVsdGlwbHlJbmhlcml0ZWRPcHRpb25hbFByb3BlcnRpZXMoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICBpZiAoaWZjLmludGVyZmFjZXMgPT0gbnVsbCB8fCBpZmMuaW50ZXJmYWNlcy5sZW5ndGggPD0gMSkge1xuICAgICAgLy8gTm90aGluZyB0byBkbyBpZiB3ZSBkb24ndCBoYXZlIHBhcmVudCBpbnRlcmZhY2VzLCBvciBpZiB3ZSBoYXZlIGV4YWN0bHkgb25lXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluaGVyaXRlZE9wdGlvbmFsUHJvcHMgPSBpZmMuaW50ZXJmYWNlc1xuICAgICAgLm1hcChhbGxPcHRpb25hbFByb3BzLmJpbmQodGhpcykpXG4gICAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgZGlyZWN0IHBhcmVudHMgYnJvdWdodCBhIGdpdmVuIG9wdGlvbmFsIHByb3BlcnR5XG4gICAgICAucmVkdWNlKChoaXN0b2dyYW0sIGVudHJ5KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJ5KSkge1xuICAgICAgICAgIGhpc3RvZ3JhbVtuYW1lXSA9IGhpc3RvZ3JhbVtuYW1lXSA/PyB7IHNwZWMsIGNvdW50OiAwIH07XG4gICAgICAgICAgaGlzdG9ncmFtW25hbWVdLmNvdW50ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHsgcmVhZG9ubHkgc3BlYzogc3BlYy5Qcm9wZXJ0eTsgY291bnQ6IG51bWJlciB9Pik7XG5cbiAgICBjb25zdCBsb2NhbFByb3BzID0gbmV3IFNldChpZmMucHJvcGVydGllcz8ubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpID8/IFtdKTtcbiAgICBmb3IgKGNvbnN0IHsgc3BlYywgY291bnQgfSBvZiBPYmplY3QudmFsdWVzKGluaGVyaXRlZE9wdGlvbmFsUHJvcHMpKSB7XG4gICAgICBpZiAoY291bnQgPCAyIHx8IGxvY2FsUHJvcHMuaGFzKHNwZWMubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLm9uSW50ZXJmYWNlUHJvcGVydHkoaWZjLCBzcGVjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhbGxPcHRpb25hbFByb3BzKHRoaXM6IEphdmFHZW5lcmF0b3IsIGZxbjogc3RyaW5nKSB7XG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5maW5kVHlwZShmcW4pIGFzIHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3BlYy5Qcm9wZXJ0eT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0eXBlLnByb3BlcnRpZXMgPz8gW10pIHtcbiAgICAgICAgLy8gQWRkaW5nIGFydGlmaWNhbCBcIm92ZXJyaWRlc1wiIGhlcmUgZm9yIGNvZGUtZ2VuIHF1YWxpdHkncyBzYWtlLlxuICAgICAgICByZXN1bHRbcHJvcC5uYW1lXSA9IHsgLi4ucHJvcCwgb3ZlcnJpZGVzOiB0eXBlLmZxbiB9O1xuICAgICAgfVxuICAgICAgLy8gSW5jbHVkZSBvcHRpb25hbCBwcm9wZXJ0aWVzIG9mIGFsbCBzdXBlciBpbnRlcmZhY2VzIGluIHRoZSByZXN1bHRcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0eXBlLmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgcHJvcF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgYWxsT3B0aW9uYWxQcm9wcy5jYWxsKHRoaXMsIGJhc2UpLFxuICAgICAgICApKSB7XG4gICAgICAgICAgaWYgKCEobmFtZSBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBwcm9wO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBc3NlbWJseVBhY2thZ2VJbmZvKG1vZDogc3BlYy5Bc3NlbWJseSkge1xuICAgIGlmICghbW9kLmRvY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lIH0gPSB0aGlzLnRvTmF0aXZlTmFtZShtb2QpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgoXG4gICAgICBtb2QsXG4gICAgICBgJHttb2QubmFtZX0ucGFja2FnZS1pbmZvYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBpZiAobW9kLnJlYWRtZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtb2QucmVhZG1lLm1hcmtkb3duLCB7XG4gICAgICAgICAgYXBpOiAnbW9kdWxlUmVhZG1lJyxcbiAgICAgICAgICBtb2R1bGVGcW46IG1vZC5uYW1lLFxuICAgICAgICB9KSxcbiAgICAgICkuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2xpbmUucmVwbGFjZSgvXFwqXFwvL2csICcqe0BsaXRlcmFsIC99Jyl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2QuZG9jcy5kZXByZWNhdGVkKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnIConKTtcbiAgICAgIC8vIEphdmFjIHdvbid0IGFsbG93IEBkZXByZWNhdGVkIG9uIHBhY2thZ2VzLCB3aGlsZSBARGVwcmVjYXRlZCBpcyBhYWFhYnNvbHV0ZWx5IGZpbmUuIER1aC5cbiAgICAgIHRoaXMuY29kZS5saW5lKGAgKiBEZXByZWNhdGVkOiAke21vZC5kb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtb2QpO1xuICAgIHRoaXMuY29kZS5saW5lKGBwYWNrYWdlICR7cGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUocGFja2FnZUluZm9GaWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN1Ym1vZHVsZVBhY2thZ2VJbmZvKGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5LCBtb2R1bGVGcW46IHN0cmluZykge1xuICAgIGNvbnN0IG1vZCA9IGFzc2VtYmx5LnN1Ym1vZHVsZXM/Llttb2R1bGVGcW5dO1xuICAgIGlmICghbW9kPy5yZWFkbWU/Lm1hcmtkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSB9ID0gdHJhbnNsYXRlRnFuKGFzc2VtYmx5LCBtb2R1bGVGcW4pO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgoXG4gICAgICBhc3NlbWJseSxcbiAgICAgIGAke21vZHVsZUZxbn0ucGFja2FnZS1pbmZvYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuRmlsZShwYWNrYWdlSW5mb0ZpbGUpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICBpZiAobW9kLnJlYWRtZSkge1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG1hcmtEb3duVG9KYXZhRG9jKFxuICAgICAgICB0aGlzLmNvbnZlcnRTYW1wbGVzSW5NYXJrZG93bihtb2QucmVhZG1lLm1hcmtkb3duLCB7XG4gICAgICAgICAgYXBpOiAnbW9kdWxlUmVhZG1lJyxcbiAgICAgICAgICBtb2R1bGVGcW4sXG4gICAgICAgIH0pLFxuICAgICAgKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqICR7bGluZS5yZXBsYWNlKC9cXCpcXC8vZywgJyp7QGxpdGVyYWwgL30nKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5saW5lKGBwYWNrYWdlICR7cGFja2FnZU5hbWV9O2ApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUocGFja2FnZUluZm9GaWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1hdmVuUG9tKGFzc206IHNwZWMuQXNzZW1ibHksIGZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgaWYgKCFhc3NtLnRhcmdldHM/LmphdmEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZW1ibHkgJHthc3NtLm5hbWV9IGRvZXMgbm90IGRlY2xhcmUgYSBqYXZhIHRhcmdldGApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1lbnQgPSBmaW5nZXJwcmludFxuICAgICAgPyB7XG4gICAgICAgICAgJyNjb21tZW50JzogW1xuICAgICAgICAgICAgYEdlbmVyYXRlZCBieSBqc2lpLXBhY21ha0Ake1ZFUlNJT05fREVTQ30gb24gJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIGBAanNpaS1wYWNtYWs6bWV0YUAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLm1ldGFkYXRhKX1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgIDoge307XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUoJ3BvbS54bWwnKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIHhtbGJ1aWxkZXJcbiAgICAgICAgLmNyZWF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm9qZWN0OiB7XG4gICAgICAgICAgICAgICdAeG1sbnMnOiAnaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJyxcbiAgICAgICAgICAgICAgJ0B4bWxuczp4c2knOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLFxuICAgICAgICAgICAgICAnQHhzaTpzY2hlbWFMb2NhdGlvbic6XG4gICAgICAgICAgICAgICAgJ2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkJyxcblxuICAgICAgICAgICAgICAuLi5jb21tZW50LFxuXG4gICAgICAgICAgICAgIG1vZGVsVmVyc2lvbjogJzQuMC4wJyxcbiAgICAgICAgICAgICAgbmFtZTogJyR7cHJvamVjdC5ncm91cElkfToke3Byb2plY3QuYXJ0aWZhY3RJZH0nLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYXNzbS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdXJsOiBhc3NtLmhvbWVwYWdlLFxuXG4gICAgICAgICAgICAgIGxpY2Vuc2VzOiB7XG4gICAgICAgICAgICAgICAgbGljZW5zZTogZ2V0TGljZW5zZSgpLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGRldmVsb3BlcnM6IHtcbiAgICAgICAgICAgICAgICBkZXZlbG9wZXI6IG1hdmVuRGV2ZWxvcGVycygpLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIHNjbToge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IGBzY206JHthc3NtLnJlcG9zaXRvcnkudHlwZX06JHthc3NtLnJlcG9zaXRvcnkudXJsfWAsXG4gICAgICAgICAgICAgICAgdXJsOiBhc3NtLnJlcG9zaXRvcnkudXJsLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGdyb3VwSWQ6IGFzc20udGFyZ2V0cy5qYXZhLm1hdmVuLmdyb3VwSWQsXG4gICAgICAgICAgICAgIGFydGlmYWN0SWQ6IGFzc20udGFyZ2V0cy5qYXZhLm1hdmVuLmFydGlmYWN0SWQsXG4gICAgICAgICAgICAgIHZlcnNpb246IG1ha2VWZXJzaW9uKFxuICAgICAgICAgICAgICAgIGFzc20udmVyc2lvbixcbiAgICAgICAgICAgICAgICBhc3NtLnRhcmdldHMuamF2YS5tYXZlbi52ZXJzaW9uU3VmZml4LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBwYWNrYWdpbmc6ICdqYXInLFxuXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHsgJ3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2RpbmcnOiAnVVRGLTgnIH0sXG5cbiAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB7IGRlcGVuZGVuY3k6IG1hdmVuRGVwZW5kZW5jaWVzLmNhbGwodGhpcykgfSxcblxuICAgICAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgICAgICAgIHBsdWdpbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucycsXG4gICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZDogJ21hdmVuLWNvbXBpbGVyLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuOC4xJyxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7IHNvdXJjZTogJzEuOCcsIHRhcmdldDogJzEuOCcgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1qYXItcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMy4yLjAnLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tc291cmNlLXBsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzMuMi4xJyxcbiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdhdHRhY2gtc291cmNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWxzOiB7IGdvYWw6ICdqYXInIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBncm91cElkOiAnb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAnbWF2ZW4tamF2YWRvYy1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjIuMCcsXG4gICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYXR0YWNoLWphdmFkb2NzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IHsgZ29hbDogJ2phcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsT25FcnJvcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93OiAncHJvdGVjdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVFeGNsdWRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdWRpbmcgdGhlICRNb2R1bGUgY2xhc3NlcyBzbyB0aGV5IHdvbid0IHBvbGx1dGUgdGhlIGRvY3NpdGUuIFRoZXkgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhbGwgY29sbGVjdGVkIGF0IHRoZSB0b3Agb2YgdGhlIGNsYXNzbGlzdCwgYnVycnlpbmcgdXNlZnVsIGluZm9ybWF0aW9uIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbG90IG9mIGRyeSBzY3JvbGxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKiovJE1vZHVsZS5qYXZhJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZXNlIG1ha2VzIEphdmFEb2MgZ2VuZXJhdGlvbiBhYm91dCBhIDNyZCBmYXN0ZXIgKHdoaWNoIGlzIGZhciBhbmQgYXdheSB0aGUgbW9zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZW5zaXZlIHBhcnQgb2YgdGhlIGJ1aWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEpPcHRpb246IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJy1KLVhYOitUaWVyZWRDb21waWxhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICctSi1YWDpUaWVyZWRTdG9wQXRMZXZlbD0xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6ICdvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SWQ6ICdtYXZlbi1lbmZvcmNlci1wbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjAuMC1NMycsXG4gICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnZW5mb3JjZS1tYXZlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdvYWxzOiB7IGdvYWw6ICdlbmZvcmNlJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVNYXZlblZlcnNpb246IHsgdmVyc2lvbjogJzMuNicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogJ29yZy5jb2RlaGF1cy5tb2pvJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkOiAndmVyc2lvbnMtbWF2ZW4tcGx1Z2luJyxcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMi44LjEnLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmFja3VwUG9tczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGVuY29kaW5nOiAnVVRGLTgnIH0sXG4gICAgICAgIClcbiAgICAgICAgLmVuZCh7IHByZXR0eTogdHJ1ZSB9KSxcbiAgICApO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoJ3BvbS54bWwnKTtcblxuICAgIC8qKlxuICAgICAqIENvbWJpbmVzIGEgdmVyc2lvbiBudW1iZXIgd2l0aCBhbiBvcHRpb25hbCBzdWZmaXguIFRoZSBzdWZmaXgsIHdoZW4gcHJlc2VudCwgbXVzdCBiZWdpbiB3aXRoXG4gICAgICogJy0nIG9yICcuJywgYW5kIHdpbGwgYmUgY29uY2F0ZW5hdGVkIGFzLWlzIHRvIHRoZSB2ZXJzaW9uIG51bWJlci4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXJcbiAgICAgKiBAcGFyYW0gc3VmZml4ICB0aGUgc3VmZml4LCBpZiBhbnkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFrZVZlcnNpb24odmVyc2lvbjogc3RyaW5nLCBzdWZmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgaWYgKCFzdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRvUmVsZWFzZVZlcnNpb24odmVyc2lvbiwgVGFyZ2V0TmFtZS5KQVZBKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3VmZml4LnN0YXJ0c1dpdGgoJy0nKSAmJiAhc3VmZml4LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZlcnNpb25TdWZmaXggbXVzdCBzdGFydCB3aXRoICctJyBvciAnLicsIGJ1dCByZWNlaXZlZCAke3N1ZmZpeH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3ZlcnNpb259JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXZlbkRlcGVuZGVuY2llcyh0aGlzOiBKYXZhR2VuZXJhdG9yKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8TWF2ZW5EZXBlbmRlbmN5PigpO1xuICAgICAgZm9yIChjb25zdCBbZGVwTmFtZSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICAgKSkge1xuICAgICAgICBjb25zdCBkZXAgPSB0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY3lDbG9zdXJlPy5bZGVwTmFtZV07XG4gICAgICAgIGlmICghZGVwPy50YXJnZXRzPy5qYXZhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFzc2VtYmx5ICR7YXNzbS5uYW1lfSBkZXBlbmRzIG9uICR7ZGVwTmFtZX0sIHdoaWNoIGRvZXMgbm90IGRlY2xhcmUgYSBqYXZhIHRhcmdldGAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgICAgZ3JvdXBJZDogZGVwLnRhcmdldHMuamF2YS5tYXZlbi5ncm91cElkLFxuICAgICAgICAgIGFydGlmYWN0SWQ6IGRlcC50YXJnZXRzLmphdmEubWF2ZW4uYXJ0aWZhY3RJZCxcbiAgICAgICAgICB2ZXJzaW9uOiB0b01hdmVuVmVyc2lvblJhbmdlKFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIGRlcC50YXJnZXRzLmphdmEubWF2ZW4udmVyc2lvblN1ZmZpeCxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBKU0lJIGphdmEgcnVudGltZSBiYXNlIGNsYXNzZXNcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHtcbiAgICAgICAgZ3JvdXBJZDogJ3NvZnR3YXJlLmFtYXpvbi5qc2lpJyxcbiAgICAgICAgYXJ0aWZhY3RJZDogJ2pzaWktcnVudGltZScsXG4gICAgICAgIHZlcnNpb246IHRvTWF2ZW5WZXJzaW9uUmFuZ2UoYF4ke1ZFUlNJT059YCksXG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZXMgQG9yZy5qZXRicmFpbnMuKlxuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgICBncm91cElkOiAnb3JnLmpldGJyYWlucycsXG4gICAgICAgIGFydGlmYWN0SWQ6ICdhbm5vdGF0aW9ucycsXG4gICAgICAgIHZlcnNpb246ICdbMTYuMC4zLDIwLjAuMCknLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGVzIEBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCBmb3IgSkRLcyA+PSA5XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh7XG4gICAgICAgICcjY29tbWVudCc6ICdQcm92aWRlcyBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQgZm9yIEpES3MgPj0gOScsXG4gICAgICAgIGdyb3VwSWQ6ICdqYXZheC5hbm5vdGF0aW9uJyxcbiAgICAgICAgYXJ0aWZhY3RJZDogJ2phdmF4LmFubm90YXRpb24tYXBpJyxcbiAgICAgICAgdmVyc2lvbjogJ1sxLjMuMiwxLjQuMCknLFxuICAgICAgICBzY29wZTogJ2NvbXBpbGUnLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF2ZW5EZXZlbG9wZXJzKCkge1xuICAgICAgcmV0dXJuIFthc3NtLmF1dGhvciwgLi4uKGFzc20uY29udHJpYnV0b3JzID8/IFtdKV0ubWFwKHRvRGV2ZWxvcGVyKTtcblxuICAgICAgZnVuY3Rpb24gdG9EZXZlbG9wZXIocGVyc29uOiBzcGVjLlBlcnNvbikge1xuICAgICAgICBjb25zdCBkZXZlbG9wZXI6IGFueSA9IHtcbiAgICAgICAgICBbcGVyc29uLm9yZ2FuaXphdGlvbiA/ICdvcmdhbml6YXRpb24nIDogJ25hbWUnXTogcGVyc29uLm5hbWUsXG4gICAgICAgICAgcm9sZXM6IHsgcm9sZTogcGVyc29uLnJvbGVzIH0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFdlIGNhbm5vdCBzZXQgXCJ1bmRlZmluZWRcIiBvciBcIm51bGxcIiB0byBhIGZpZWxkIC0gdGhpcyBjYXVzZXMgaW52YWxpZCBYTUwgdG8gYmUgZW1pdHRlZCAocGVyIFBPTSBzY2hlbWEpLlxuICAgICAgICBpZiAocGVyc29uLmVtYWlsKSB7XG4gICAgICAgICAgZGV2ZWxvcGVyLmVtYWlsID0gcGVyc29uLmVtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJzb24udXJsKSB7XG4gICAgICAgICAgZGV2ZWxvcGVyW3BlcnNvbi5vcmdhbml6YXRpb24gPyAnb3JnYW5pemF0aW9uVXJsJyA6ICd1cmwnXSA9XG4gICAgICAgICAgICBwZXJzb24udXJsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXZlbG9wZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXZlbi1zdHlsZSBsaWNlbnNlIGJsb2NrIGZvciBhIHRoZSBhc3NlbWJseS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9wb20uaHRtbCNMaWNlbnNlc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldExpY2Vuc2UoKSB7XG4gICAgICBjb25zdCBzcGR4ID0gc3BkeExpY2Vuc2VMaXN0W2Fzc20ubGljZW5zZV07XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzcGR4ICYmIHtcbiAgICAgICAgICBuYW1lOiBzcGR4Lm5hbWUsXG4gICAgICAgICAgdXJsOiBzcGR4LnVybCxcbiAgICAgICAgICBkaXN0cmlidXRpb246ICdyZXBvJyxcbiAgICAgICAgICBjb21tZW50czogc3BkeC5vc2lBcHByb3ZlZCA/ICdBbiBPU0ktYXBwcm92ZWQgbGljZW5zZScgOiB1bmRlZmluZWQsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGljSW5pdGlhbGl6ZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIGNvbnN0IGNvbnN0cyA9IChjbHMucHJvcGVydGllcyA/PyBbXSkuZmlsdGVyKCh4KSA9PiB4LmNvbnN0KTtcbiAgICBpZiAoY29uc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGphdmFDbGFzcyA9IHRoaXMudG9KYXZhVHlwZShjbHMpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdzdGF0aWMnKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBjb25zdHMpIHtcbiAgICAgIGNvbnN0IGNvbnN0TmFtZSA9IHRoaXMucmVuZGVyQ29uc3ROYW1lKHByb3ApO1xuICAgICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnRvTmF0aXZlVHlwZShwcm9wLnR5cGUsIHsgZm9yTWFyc2hhbGxpbmc6IHRydWUgfSk7XG4gICAgICBjb25zdCBzdGF0ZW1lbnQgPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljR2V0KCR7amF2YUNsYXNzfS5jbGFzcywgXCIke3Byb3AubmFtZX1cIiwgJHtwcm9wVHlwZX0pYDtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgJHtjb25zdE5hbWV9ID0gJHt0aGlzLndyYXBDb2xsZWN0aW9uKFxuICAgICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgICBwcm9wLnR5cGUsXG4gICAgICAgICAgcHJvcC5vcHRpb25hbCxcbiAgICAgICAgKX07YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29uc3ROYW1lKHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5jb2RlLnRvU25ha2VDYXNlKHByb3AubmFtZSkudG9Mb2NhbGVVcHBlckNhc2UoKTsgLy8gamF2YSBjb25zdHMgYXJlIFNOQUtFX1VQUEVSX0NBU0VcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0UHJvcGVydHkocGFyZW50VHlwZTogc3BlYy5UeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgY29uc3QgcHJvcFR5cGUgPSB0aGlzLnRvSmF2YVR5cGUocHJvcC50eXBlKTtcbiAgICBjb25zdCBwcm9wTmFtZSA9IHRoaXMucmVuZGVyQ29uc3ROYW1lKHByb3ApO1xuICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwocHJvcCk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogcGFyZW50VHlwZS5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCR7YWNjZXNzfSBmaW5hbCBzdGF0aWMgJHtwcm9wVHlwZX0gJHtwcm9wTmFtZX07YCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuVHlwZSxcbiAgICBwcm9wOiBzcGVjLlByb3BlcnR5LFxuICAgIGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICAgIHtcbiAgICAgIGRlZmF1bHRJbXBsID0gZmFsc2UsXG4gICAgICBmaW5hbCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZUdldHRlciA9IHRydWUsXG4gICAgICBvdmVycmlkZXMgPSAhIXByb3Aub3ZlcnJpZGVzLFxuICAgIH06IHtcbiAgICAgIGRlZmF1bHRJbXBsPzogYm9vbGVhbjtcbiAgICAgIGZpbmFsPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVHZXR0ZXI/OiBib29sZWFuO1xuICAgICAgb3ZlcnJpZGVzPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IGdldHRlclR5cGUgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUocHJvcCk7XG4gICAgY29uc3Qgc2V0dGVyVHlwZXMgPSB0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGVzKHByb3AsIHtcbiAgICAgIGNvdmFyaWFudDogcHJvcC5zdGF0aWMsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvcE5hbWUgPSBqc2lpVG9QYXNjYWxDYXNlKFxuICAgICAgSmF2YUdlbmVyYXRvci5zYWZlSmF2YVByb3BlcnR5TmFtZShwcm9wLm5hbWUpLFxuICAgICk7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSBbZGVmYXVsdEltcGwgPyAnZGVmYXVsdCcgOiB0aGlzLnJlbmRlckFjY2Vzc0xldmVsKHByb3ApXTtcbiAgICBpZiAocHJvcC5zdGF0aWMpIG1vZGlmaWVycy5wdXNoKCdzdGF0aWMnKTtcbiAgICBpZiAocHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdhYnN0cmFjdCcpO1xuICAgIGlmIChmaW5hbCAmJiAhcHJvcC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdmaW5hbCcpO1xuXG4gICAgY29uc3QgamF2YUNsYXNzID0gdGhpcy50b0phdmFUeXBlKGNscyk7XG5cbiAgICAvLyBmb3IgdW5pb25zIHdlIG9ubHkgZ2VuZXJhdGUgb3ZlcmxvYWRzIGZvciBzZXR0ZXJzLCBub3QgZ2V0dGVycy5cbiAgICBpZiAoaW5jbHVkZUdldHRlcikge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIHRoaXMuYWRkSmF2YURvY3MocHJvcCwge1xuICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICBmcW46IGRlZmluaW5nVHlwZS5mcW4sXG4gICAgICAgIG1lbWJlck5hbWU6IHByb3AubmFtZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlcyAmJiAhcHJvcC5zdGF0aWMpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMocHJvcCk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBgJHttb2RpZmllcnMuam9pbignICcpfSAke2dldHRlclR5cGV9IGdldCR7cHJvcE5hbWV9KClgO1xuICAgICAgaWYgKHByb3AuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSB7XG4gICAgICAgIHRoaXMuY29kZS5saW5lKGAke3NpZ25hdHVyZX07YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKHNpZ25hdHVyZSk7XG4gICAgICAgIGxldCBzdGF0ZW1lbnQ7XG4gICAgICAgIGlmIChwcm9wLnN0YXRpYykge1xuICAgICAgICAgIHN0YXRlbWVudCA9IGBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LmpzaWlTdGF0aWNHZXQoJHt0aGlzLnRvSmF2YVR5cGUoXG4gICAgICAgICAgICBjbHMsXG4gICAgICAgICAgKX0uY2xhc3MsIGA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGVtZW50ID0gJ3NvZnR3YXJlLmFtYXpvbi5qc2lpLktlcm5lbC5nZXQodGhpcywgJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlbWVudCArPSBgXCIke3Byb3AubmFtZX1cIiwgJHt0aGlzLnRvTmF0aXZlVHlwZShwcm9wLnR5cGUsIHtcbiAgICAgICAgICBmb3JNYXJzaGFsbGluZzogdHJ1ZSxcbiAgICAgICAgfSl9KWA7XG5cbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHJldHVybiAke3RoaXMud3JhcENvbGxlY3Rpb24oc3RhdGVtZW50LCBwcm9wLnR5cGUsIHByb3Aub3B0aW9uYWwpfTtgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvcC5pbW11dGFibGUpIHtcbiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBzZXR0ZXJUeXBlcykge1xuICAgICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgICB0aGlzLmFkZEphdmFEb2NzKHByb3AsIHtcbiAgICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICAgIGZxbjogY2xzLmZxbixcbiAgICAgICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3ZlcnJpZGVzICYmICFwcm9wLnN0YXRpYykge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wKTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7bW9kaWZpZXJzLmpvaW4oXG4gICAgICAgICAgJyAnLFxuICAgICAgICApfSB2b2lkIHNldCR7cHJvcE5hbWV9KGZpbmFsICR7dHlwZX0gdmFsdWUpYDtcbiAgICAgICAgaWYgKHByb3AuYWJzdHJhY3QgJiYgIWRlZmF1bHRJbXBsKSB7XG4gICAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7c2lnbmF0dXJlfTtgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKHNpZ25hdHVyZSk7XG4gICAgICAgICAgbGV0IHN0YXRlbWVudCA9ICcnO1xuXG4gICAgICAgICAgaWYgKHByb3Auc3RhdGljKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuanNpaVN0YXRpY1NldCgke2phdmFDbGFzc30uY2xhc3MsIGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlbWVudCArPSAnc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLnNldCh0aGlzLCAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb3Aub3B0aW9uYWxcbiAgICAgICAgICAgID8gJ3ZhbHVlJ1xuICAgICAgICAgICAgOiBgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGwodmFsdWUsIFwiJHtwcm9wLm5hbWV9IGlzIHJlcXVpcmVkXCIpYDtcbiAgICAgICAgICBzdGF0ZW1lbnQgKz0gYFwiJHtwcm9wLm5hbWV9XCIsICR7dmFsdWV9KTtgO1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKHN0YXRlbWVudCk7XG4gICAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1ldGhvZChcbiAgICBjbHM6IHNwZWMuVHlwZSxcbiAgICBtZXRob2Q6IHNwZWMuTWV0aG9kLFxuICAgIHtcbiAgICAgIGRlZmF1bHRJbXBsID0gZmFsc2UsXG4gICAgICBmaW5hbCA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gISFtZXRob2Qub3ZlcnJpZGVzLFxuICAgIH06IHsgZGVmYXVsdEltcGw/OiBib29sZWFuOyBmaW5hbD86IGJvb2xlYW47IG92ZXJyaWRlcz86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0aG9kLnJldHVybnNcbiAgICAgID8gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlKG1ldGhvZC5yZXR1cm5zKVxuICAgICAgOiAndm9pZCc7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSBbXG4gICAgICBkZWZhdWx0SW1wbCA/ICdkZWZhdWx0JyA6IHRoaXMucmVuZGVyQWNjZXNzTGV2ZWwobWV0aG9kKSxcbiAgICBdO1xuICAgIGlmIChtZXRob2Quc3RhdGljKSBtb2RpZmllcnMucHVzaCgnc3RhdGljJyk7XG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIG1vZGlmaWVycy5wdXNoKCdhYnN0cmFjdCcpO1xuICAgIGlmIChmaW5hbCAmJiAhbWV0aG9kLmFic3RyYWN0ICYmICFkZWZhdWx0SW1wbCkgbW9kaWZpZXJzLnB1c2goJ2ZpbmFsJyk7XG5cbiAgICBjb25zdCBhc3luYyA9ICEhbWV0aG9kLmFzeW5jO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhTWV0aG9kTmFtZShtZXRob2QubmFtZSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7cmV0dXJuVHlwZX0gJHttZXRob2ROYW1lfSgke3RoaXMucmVuZGVyTWV0aG9kUGFyYW1ldGVycyhcbiAgICAgIG1ldGhvZCxcbiAgICApfSlgO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5hZGRKYXZhRG9jcyhtZXRob2QsIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IGNscy5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiBtZXRob2QubmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhtZXRob2QpO1xuICAgIGlmIChvdmVycmlkZXMgJiYgIW1ldGhvZC5zdGF0aWMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZC5hYnN0cmFjdCAmJiAhZGVmYXVsdEltcGwpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke21vZGlmaWVycy5qb2luKCcgJyl9ICR7c2lnbmF0dXJlfTtgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgJHttb2RpZmllcnMuam9pbignICcpfSAke3NpZ25hdHVyZX1gKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKHRoaXMucmVuZGVyTWV0aG9kQ2FsbChjbHMsIG1ldGhvZCwgYXN5bmMpKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdlIGFyZSBub3cgZ29pbmcgdG8gYnVpbGQgYSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcHJveHkgZm9yIHVudHlwZWRcbiAgICogamF2YXNjcmlwdCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiB3ZSB3YW50IGphdmEgY29kZSB0byBiZVxuICAgKiBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlbSwgc28gd2Ugd2lsbCBjcmVhdGUgYSBwcm94eSBjbGFzcyB3aGljaFxuICAgKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGFuZCBoYXMgdGhlIHNhbWUgbWV0aG9kcy5cbiAgICpcbiAgICogVGhlc2UgcHJveGllcyBhcmUgYWxzbyB1c2VkIHRvIGV4dGVuZCBhYnN0cmFjdCBjbGFzc2VzIHRvIGFsbG93IHRoZSBKU0lJXG4gICAqIGVuZ2luZSB0byBpbnN0YW50aWF0ZSBhbiBhYnN0cmFjdCBjbGFzcyBpbiBKYXZhLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UHJveHkodHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlIHwgcmVmbGVjdC5DbGFzc1R5cGUpIHtcbiAgICBjb25zdCBuYW1lID0gSU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUU7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBBIHByb3h5IGNsYXNzIHdoaWNoIHJlcHJlc2VudHMgYSBjb25jcmV0ZSBqYXZhc2NyaXB0IGluc3RhbmNlIG9mIHRoaXMgdHlwZS4nLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuXG4gICAgY29uc3QgYmFzZUludGVyZmFjZXMgPSB0aGlzLmRlZmF1bHRJbnRlcmZhY2VzRm9yKHR5cGUsIHtcbiAgICAgIGluY2x1ZGVUaGlzVHlwZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlVHlwZSgpICYmICFoYXNEZWZhdWx0SW50ZXJmYWNlcyh0eXBlLmFzc2VtYmx5KSkge1xuICAgICAgLy8gRXh0ZW5kIHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5IHNpbmNlIHRoaXMgbW9kdWxlIGRvZXMgbm90IGhhdmUgdGhlIEpzaWkkRGVmYXVsdFxuICAgICAgYmFzZUludGVyZmFjZXMucHVzaCh0aGlzLnRvTmF0aXZlRnFuKHR5cGUuZnFuKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VmZml4ID0gdHlwZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICAgPyBgZXh0ZW5kcyBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0IGltcGxlbWVudHMgJHtiYXNlSW50ZXJmYWNlcy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9YFxuICAgICAgOiBgZXh0ZW5kcyAke3RoaXMudG9OYXRpdmVGcW4odHlwZS5mcW4pfSR7XG4gICAgICAgICAgYmFzZUludGVyZmFjZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBgIGltcGxlbWVudHMgJHtiYXNlSW50ZXJmYWNlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgfWA7XG5cbiAgICBjb25zdCBtb2RpZmllcnMgPSB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpID8gJ2ZpbmFsJyA6ICdwcml2YXRlIHN0YXRpYyBmaW5hbCc7XG5cbiAgICB0aGlzLmNvZGUubGluZShBTk5fSU5URVJOQUwpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYCR7bW9kaWZpZXJzfSBjbGFzcyAke25hbWV9ICR7c3VmZml4fWApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7bmFtZX0oZmluYWwgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdFJlZiBvYmpSZWYpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihvYmpSZWYpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBlbWl0IGFsbCBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCByZWZsZWN0UHJvcCBvZiB0eXBlLmFsbFByb3BlcnRpZXMuZmlsdGVyKFxuICAgICAgKHByb3ApID0+XG4gICAgICAgIHByb3AuYWJzdHJhY3QgJiZcbiAgICAgICAgKHByb3AucGFyZW50VHlwZS5mcW4gPT09IHR5cGUuZnFuIHx8XG4gICAgICAgICAgcHJvcC5wYXJlbnRUeXBlLmlzQ2xhc3NUeXBlKCkgfHxcbiAgICAgICAgICAhaGFzRGVmYXVsdEludGVyZmFjZXMocHJvcC5hc3NlbWJseSkpLFxuICAgICkpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjbG9uZShyZWZsZWN0UHJvcC5zcGVjKTtcbiAgICAgIHByb3AuYWJzdHJhY3QgPSBmYWxzZTtcbiAgICAgIC8vIEVtaXR0aW5nIFwiZmluYWxcIiBzaW5jZSB0aGlzIGlzIGEgcHJveHkgYW5kIG5vdGhpbmcgd2lsbC9zaG91bGQgb3ZlcnJpZGUgdGhpc1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkodHlwZS5zcGVjLCBwcm9wLCByZWZsZWN0UHJvcC5kZWZpbmluZ1R5cGUuc3BlYywge1xuICAgICAgICBmaW5hbDogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZW1pdCBhbGwgdGhlIG1ldGhvZHNcbiAgICBmb3IgKGNvbnN0IHJlZmxlY3RNZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzLmZpbHRlcihcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5hYnN0cmFjdCAmJlxuICAgICAgICAobWV0aG9kLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgIG1ldGhvZC5wYXJlbnRUeXBlLmlzQ2xhc3NUeXBlKCkgfHxcbiAgICAgICAgICAhaGFzRGVmYXVsdEludGVyZmFjZXMobWV0aG9kLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gY2xvbmUocmVmbGVjdE1ldGhvZC5zcGVjKTtcbiAgICAgIG1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgLy8gRW1pdHRpbmcgXCJmaW5hbFwiIHNpbmNlIHRoaXMgaXMgYSBwcm94eSBhbmQgbm90aGluZyB3aWxsL3Nob3VsZCBvdmVycmlkZSB0aGlzXG4gICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBtZXRob2QsIHsgZmluYWw6IHRydWUsIG92ZXJyaWRlczogdHJ1ZSB9KTtcblxuICAgICAgZm9yIChjb25zdCBvdmVybG9hZGVkTWV0aG9kIG9mIHRoaXMuY3JlYXRlT3ZlcmxvYWRzRm9yT3B0aW9uYWxzKG1ldGhvZCkpIHtcbiAgICAgICAgb3ZlcmxvYWRlZE1ldGhvZC5hYnN0cmFjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBvdmVybG9hZGVkTWV0aG9kLCB7XG4gICAgICAgICAgZmluYWw6IHRydWUsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVmYXVsdEltcGxlbWVudGF0aW9uKHR5cGU6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSkge1xuICAgIGNvbnN0IGJhc2VJbnRlcmZhY2VzID0gW3R5cGUubmFtZSwgLi4udGhpcy5kZWZhdWx0SW50ZXJmYWNlc0Zvcih0eXBlKV07XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGAgKiBJbnRlcm5hbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgJHt0eXBlLm5hbWV9fS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBpbnRlcmZhY2UgJHtJTlRFUkZBQ0VfREVGQVVMVF9DTEFTU19OQU1FfSBleHRlbmRzICR7YmFzZUludGVyZmFjZXNcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHR5cGUuYWxsUHJvcGVydGllcy5maWx0ZXIoXG4gICAgICAocHJvcCkgPT5cbiAgICAgICAgcHJvcC5hYnN0cmFjdCAmJlxuICAgICAgICAvLyBPbmx5IGNoZWNraW5nIHRoZSBnZXR0ZXIgLSBqYXZhLmxhbmcuT2JqZWN0IGhhcyBubyBzZXR0ZXJzLlxuICAgICAgICAhaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUoYGdldCR7anNpaVRvUGFzY2FsQ2FzZShwcm9wLm5hbWUpfWApICYmXG4gICAgICAgIChwcm9wLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhwcm9wLmFzc2VtYmx5KSksXG4gICAgKSkge1xuICAgICAgdGhpcy5lbWl0UHJvcGVydHkodHlwZS5zcGVjLCBwcm9wZXJ0eS5zcGVjLCBwcm9wZXJ0eS5kZWZpbmluZ1R5cGUuc3BlYywge1xuICAgICAgICBkZWZhdWx0SW1wbDogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIHR5cGUuYWxsTWV0aG9kcy5maWx0ZXIoXG4gICAgICAobWV0aG9kKSA9PlxuICAgICAgICBtZXRob2QuYWJzdHJhY3QgJiZcbiAgICAgICAgIWlzSmF2YUxhbmdPYmplY3RNZXRob2ROYW1lKG1ldGhvZC5uYW1lKSAmJlxuICAgICAgICAobWV0aG9kLnBhcmVudFR5cGUuZnFuID09PSB0eXBlLmZxbiB8fFxuICAgICAgICAgICFoYXNEZWZhdWx0SW50ZXJmYWNlcyhtZXRob2QuYXNzZW1ibHkpKSxcbiAgICApKSB7XG4gICAgICB0aGlzLmVtaXRNZXRob2QodHlwZS5zcGVjLCBtZXRob2Quc3BlYywge1xuICAgICAgICBkZWZhdWx0SW1wbDogdHJ1ZSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0eXBlLmlzSW50ZXJmYWNlVHlwZSgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhlbnRpdHk6IHNwZWMuRG9jdW1lbnRhYmxlKSB7XG4gICAgaWYgKCFlbnRpdHkuZG9jcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZW50aXR5LmRvY3Muc3RhYmlsaXR5KSB7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYEBzb2Z0d2FyZS5hbWF6b24uanNpaS5TdGFiaWxpdHkoc29mdHdhcmUuYW1hem9uLmpzaWkuU3RhYmlsaXR5LkxldmVsLiR7X2xldmVsKFxuICAgICAgICAgIGVudGl0eS5kb2NzLnN0YWJpbGl0eSxcbiAgICAgICAgKX0pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGVudGl0eS5kb2NzLnN0YWJpbGl0eSA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fFxuICAgICAgZW50aXR5LmRvY3MuZGVwcmVjYXRlZFxuICAgICkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BEZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2xldmVsKHN0YWJpbGl0eTogc3BlYy5TdGFiaWxpdHkpOiBzdHJpbmcge1xuICAgICAgc3dpdGNoIChzdGFiaWxpdHkpIHtcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICAgIHJldHVybiAnRGVwcmVjYXRlZCc7XG4gICAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICAgIHJldHVybiAnRXhwZXJpbWVudGFsJztcbiAgICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHRlcm5hbDpcbiAgICAgICAgICAvLyBSZW5kZXJpbmcgJ0V4dGVybmFsJyBvdXQgYXMgcHVibGljbHkgdmlzaWJsZSBzdGF0ZSBpcyBjb25mdXNpbmcuIEFzIGZhclxuICAgICAgICAgIC8vIGFzIHVzZXJzIGFyZSBjb25jZXJuZWQgd2UganVzdCBhZHZlcnRpc2UgdGhpcyBhcyBzdGFibGUuXG4gICAgICAgICAgcmV0dXJuICdTdGFibGUnO1xuICAgICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgICByZXR1cm4gJ1N0YWJsZSc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHN0YWJpbGl0eTogJHtzdGFiaWxpdHkgYXMgYW55fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhUHJvcChcbiAgICBwcm9wZXJ0eTogc3BlYy5Qcm9wZXJ0eSxcbiAgICBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZSxcbiAgICBpbmhlcml0ZWQ6IGJvb2xlYW4sXG4gICk6IEphdmFQcm9wIHtcbiAgICBjb25zdCBzYWZlTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSk7XG4gICAgY29uc3QgcHJvcE5hbWUgPSBqc2lpVG9QYXNjYWxDYXNlKHNhZmVOYW1lKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb2NzOiBwcm9wZXJ0eS5kb2NzLFxuICAgICAgc3BlYzogcHJvcGVydHksXG4gICAgICBkZWZpbmluZ1R5cGUsXG4gICAgICBwcm9wTmFtZSxcbiAgICAgIGpzaWlOYW1lOiBwcm9wZXJ0eS5uYW1lLFxuICAgICAgbnVsbGFibGU6ICEhcHJvcGVydHkub3B0aW9uYWwsXG4gICAgICBmaWVsZE5hbWU6IHRoaXMuY29kZS50b0NhbWVsQ2FzZShzYWZlTmFtZSksXG4gICAgICBmaWVsZEphdmFUeXBlOiB0aGlzLnRvSmF2YVR5cGUocHJvcGVydHkudHlwZSksXG4gICAgICBwYXJhbUphdmFUeXBlOiB0aGlzLnRvSmF2YVR5cGUocHJvcGVydHkudHlwZSwgeyBjb3ZhcmlhbnQ6IHRydWUgfSksXG4gICAgICBmaWVsZE5hdGl2ZVR5cGU6IHRoaXMudG9OYXRpdmVUeXBlKHByb3BlcnR5LnR5cGUpLFxuICAgICAgZmllbGRKYXZhQ2xhc3M6IGAke3RoaXMudG9KYXZhVHlwZShwcm9wZXJ0eS50eXBlLCB7XG4gICAgICAgIGZvck1hcnNoYWxsaW5nOiB0cnVlLFxuICAgICAgfSl9LmNsYXNzYCxcbiAgICAgIGphdmFUeXBlczogdGhpcy50b0phdmFUeXBlcyhwcm9wZXJ0eS50eXBlLCB7IGNvdmFyaWFudDogdHJ1ZSB9KSxcbiAgICAgIGltbXV0YWJsZTogcHJvcGVydHkuaW1tdXRhYmxlID8/IGZhbHNlLFxuICAgICAgaW5oZXJpdGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRDbGFzc0J1aWxkZXIoY2xzOiBzcGVjLkNsYXNzVHlwZSkge1xuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlcmUgaXMgbm8gaW5pdGlhbGl6ZXIsIG9yIGlmIHRoZSBpbml0aWFsaXplciBpcyBwcm90ZWN0ZWQgb3IgdmFyaWFkaWNcbiAgICBpZiAoY2xzLmluaXRpYWxpemVyID09IG51bGwgfHwgY2xzLmluaXRpYWxpemVyLnByb3RlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBOb3QgcmVuZGVyaW5nIGlmIHRoZSBpbml0aWFsaXplciBoYXMgbm8gcGFyYW1ldGVyc1xuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIucGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlcmUgaXMgYSBuZXN0ZWQgXCJCdWlsZGVyXCIgY2xhc3NcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZmxlY3RBc3NlbWJseS50cnlGaW5kVHlwZShgJHtjbHMuZnFufS4ke0JVSUxERVJfQ0xBU1NfTkFNRX1gKSAhPVxuICAgICAgbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN0cnVjdCBwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yIChpZiBhbnkpXG4gICAgY29uc3QgZmlyc3RTdHJ1Y3QgPSBjbHMuaW5pdGlhbGl6ZXIucGFyYW1ldGVycy5maW5kKChwYXJhbSkgPT4ge1xuICAgICAgaWYgKCFzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHBhcmFtLnR5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LnRyeUZpbmRUeXBlKHBhcmFtLnR5cGUuZnFuKTtcbiAgICAgIHJldHVybiBwYXJhbVR5cGU/LmlzRGF0YVR5cGUoKTtcbiAgICB9KTtcblxuICAgIC8vIE5vdCByZW5kZXJpbmcgaWYgdGhlcmUgaXMgbm8gc3RydWN0IHBhcmFtZXRlclxuICAgIGlmIChmaXJzdFN0cnVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RydWN0VHlwZSA9IHRoaXMucmVmbGVjdEFzc2VtYmx5LmZpbmRUeXBlKFxuICAgICAgKGZpcnN0U3RydWN0LnR5cGUgYXMgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpLmZxbixcbiAgICApIGFzIHJlZmxlY3QuSW50ZXJmYWNlVHlwZTtcbiAgICBjb25zdCBzdHJ1Y3RQYXJhbU5hbWUgPSB0aGlzLmNvZGUudG9DYW1lbENhc2UoXG4gICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKGZpcnN0U3RydWN0Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3Qgc3RydWN0QnVpbGRlciA9IGAke3RoaXMudG9KYXZhVHlwZShcbiAgICAgIGZpcnN0U3RydWN0LnR5cGUsXG4gICAgKX0uJHtCVUlMREVSX0NMQVNTX05BTUV9YDtcblxuICAgIGNvbnN0IHBvc2l0aW9uYWxQYXJhbXMgPSBjbHMuaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1xuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZmlyc3RTdHJ1Y3QpXG4gICAgICAubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgcGFyYW0sXG4gICAgICAgIGZpZWxkTmFtZTogdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKFxuICAgICAgICAgIEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocGFyYW0ubmFtZSksXG4gICAgICAgICksXG4gICAgICAgIGphdmFUeXBlOiB0aGlzLnRvSmF2YVR5cGUocGFyYW0udHlwZSksXG4gICAgICB9KSk7XG5cbiAgICBjb25zdCBidWlsdFR5cGUgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCAqICR7c3RhYmlsaXR5UHJlZml4Rm9yKFxuICAgICAgICBjbHMuaW5pdGlhbGl6ZXIsXG4gICAgICApfUEgZmx1ZW50IGJ1aWxkZXIgZm9yIHtAbGluayAke2J1aWx0VHlwZX19LmAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgdGhpcy5lbWl0U3RhYmlsaXR5QW5ub3RhdGlvbnMoY2xzLmluaXRpYWxpemVyKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgJHtCVUlMREVSX0NMQVNTX05BTUV9IGltcGxlbWVudHMgc29mdHdhcmUuYW1hem9uLmpzaWkuQnVpbGRlcjwke2J1aWx0VHlwZX0+YCxcbiAgICApO1xuXG4gICAgLy8gU3RhdGljIGZhY3RvcnkgbWV0aG9kKHMpXG4gICAgZm9yIChjb25zdCBwYXJhbXMgb2YgY29tcHV0ZU92ZXJyaWRlcyhwb3NpdGlvbmFsUGFyYW1zKSkge1xuICAgICAgY29uc3QgZHVtbXlNZXRob2Q6IHNwZWMuTWV0aG9kID0ge1xuICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgc3RhYmlsaXR5OiBjbHMuaW5pdGlhbGl6ZXIuZG9jcz8uc3RhYmlsaXR5ID8/IGNscy5kb2NzPy5zdGFiaWxpdHksXG4gICAgICAgICAgcmV0dXJuczogYGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayAke0JVSUxERVJfQ0xBU1NfTkFNRX19LmAsXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6ICdjcmVhdGUnLFxuICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMubWFwKChwYXJhbSkgPT4gcGFyYW0ucGFyYW0pLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYWRkSmF2YURvY3MoZHVtbXlNZXRob2QsIHtcbiAgICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgICAgZnFuOiBjbHMuZnFuLFxuICAgICAgICBtZW1iZXJOYW1lOiBkdW1teU1ldGhvZC5uYW1lLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhjbHMuaW5pdGlhbGl6ZXIpO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyBzdGF0aWMgJHtCVUlMREVSX0NMQVNTX05BTUV9IGNyZWF0ZSgke3BhcmFtc1xuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgIGBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnLi4uJyA6ICcnfSAke1xuICAgICAgICAgICAgICAgIHBhcmFtLmZpZWxkTmFtZVxuICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmpvaW4oJywgJyl9KWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGByZXR1cm4gbmV3ICR7QlVJTERFUl9DTEFTU19OQU1FfSgke3Bvc2l0aW9uYWxQYXJhbXNcbiAgICAgICAgICAubWFwKChwYXJhbSwgaWR4KSA9PiAoaWR4IDwgcGFyYW1zLmxlbmd0aCA/IHBhcmFtLmZpZWxkTmFtZSA6ICdudWxsJykpXG4gICAgICAgICAgLmpvaW4oJywgJyl9KTtgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBvc2l0aW9uYWxQYXJhbXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgcHJpdmF0ZSBmaW5hbCAke3BhcmFtLmphdmFUeXBlfSR7cGFyYW0ucGFyYW0udmFyaWFkaWMgPyAnW10nIDogJyd9ICR7XG4gICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgIH07YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHByaXZhdGUgJHtcbiAgICAgICAgZmlyc3RTdHJ1Y3Qub3B0aW9uYWwgPyAnJyA6ICdmaW5hbCAnXG4gICAgICB9JHtzdHJ1Y3RCdWlsZGVyfSAke3N0cnVjdFBhcmFtTmFtZX07YCxcbiAgICApO1xuXG4gICAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcml2YXRlICR7QlVJTERFUl9DTEFTU19OQU1FfSgke3Bvc2l0aW9uYWxQYXJhbXNcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICBgZmluYWwgJHtwYXJhbS5qYXZhVHlwZX0ke3BhcmFtLnBhcmFtLnZhcmlhZGljID8gJy4uLicgOiAnJ30gJHtcbiAgICAgICAgICAgICAgcGFyYW0uZmllbGROYW1lXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignLCAnKX0pYCxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcG9zaXRpb25hbFBhcmFtcykge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHRoaXMuJHtwYXJhbS5maWVsZE5hbWV9ID0gJHtwYXJhbS5maWVsZE5hbWV9O2ApO1xuICAgIH1cbiAgICBpZiAoIWZpcnN0U3RydWN0Lm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0gPSBuZXcgJHtzdHJ1Y3RCdWlsZGVyfSgpO2ApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgLy8gRmllbGRzXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHN0cnVjdFR5cGUuYWxsUHJvcGVydGllcykge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5jb2RlLnRvQ2FtZWxDYXNlKFxuICAgICAgICBKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKHByb3AubmFtZSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICAgIGNvbnN0IHNldHRlcjogc3BlYy5NZXRob2QgPSB7XG4gICAgICAgIG5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgZG9jczoge1xuICAgICAgICAgIC4uLnByb3Auc3BlYy5kb2NzLFxuICAgICAgICAgIHN0YWJpbGl0eTogcHJvcC5zcGVjLmRvY3M/LnN0YWJpbGl0eSxcbiAgICAgICAgICByZXR1cm5zOiAne0Bjb2RlIHRoaXN9JyxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSwgLy8gV2UgZG9uJ3QgcXVpdGUgY2FyZSBpbiB0aGlzIGNvbnRleHQhXG4gICAgICAgICAgICBkb2NzOiBwcm9wLnNwZWMuZG9jcyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgamF2YVR5cGUgb2YgdGhpcy50b0phdmFUeXBlcyhwcm9wLnR5cGUuc3BlYyEsIHtcbiAgICAgICAgY292YXJpYW50OiB0cnVlLFxuICAgICAgfSkpIHtcbiAgICAgICAgdGhpcy5hZGRKYXZhRG9jcyhzZXR0ZXIsIHtcbiAgICAgICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgICAgIGZxbjogcHJvcC5kZWZpbmluZ1R5cGUuZnFuLCAvLyBDb3VsZCBiZSBpbmhlcml0ZWRcbiAgICAgICAgICBtZW1iZXJOYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wLnNwZWMpO1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAgIGBwdWJsaWMgJHtCVUlMREVSX0NMQVNTX05BTUV9ICR7ZmllbGROYW1lfShmaW5hbCAke2phdmFUeXBlfSAke2ZpZWxkTmFtZX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgICAgYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9JHtcbiAgICAgICAgICAgIGZpcnN0U3RydWN0Lm9wdGlvbmFsID8gJygpJyA6ICcnXG4gICAgICAgICAgfS4ke2ZpZWxkTmFtZX0oJHtmaWVsZE5hbWV9KTtgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHRoaXM7Jyk7XG4gICAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmluYWwgYnVpbGQgbWV0aG9kXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgICogQHJldHVybnMgYSBuZXdseSBidWlsdCBpbnN0YW5jZSBvZiB7QGxpbmsgJHtidWlsdFR5cGV9fS5gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNscy5pbml0aWFsaXplcik7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyAke2J1aWx0VHlwZX0gYnVpbGQoKWApO1xuICAgIGNvbnN0IHBhcmFtcyA9IGNscy5pbml0aWFsaXplci5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgIGlmIChwYXJhbSA9PT0gZmlyc3RTdHJ1Y3QpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0U3RydWN0Lm9wdGlvbmFsXG4gICAgICAgICAgPyBgdGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0gIT0gbnVsbCA/IHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9LmJ1aWxkKCkgOiBudWxsYFxuICAgICAgICAgIDogYHRoaXMuJHtzdHJ1Y3RQYXJhbU5hbWV9LmJ1aWxkKClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB0aGlzLiR7XG4gICAgICAgIHBvc2l0aW9uYWxQYXJhbXMuZmluZCgocCkgPT4gcGFyYW0gPT09IHAucGFyYW0pIS5maWVsZE5hbWVcbiAgICAgIH1gO1xuICAgIH0pO1xuICAgIHRoaXMuY29kZS5pbmRlbnQoYHJldHVybiBuZXcgJHtidWlsdFR5cGV9KGApO1xuICAgIHBhcmFtcy5mb3JFYWNoKChwYXJhbSwgaWR4KSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYCR7cGFyYW19JHtpZHggPCBwYXJhbXMubGVuZ3RoIC0gMSA/ICcsJyA6ICcnfWApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLnVuaW5kZW50KCcpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICAvLyBPcHRpb25hbCBidWlsZGVyIGluaXRpYWxpemF0aW9uXG4gICAgaWYgKGZpcnN0U3RydWN0Lm9wdGlvbmFsKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHJpdmF0ZSAke3N0cnVjdEJ1aWxkZXJ9ICR7c3RydWN0UGFyYW1OYW1lfSgpYCk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBpZiAodGhpcy4ke3N0cnVjdFBhcmFtTmFtZX0gPT0gbnVsbClgKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKGB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfSA9IG5ldyAke3N0cnVjdEJ1aWxkZXJ9KCk7YCk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiB0aGlzLiR7c3RydWN0UGFyYW1OYW1lfTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRCdWlsZGVyU2V0dGVyKFxuICAgIHByb3A6IEphdmFQcm9wLFxuICAgIGJ1aWxkZXJOYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50VHlwZTogc3BlYy5JbnRlcmZhY2VUeXBlLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgcHJvcC5qYXZhVHlwZXMpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYCAqIFNldHMgdGhlIHZhbHVlIG9mIHtAbGluayAke3BhcmVudFR5cGUubmFtZX0jJHtnZXR0ZXJGb3IoXG4gICAgICAgICAgcHJvcC5maWVsZE5hbWUsXG4gICAgICAgICl9fWAsXG4gICAgICApO1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IHByb3AuZG9jcz8uc3VtbWFyeSA/PyAndGhlIHZhbHVlIHRvIGJlIHNldCc7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYCAqICR7cGFyYW1KYXZhZG9jKHByb3AuZmllbGROYW1lLCBwcm9wLm51bGxhYmxlLCBzdW1tYXJ5KX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChwcm9wLmRvY3M/LnJlbWFya3MgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSAnICcucmVwZWF0KDcgKyBwcm9wLmZpZWxkTmFtZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZW1hcmtzID0gbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgICAgdGhpcy5jb252ZXJ0U2FtcGxlc0luTWFya2Rvd24ocHJvcC5kb2NzLnJlbWFya3MsIHtcbiAgICAgICAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICAgICAgICBmcW46IHByb3AuZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgICAgICAgIG1lbWJlck5hbWU6IHByb3AuanNpaU5hbWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICkudHJpbVJpZ2h0KCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiByZW1hcmtzLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIHRoaXMuY29kZS5saW5lKGAgKiAke2luZGVudH0gJHtsaW5lfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUubGluZSgnICogQHJldHVybiB7QGNvZGUgdGhpc30nKTtcbiAgICAgIGlmIChwcm9wLmRvY3M/LmRlcHJlY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5jb2RlLmxpbmUoYCAqIEBkZXByZWNhdGVkICR7cHJvcC5kb2NzLmRlcHJlY2F0ZWR9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gICAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhwcm9wLnNwZWMpO1xuICAgICAgLy8gV2UgYWRkIGFuIGV4cGxpY2l0IGNhc3QgaWYgYm90aCB0eXBlcyBhcmUgZ2VuZXJpYyBidXQgdGhleSBhcmUgbm90IGlkZW50aWNhbCAob25lIGlzIGNvdmFyaWFudCwgdGhlIG90aGVyIGlzbid0KVxuICAgICAgY29uc3QgZXhwbGljaXRDYXN0ID1cbiAgICAgICAgdHlwZS5pbmNsdWRlcygnPCcpICYmXG4gICAgICAgIHByb3AuZmllbGRKYXZhVHlwZS5pbmNsdWRlcygnPCcpICYmXG4gICAgICAgIHR5cGUgIT09IHByb3AuZmllbGRKYXZhVHlwZVxuICAgICAgICAgID8gYCgke3Byb3AuZmllbGRKYXZhVHlwZX0pYFxuICAgICAgICAgIDogJyc7XG4gICAgICBpZiAoZXhwbGljaXRDYXN0ICE9PSAnJykge1xuICAgICAgICAvLyBXZSdsbCBiZSBkb2luZyBhIHNhZmUsIGJ1dCB1bmNoZWNrZWQgY2FzdCwgc28gc3VwcHJlc3MgdGhhdCB3YXJuaW5nXG4gICAgICAgIHRoaXMuY29kZS5saW5lKCdAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKScpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyAke2J1aWxkZXJOYW1lfSAke3Byb3AuZmllbGROYW1lfSgke3R5cGV9ICR7cHJvcC5maWVsZE5hbWV9KWAsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ID0gJHtleHBsaWNpdENhc3R9JHtwcm9wLmZpZWxkTmFtZX07YCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIHRoaXM7Jyk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldHRlckZvcihmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gZmllbGROYW1lO1xuICAgICAgcmV0dXJuIGBnZXQke2ZpcnN0LnRvVXBwZXJDYXNlKCl9JHtyZXN0LmpvaW4oJycpfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SW50ZXJmYWNlQnVpbGRlcihcbiAgICBjbGFzc1NwZWM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBjb25zdHJ1Y3Rvck5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSmF2YVByb3BbXSxcbiAgKSB7XG4gICAgLy8gU3RhcnQgYnVpbGRlcigpXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgICogQHJldHVybiBhIHtAbGluayAke0JVSUxERVJfQ0xBU1NfTkFNRX19IG9mIHtAbGluayAke2NsYXNzU3BlYy5uYW1lfX1gLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgc3RhdGljICR7QlVJTERFUl9DTEFTU19OQU1FfSBidWlsZGVyKClgKTtcbiAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIG5ldyAke0JVSUxERVJfQ0xBU1NfTkFNRX0oKTtgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBidWlsZGVyKClcblxuICAgIC8vIFN0YXJ0IEJ1aWxkZXJcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYCAqIEEgYnVpbGRlciBmb3Ige0BsaW5rICR7Y2xhc3NTcGVjLm5hbWV9fWApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhjbGFzc1NwZWMpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyAke0JVSUxERVJfQ0xBU1NfTkFNRX0gaW1wbGVtZW50cyBzb2Z0d2FyZS5hbWF6b24uanNpaS5CdWlsZGVyPCR7Y2xhc3NTcGVjLm5hbWV9PmAsXG4gICAgKTtcblxuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+XG4gICAgICB0aGlzLmNvZGUubGluZShgJHtwcm9wLmZpZWxkSmF2YVR5cGV9ICR7cHJvcC5maWVsZE5hbWV9O2ApLFxuICAgICk7XG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuZW1pdEJ1aWxkZXJTZXR0ZXIocHJvcCwgQlVJTERFUl9DTEFTU19OQU1FLCBjbGFzc1NwZWMpLFxuICAgICk7XG5cbiAgICAvLyBTdGFydCBidWlsZCgpXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqIEJ1aWxkcyB0aGUgY29uZmlndXJlZCBpbnN0YW5jZS4nKTtcbiAgICB0aGlzLmNvZGUubGluZShgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgJHtjbGFzc1NwZWMubmFtZX19YCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAnICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgYXR0cmlidXRlIHdhcyBub3QgcHJvdmlkZWQnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuZW1pdFN0YWJpbGl0eUFubm90YXRpb25zKGNsYXNzU3BlYyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soYHB1YmxpYyAke2NsYXNzU3BlYy5uYW1lfSBidWlsZCgpYCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIG5ldyAke2NvbnN0cnVjdG9yTmFtZX0odGhpcyk7YCk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgYnVpbGQoKVxuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgQnVpbGRlclxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGF0YVR5cGUoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUpIHtcbiAgICAvLyBjb2xsZWN0IGFsbCBwcm9wZXJ0aWVzIGZyb20gYWxsIGJhc2Ugc3RydWN0cyBhbmQgZGVkdXBlIGJ5IG5hbWUuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZ2VuZXJhdGlvbiBvZiB0aGVcbiAgICAvLyBhc3NlbWJseSB3aWxsIG5vdCBwZXJtaXQgbXVsdGlwbGUgb3ZlcmxvYWRlZCBpbmhlcml0ZWQgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHRoYXQgdGhpcyB3aWxsIGJlXG4gICAgLy8gZW5mb3JjZWQgYnkgVHlwZXNjcmlwdCBjb25zdHJhaW50cy5cbiAgICBjb25zdCBwcm9wc0J5TmFtZTogeyBbbmFtZTogc3RyaW5nXTogSmF2YVByb3AgfSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gY29sbGVjdFByb3BzKFxuICAgICAgdGhpczogSmF2YUdlbmVyYXRvcixcbiAgICAgIGN1cnJlbnRJZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICAgIGlzQmFzZUNsYXNzID0gZmFsc2UsXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGN1cnJlbnRJZmMucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBqYXZhUHJvcCA9IHRoaXMudG9KYXZhUHJvcChwcm9wZXJ0eSwgY3VycmVudElmYywgaXNCYXNlQ2xhc3MpO1xuICAgICAgICBwcm9wc0J5TmFtZVtqYXZhUHJvcC5wcm9wTmFtZV0gPSBqYXZhUHJvcDtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHByb3BzIG9mIGJhc2Ugc3RydWN0XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgY3VycmVudElmYy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICAgIGNvbGxlY3RQcm9wcy5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maW5kVHlwZShiYXNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb2xsZWN0UHJvcHMuY2FsbCh0aGlzLCBpZmMpO1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LnZhbHVlcyhwcm9wc0J5TmFtZSk7XG4gICAgdGhpcy5lbWl0SW50ZXJmYWNlQnVpbGRlcihpZmMsIElOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FLCBwcm9wcyk7XG5cbiAgICAvLyBTdGFydCBpbXBsZW1lbnRhdGlvbiBjbGFzc1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJy8qKicpO1xuICAgIHRoaXMuY29kZS5saW5lKGAgKiBBbiBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rICR7aWZjLm5hbWV9fWApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICB0aGlzLmVtaXRTdGFiaWxpdHlBbm5vdGF0aW9ucyhpZmMpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBmaW5hbCBjbGFzcyAke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSBleHRlbmRzIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QgaW1wbGVtZW50cyAke2lmYy5uYW1lfWAsXG4gICAgKTtcblxuICAgIC8vIEltbXV0YWJsZSBwcm9wZXJ0aWVzXG4gICAgcHJvcHMuZm9yRWFjaCgocHJvcCkgPT5cbiAgICAgIHRoaXMuY29kZS5saW5lKGBwcml2YXRlIGZpbmFsICR7cHJvcC5maWVsZEphdmFUeXBlfSAke3Byb3AuZmllbGROYW1lfTtgKSxcbiAgICApO1xuXG4gICAgLy8gU3RhcnQgSlNJSSByZWZlcmVuY2UgY29uc3RydWN0b3JcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBDb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBvYmplY3QgYmFzZWQgb24gdmFsdWVzIHJldHJpZXZlZCBmcm9tIHRoZSBKc2lpT2JqZWN0LicsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnICogQHBhcmFtIG9ialJlZiBSZWZlcmVuY2UgdG8gdGhlIEpTSUkgbWFuYWdlZCBvYmplY3QuJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAqLycpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7SU5URVJGQUNFX1BST1hZX0NMQVNTX05BTUV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RSZWYgb2JqUmVmKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3VwZXIob2JqUmVmKTsnKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAgIGB0aGlzLiR7cHJvcC5maWVsZE5hbWV9ID0gc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLmdldCh0aGlzLCBcIiR7cHJvcC5qc2lpTmFtZX1cIiwgJHtwcm9wLmZpZWxkTmF0aXZlVHlwZX0pO2AsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgSlNJSSByZWZlcmVuY2UgY29uc3RydWN0b3JcblxuICAgIC8vIFN0YXJ0IGJ1aWxkZXIgY29uc3RydWN0b3JcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCcvKionKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgKiBDb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBvYmplY3QgYmFzZWQgb24gbGl0ZXJhbCBwcm9wZXJ0eSB2YWx1ZXMgcGFzc2VkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlcn0uJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCcgKi8nKTtcbiAgICBpZiAocHJvcHMuc29tZSgocHJvcCkgPT4gcHJvcC5maWVsZEphdmFUeXBlICE9PSBwcm9wLnBhcmFtSmF2YVR5cGUpKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQFN1cHByZXNzV2FybmluZ3MoXCJ1bmNoZWNrZWRcIiknKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgIGBwcm90ZWN0ZWQgJHtJTlRFUkZBQ0VfUFJPWFlfQ0xBU1NfTkFNRX0oZmluYWwgJHtCVUlMREVSX0NMQVNTX05BTUV9IGJ1aWxkZXIpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ3N1cGVyKHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3QuSW5pdGlhbGl6YXRpb25Nb2RlLkpTSUkpOycsXG4gICAgKTtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBleHBsaWNpdENhc3QgPVxuICAgICAgICBwcm9wLmZpZWxkSmF2YVR5cGUgIT09IHByb3AucGFyYW1KYXZhVHlwZVxuICAgICAgICAgID8gYCgke3Byb3AuZmllbGRKYXZhVHlwZX0pYFxuICAgICAgICAgIDogJyc7XG4gICAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICAgYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gPSAke2V4cGxpY2l0Q2FzdH0ke192YWxpZGF0ZUlmTm9uT3B0aW9uYWwoXG4gICAgICAgICAgYGJ1aWxkZXIuJHtwcm9wLmZpZWxkTmFtZX1gLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICl9O2AsXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgLy8gRW5kIGxpdGVyYWwgY29uc3RydWN0b3JcblxuICAgIC8vIEdldHRlcnNcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICAgYHB1YmxpYyBmaW5hbCAke3Byb3AuZmllbGRKYXZhVHlwZX0gZ2V0JHtwcm9wLnByb3BOYW1lfSgpYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGUubGluZShgcmV0dXJuIHRoaXMuJHtwcm9wLmZpZWxkTmFtZX07YCk7XG4gICAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH0pO1xuXG4gICAgLy8gZW1pdCAkanNpaSR0b0pzb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgdG8gc2VyaWFsaXplIHRoaXMgb2JqZWN0IHdoZW4gc2VudCB0byBKU1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5saW5lKEFOTl9JTlRFUk5BTCk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICdwdWJsaWMgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkpzb25Ob2RlICRqc2lpJHRvSnNvbigpJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2ZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXIgb20gPSBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0TWFwcGVyLklOU1RBTkNFOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBmaW5hbCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5PYmplY3ROb2RlIGRhdGEgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3RvcnkuaW5zdGFuY2Uub2JqZWN0Tm9kZSgpO2AsXG4gICAgKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKGBpZiAodGhpcy5nZXQke3Byb3AucHJvcE5hbWV9KCkgIT0gbnVsbClgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgICBgZGF0YS5zZXQoXCIke3Byb3Auc3BlYy5uYW1lfVwiLCBvbS52YWx1ZVRvVHJlZSh0aGlzLmdldCR7cHJvcC5wcm9wTmFtZX0oKSkpO2AsXG4gICAgICApO1xuICAgICAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICAgICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2ZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgc3RydWN0ID0gY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuSnNvbk5vZGVGYWN0b3J5Lmluc3RhbmNlLm9iamVjdE5vZGUoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHN0cnVjdC5zZXQoXCJmcW5cIiwgb20udmFsdWVUb1RyZWUoXCIke2lmYy5mcW59XCIpKTtgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3RydWN0LnNldChcImRhdGFcIiwgZGF0YSk7Jyk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2ZpbmFsIGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5ub2RlLk9iamVjdE5vZGUgb2JqID0gY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuSnNvbk5vZGVGYWN0b3J5Lmluc3RhbmNlLm9iamVjdE5vZGUoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ29iai5zZXQoXCIkanNpaS5zdHJ1Y3RcIiwgc3RydWN0KTsnKTtcblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiBvYmo7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICAvLyBFbmQgJGpzaWkkdG9Kc29uXG5cbiAgICAvLyBHZW5lcmF0ZSBlcXVhbHMoKSBvdmVycmlkZVxuICAgIHRoaXMuZW1pdEVxdWFsc092ZXJyaWRlKGlmYy5uYW1lLCBwcm9wcyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBoYXNoQ29kZSgpIG92ZXJyaWRlXG4gICAgdGhpcy5lbWl0SGFzaENvZGVPdmVycmlkZShwcm9wcyk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIC8vIEVuZCBpbXBsZW1lbnRhdGlvbiBjbGFzc1xuXG4gICAgZnVuY3Rpb24gX3ZhbGlkYXRlSWZOb25PcHRpb25hbCh2YXJpYWJsZTogc3RyaW5nLCBwcm9wOiBKYXZhUHJvcCk6IHN0cmluZyB7XG4gICAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGphdmEudXRpbC5PYmplY3RzLnJlcXVpcmVOb25OdWxsKCR7dmFyaWFibGV9LCBcIiR7cHJvcC5maWVsZE5hbWV9IGlzIHJlcXVpcmVkXCIpYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRFcXVhbHNPdmVycmlkZShjbGFzc05hbWU6IHN0cmluZywgcHJvcHM6IEphdmFQcm9wW10pIHtcbiAgICAvLyBBIGNsYXNzIHdpdGhvdXQgcHJvcGVydGllcyBkb2VzIG5vdCBuZWVkIHRvIG92ZXJyaWRlIGVxdWFscygpXG4gICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ0BPdmVycmlkZScpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3B1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbyknKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Jyk7XG5cbiAgICAvLyBUaGlzIHdhcyBhbHJlYWR5IGNoZWNrZWQgYnkgYHN1cGVyLmVxdWFscyhvKWAsIHNvIHdlIHNraXAgaXQgaGVyZS4uLlxuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgJ2lmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsnLFxuICAgICk7XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYCR7Y2xhc3NOYW1lfS4ke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSB0aGF0ID0gKCR7Y2xhc3NOYW1lfS4ke0lOVEVSRkFDRV9QUk9YWV9DTEFTU19OQU1FfSkgbztgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIGNvbnN0IGluaXRpYWxQcm9wcyA9IHByb3BzLnNsaWNlKDAsIHByb3BzLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGZpbmFsUHJvcCA9IHByb3BzW3Byb3BzLmxlbmd0aCAtIDFdO1xuXG4gICAgaW5pdGlhbFByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHByZWRpY2F0ZSA9IHByb3AubnVsbGFibGVcbiAgICAgICAgPyBgdGhpcy4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsID8gIXRoaXMuJHtwcm9wLmZpZWxkTmFtZX0uZXF1YWxzKHRoYXQuJHtwcm9wLmZpZWxkTmFtZX0pIDogdGhhdC4ke3Byb3AuZmllbGROYW1lfSAhPSBudWxsYFxuICAgICAgICA6IGAhJHtwcm9wLmZpZWxkTmFtZX0uZXF1YWxzKHRoYXQuJHtwcm9wLmZpZWxkTmFtZX0pYDtcblxuICAgICAgdGhpcy5jb2RlLmxpbmUoYGlmICgke3ByZWRpY2F0ZX0pIHJldHVybiBmYWxzZTtgKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBmaW5hbCAocmV0dXJuZWQgcHJlZGljYXRlKSBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3RoZXIgb25lc1xuICAgIGNvbnN0IGZpbmFsUHJlZGljYXRlID0gZmluYWxQcm9wLm51bGxhYmxlXG4gICAgICA/IGB0aGlzLiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0gIT0gbnVsbCA/IHRoaXMuJHtmaW5hbFByb3AuZmllbGROYW1lfS5lcXVhbHModGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9KSA6IGAgK1xuICAgICAgICBgdGhhdC4ke2ZpbmFsUHJvcC5maWVsZE5hbWV9ID09IG51bGxgXG4gICAgICA6IGB0aGlzLiR7ZmluYWxQcm9wLmZpZWxkTmFtZX0uZXF1YWxzKHRoYXQuJHtmaW5hbFByb3AuZmllbGROYW1lfSlgO1xuICAgIHRoaXMuY29kZS5saW5lKGByZXR1cm4gJHtmaW5hbFByZWRpY2F0ZX07YCk7XG5cbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SGFzaENvZGVPdmVycmlkZShwcm9wczogSmF2YVByb3BbXSkge1xuICAgIC8vIEEgY2xhc3Mgd2l0aG91dCBwcm9wZXJ0aWVzIGRvZXMgbm90IG5lZWQgdG8gb3ZlcnJpZGUgaGFzaENvZGUoKVxuICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdAT3ZlcnJpZGUnKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCknKTtcblxuICAgIGNvbnN0IGZpcnN0UHJvcCA9IHByb3BzWzBdO1xuICAgIGNvbnN0IHJlbWFpbmluZ1Byb3BzID0gcHJvcHMuc2xpY2UoMSk7XG5cbiAgICB0aGlzLmNvZGUubGluZShgaW50IHJlc3VsdCA9ICR7X2hhc2hDb2RlRm9yUHJvcChmaXJzdFByb3ApfTtgKTtcbiAgICByZW1haW5pbmdQcm9wcy5mb3JFYWNoKChwcm9wKSA9PlxuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKCR7X2hhc2hDb2RlRm9yUHJvcChwcm9wKX0pO2ApLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiByZXN1bHQ7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGZ1bmN0aW9uIF9oYXNoQ29kZUZvclByb3AocHJvcDogSmF2YVByb3ApIHtcbiAgICAgIHJldHVybiBwcm9wLm51bGxhYmxlXG4gICAgICAgID8gYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0gIT0gbnVsbCA/IHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0uaGFzaENvZGUoKSA6IDBgXG4gICAgICAgIDogYHRoaXMuJHtwcm9wLmZpZWxkTmFtZX0uaGFzaENvZGUoKWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRmlsZUlmTmVlZGVkKHR5cGU6IHNwZWMuVHlwZSkge1xuICAgIGlmICh0aGlzLmlzTmVzdGVkKHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKHRoaXMudG9KYXZhRmlsZVBhdGgodGhpcy5hc3NlbWJseSwgdHlwZSkpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYHBhY2thZ2UgJHt0aGlzLnRvTmF0aXZlTmFtZSh0aGlzLmFzc2VtYmx5LCB0eXBlKS5wYWNrYWdlTmFtZX07YCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlRmlsZUlmTmVlZGVkKHR5cGU6IHNwZWMuVHlwZSkge1xuICAgIGlmICh0aGlzLmlzTmVzdGVkKHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUodGhpcy50b0phdmFGaWxlUGF0aCh0aGlzLmFzc2VtYmx5LCB0eXBlKSk7XG4gIH1cblxuICBwcml2YXRlIGlzTmVzdGVkKHR5cGU6IHNwZWMuVHlwZSkge1xuICAgIGlmICghdGhpcy5hc3NlbWJseS50eXBlcyB8fCAhdHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gYCR7dHlwZS5hc3NlbWJseX0uJHt0eXBlLm5hbWVzcGFjZX1gO1xuICAgIHJldHVybiBwYXJlbnQgaW4gdGhpcy5hc3NlbWJseS50eXBlcztcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgZnFuOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9KYXZhRmlsZVBhdGgoYXNzbTogc3BlYy5Bc3NlbWJseSwgdHlwZTogc3BlYy5UeXBlKTogc3RyaW5nO1xuICBwcml2YXRlIHRvSmF2YUZpbGVQYXRoKGFzc206IHNwZWMuQXNzZW1ibHksIHdoYXQ6IHNwZWMuVHlwZSB8IHN0cmluZykge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB3aGF0ID09PSAnc3RyaW5nJyA/IHdoYXQgOiB3aGF0LmZxbjtcbiAgICBjb25zdCB7IHBhY2thZ2VOYW1lLCB0eXBlTmFtZXMgfSA9IHRyYW5zbGF0ZUZxbihhc3NtLCBmcW4pO1xuXG4gICAgaWYgKHR5cGVOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRvSmF2YUZpbGVQYXRoOiAke2Zxbn0gbXVzdCBpbmRpY2F0ZSBhIHR5cGUsIGJ1dCBkb2Vzbid0OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHsgcGFja2FnZU5hbWUsIHR5cGVOYW1lcyB9LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXRoLmpvaW4oXG4gICAgICAnc3JjJyxcbiAgICAgICdtYWluJyxcbiAgICAgICdqYXZhJyxcbiAgICAgIC4uLnBhY2thZ2VOYW1lLnNwbGl0KCcuJyksXG4gICAgICB0eXBlTmFtZXNbMF0sXG4gICAgKX0uamF2YWA7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVJlc291cmNlUGF0aChhc3NtOiBzcGVjLkFzc2VtYmx5LCBmcW46IHN0cmluZywgZXh0ID0gJy50eHQnKSB7XG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWUgfSA9IHRoaXMudG9OYXRpdmVOYW1lKGFzc20sIHtcbiAgICAgIGZxbixcbiAgICAgIGtpbmQ6IHNwZWMuVHlwZUtpbmQuQ2xhc3MsXG4gICAgICBhc3NlbWJseTogYXNzbS5uYW1lLFxuICAgICAgbmFtZTogZnFuLnJlcGxhY2UoLy4qXFwuKFteLl0rKSQvLCAnJDEnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgLi4ucGFja2FnZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgIGAke3R5cGVOYW1lLnNwbGl0KCcuJylbMF19JHtleHR9YCxcbiAgICBdO1xuICAgIC8vIFJlc291cmNlIG5hbWVzIGFyZSAvLWRlbGltaXRlZCBwYXRocyAoZXZlbiBvbiBXaW5kb3dzICp3aW5rIHdpbmsqKVxuICAgIGNvbnN0IG5hbWUgPSBwYXJ0cy5qb2luKCcvJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oJ3NyYycsICdtYWluJywgJ3Jlc291cmNlcycsIC4uLnBhcnRzKTtcblxuICAgIHJldHVybiB7IGZpbGVQYXRoLCBuYW1lIH07XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwcml2YXRlIGFkZEphdmFEb2NzKFxuICAgIGRvYzogc3BlYy5Eb2N1bWVudGFibGUsXG4gICAgYXBpTG9jOiBBcGlMb2NhdGlvbixcbiAgICBkZWZhdWx0VGV4dD86IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgIWRlZmF1bHRUZXh0ICYmXG4gICAgICBPYmplY3Qua2V5cyhkb2MuZG9jcyA/PyB7fSkubGVuZ3RoID09PSAwICYmXG4gICAgICAhKChkb2MgYXMgc3BlYy5NZXRob2QpLnBhcmFtZXRlcnMgPz8gW10pLnNvbWUoXG4gICAgICAgIChwKSA9PiBPYmplY3Qua2V5cyhwLmRvY3MgPz8ge30pLmxlbmd0aCAhPT0gMCxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gKGRvYy5kb2NzID0gZG9jLmRvY3MgPz8ge30pO1xuXG4gICAgY29uc3QgcGFyYXMgPSBbXTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIHBhcmFzLnB1c2gocmVuZGVyU3VtbWFyeShkb2NzKSk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0VGV4dCkge1xuICAgICAgcGFyYXMucHVzaChkZWZhdWx0VGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgICAgcGFyYXMucHVzaChcbiAgICAgICAgbWFya0Rvd25Ub0phdmFEb2MoXG4gICAgICAgICAgdGhpcy5jb252ZXJ0U2FtcGxlc0luTWFya2Rvd24oZG9jcy5yZW1hcmtzLCBhcGlMb2MpLFxuICAgICAgICApLnRyaW1SaWdodCgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBwYXJhcy5wdXNoKGBEZWZhdWx0OiAke2RvY3MuZGVmYXVsdH1gKTsgLy8gTk9URTogdGhlcmUgaXMgbm8gYW5ub3RhdGlvbiBpbiBKYXZhRG9jIGZvciB0aGlzXG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZXhhbXBsZSkge1xuICAgICAgcGFyYXMucHVzaCgnRXhhbXBsZTonKTtcblxuICAgICAgY29uc3QgY29udmVydGVkRXhhbXBsZSA9IHRoaXMuY29udmVydEV4YW1wbGUoZG9jcy5leGFtcGxlLCBhcGlMb2MpO1xuXG4gICAgICAvLyBXZSB1c2VkIHRvIHVzZSB0aGUgc2xpZ2h0bHkgbmljZXIgYDxwcmU+e0Bjb2RlIC4uLn08L3ByZT5gLCB3aGljaCBkb2Vzbid0XG4gICAgICAvLyByZXF1aXJlIChhbmQgdGhlcmVmb3JlIGFsc28gZG9lc24ndCBhbGxvdykgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGNvZGUgc2FtcGxlcyBtYXkgY29udGFpbiBibG9jayBxdW90ZXMgb2YgdGhlaXIgb3duICgnKi8nKSB0aGF0XG4gICAgICAvLyB3b3VsZCB0ZXJtaW5hdGUgdGhlIGJsb2NrIGNvbW1lbnQgZnJvbSB0aGUgUG9WIG9mIHRoZSBKYXZhIHRva2VuaXplciwgYW5kXG4gICAgICAvLyBzaW5jZSBge0Bjb2RlIC4uLiB9YCBkb2Vzbid0IGFsbG93IGFueSBlc2NhcGluZywgdGhlcmUncyBhbHNvIG5vIHdheSB0byBlbmNvZGVcbiAgICAgIC8vICcqLycgaW4gYSB3YXkgdGhhdCB3b3VsZCAoYSkgaGlkZSBpdCBmcm9tIHRoZSB0b2tlbml6ZXIgYW5kIChiKSBnaXZlICcqLycgYmFja1xuICAgICAgLy8gYWZ0ZXIgcHJvY2Vzc2luZyBKYXZhRG9jcy5cbiAgICAgIC8vXG4gICAgICAvLyBIZW5jZSwgd2UganVzdCByZXNvcnQgdG8gSFRNTC1lbmNvZGluZyBldmVyeXRoaW5nIChzYW1lIGFzIHdlIGRvIGZvciBjb2RlXG4gICAgICAvLyBleGFtcGxlcyB0aGF0IGhhdmUgYmVlbiB0cmFuc2xhdGVkIGZyb20gTWFya0Rvd24pLlxuICAgICAgcGFyYXMucHVzaChcbiAgICAgICAgbWFya0Rvd25Ub0phdmFEb2MoWydgYGAnLCBjb252ZXJ0ZWRFeGFtcGxlLCAnYGBgJ10uam9pbignXFxuJykpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdMaW5lcyA9IFtdO1xuXG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgdGFnTGluZXMucHVzaChgQHJldHVybiAke2RvY3MucmV0dXJuc31gKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICB0YWdMaW5lcy5wdXNoKGBAc2VlICR7ZG9jcy5zZWV9YCk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIHRhZ0xpbmVzLnB1c2goYEBkZXByZWNhdGVkICR7ZG9jcy5kZXByZWNhdGVkfWApO1xuICAgIH1cblxuICAgIC8vIFBhcmFtc1xuICAgIGlmICgoZG9jIGFzIHNwZWMuTWV0aG9kKS5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBkb2MgYXMgc3BlYy5NZXRob2Q7XG4gICAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBwYXJhbS5kb2NzPy5zdW1tYXJ5O1xuICAgICAgICAgIHRhZ0xpbmVzLnB1c2gocGFyYW1KYXZhZG9jKHBhcmFtLm5hbWUsIHBhcmFtLm9wdGlvbmFsLCBzdW1tYXJ5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFnTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYXMucHVzaCh0YWdMaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGFyYSBvZiBwYXJhcykge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnPHA+Jyk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKC4uLnBhcmEuc3BsaXQoJ1xcbicpLmZpbHRlcigobCkgPT4gbCAhPT0gJycpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvZGUubGluZSgnLyoqJyk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0aGlzLmNvZGUubGluZShgICogJHtsaW5lfWApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUubGluZSgnICovJyk7XG4gIH1cblxuICBwcml2YXRlIGdldENsYXNzQmFzZShjbHM6IHNwZWMuQ2xhc3NUeXBlKSB7XG4gICAgaWYgKCFjbHMuYmFzZSkge1xuICAgICAgcmV0dXJuICdzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0JztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0phdmFUeXBlKHsgZnFuOiBjbHMuYmFzZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdG9EZWNvcmF0ZWRKYXZhVHlwZShcbiAgICBvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgeyBjb3ZhcmlhbnQgPSBmYWxzZSB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50b0RlY29yYXRlZEphdmFUeXBlcyhvcHRpb25hbFZhbHVlLCB7IGNvdmFyaWFudCB9KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgb3B0aW9uYWxWYWx1ZS5vcHRpb25hbCA/IEFOTl9OVUxMQUJMRSA6IEFOTl9OT1RfTlVMTFxuICAgICAgfSBqYXZhLmxhbmcuT2JqZWN0YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFswXTtcbiAgfVxuXG4gIHByaXZhdGUgdG9EZWNvcmF0ZWRKYXZhVHlwZXMoXG4gICAgb3B0aW9uYWxWYWx1ZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHsgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudG9KYXZhVHlwZXMob3B0aW9uYWxWYWx1ZS50eXBlLCB7IGNvdmFyaWFudCB9KS5tYXAoXG4gICAgICAobmFrZWRUeXBlKSA9PlxuICAgICAgICBgJHtvcHRpb25hbFZhbHVlLm9wdGlvbmFsID8gQU5OX05VTExBQkxFIDogQU5OX05PVF9OVUxMfSAke25ha2VkVHlwZX1gLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YVR5cGUoXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG9wdHM/OiB7IGZvck1hcnNoYWxsaW5nPzogYm9vbGVhbjsgY292YXJpYW50PzogYm9vbGVhbiB9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVzID0gdGhpcy50b0phdmFUeXBlcyh0eXBlLCBvcHRzKTtcbiAgICBpZiAodHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuICdqYXZhLmxhbmcuT2JqZWN0JztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVzWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSB0b05hdGl2ZVR5cGUoXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIHsgZm9yTWFyc2hhbGxpbmcgPSBmYWxzZSwgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZSkpIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnRUeXBlID0gdGhpcy50b05hdGl2ZVR5cGUodHlwZS5jb2xsZWN0aW9uLmVsZW1lbnR0eXBlLCB7XG4gICAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgICBjb3ZhcmlhbnQsXG4gICAgICB9KTtcbiAgICAgIHN3aXRjaCAodHlwZS5jb2xsZWN0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5OlxuICAgICAgICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5saXN0T2YoJHtuYXRpdmVFbGVtZW50VHlwZX0pYDtcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgICByZXR1cm4gYHNvZnR3YXJlLmFtYXpvbi5qc2lpLk5hdGl2ZVR5cGUubWFwT2YoJHtuYXRpdmVFbGVtZW50VHlwZX0pYDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29sbGVjdGlvbiBraW5kOiAke3R5cGUuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5mb3JDbGFzcygke3RoaXMudG9KYXZhVHlwZSh0eXBlLCB7XG4gICAgICBmb3JNYXJzaGFsbGluZyxcbiAgICAgIGNvdmFyaWFudCxcbiAgICB9KX0uY2xhc3MpYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9KYXZhVHlwZXMoXG4gICAgdHlwZXJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIHsgZm9yTWFyc2hhbGxpbmcgPSBmYWxzZSwgY292YXJpYW50ID0gZmFsc2UgfSA9IHt9LFxuICApOiBzdHJpbmdbXSB7XG4gICAgaWYgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKHR5cGVyZWYpKSB7XG4gICAgICByZXR1cm4gW3RoaXMudG9KYXZhUHJpbWl0aXZlKHR5cGVyZWYucHJpbWl0aXZlKV07XG4gICAgfSBlbHNlIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZXJlZikpIHtcbiAgICAgIHJldHVybiBbdGhpcy50b0phdmFDb2xsZWN0aW9uKHR5cGVyZWYsIHsgZm9yTWFyc2hhbGxpbmcsIGNvdmFyaWFudCB9KV07XG4gICAgfSBlbHNlIGlmIChzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHR5cGVyZWYpKSB7XG4gICAgICByZXR1cm4gW3RoaXMudG9OYXRpdmVGcW4odHlwZXJlZi5mcW4pXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVyZWYudW5pb24pIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3Qgc3VidHlwZSBvZiB0eXBlcmVmLnVuaW9uLnR5cGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnRvSmF2YVR5cGVzKHN1YnR5cGUsIHtcbiAgICAgICAgICBmb3JNYXJzaGFsbGluZyxcbiAgICAgICAgICBjb3ZhcmlhbnQsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgdHlwZXMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSByZWZlcmVuY2U6ICR7SlNPTi5zdHJpbmdpZnkodHlwZXJlZil9YCk7XG4gIH1cblxuICBwcml2YXRlIHRvSmF2YUNvbGxlY3Rpb24oXG4gICAgcmVmOiBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlLFxuICAgIHtcbiAgICAgIGZvck1hcnNoYWxsaW5nLFxuICAgICAgY292YXJpYW50LFxuICAgIH06IHsgZm9yTWFyc2hhbGxpbmc6IGJvb2xlYW47IGNvdmFyaWFudDogYm9vbGVhbiB9LFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50SmF2YVR5cGUgPSB0aGlzLnRvSmF2YVR5cGUocmVmLmNvbGxlY3Rpb24uZWxlbWVudHR5cGUsIHtcbiAgICAgIGNvdmFyaWFudCxcbiAgICB9KTtcbiAgICBjb25zdCB0eXBlQ29uc3RyYWludCA9IGNvdmFyaWFudFxuICAgICAgPyBtYWtlQ292YXJpYW50KGVsZW1lbnRKYXZhVHlwZSlcbiAgICAgIDogZWxlbWVudEphdmFUeXBlO1xuICAgIHN3aXRjaCAocmVmLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5OlxuICAgICAgICByZXR1cm4gZm9yTWFyc2hhbGxpbmdcbiAgICAgICAgICA/ICdqYXZhLnV0aWwuTGlzdCdcbiAgICAgICAgICA6IGBqYXZhLnV0aWwuTGlzdDwke3R5cGVDb25zdHJhaW50fT5gO1xuICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgcmV0dXJuIGZvck1hcnNoYWxsaW5nXG4gICAgICAgICAgPyAnamF2YS51dGlsLk1hcCdcbiAgICAgICAgICA6IGBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICR7dHlwZUNvbnN0cmFpbnR9PmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbGxlY3Rpb24ga2luZDogJHtyZWYuY29sbGVjdGlvbi5raW5kIGFzIGFueX1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VDb3ZhcmlhbnQoamF2YVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAvLyBEb24ndCBlbWl0IGEgY292YXJpYW50IGV4cHJlc3Npb24gZm9yIFN0cmluZyAoaXQncyBgZmluYWxgIGluIEphdmEpXG4gICAgICBpZiAoamF2YVR5cGUgPT09ICdqYXZhLmxhbmcuU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gamF2YVR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD8gZXh0ZW5kcyAke2phdmFUeXBlfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0phdmFQcmltaXRpdmUocHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUpIHtcbiAgICBzd2l0Y2ggKHByaW1pdGl2ZSkge1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuQm9vbGVhbjpcbiAgICAgICAgcmV0dXJuICdqYXZhLmxhbmcuQm9vbGVhbic7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gJ2phdmEudGltZS5JbnN0YW50JztcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkpzb246XG4gICAgICAgIHJldHVybiAnY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSc7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5OdW1iZXI6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLk51bWJlcic7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLlN0cmluZyc7XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Bbnk6XG4gICAgICAgIHJldHVybiAnamF2YS5sYW5nLk9iamVjdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJpbWl0aXZlIHR5cGU6ICR7cHJpbWl0aXZlIGFzIGFueX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1ldGhvZENhbGxBcmd1bWVudHMobWV0aG9kOiBzcGVjLkNhbGxhYmxlKSB7XG4gICAgaWYgKCFtZXRob2QucGFyYW1ldGVycyB8fCBtZXRob2QucGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgcmVndWxhclBhcmFtcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLmZpbHRlcigocCkgPT4gIXAudmFyaWFkaWMpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJlZ3VsYXJQYXJhbXMubWFwKF9yZW5kZXJQYXJhbWV0ZXIpO1xuICAgIGNvbnN0IHZhbHVlU3RyID0gYG5ldyBPYmplY3RbXSB7ICR7dmFsdWVzLmpvaW4oJywgJyl9IH1gO1xuICAgIGlmIChtZXRob2QudmFyaWFkaWMpIHtcbiAgICAgIGNvbnN0IHZhbHVlc1N0cmVhbSA9IGBqYXZhLnV0aWwuQXJyYXlzLjxPYmplY3Q+c3RyZWFtKCR7dmFsdWVTdHJ9KWA7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbSA9IG1ldGhvZC5wYXJhbWV0ZXJzW21ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgcmVzdFN0cmVhbSA9IGBqYXZhLnV0aWwuQXJyYXlzLjxPYmplY3Q+c3RyZWFtKCR7bGFzdFBhcmFtLm5hbWV9KWA7XG5cbiAgICAgIGNvbnN0IGZ1bGxTdHJlYW0gPVxuICAgICAgICByZWd1bGFyUGFyYW1zLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb25jYXQoJHt2YWx1ZXNTdHJlYW19LCAke3Jlc3RTdHJlYW19KWBcbiAgICAgICAgICA6IHJlc3RTdHJlYW07XG4gICAgICByZXR1cm4gYCwgJHtmdWxsU3RyZWFtfS50b0FycmF5KE9iamVjdFtdOjpuZXcpYDtcbiAgICB9XG4gICAgcmV0dXJuIGAsICR7dmFsdWVTdHJ9YDtcblxuICAgIGZ1bmN0aW9uIF9yZW5kZXJQYXJhbWV0ZXIocGFyYW06IHNwZWMuUGFyYW1ldGVyKSB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEphdmFHZW5lcmF0b3Iuc2FmZUphdmFQcm9wZXJ0eU5hbWUocGFyYW0ubmFtZSk7XG4gICAgICByZXR1cm4gaXNOdWxsYWJsZShwYXJhbSlcbiAgICAgICAgPyBzYWZlTmFtZVxuICAgICAgICA6IGBqYXZhLnV0aWwuT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCgke3NhZmVOYW1lfSwgXCIke3NhZmVOYW1lfSBpcyByZXF1aXJlZFwiKWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNZXRob2RDYWxsKFxuICAgIGNsczogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QsXG4gICAgYXN5bmM6IGJvb2xlYW4sXG4gICkge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJztcblxuICAgIGlmIChtZXRob2Quc3RhdGljKSB7XG4gICAgICBjb25zdCBqYXZhQ2xhc3MgPSB0aGlzLnRvSmF2YVR5cGUoY2xzKTtcbiAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuSnNpaU9iamVjdC5qc2lpU3RhdGljQ2FsbCgke2phdmFDbGFzc30uY2xhc3MsIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudCArPSBgc29mdHdhcmUuYW1hem9uLmpzaWkuS2VybmVsLiR7XG4gICAgICAgIGFzeW5jID8gJ2FzeW5jQ2FsbCcgOiAnY2FsbCdcbiAgICAgIH0odGhpcywgYDtcbiAgICB9XG5cbiAgICBzdGF0ZW1lbnQgKz0gYFwiJHttZXRob2QubmFtZX1cImA7XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHN0YXRlbWVudCArPSBgLCAke3RoaXMudG9OYXRpdmVUeXBlKG1ldGhvZC5yZXR1cm5zLnR5cGUsIHtcbiAgICAgICAgZm9yTWFyc2hhbGxpbmc6IHRydWUsXG4gICAgICB9KX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZW1lbnQgKz0gJywgc29mdHdhcmUuYW1hem9uLmpzaWkuTmF0aXZlVHlwZS5WT0lEJztcbiAgICB9XG4gICAgc3RhdGVtZW50ICs9IGAke3RoaXMucmVuZGVyTWV0aG9kQ2FsbEFyZ3VtZW50cyhtZXRob2QpfSlgO1xuXG4gICAgaWYgKG1ldGhvZC5yZXR1cm5zKSB7XG4gICAgICBzdGF0ZW1lbnQgPSB0aGlzLndyYXBDb2xsZWN0aW9uKFxuICAgICAgICBzdGF0ZW1lbnQsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLnR5cGUsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLm9wdGlvbmFsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kLnJldHVybnMpIHtcbiAgICAgIHJldHVybiBgcmV0dXJuICR7c3RhdGVtZW50fTtgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7c3RhdGVtZW50fTtgO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgY29sbGVjdGlvbiBpbnRvIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIGVsc2UgcmV0dXJucyB0aGUgZXhpc3Rpbmcgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IFRoZSBzdGF0ZW1lbnQgdG8gd3JhcCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9wdGlvbmFsIFdoZXRoZXIgdGhlIHZhbHVlIGlzIG9wdGlvbmFsIChjYW4gYmUgbnVsbC91bmRlZmluZWQpIG9yIG5vdC5cbiAgICogQHJldHVybnMgVGhlIG1vZGlmaWVkIG9yIG9yaWdpbmFsIHN0YXRlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd3JhcENvbGxlY3Rpb24oXG4gICAgc3RhdGVtZW50OiBzdHJpbmcsXG4gICAgdHlwZTogc3BlYy5UeXBlUmVmZXJlbmNlLFxuICAgIG9wdGlvbmFsPzogYm9vbGVhbixcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoc3BlYy5pc0NvbGxlY3Rpb25UeXBlUmVmZXJlbmNlKHR5cGUpKSB7XG4gICAgICBsZXQgd3JhcHBlcjogc3RyaW5nO1xuICAgICAgc3dpdGNoICh0eXBlLmNvbGxlY3Rpb24ua2luZCkge1xuICAgICAgICBjYXNlIHNwZWMuQ29sbGVjdGlvbktpbmQuQXJyYXk6XG4gICAgICAgICAgd3JhcHBlciA9ICd1bm1vZGlmaWFibGVMaXN0JztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBzcGVjLkNvbGxlY3Rpb25LaW5kLk1hcDpcbiAgICAgICAgICB3cmFwcGVyID0gJ3VubW9kaWZpYWJsZU1hcCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbGxlY3Rpb24ga2luZDogJHt0eXBlLmNvbGxlY3Rpb24ua2luZCBhcyBhbnl9YCxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgXCJvcHRpb25hbFwiLCB0aGUgdmFsdWUgbmVlZHMgb3QgYmUgZXhwbGljaXRseSBjYXN0IHRvIGFsbG93IGZvciBjYXNlcyB3aGVyZSB0aGUgcmF3IHR5cGUgd2FzIHJldHVybmVkLlxuICAgICAgcmV0dXJuIG9wdGlvbmFsXG4gICAgICAgID8gYGphdmEudXRpbC5PcHRpb25hbC5vZk51bGxhYmxlKCgke3RoaXMudG9KYXZhVHlwZShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgKX0pKCR7c3RhdGVtZW50fSkpLm1hcChqYXZhLnV0aWwuQ29sbGVjdGlvbnM6OiR7d3JhcHBlcn0pLm9yRWxzZShudWxsKWBcbiAgICAgICAgOiBgamF2YS51dGlsLkNvbGxlY3Rpb25zLiR7d3JhcHBlcn0oJHtzdGF0ZW1lbnR9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWV0aG9kUGFyYW1ldGVycyhtZXRob2Q6IHNwZWMuQ2FsbGFibGUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcbiAgICBpZiAobWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgICAvLyBXZSBjYW4gcmVuZGVyIGNvdmFyaWFudCBwYXJhbWV0ZXJzIG9ubHkgZm9yIG1ldGhvZHMgdGhhdCBhcmVuJ3Qgb3ZlcnJpZGFibGUuLi4gc28gb25seSBmb3Igc3RhdGljIG1ldGhvZHMgY3VycmVudGx5LlxuICAgICAgICBwYXJhbXMucHVzaChcbiAgICAgICAgICBgZmluYWwgJHt0aGlzLnRvRGVjb3JhdGVkSmF2YVR5cGUocCwge1xuICAgICAgICAgICAgY292YXJpYW50OiAobWV0aG9kIGFzIHNwZWMuTWV0aG9kKS5zdGF0aWMsXG4gICAgICAgICAgfSl9JHtwLnZhcmlhZGljID8gJy4uLicgOiAnJ30gJHtKYXZhR2VuZXJhdG9yLnNhZmVKYXZhUHJvcGVydHlOYW1lKFxuICAgICAgICAgICAgcC5uYW1lLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcy5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBY2Nlc3NMZXZlbChtZXRob2Q6IHNwZWMuQ2FsbGFibGUgfCBzcGVjLlByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG1ldGhvZC5wcm90ZWN0ZWQgPyAncHJvdGVjdGVkJyA6ICdwdWJsaWMnO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlTW9kdWxlQ2xhc3MobW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudG9OYXRpdmVGcW4obW9kdWxlTmFtZSl9LiR7TU9EVUxFX0NMQVNTX05BTUV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE1vZHVsZUZpbGUobW9kOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IG1vZC5uYW1lO1xuICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gdGhpcy5tYWtlTW9kdWxlQ2xhc3MobW9kdWxlTmFtZSk7XG5cbiAgICBjb25zdCB7IGZpbGVQYXRoOiBtb2R1bGVSZXNGaWxlLCBuYW1lOiBtb2R1bGVSZXNOYW1lIH0gPVxuICAgICAgdGhpcy50b0phdmFSZXNvdXJjZVBhdGgobW9kLCBgJHttb2QubmFtZX0uJHtNT0RVTEVfQ0xBU1NfTkFNRX1gKTtcbiAgICB0aGlzLmNvZGUub3BlbkZpbGUobW9kdWxlUmVzRmlsZSk7XG4gICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS50eXBlcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuY29kZS5saW5lKGAke2Zxbn09JHt0aGlzLnRvTmF0aXZlRnFuKGZxbiwgeyBiaW5hcnlOYW1lOiB0cnVlIH0pfWApO1xuICAgIH1cbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKG1vZHVsZVJlc0ZpbGUpO1xuXG4gICAgY29uc3QgbW9kdWxlRmlsZSA9IHRoaXMudG9KYXZhRmlsZVBhdGgobW9kLCB7XG4gICAgICBhc3NlbWJseTogbW9kLm5hbWUsXG4gICAgICBmcW46IGAke21vZC5uYW1lfS4ke01PRFVMRV9DTEFTU19OQU1FfWAsXG4gICAgICBraW5kOiBzcGVjLlR5cGVLaW5kLkNsYXNzLFxuICAgICAgbmFtZTogTU9EVUxFX0NMQVNTX05BTUUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkZpbGUobW9kdWxlRmlsZSk7XG4gICAgdGhpcy5jb2RlLmxpbmUoYHBhY2thZ2UgJHt0aGlzLnRvTmF0aXZlTmFtZShtb2QpLnBhY2thZ2VOYW1lfTtgKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIGlmIChPYmplY3Qua2V5cyhtb2QuZGVwZW5kZW5jaWVzID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsnKTtcbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgfVxuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgnaW1wb3J0IGphdmEuaW8uUmVhZGVyOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5pby5VbmNoZWNrZWRJT0V4Y2VwdGlvbjsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5saW5lKCdpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsnKTtcbiAgICBpZiAoT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcyA/PyB7fSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsnKTtcbiAgICB9XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBqYXZhLnV0aWwuTWFwOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ltcG9ydCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpTW9kdWxlOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICB0aGlzLmNvZGUubGluZShBTk5fSU5URVJOQUwpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHVibGljIGZpbmFsIGNsYXNzICR7TU9EVUxFX0NMQVNTX05BTUV9IGV4dGVuZHMgSnNpaU1vZHVsZWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICdwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IE1PRFVMRV9UWVBFUyA9IGxvYWQoKTsnLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZCgpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOycpO1xuICAgIHRoaXMuY29kZS5saW5lKFxuICAgICAgYGZpbmFsIENsYXNzTG9hZGVyIGNsID0gJHtNT0RVTEVfQ0xBU1NfTkFNRX0uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0oXCIke21vZHVsZVJlc05hbWV9XCIpO2AsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgICcgICAgIGZpbmFsIFJlYWRlciByZCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICAnICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZCkpJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdici5saW5lcygpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJyAgLmZpbHRlcihsaW5lIC0+ICFsaW5lLnRyaW0oKS5pc0VtcHR5KCkpJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jaygnICAuZm9yRWFjaChsaW5lIC0+ICcpO1xuICAgIHRoaXMuY29kZS5saW5lKCdmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoXCI9XCIsIDIpOycpO1xuICAgIHRoaXMuY29kZS5saW5lKCdmaW5hbCBTdHJpbmcgZnFuID0gcGFydHNbMF07Jyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ2ZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBwYXJ0c1sxXTsnKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmVzdWx0LnB1dChmcW4sIGNsYXNzTmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLnVuaW5kZW50KCd9KTsnKTsgLy8gUHJveHkgZm9yIGNsb3NlQmxvY2tcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2NhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleGNlcHRpb24pJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3Rocm93IG5ldyBVbmNoZWNrZWRJT0V4Y2VwdGlvbihleGNlcHRpb24pOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiByZXN1bHQ7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAncHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gY2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7JyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCk7XG5cbiAgICAvLyBjdG9yXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhgcHVibGljICR7TU9EVUxFX0NMQVNTX05BTUV9KClgKTtcbiAgICB0aGlzLmNvZGUubGluZShcbiAgICAgIGBzdXBlcihcIiR7bW9kdWxlTmFtZX1cIiwgXCIke1xuICAgICAgICBtb2QudmVyc2lvblxuICAgICAgfVwiLCAke01PRFVMRV9DTEFTU19OQU1FfS5jbGFzcywgXCIke3RoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpfVwiKTtgLFxuICAgICk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTsgLy8gY3RvclxuXG4gICAgLy8gZGVwZW5kZW5jaWVzXG4gICAgaWYgKG1vZC5kZXBlbmRlbmNpZXMgJiYgT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVwcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgT2JqZWN0LmtleXMobW9kLmRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgZGVwcy5wdXNoKGAke3RoaXMubWFrZU1vZHVsZUNsYXNzKGRlcCl9LmNsYXNzYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgICAncHVibGljIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEpzaWlNb2R1bGU+PiBnZXREZXBlbmRlbmNpZXMoKScsXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlLmxpbmUoYHJldHVybiBhc0xpc3QoJHtkZXBzLmpvaW4oJywgJyl9KTtgKTtcbiAgICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUubGluZSgnQE92ZXJyaWRlJyk7XG4gICAgdGhpcy5jb2RlLm9wZW5CbG9jayhcbiAgICAgICdwcm90ZWN0ZWQgQ2xhc3M8Pz4gcmVzb2x2ZUNsYXNzKGZpbmFsIFN0cmluZyBmcW4pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uJyxcbiAgICApO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2lmICghTU9EVUxFX1RZUEVTLmNvbnRhaW5zS2V5KGZxbikpJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICAndGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oXCJVbmtub3duIEpTSUkgdHlwZTogXCIgKyBmcW4pOycsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuICAgIHRoaXMuY29kZS5saW5lKCdTdHJpbmcgY2xhc3NOYW1lID0gTU9EVUxFX1RZUEVTLmdldChmcW4pOycpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soJ2lmICghdGhpcy5jYWNoZS5jb250YWluc0tleShjbGFzc05hbWUpKScpO1xuICAgIHRoaXMuY29kZS5saW5lKCd0aGlzLmNhY2hlLnB1dChjbGFzc05hbWUsIHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSkpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3JldHVybiB0aGlzLmNhY2hlLmdldChjbGFzc05hbWUpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdwcml2YXRlIENsYXNzPD8+IGZpbmRDbGFzcyhmaW5hbCBTdHJpbmcgYmluYXJ5TmFtZSknKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCd0cnknKTtcbiAgICB0aGlzLmNvZGUubGluZSgncmV0dXJuIENsYXNzLmZvck5hbWUoYmluYXJ5TmFtZSk7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKCdjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pJyk7XG4gICAgdGhpcy5jb2RlLmxpbmUoJ3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Jyk7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUobW9kdWxlRmlsZSk7XG5cbiAgICByZXR1cm4gbW9kdWxlQ2xhc3M7XG4gIH1cblxuICBwcml2YXRlIGVtaXRKc2lpSW5pdGlhbGl6ZXJzKGNsczogc3BlYy5DbGFzc1R5cGUpIHtcbiAgICB0aGlzLmNvZGUubGluZSgpO1xuICAgIHRoaXMuY29kZS5vcGVuQmxvY2soXG4gICAgICBgcHJvdGVjdGVkICR7Y2xzLm5hbWV9KGZpbmFsIHNvZnR3YXJlLmFtYXpvbi5qc2lpLkpzaWlPYmplY3RSZWYgb2JqUmVmKWAsXG4gICAgKTtcbiAgICB0aGlzLmNvZGUubGluZSgnc3VwZXIob2JqUmVmKTsnKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgdGhpcy5jb2RlLmxpbmUoKTtcbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrKFxuICAgICAgYHByb3RlY3RlZCAke2Nscy5uYW1lfShmaW5hbCBzb2Z0d2FyZS5hbWF6b24uanNpaS5Kc2lpT2JqZWN0LkluaXRpYWxpemF0aW9uTW9kZSBpbml0aWFsaXphdGlvbk1vZGUpYCxcbiAgICApO1xuICAgIHRoaXMuY29kZS5saW5lKCdzdXBlcihpbml0aWFsaXphdGlvbk1vZGUpOycpO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGphdmEgRlFOIGZvciBhIEpTSUkgRlFOOlxuICAgKiAxLiBEZXRlcm1pbmUgd2hpY2ggYXNzZW1ibHkgdGhlIEZRTiBiZWxvbmdzIHRvIChmaXJzdCBjb21wb25lbnQgb2YgdGhlIEZRTilcbiAgICogMi4gTG9jYXRlIHRoZSBgdGFyZ2V0cy5qYXZhLnBhY2thZ2VgIHZhbHVlIGZvciB0aGF0IGFzc2VtYmx5ICh0aGlzIGFzc2VtYmx5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcylcbiAgICogMy4gUmV0dXJuIHRoZSBqYXZhIEZRTjogYGA8bW9kdWxlLnRhcmdldHMuamF2YS5wYWNrYWdlPi48RlFOIHN0aXBwZWQgb2YgZmlyc3QgY29tcG9uZW50PmBgXG4gICAqXG4gICAqIFJlY29yZHMgYW4gYXNzZW1ibHkgcmVmZXJlbmNlIGlmIHRoZSByZWZlcmVuY2VkIEZRTiBjb21lcyBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LlxuICAgKlxuICAgKiBAcGFyYW0gZnFuIHRoZSBKU0lJIEZRTiB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBKYXZhIEZRTi5cbiAgICpcbiAgICogQHRocm93cyBpZiB0aGUgYXNzZW1ibHkgdGhlIEZRTiBiZWxvbmdzIHRvIGRvZXMgbm90IGhhdmUgYSBgdGFyZ2V0cy5qYXZhLnBhY2thZ2VgIHNldC5cbiAgICovXG4gIHByaXZhdGUgdG9OYXRpdmVGcW4oXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgeyBiaW5hcnlOYW1lIH06IHsgYmluYXJ5TmFtZTogYm9vbGVhbiB9ID0geyBiaW5hcnlOYW1lOiBmYWxzZSB9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IFttb2RdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZGVwTW9kID0gdGhpcy5maW5kTW9kdWxlKG1vZCk7XG4gICAgLy8gTWFrZSBzdXJlIGFueSBkZXBlbmRlbmN5IChkaXJlY3Qgb3IgdHJhbnNpdGl2ZSkgb2Ygd2hpY2ggYW55IHR5cGUgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkIGJ5IHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBjb2RlIGlzIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgUE9NJ3MgZGVwZW5kZW5jaWVzIHNlY3Rpb24gKHByb3RlY3RpbmcgdGhlIGFydGlmYWN0IGZyb20gY2hhbmdlcyBpbiB0aGVcbiAgICAvLyBkZXBlbmRlbmNpZXMnIGRlcGVuZGVuY3kgc3RydWN0dXJlKS5cbiAgICBpZiAobW9kICE9PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlZE1vZHVsZXNbbW9kXSA9IGRlcE1vZDtcblxuICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRyYW5zbGF0ZUZxbih7IC4uLmRlcE1vZCwgbmFtZTogbW9kIH0sIGZxbik7XG4gICAgICByZXR1cm4gW3RyYW5zbGF0ZWQucGFja2FnZU5hbWUsIC4uLnRyYW5zbGF0ZWQudHlwZU5hbWVzXS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlTmFtZSwgdHlwZU5hbWUgfSA9XG4gICAgICBmcW4gPT09IHRoaXMuYXNzZW1ibHkubmFtZVxuICAgICAgICA/IHRoaXMudG9OYXRpdmVOYW1lKHRoaXMuYXNzZW1ibHkpXG4gICAgICAgIDogdGhpcy50b05hdGl2ZU5hbWUodGhpcy5hc3NlbWJseSwgdGhpcy5hc3NlbWJseS50eXBlcyFbZnFuXSk7XG4gICAgY29uc3QgY2xhc3NOYW1lID1cbiAgICAgIHR5cGVOYW1lICYmIGJpbmFyeU5hbWUgPyB0eXBlTmFtZS5yZXBsYWNlKCcuJywgJyQnKSA6IHR5cGVOYW1lO1xuICAgIHJldHVybiBgJHtwYWNrYWdlTmFtZX0ke2NsYXNzTmFtZSA/IGAuJHtjbGFzc05hbWV9YCA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgSmF2YSBuYW1lIGZvciBhIGpzaWkgYXNzZW1ibHkgb3IgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIGFzc20gVGhlIGFzc2VtYmx5IHRoYXQgY29udGFpbnMgdGhlIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgd2Ugd2FudCB0aGUgbmFtZSBvZlxuICAgKi9cbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHR5cGVOYW1lOiB1bmRlZmluZWQ7XG4gIH07XG4gIHByaXZhdGUgdG9OYXRpdmVOYW1lKFxuICAgIGFzc206IHNwZWMuQXNzZW1ibHksXG4gICAgdHlwZTogc3BlYy5UeXBlLFxuICApOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSB0b05hdGl2ZU5hbWUoXG4gICAgYXNzbTogc3BlYy5Bc3NlbWJseSxcbiAgICB0eXBlPzogc3BlYy5UeXBlLFxuICApOiB7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHR5cGVOYW1lPzogc3RyaW5nIH0ge1xuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIHsgcGFja2FnZU5hbWU6IHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc20pIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRyYW5zbGF0ZUZxbihhc3NtLCB0eXBlLmZxbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhY2thZ2VOYW1lOiB0cmFuc2xhdGVkLnBhY2thZ2VOYW1lLFxuICAgICAgdHlwZU5hbWU6IHRyYW5zbGF0ZWQudHlwZU5hbWVzLmpvaW4oJy4nKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGBgQEdlbmVyYXRlZGBgIGFubm90YXRpb24gaG9ub3JpbmcgdGhlIGBgdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9gYCBzZXR0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0R2VuZXJhdGVkQW5ub3RhdGlvbigpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5lbWl0RnVsbEdlbmVyYXRvckluZm9cbiAgICAgID8gYCwgZGF0ZSA9IFwiJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGdlbmVyYXRvciA9IHRoaXMuZW1pdEZ1bGxHZW5lcmF0b3JJbmZvXG4gICAgICA/IGBqc2lpLXBhY21hay8ke1ZFUlNJT05fREVTQ31gXG4gICAgICA6ICdqc2lpLXBhY21hayc7XG4gICAgdGhpcy5jb2RlLmxpbmUoXG4gICAgICBgQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkKHZhbHVlID0gXCIke2dlbmVyYXRvcn1cIiR7ZGF0ZX0pYCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RXhhbXBsZShleGFtcGxlOiBzdHJpbmcsIGFwaTogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlRXhhbXBsZShcbiAgICAgIGFwaSxcbiAgICAgIGV4YW1wbGUsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5KQVZBLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U2FtcGxlc0luTWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGksXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLkpBVkEsXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5zIHRoZSBKYXZhIEZRTiBvZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2VzIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIHdoZW4gYSBuZXdcbiAgICogZGVmYXVsdCBpbnRlcmZhY2Ugb3IgcHJveHkgY2xhc3MgaXMgYmVpbmcgZW1pdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgZm9yIHdoaWNoIGEgZGVmYXVsdCBpbnRlcmZhY2Ugb3IgcHJveHkgaXMgZW1pdHRlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVUaGlzVHlwZSB3aGV0aGVyIHRoaXMgY2xhc3MncyBkZWZhdWx0IGludGVyZmFjZSBzaG91bGQgYmUgaW5jbHVkZWQgb3Igbm90LlxuICAgKlxuICAgKiBAcmV0dXJucyBhIGxpc3Qgb2YgSmF2YSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMuXG4gICAqL1xuICBwcml2YXRlIGRlZmF1bHRJbnRlcmZhY2VzRm9yKFxuICAgIHR5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlIHwgcmVmbGVjdC5JbnRlcmZhY2VUeXBlLFxuICAgIHsgaW5jbHVkZVRoaXNUeXBlID0gZmFsc2UgfTogeyBpbmNsdWRlVGhpc1R5cGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgaWYgKFxuICAgICAgaW5jbHVkZVRoaXNUeXBlICYmXG4gICAgICBoYXNEZWZhdWx0SW50ZXJmYWNlcyh0eXBlLmFzc2VtYmx5KSAmJlxuICAgICAgdHlwZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICkge1xuICAgICAgcmVzdWx0LmFkZChcbiAgICAgICAgYCR7dGhpcy50b05hdGl2ZUZxbih0eXBlLmZxbil9LiR7SU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiB0eXBlLmludGVyZmFjZXMpIHtcbiAgICAgICAgaWYgKGhhc0RlZmF1bHRJbnRlcmZhY2VzKGlmYWNlLmFzc2VtYmx5KSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoXG4gICAgICAgICAgICBgJHt0aGlzLnRvTmF0aXZlRnFuKGlmYWNlLmZxbil9LiR7SU5URVJGQUNFX0RFRkFVTFRfQ0xBU1NfTkFNRX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGVmYXVsdEludGVyZmFjZXNGb3IoaWZhY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGUuaXNDbGFzc1R5cGUoKSAmJiB0eXBlLmJhc2UgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kZWZhdWx0SW50ZXJmYWNlc0Zvcih0eXBlLmJhc2UpKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG1vZGVscyB0aGUgUE9NIHNjaGVtYSBmb3IgYSA8ZGVwZW5kZW5jeT4gZW50aXR5XG4gKiBAc2VlIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9wb20uaHRtbCNEZXBlbmRlbmNpZXNcbiAqL1xuaW50ZXJmYWNlIE1hdmVuRGVwZW5kZW5jeSB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgYXJ0aWZhY3RJZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgdHlwZT86IHN0cmluZztcbiAgc2NvcGU/OiAnY29tcGlsZScgfCAncHJvdmlkZWQnIHwgJ3J1bnRpbWUnIHwgJ3Rlc3QnIHwgJ3N5c3RlbSc7XG4gIHN5c3RlbVBhdGg/OiBzdHJpbmc7XG4gIG9wdGlvbmFsPzogYm9vbGVhbjtcblxuICAnI2NvbW1lbnQnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBgQGpzaWkvamF2YS1ydW50aW1lYCBwYWNrYWdlIGZyb20gdGhlIGxvY2FsIHJlcG9zaXRvcnkuXG4gKiBJZiBpdCBjb250YWlucyBhIFwibWF2ZW4tcmVwb1wiIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSBhZGRlZCBhcyBhIGxvY2FsIG1hdmVuIHJlcG9cbiAqIHNvIHdoZW4gd2UgYnVpbGQgbG9jYWxseSwgd2UgYnVpbGQgYWdhaW5zdCBpdCBhbmQgbm90IGFnYWluc3QgdGhlIG9uZSBwdWJsaXNoZWRcbiAqIHRvIE1hdmVuIENlbnRyYWwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRKYXZhUnVudGltZUxvY2FsUmVwb3NpdG9yeSgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGphdmFSdW50aW1lID0gcmVxdWlyZSgnQGpzaWkvamF2YS1ydW50aW1lJyk7XG4gICAgbG9nZ2luZy5pbmZvKFxuICAgICAgYFVzaW5nIGxvY2FsIHZlcnNpb24gb2YgdGhlIEphdmEganNpaSBydW50aW1lIHBhY2thZ2UgYXQ6ICR7amF2YVJ1bnRpbWUucmVwb3NpdG9yeX1gLFxuICAgICk7XG4gICAgcmV0dXJuIGphdmFSdW50aW1lLnJlcG9zaXRvcnk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOdWxsYWJsZShvcHRpb25hbFZhbHVlOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFvcHRpb25hbFZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgb3B0aW9uYWxWYWx1ZS5vcHRpb25hbCB8fFxuICAgIChzcGVjLmlzUHJpbWl0aXZlVHlwZVJlZmVyZW5jZShvcHRpb25hbFZhbHVlLnR5cGUpICYmXG4gICAgICBvcHRpb25hbFZhbHVlLnR5cGUucHJpbWl0aXZlID09PSBzcGVjLlByaW1pdGl2ZVR5cGUuQW55KVxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJhbUphdmFkb2MoXG4gIG5hbWU6IHN0cmluZyxcbiAgb3B0aW9uYWw/OiBib29sZWFuLFxuICBzdW1tYXJ5Pzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBbJ0BwYXJhbScsIG5hbWVdO1xuICBpZiAoc3VtbWFyeSkge1xuICAgIHBhcnRzLnB1c2goZW5kV2l0aFBlcmlvZChzdW1tYXJ5KSk7XG4gIH1cbiAgaWYgKCFvcHRpb25hbCkge1xuICAgIHBhcnRzLnB1c2goJ1RoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gZW5kV2l0aFBlcmlvZChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzID0gcy50cmltUmlnaHQoKTtcbiAgaWYgKCFzLmVuZHNXaXRoKCcuJykpIHtcbiAgICByZXR1cm4gYCR7c30uYDtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU92ZXJyaWRlczxUIGV4dGVuZHMgeyBwYXJhbTogc3BlYy5QYXJhbWV0ZXIgfT4oXG4gIGFsbFBhcmFtczogVFtdLFxuKTogSXRlcmFibGU8VFtdPiB7XG4gIHJldHVybiB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06IGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCBhbGxQYXJhbXM7XG4gICAgICB3aGlsZSAoYWxsUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtID0gYWxsUGFyYW1zW2FsbFBhcmFtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFsYXN0UGFyYW0ucGFyYW0udmFyaWFkaWMgJiYgIWxhc3RQYXJhbS5wYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIC8vIE5laXRoZXIgdmFyaWFkaWMgbm9yIG9wdGlvbmFsIC0tIHdlJ3JlIGRvbmUgaGVyZSFcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWxsUGFyYW1zID0gYWxsUGFyYW1zLnNsaWNlKDAsIGFsbFBhcmFtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgLy8gSWYgdGhlIGxhc3RQYXJhbSB3YXMgdmFyaWFkaWMsIHdlIHNob3VsZG4ndCBnZW5lcmF0ZSBhbiBvdmVycmlkZSB3aXRob3V0IGl0IG9ubHkuXG4gICAgICAgIGlmIChsYXN0UGFyYW0ucGFyYW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICB5aWVsZCBhbGxQYXJhbXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG50eXBlIEFzc2VtYmx5TGlrZSA9IHNwZWMuQXNzZW1ibHlDb25maWd1cmF0aW9uICYgeyBuYW1lOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5hdGl2ZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBhc3NlbWJseVxuICovXG5mdW5jdGlvbiBwYWNrYWdlTmFtZUZyb21Bc3NlbWJseShhc3NtOiBBc3NlbWJseUxpa2UpIHtcbiAgY29uc3QgamF2YVBhY2thZ2UgPSBhc3NtLnRhcmdldHM/LmphdmE/LnBhY2thZ2U7XG4gIGlmICghamF2YVBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIG1vZHVsZSAke2Fzc20ubmFtZX0gZG9lcyBub3QgaGF2ZSBhIGphdmEucGFja2FnZSBzZXR0aW5nYCxcbiAgICApO1xuICB9XG4gIHJldHVybiBqYXZhUGFja2FnZTtcbn1cblxuLyoqXG4gKiBBbmFseXplcyBhbmQgdHJhbnNsYXRlcyBhIGpzaWkgRlFOIHRvIEphdmEgY29tcG9uZW50c1xuICpcbiAqIFRoZSBGUU4gY2FuIGJlIG9mIHRoZSBhc3NlbWJseSwgYSBzdWJtb2R1bGUsIG9yIGEgdHlwZS5cbiAqXG4gKiBBbnkgdHlwZSBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAqXG4gKiAtIExvY2F0ZWQgaW4gemVybyBvciBtb3JlIG5lc3RlZCBzdWJtb2R1bGVzLiBBbnkgb2YgdGhlc2UgY2FuIGhhdmUgYSBKYXZhXG4gKiAgIHBhY2thZ2UgbmFtZSBhc3NpZ25lZC0taWYgbm9uZSwgdGhlIG5hbWUgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJ5XG4gKiAgIHNuYWtlIGNhc2luZy4gQXQgbGVhc3QgdGhlIGFzc2VtYmx5IG11c3QgaGF2ZSBhIEphdmEgcGFja2FnZSBuYW1lIGFzc2lnbmVkLlxuICogLSBMb2NhdGVkIGluIHplcm8gb3IgbW9yZSBuZXN0ZWQgdHlwZXMgKGNsYXNzZXMpLlxuICpcbiAqIEZpbmQgdXAgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHVudGlsIHdlIGZpbmQgYSBzdWJtb2R1bGUgKG9yIHRoZSBhc3NlbWJseVxuICogaXRzZWxmKSB0aGF0IGhhcyBhbiBleHBsaWNpdCBKYXZhIHBhY2thZ2UgbmFtZSBkZWZpbmVkLlxuICpcbiAqIEFwcGVuZCBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCB3ZSBjcm9zc2VkIHRoYXQgZGlkbid0IGhhdmUgYSBwYWNrYWdlIG5hbWUgZGVmaW5lZC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSBkZXRlcm1pbmVkIHRoaXMgd2F5LCBhcyB3ZWxsIGFzIHRoZSBoaWVyYXJjaHkgb2YgdHlwZVxuICogbmFtZXMgaW5zaWRlIHRoZSBwYWNrYWdlLiBgdHlwZU5hbWVzYCBtYXkgYmUgbWlzc2luZyBvciBlbXB0eSBpZiB0aGUgRlFOIGluZGljYXRlZFxuICogdGhlIGFzc2VtYmx5IG9yIGEgc3VibW9kdWxlLCBjb250YWlucyAxIGVsZW1lbnQgaWYgdGhlIEZRTiBpbmRpY2F0ZWQgYSB0b3AtbGV2ZWwgdHlwZSxcbiAqIG11bHRpcGxlIGVsZW1lbnRzIGlmIHRoZSBGUU4gaW5kaWNhdGVkIGEgbmVzdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZUZxbihcbiAgYXNzbTogQXNzZW1ibHlMaWtlLFxuICBvcmlnaW5hbEZxbjogc3RyaW5nLFxuKTogeyBwYWNrYWdlTmFtZTogc3RyaW5nOyB0eXBlTmFtZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBpbXBsaWNpdFBhY2thZ2VOYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgLy8gV2Ugd29yayBvdXJzZWx2ZXMgdXB3YXJkIHRocm91Z2ggdGhlIEZRTiB1bnRpbCB3ZSd2ZSBmb3VuZCBhbiBleHBsaWNpdCBwYWNrYWdlXG4gIGxldCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lRnJvbUFzc2VtYmx5KGFzc20pO1xuICBsZXQgZnFuID0gb3JpZ2luYWxGcW47XG4gIHdoaWxlIChmcW4gIT09ICcnICYmIGZxbiAhPT0gYXNzbS5uYW1lKSB7XG4gICAgY29uc3QgW3BhcmVudEZxbiwgbGFzdFBhcnRdID0gc3BsaXROYW1lc3BhY2UoZnFuKTtcblxuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IGFzc20uc3VibW9kdWxlcz8uW2Zxbl07XG4gICAgaWYgKHN1Ym1vZHVsZSkge1xuICAgICAgY29uc3QgZXhwbGljaXRQYWNrYWdlID0gc3VibW9kdWxlLnRhcmdldHM/LmphdmE/LnBhY2thZ2U7XG4gICAgICBpZiAoZXhwbGljaXRQYWNrYWdlKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gZXhwbGljaXRQYWNrYWdlO1xuICAgICAgICAvLyBXZSBjYW4gc3RvcCByZWN1cnNpbmcsIHR5cGVzIGNhbm5vdCBiZSB0aGUgcGFyZW50IG9mIGEgbW9kdWxlIGFuZCBub3RoaW5nIHVwd2FyZHMgY2FuIGNoYW5nZVxuICAgICAgICAvLyB0aGUgcGFja2FnZSBuYW1lIGFueW1vcmVcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbXBsaWNpdFBhY2thZ2VOYW1lcy51bnNoaWZ0KGAuJHt0b1NuYWtlQ2FzZShsYXN0UGFydCl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGl0J3Mgbm90IGEgc3VibW9kdWxlLCBpdCBtdXN0IGJlIGEgdHlwZS5cbiAgICAgIHR5cGVOYW1lcy51bnNoaWZ0KGxhc3RQYXJ0KTtcbiAgICB9XG5cbiAgICBmcW4gPSBwYXJlbnRGcW47XG4gIH1cbiAgaWYgKGZxbiA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICcke29yaWdpbmFsRnFufScgaW5zaWRlICcke2Fzc20ubmFtZX0nYCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZTogYCR7cGFja2FnZU5hbWV9JHtpbXBsaWNpdFBhY2thZ2VOYW1lcy5qb2luKCcnKX1gLFxuICAgIHR5cGVOYW1lcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGFzc2VtYmx5IGV4cG9zZXMgdGhlIFwiaGFzRGVmYXVsdEludGVyZmFjZXNcIlxuICoganNpaS1wYWNtYWsgZmVhdHVyZSBmbGFnLlxuICpcbiAqIEBwYXJhbSBhc3NlbWJseSB0aGUgYXNzZW1ibHkgdGhhdCBpcyB0ZXN0ZWRcbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBKc2lpJERlZmF1bHQgaW50ZXJmYWNlcyBjYW4gYmUgdXNlZFxuICovXG5mdW5jdGlvbiBoYXNEZWZhdWx0SW50ZXJmYWNlcyhhc3NlbWJseTogcmVmbGVjdC5Bc3NlbWJseSk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFhc3NlbWJseS5tZXRhZGF0YT8uanNpaT8ucGFjbWFrPy5oYXNEZWZhdWx0SW50ZXJmYWNlcztcbn1cblxuLyoqXG4gKiBXaGVja3Mgd2hldGhlciBhIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBtZXRob2Qgb24gYGphdmEubGFuZy5PYmplY3RgLiBJdCBpcyBub3RcbiAqIHBvc3NpYmxlIHRvIGVtaXQgZGVmYXVsdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHRob3NlIG5hbWVzIGJlY2F1c2VcbiAqIHRoZXNlIHdvdWxkIGFsd2F5cyBiZSByZXBsYWNlZCBieSB0aGUgaW1wbGVtZW50YXRpb25zIG9uIGBPYmplY3RgLlxuICpcbiAqIEBwYXJhbSBuYW1lIHRoZSBjaGVja2VkIG5hbWVcbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gaXNKYXZhTGFuZ09iamVjdE1ldGhvZE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBKQVZBX0xBTkdfT0JKRUNUX01FVEhPRF9OQU1FUy5oYXMobmFtZSk7XG59XG5jb25zdCBKQVZBX0xBTkdfT0JKRUNUX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQoW1xuICAnY2xvbmUnLFxuICAnZXF1YWxzJyxcbiAgJ2ZpbmFsaXplJyxcbiAgJ2dldENsYXNzJyxcbiAgJ2hhc2hDb2RlJyxcbiAgJ25vdGlmeScsXG4gICdub3RpZnlBbGwnLFxuICAndG9TdHJpbmcnLFxuICAnd2FpdCcsXG5dKTtcblxuLyoqXG4gKiBJbiBhIGRvdHRlZCBzdHJpbmcsIHN0cmlwIG9mZiB0aGUgbGFzdCBkb3R0ZWQgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIHNwbGl0TmFtZXNwYWNlKG5zOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgZG90ID0gbnMubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGRvdCA9PT0gLTEpIHtcbiAgICByZXR1cm4gWycnLCBuc107XG4gIH1cbiAgcmV0dXJuIFtucy5zbGljZSgwLCBkb3QpLCBucy5zbGljZShkb3QgKyAxKV07XG59XG4iXX0=
2359
+ /**
2360
+ * Escape a string for dropping into JavaDoc
2361
+ */
2362
+ function escape(s) {
2363
+ return s.replace(/["\\<>&]/g, (c) => `&#${c.charCodeAt(0)};`);
2364
+ }
2365
+ //# sourceMappingURL=java.js.map