@fjall/components-infrastructure 0.88.1 → 0.88.4

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 (146) hide show
  1. package/dist/lib/app.d.ts +34 -11
  2. package/dist/lib/app.js +83 -39
  3. package/dist/lib/aspects/index.d.ts +1 -0
  4. package/dist/lib/aspects/index.js +6 -0
  5. package/dist/lib/config/aws/accountAuditRole.d.ts +20 -0
  6. package/dist/lib/config/aws/accountAuditRole.js +38 -0
  7. package/dist/lib/config/aws/accountMonitoringRole.d.ts +22 -0
  8. package/dist/lib/config/aws/accountMonitoringRole.js +133 -0
  9. package/dist/lib/config/aws/cloudTrail.d.ts +0 -3
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +26 -14
  12. package/dist/lib/config/aws/ecrDefaultImage.js +4 -3
  13. package/dist/lib/config/aws/identityCenter.d.ts +4 -4
  14. package/dist/lib/config/aws/identityCenter.js +17 -62
  15. package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -37
  16. package/dist/lib/config/aws/index.d.ts +4 -7
  17. package/dist/lib/config/aws/index.js +5 -8
  18. package/dist/lib/config/aws/oidcConnector.d.ts +8 -0
  19. package/dist/lib/config/aws/oidcConnector.js +46 -0
  20. package/dist/lib/config/aws/platform.d.ts +2 -0
  21. package/dist/lib/config/aws/platform.js +6 -0
  22. package/dist/lib/config/index.d.ts +2 -0
  23. package/dist/lib/config/index.js +21 -0
  24. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
  25. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  26. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
  27. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  28. package/dist/lib/patterns/aws/account.js +45 -19
  29. package/dist/lib/patterns/aws/cdn.d.ts +19 -40
  30. package/dist/lib/patterns/aws/cdn.js +21 -17
  31. package/dist/lib/patterns/aws/compute.d.ts +6 -7
  32. package/dist/lib/patterns/aws/compute.js +7 -9
  33. package/dist/lib/patterns/aws/database.d.ts +9 -89
  34. package/dist/lib/patterns/aws/database.js +17 -40
  35. package/dist/lib/patterns/aws/index.d.ts +1 -1
  36. package/dist/lib/patterns/aws/index.js +2 -2
  37. package/dist/lib/patterns/aws/interfaces/cdn.d.ts +26 -0
  38. package/dist/lib/patterns/aws/interfaces/cdn.js +14 -0
  39. package/dist/lib/patterns/aws/interfaces/connector.d.ts +4 -181
  40. package/dist/lib/patterns/aws/interfaces/connector.js +16 -113
  41. package/dist/lib/patterns/aws/interfaces/index.d.ts +1 -0
  42. package/dist/lib/patterns/aws/interfaces/index.js +5 -2
  43. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +6 -6
  44. package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
  45. package/dist/lib/patterns/aws/network.js +6 -9
  46. package/dist/lib/patterns/aws/organisation.d.ts +6 -17
  47. package/dist/lib/patterns/aws/organisation.js +22 -67
  48. package/dist/lib/patterns/aws/payload.js +11 -12
  49. package/dist/lib/patterns/aws/storage.d.ts +3 -2
  50. package/dist/lib/patterns/aws/storage.js +1 -1
  51. package/dist/lib/resources/aws/audit/auditRole.js +4 -4
  52. package/dist/lib/resources/aws/audit/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/audit/index.js +6 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.js +3 -2
  55. package/dist/lib/resources/aws/backup/backupVault.js +5 -3
  56. package/dist/lib/resources/aws/base/awsStack.d.ts +4 -2
  57. package/dist/lib/resources/aws/base/awsStack.js +8 -2
  58. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +14 -0
  59. package/dist/lib/resources/aws/cdn/cloudFront.js +52 -18
  60. package/dist/lib/resources/aws/compute/ec2.js +18 -22
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -8
  62. package/dist/lib/resources/aws/compute/ecs.js +53 -41
  63. package/dist/lib/resources/aws/compute/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/compute/index.js +2 -1
  65. package/dist/lib/resources/aws/compute/lambda.d.ts +12 -3
  66. package/dist/lib/resources/aws/compute/lambda.js +48 -36
  67. package/dist/lib/resources/aws/database/dynamodb.js +3 -13
  68. package/dist/lib/resources/aws/database/index.d.ts +8 -2
  69. package/dist/lib/resources/aws/database/index.js +19 -3
  70. package/dist/lib/resources/aws/database/rdsAurora.d.ts +2 -3
  71. package/dist/lib/resources/aws/database/rdsAurora.js +33 -69
  72. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +6 -6
  73. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +25 -29
  74. package/dist/lib/resources/aws/database/rdsDefaults.d.ts +11 -0
  75. package/dist/lib/resources/aws/database/rdsDefaults.js +15 -0
  76. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +39 -0
  77. package/dist/lib/resources/aws/database/rdsHelpers.js +75 -0
  78. package/dist/lib/resources/aws/database/rdsInstance.d.ts +7 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.js +40 -84
  80. package/dist/lib/resources/aws/database/rdsProxyOutput.d.ts +7 -0
  81. package/dist/lib/resources/aws/database/rdsProxyOutput.js +18 -0
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
  83. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -45
  84. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
  85. package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -82
  86. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -93
  88. package/dist/lib/resources/aws/iam/index.d.ts +0 -1
  89. package/dist/lib/resources/aws/iam/index.js +1 -2
  90. package/dist/lib/resources/aws/index.d.ts +0 -1
  91. package/dist/lib/resources/aws/index.js +1 -2
  92. package/dist/lib/resources/aws/logging/cloudTrail.js +13 -3
  93. package/dist/lib/resources/aws/logging/index.d.ts +2 -0
  94. package/dist/lib/resources/aws/logging/index.js +19 -0
  95. package/dist/lib/resources/aws/messaging/index.d.ts +3 -2
  96. package/dist/lib/resources/aws/messaging/index.js +4 -3
  97. package/dist/lib/resources/aws/messaging/sqs.js +14 -11
  98. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -2
  99. package/dist/lib/resources/aws/messaging/utils.js +3 -4
  100. package/dist/lib/resources/aws/monitoring/index.d.ts +0 -1
  101. package/dist/lib/resources/aws/monitoring/index.js +4 -17
  102. package/dist/lib/resources/aws/networking/hostedZone.d.ts +28 -0
  103. package/dist/lib/resources/aws/networking/hostedZone.js +153 -0
  104. package/dist/lib/resources/aws/networking/index.d.ts +2 -0
  105. package/dist/lib/resources/aws/networking/index.js +3 -1
  106. package/dist/lib/resources/aws/networking/ipamPool.js +110 -31
  107. package/dist/lib/resources/aws/networking/securityGroup.d.ts +5 -0
  108. package/dist/lib/resources/aws/networking/securityGroup.js +14 -0
  109. package/dist/lib/resources/aws/networking/vpc.js +9 -4
  110. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +17 -0
  111. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +66 -0
  112. package/dist/lib/resources/aws/organisation/index.d.ts +1 -0
  113. package/dist/lib/resources/aws/organisation/index.js +4 -2
  114. package/dist/lib/resources/aws/secrets/index.d.ts +0 -1
  115. package/dist/lib/resources/aws/secrets/index.js +1 -2
  116. package/dist/lib/resources/aws/secrets/parameter.js +5 -3
  117. package/dist/lib/resources/aws/storage/ecr.d.ts +0 -1
  118. package/dist/lib/resources/aws/storage/ecr.js +5 -7
  119. package/dist/lib/resources/aws/storage/s3.d.ts +3 -3
  120. package/dist/lib/resources/aws/storage/s3.js +1 -1
  121. package/dist/lib/resources/aws/utilities/index.d.ts +5 -0
  122. package/dist/lib/resources/aws/utilities/index.js +22 -0
  123. package/dist/lib/utils/backupTierMapping.d.ts +11 -0
  124. package/dist/lib/utils/backupTierMapping.js +17 -0
  125. package/dist/lib/utils/capitaliseString.d.ts +6 -0
  126. package/dist/lib/utils/capitaliseString.js +10 -1
  127. package/dist/lib/utils/connections.d.ts +46 -0
  128. package/dist/lib/utils/connections.js +159 -0
  129. package/dist/lib/utils/connector.d.ts +183 -0
  130. package/dist/lib/utils/connector.js +117 -0
  131. package/dist/lib/utils/databaseTypes.d.ts +85 -0
  132. package/dist/lib/utils/databaseTypes.js +34 -0
  133. package/dist/lib/utils/env.d.ts +42 -0
  134. package/dist/lib/utils/env.js +128 -0
  135. package/dist/lib/utils/getConfig.d.ts +0 -2
  136. package/dist/lib/utils/getConfig.js +1 -4
  137. package/dist/lib/utils/index.d.ts +6 -0
  138. package/dist/lib/utils/index.js +7 -1
  139. package/dist/lib/utils/removalPolicy.d.ts +2 -0
  140. package/dist/lib/utils/removalPolicy.js +16 -0
  141. package/dist/lib/utils/resourceNaming.js +4 -7
  142. package/dist/lib/utils/standardTagsAspect.d.ts +4 -0
  143. package/dist/lib/utils/standardTagsAspect.js +8 -8
  144. package/dist/lib/utils/vpcUtils.d.ts +14 -0
  145. package/dist/lib/utils/vpcUtils.js +28 -0
  146. package/package.json +8 -8
@@ -17,7 +17,7 @@ Object.defineProperty(exports, "isCompute", { enumerable: true, get: function ()
17
17
  Object.defineProperty(exports, "isEcsCompute", { enumerable: true, get: function () { return compute_js_1.isEcsCompute; } });
18
18
  Object.defineProperty(exports, "isLambdaCompute", { enumerable: true, get: function () { return compute_js_1.isLambdaCompute; } });
19
19
  Object.defineProperty(exports, "isEc2Compute", { enumerable: true, get: function () { return compute_js_1.isEc2Compute; } });
20
- const connections_js_1 = require("./connections.js");
20
+ const connections_js_1 = require("../../utils/connections.js");
21
21
  const validationLogger_js_1 = require("../../utils/validationLogger.js");
22
22
  const ecs_1 = require("../../resources/aws/compute/ecs");
23
23
  Object.defineProperty(exports, "ScalingType", { enumerable: true, get: function () { return ecs_1.ScalingType; } });
@@ -27,19 +27,16 @@ exports.COMPUTE_TYPE_CONFIG = {
27
27
  ecs: {
28
28
  defaultPort: 80,
29
29
  defaultScaling: { minCapacity: 2, maxCapacity: 5 },
30
- supportsConnections: true,
31
30
  requiresVpc: true
32
31
  },
33
32
  ec2: {
34
33
  defaultPort: 22,
35
34
  defaultScaling: { minCapacity: 2, maxCapacity: 3 },
36
- supportsConnections: true,
37
35
  requiresVpc: true
38
36
  },
39
37
  lambda: {
40
38
  defaultPort: 0,
41
39
  defaultScaling: { minCapacity: 0, maxCapacity: 100 },
42
- supportsConnections: false,
43
40
  requiresVpc: false
44
41
  }
45
42
  };
@@ -63,7 +60,7 @@ exports.ECS_CAPACITY_PROVIDER_CONFIG = {
63
60
  */
64
61
  exports.COMPUTE_DEFAULTS = {
65
62
  EC2: {
66
- INSTANCE_TYPE: "t3.micro",
63
+ INSTANCE_TYPE: "t4g.micro",
67
64
  MIN_CAPACITY: 1,
68
65
  MAX_CAPACITY: 1
69
66
  },
@@ -75,7 +72,8 @@ exports.COMPUTE_DEFAULTS = {
75
72
  },
76
73
  LAMBDA: {
77
74
  HANDLER: "index.handler",
78
- RUNTIME: aws_lambda_1.Runtime.NODEJS_22_X
75
+ RUNTIME: aws_lambda_1.Runtime.NODEJS_22_X,
76
+ ARCHITECTURE: aws_lambda_1.Architecture.ARM_64
79
77
  }
80
78
  };
81
79
  function getComputeTypeConfig(type) {
@@ -268,7 +266,7 @@ function resolveLambdaDeployment(props) {
268
266
  * // EC2 compute - returns Ec2Compute with EC2-specific methods
269
267
  * const ec2 = app.addCompute(ComputeFactory.build("Instance", {
270
268
  * type: "ec2",
271
- * instanceType: "t3.micro"
269
+ * instanceType: "t4g.micro"
272
270
  * }));
273
271
  * ec2.getAutoScalingGroup(); // Available on Ec2Compute
274
272
  */
@@ -504,7 +502,7 @@ class LambdaCompute extends constructs_1.Construct {
504
502
  vpc: props.vpc,
505
503
  handler,
506
504
  runtime,
507
- architecture: props.architecture,
505
+ architecture: props.architecture ?? exports.COMPUTE_DEFAULTS.LAMBDA.ARCHITECTURE,
508
506
  timeout: props.timeout,
509
507
  memorySize: props.memorySize,
510
508
  lambdaDescription: props.description,
@@ -624,4 +622,4 @@ class Ec2Compute extends constructs_1.Construct {
624
622
  }
625
623
  }
626
624
  exports.Ec2Compute = Ec2Compute;
627
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1S0Esb0RBRUM7QUFFRCxvRUFJQztBQW93QkQsc0RBbUJDO0FBaUJELG9EQXNCQztBQWVELDBEQXNCQztBQTdnQ0QsaURBQWlEO0FBQ2pELGlEQU02QjtBQUM3Qix1REFTZ0M7QUFDaEMsaURBTTZCO0FBTzdCLDJDQUF1QztBQUV2Qyw4QkFBOEI7QUFDOUIsd0RBU2lDO0FBcThDeEIsMEZBejhDUCxzQkFBUyxPQXk4Q087QUFBRSw2RkF4OENsQix5QkFBWSxPQXc4Q2tCO0FBQUUsZ0dBdjhDaEMsNEJBQWUsT0F1OENnQztBQUFFLDZGQXQ4Q2pELHlCQUFZLE9BczhDaUQ7QUFuOEMvRCxxREFBc0Q7QUFHdEQseUVBR3lDO0FBTXpDLHlEQU15QztBQVFoQyw0RkFaUCxpQkFBVyxPQVlPO0FBUHBCLHlEQUE4RDtBQUM5RCwrREFBb0U7QUEwQnZELFFBQUEsbUJBQW1CLEdBQTJDO0lBQ3pFLEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELG1CQUFtQixFQUFFLElBQUk7UUFDekIsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxXQUFXLEVBQUUsRUFBRTtRQUNmLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtRQUNsRCxtQkFBbUIsRUFBRSxJQUFJO1FBQ3pCLFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLENBQUM7UUFDZCxjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDcEQsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixXQUFXLEVBQUUsS0FBSztLQUNuQjtDQUNGLENBQUM7QUFZVyxRQUFBLDRCQUE0QixHQUdyQztJQUNGLE9BQU8sRUFBRTtRQUNQLFFBQVEsRUFBRSxLQUFLO1FBQ2YsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELFlBQVksRUFBRTtRQUNaLFFBQVEsRUFBRSxJQUFJO1FBQ2QsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QjtJQUNELEdBQUcsRUFBRTtRQUNILFFBQVEsRUFBRSxLQUFLO1FBQ2YsZ0JBQWdCLEVBQUUsSUFBSTtLQUN2QjtDQUNGLENBQUM7QUFFRjs7O0dBR0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHO0lBQzlCLEdBQUcsRUFBRTtRQUNILGFBQWEsRUFBRSxVQUFVO1FBQ3pCLFlBQVksRUFBRSxDQUFDO1FBQ2YsWUFBWSxFQUFFLENBQUM7S0FDaEI7SUFDRCxHQUFHLEVBQUU7UUFDSCwrREFBK0Q7UUFDL0QsY0FBYyxFQUFFLDBCQUEwQjtRQUMxQyxpQ0FBaUM7UUFDakMsU0FBUyxFQUFFLFFBQVE7S0FDcEI7SUFDRCxNQUFNLEVBQUU7UUFDTixPQUFPLEVBQUUsZUFBZTtRQUN4QixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO0tBQzdCO0NBQ08sQ0FBQztBQUVYLFNBQWdCLG9CQUFvQixDQUFDLElBQWlCO0lBQ3BELE9BQU8sMkJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQWdCLDRCQUE0QixDQUMxQyxRQUE2QjtJQUU3QixPQUFPLG9DQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCx1REFBdUQ7QUFDdkQscURBS2dDO0FBSjlCLDBHQUFBLFlBQVksT0FBQTtBQUNaLHdHQUFBLFVBQVUsT0FBQTtBQUNWLHdHQUFBLFVBQVUsT0FBQTtBQXluQlo7Ozs7R0FJRztBQUNILFNBQVMsb0JBQW9CLENBQUMsS0FBb0I7SUFDaEQsMENBQTBDO0lBQzFDLElBQUEsNkNBQXVCLEVBQ3JCLEtBQUssRUFDTCxDQUFDLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQ3hELEtBQUssRUFDTCxhQUFhLENBQ2QsQ0FBQztJQUVGLGdEQUFnRDtJQUNoRCxJQUFBLDZDQUF1QixFQUNyQixLQUFLLEVBQ0wsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUNyQyxRQUFRLEVBQ1IsZ0JBQWdCLENBQ2pCLENBQUM7SUFFRiwwQ0FBMEM7SUFDMUMsSUFBQSw2Q0FBdUIsRUFDckIsS0FBSyxFQUNMLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFDbkMsS0FBSyxFQUNMLGFBQWEsQ0FDZCxDQUFDO0lBRUYsMEVBQTBFO0lBQzFFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN6QixnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsa0RBQWtEO0lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsNkRBQTZELENBQzlELENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FDeEMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FDdEQsQ0FBQztJQUNGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUNiLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ3hDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQy9DLENBQUM7SUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQkFBMEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUN0RSx3RkFBd0YsQ0FDM0YsQ0FBQztJQUNKLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3BELENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQ2xDLENBQUM7SUFFRixJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNwRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztnQkFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87b0JBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDYixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQ2IsaUZBQWlGO2dCQUMvRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ25ELDRFQUE0RSxDQUMvRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hELDZFQUE2RTtZQUM3RSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsVUFBVTtpQkFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2lCQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQ25ELENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQ3hELENBQUM7WUFDRixJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLEtBQUssQ0FDYixZQUFZLE9BQU8sQ0FBQyxJQUFJLGdDQUFnQztvQkFDdEQsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN4RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FDYixZQUFZLE9BQU8sQ0FBQyxJQUFJLDREQUE0RDtnQkFDbEYsbUNBQW1DLENBQ3RDLENBQUM7UUFDSixDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDNUQsaUNBQVcsQ0FBQyxJQUFJLENBQ2QsWUFBWSxPQUFPLENBQUMsSUFBSSxxREFBcUQ7Z0JBQzNFLHdFQUF3RSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLHFCQUFxQixDQUNuQyxPQUF5QjtJQUV6QixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEQsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0MsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxZQUFZLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ25FLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztZQUMxQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDbEIsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhO1lBQzlCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztZQUNsQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ3RCLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztTQUMzQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCx1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBWUQ7Ozs7R0FJRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxPQUE2QztJQUU3QyxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN0QixPQUFPO1lBQ0wsV0FBVyxFQUFFLFNBQVM7WUFDdEIsV0FBVyxFQUFFLFNBQVM7WUFDdEIsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPO1lBQ0wsV0FBVyxFQUFFLGlCQUFXLENBQUMsR0FBRztZQUM1QixXQUFXLEVBQUUsU0FBUztZQUN0QixXQUFXLEVBQUUsU0FBUztTQUN2QixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxpQkFBVyxDQUFDLEdBQUc7UUFDbkQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQVdEOzs7R0FHRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxLQUEwQjtJQUUxQixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsWUFBWSxvQkFBVSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNiLHFFQUFxRSxDQUN0RSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsaUJBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtnQkFDM0MsV0FBVyxFQUFFLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTO2FBQzVDLENBQUM7WUFDRixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxVQUFVO1lBQzNCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFVBQVU7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLHdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQ3pELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLHdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPO0tBQzFELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFhLGNBQWM7SUFnQnpCLDJCQUEyQjtJQUMzQixNQUFNLENBQUMsS0FBSyxDQUNWLEVBQVUsRUFDVixLQUFvQjtRQUVwQixPQUFPLENBQUMsR0FBUSxFQUFFLEtBQWdCLEVBQWMsRUFBRTtZQUNoRCxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU1Qix3REFBd0Q7WUFDeEQsTUFBTSxVQUFVLEdBQUcsMkJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELE1BQU0sUUFBUSxHQUNaLFVBQVUsQ0FBQyxXQUFXO2dCQUN0QixDQUFDLGFBQWEsSUFBSSxLQUFLO29CQUNyQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7b0JBQ2hDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksWUFBWSxHQUFrQjtnQkFDaEMsR0FBRztvQkFDRCxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQ3hDLGFBQWEsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEVBQUU7aUJBQ2pEO2dCQUNELEdBQUcsS0FBSzthQUNULENBQUM7WUFFRixJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLFlBQVksR0FBRztvQkFDYixHQUFHLFlBQVk7b0JBQ2YsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtpQkFDL0MsQ0FBQztZQUNKLENBQUM7WUFFRCw0REFBNEQ7WUFDNUQsUUFBUSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDWCxrRUFBa0U7b0JBQ2xFLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO29CQUM3QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUV0RCxLQUFLLE1BQU0sT0FBTyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDNUMsTUFBTSxlQUFlLEdBQW9COzRCQUN2QyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFdBQVc7eUJBQ1osQ0FBQzt3QkFFRix5REFBeUQ7d0JBQ3pELElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDOzRCQUMzQixlQUFlLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7d0JBQzFELENBQUM7d0JBRUQsdURBQXVEO3dCQUN2RCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDekIsZUFBZSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO3dCQUN0RCxDQUFDO3dCQUVELHVEQUF1RDt3QkFDdkQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUM1QixDQUFDO3dCQUNGLElBQUksaUJBQWlCLEVBQUUsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDOzRCQUMxQyxlQUFlLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQzt3QkFDekQsQ0FBQzt3QkFFRCx1REFBdUQ7d0JBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7d0JBQ3JDLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQzs0QkFDakQsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0NBQ3RCLEtBQUssTUFBTSxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO29DQUN2QyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dDQUN6QixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLGVBQWUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDbkQsQ0FBQzt3QkFFRCwrQ0FBK0M7d0JBQy9DLGVBQWUsQ0FBQyxjQUFjOzRCQUM1QixPQUFPLENBQUMsY0FBYztnQ0FDdEIsSUFBSSxPQUFPLElBQUksV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFFL0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDeEMsQ0FBQztvQkFDRCxPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNkLHVFQUF1RTtvQkFDdkUsTUFBTSxrQkFBa0IsR0FBRzt3QkFDekIsR0FBRyxZQUFZO3dCQUNmLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFO3FCQUN2QixDQUFDO29CQUVGLG1FQUFtRTtvQkFDbkUsb0VBQW9FO29CQUNwRSwwREFBMEQ7b0JBQzFELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO29CQUM3QyxNQUFNLGNBQWMsR0FBbUI7d0JBQ3JDLElBQUksRUFBRSxFQUFFO3dCQUNSLGNBQWMsRUFDWixrQkFBa0IsQ0FBQyxjQUFjOzRCQUNqQyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sV0FBVyxFQUFFLEVBQUU7cUJBQ2hELENBQUM7b0JBQ0YsSUFDRSxrQkFBa0IsQ0FBQyxPQUFPO3dCQUMxQixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDckMsQ0FBQzt3QkFDRCxjQUFjLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztvQkFDdEQsQ0FBQztvQkFDRCxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUVwQyxPQUFPLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztnQkFDRCxLQUFLLEtBQUs7b0JBQ1IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNSLE1BQU0sV0FBVyxHQUFVLFlBQVksQ0FBQztvQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYiw2QkFBNkIsTUFBTSxDQUFFLFdBQTZCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDM0UsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTFJRCx3Q0EwSUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQU12QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFOSCxnQkFBVyxHQUFHLEtBQWMsQ0FBQztRQVEzQyxtRUFBbUU7UUFDbkUsTUFBTSxRQUFRLEdBQWdDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUM5RCxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1YsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsb0JBQW9CLENBQ3BFLE9BQU8sQ0FBQyxPQUFPLENBQ2hCLENBQUM7WUFFRixPQUFPO2dCQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNwQixVQUFVO2dCQUNWLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztnQkFDaEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO2dCQUN0QyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLFdBQVc7Z0JBQ1gsV0FBVztnQkFDWCxXQUFXO2dCQUNYLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLHNCQUFzQjtnQkFDdEQsdUJBQXVCLEVBQUUsT0FBTyxDQUFDLHVCQUF1QjtnQkFDeEQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUNoQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO2dCQUMxQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztnQkFDdEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2FBQ25DLENBQUM7UUFDSixDQUFDLENBQ0YsQ0FBQztRQUVGLHVCQUF1QjtRQUN2QixNQUFNLE9BQU8sR0FBK0IsS0FBSyxDQUFDLE9BQU87WUFDdkQsQ0FBQyxDQUFDO2dCQUNFLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU07Z0JBQzVCLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVk7Z0JBQ3hDLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVk7Z0JBQ3hDLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVk7YUFDekM7WUFDSCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsTUFBTSxRQUFRLEdBQW9CO1lBQ2hDLFdBQVcsRUFBRSxFQUFFO1lBQ2YsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxjQUFjO1lBQ3pFLE9BQU87WUFDUCxRQUFRO1NBQ1QsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxhQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUNqRCxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsVUFBVSxDQUFDLElBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLGNBQWM7UUFDWixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsOENBQThDO0lBQzlDLGdCQUFnQjtRQUNkLG1EQUFtRDtRQUNuRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUN2RCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxPQUFtQjtRQUNyQyxPQUFPLGVBQUssQ0FBQyxjQUFjLENBQUM7WUFDMUIsT0FBTztZQUNQLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO1lBQy9CLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF2SEQsZ0NBdUhDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQVM7SUFNMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTkgsZ0JBQVcsR0FBRyxRQUFpQixDQUFDO1FBUTlDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxFLHFFQUFxRTtRQUNyRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDNUMsTUFBTSxpQkFBaUIsR0FDckIsaUJBQWlCLEtBQUssU0FBUyxJQUFJLGlCQUFpQixLQUFLLEtBQUssQ0FBQztRQUNqRSxNQUFNLG1CQUFtQixHQUN2QixpQkFBaUIsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVE7WUFDeEQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7WUFDNUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixNQUFNLGVBQWUsR0FDbkIsaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsS0FBSyxRQUFRO1lBQ3hELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsTUFBTSxxQkFBcUIsR0FDekIsaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsS0FBSyxRQUFRO1lBQ3hELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVO1lBQzlCLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFaEIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsSUFBSTtZQUNKLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLE9BQU87WUFDUCxPQUFPO1lBQ1AsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDcEMsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUU7WUFDdEMsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQixlQUFlO1lBQ2YscUJBQXFCO1lBQ3JCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7WUFDNUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQjtZQUNoRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNsQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxFQUFFO1NBQ2pCLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksdUJBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUU1RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHO1lBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVc7WUFDakMsQ0FBQyxDQUFDLElBQUkscUJBQVcsRUFBRSxDQUFDO1FBRXRCLDREQUE0RDtRQUM1RCxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsRUFBRSwyQ0FBMkM7b0JBQ3RELG1EQUFtRCxDQUN0RCxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxJQUFBLG1DQUFrQixFQUNoQixLQUFLLENBQUMsV0FBVyxFQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLDhCQUE4QjtnQkFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQ0FBZ0M7aUJBQ3JELENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUNiLDZDQUE2QyxFQUFFLE1BQzdDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3ZELEVBQUUsQ0FDSCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEtBQWM7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsZUFBZTtRQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLEtBQWM7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxPQUFtQixFQUFFLGFBQXNCO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQjtRQUNkLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDO1FBQ3ZELE9BQU8sY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFoSUQsc0NBZ0lDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsc0JBQVM7SUFNdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTkgsZ0JBQVcsR0FBRyxLQUFjLENBQUM7UUFRM0MsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUM7UUFFakUsTUFBTSxRQUFRLEdBQUc7WUFDZixXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVM7WUFDM0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksd0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWE7WUFDdEUsU0FBUztZQUNULFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksd0JBQWdCLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDbkUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksd0JBQWdCLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDbkUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2Qsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLHNCQUFzQjtTQUNyRCxDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGlCQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztJQUNsRCxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQTNDRCxnQ0EyQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIFJlcG9zaXRvcnlJbWFnZSxcbiAgdHlwZSBJQ2x1c3RlcixcbiAgdHlwZSBJQmFzZVNlcnZpY2Vcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjclwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBVc2VyRGF0YSxcbiAgdHlwZSBJTWFjaGluZUltYWdlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICBIYW5kbGVyLFxuICB0eXBlIEFyY2hpdGVjdHVyZSxcbiAgdHlwZSBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIHR5cGUgSUZ1bmN0aW9uLFxuICB0eXBlIEludm9rZU1vZGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIHR5cGUgUG9saWN5U3RhdGVtZW50LFxuICB0eXBlIFBvbGljeURvY3VtZW50LFxuICB0eXBlIElNYW5hZ2VkUG9saWN5LFxuICB0eXBlIElHcmFudGFibGUsXG4gIEdyYW50XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICB0eXBlIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgdHlwZSBBcHBsaWNhdGlvbkxpc3RlbmVyXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgdHlwZSBJQXV0b1NjYWxpbmdHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLy8gSW1wb3J0IHR5cGUtc2FmZSBpbnRlcmZhY2VzXG5pbXBvcnQge1xuICB0eXBlIElFY3NDb21wdXRlLFxuICB0eXBlIElMYW1iZGFDb21wdXRlLFxuICB0eXBlIElFYzJDb21wdXRlLFxuICB0eXBlIEFueUNvbXB1dGUsXG4gIGlzQ29tcHV0ZSxcbiAgaXNFY3NDb21wdXRlLFxuICBpc0xhbWJkYUNvbXB1dGUsXG4gIGlzRWMyQ29tcHV0ZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NvbXB1dGUuanNcIjtcbmltcG9ydCB7IHR5cGUgQ29ubmVjdGlvblNwZWMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuaW1wb3J0IHsgcHJvY2Vzc0Nvbm5lY3Rpb25zIH0gZnJvbSBcIi4vY29ubmVjdGlvbnMuanNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIEZqYWxsTG9nZ2VyLFxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5pZmVzdFNlcnZpY2UsXG4gIHR5cGUgTWFuaWZlc3RMYW1iZGFcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21hbmlmZXN0V3JpdGVyLmpzXCI7XG5cbmltcG9ydCBFY3NDbHVzdGVyLCB7XG4gIHR5cGUgRWNzQ2x1c3RlclByb3BzLFxuICBTY2FsaW5nVHlwZSxcbiAgdHlwZSBEb21haW5Db25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZ1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1wiO1xuaW1wb3J0IHsgRWMySW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4vLyBSZS1leHBvcnQgZnJvbSBlY3MudHMgdG8gbWFpbnRhaW4gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuZXhwb3J0IHsgU2NhbGluZ1R5cGUgfTtcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHN1cHBvcnRzIHNlY3VyaXR5IGdyb3VwIGNvbm5lY3Rpb25zICovXG4gIHN1cHBvcnRzQ29ubmVjdGlvbnM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGVjMjoge1xuICAgIGRlZmF1bHRQb3J0OiAyMixcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDMgfSxcbiAgICBzdXBwb3J0c0Nvbm5lY3Rpb25zOiB0cnVlLFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGxhbWJkYToge1xuICAgIGRlZmF1bHRQb3J0OiAwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAwLCBtYXhDYXBhY2l0eTogMTAwIH0sXG4gICAgc3VwcG9ydHNDb25uZWN0aW9uczogZmFsc2UsXG4gICAgcmVxdWlyZXNWcGM6IGZhbHNlXG4gIH1cbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgRUNTIGNhcGFjaXR5IHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgdGhpcyB1c2VzIFNwb3QgcHJpY2luZyAqL1xuICB1c2VzU3BvdDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBydW5zIG9uIEVDMiBpbnN0YW5jZXMgKHZzIHNlcnZlcmxlc3MgRmFyZ2F0ZSkgKi9cbiAgdXNlc0VjMkluc3RhbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUc6IFJlY29yZDxcbiAgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZ1xuPiA9IHtcbiAgRkFSR0FURToge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBGQVJHQVRFX1NQT1Q6IHtcbiAgICB1c2VzU3BvdDogdHJ1ZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiBmYWxzZVxuICB9LFxuICBFQzI6IHtcbiAgICB1c2VzU3BvdDogZmFsc2UsXG4gICAgdXNlc0VjMkluc3RhbmNlczogdHJ1ZVxuICB9XG59O1xuXG4vKipcbiAqIERlZmF1bHQgdmFsdWVzIGZvciBjb21wdXRlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBDZW50cmFsaXNlZCBjb25zdGFudHMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRFX0RFRkFVTFRTID0ge1xuICBFQzI6IHtcbiAgICBJTlNUQU5DRV9UWVBFOiBcInQzLm1pY3JvXCIsXG4gICAgTUlOX0NBUEFDSVRZOiAxLFxuICAgIE1BWF9DQVBBQ0lUWTogMVxuICB9LFxuICBFQ1M6IHtcbiAgICAvKiogQVdTIHNhbXBsZSBpbWFnZSB1c2VkIHdoZW4gbm8gRUNSIHJlcG9zaXRvcnkgaXMgcHJvdmlkZWQgKi9cbiAgICBGQUxMQkFDS19JTUFHRTogXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIixcbiAgICAvKiogRGVmYXVsdCB0YWcgZm9yIEVDUiBpbWFnZXMgKi9cbiAgICBJTUFHRV9UQUc6IFwibGF0ZXN0XCJcbiAgfSxcbiAgTEFNQkRBOiB7XG4gICAgSEFORExFUjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgUlVOVElNRTogUnVudGltZS5OT0RFSlNfMjJfWFxuICB9XG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZVR5cGVDb25maWcodHlwZTogQ29tcHV0ZVR5cGUpOiBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIHJldHVybiBDT01QVVRFX1RZUEVfQ09ORklHW3R5cGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyhcbiAgcHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXJcbik6IEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICByZXR1cm4gRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJR1twcm92aWRlcl07XG59XG5cbi8vIFJlLWV4cG9ydCBMYW1iZGEgdHlwZXMgZnJvbSBDREsgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgSHR0cE1ldGhvZCxcbiAgSW52b2tlTW9kZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBjb250YWluZXIgaW4gYW4gRUNTIHRhc2suXG4gKlxuICogRm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMsIGBuYW1lYCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gYCR7c2VydmljZU5hbWV9Q29udGFpbmVyYC5cbiAqIEZvciBtdWx0aS1jb250YWluZXIgdGFza3MsIHRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIGBwb3J0YCBpcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gKiB0aGF0IHJlY2VpdmVzIGxvYWQgYmFsYW5jZXIgdHJhZmZpYy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIGNvbnRhaW5lciAobmFtZSBhdXRvLWdlbmVyYXRlZClcbiAqIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktY29udGFpbmVyIHdpdGggc2lkZWNhcnNcbiAqIGNvbnRhaW5lcnM6IFtcbiAqICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sICAgICAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IC0gcmVjZWl2ZXMgQUxCIHRyYWZmaWNcbiAqICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH0gICAgIC8vIFNpZGVjYXIgLSBtb25pdG9yaW5nXG4gKiBdXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqIENvbnRhaW5lciBuYW1lLiBPcHRpb25hbCBmb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcy4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRhaW5lciBpbWFnZS4gT3B0aW9uczpcbiAgICogLSBPbWl0OiBVc2VzIGFwcCdzIGRlZmF1bHQgRUNSIHJlcG9zaXRvcnkgKHByaW1hcnkgY29udGFpbmVyIG9ubHkpXG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbi5cbiAgICogVGhlIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydCBiZWNvbWVzIHRoZSAqKnByaW1hcnkgY29udGFpbmVyKipcbiAgICogYW5kIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogU2VjcmV0cyBmcm9tIEFXUyBTU00gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBBcnJheSBvZiBzZWNyZXQgbmFtZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgZnJvbSB0aGUgc2VydmljZSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgZnJvbSBhcHAvY2x1c3Rlci9zZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBTZWNyZXRzIGF0IC9teWFwcC9hcGktY2x1c3Rlci91c2Vycy9BUElfS0VZIGFuZCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvREJfUEFTU1dPUkRcbiAgICogc2VjcmV0czogW1wiQVBJX0tFWVwiLCBcIkRCX1BBU1NXT1JEXCJdXG4gICAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgQ0RLIHJlc291cmNlcyAoQVdTIFNlY3JldHMgTWFuYWdlcikgKi9cbiAgc2VjcmV0c0ltcG9ydD86IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD47XG4gIC8qKiBDb21tYW5kIHRvIHJ1biBpbiB0aGUgY29udGFpbmVyICovXG4gIGNvbW1hbmQ/OiBzdHJpbmdbXTtcbiAgLyoqIEVudHJ5IHBvaW50IGZvciB0aGUgY29udGFpbmVyICovXG4gIGVudHJ5UG9pbnQ/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgZXNzZW50aWFsLlxuICAgKiBJZiBhbiBlc3NlbnRpYWwgY29udGFpbmVyIHN0b3BzLCBhbGwgY29udGFpbmVycyBpbiB0aGUgdGFzayBzdG9wLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBlc3NlbnRpYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIGNvbmZpZ3VyYXRpb24uXG4gICAqIERlZmF1bHQ6IEZvciBwcmltYXJ5IGNvbnRhaW5lciB3aXRoIHBvcnQsIHVzZXMgY3VybCBoZWFsdGggY2hlY2suXG4gICAqL1xuICBoZWFsdGhDaGVjaz86IHtcbiAgICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgc3RhcnRQZXJpb2Q/OiBudW1iZXI7XG4gIH07XG59XG5cbi8qKlxuICogRUNTIHNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAqIC0gT21pdDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBgeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDEwIH1gOiBjdXN0b20gc2NhbGluZ1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2NhbGluZ0NvbmZpZyB7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgc2NhbGluZ1R5cGU/OiBTY2FsaW5nVHlwZTtcbn1cblxuLyoqXG4gKiBDbHVzdGVyLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBDb250cm9scyB0aGUgc2hhcmVkIEFMQiBmb3IgYWxsIHNlcnZpY2VzIGluIHRoaXMgY2x1c3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDbHVzdGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERvbWFpbiBmb3IgSFRUUFMgYWNjZXNzLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBETlMgKCouZWxiLmFtYXpvbmF3cy5jb20pXG4gICAqIC0gU3BlY2lmaWVkOiBDcmVhdGVzIEFDTSBjZXJ0aWZpY2F0ZSArIFJvdXRlNTMgRE5TIEEgcmVjb3JkXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0IG9yIFwicHVibGljXCI6IEludGVybmV0LWZhY2luZyBBTEIgKGRlZmF1bHQpXG4gICAqIC0gXCJpbnRlcm5hbFwiOiBWUEMtb25seSBBTEJcbiAgICogLSBmYWxzZTogTm8gQUxCIChmb3Igd29ya2Vycy9iYWNrZ3JvdW5kIHByb2Nlc3NvcnMpXG4gICAqL1xuICBsb2FkQmFsYW5jZXI/OiBmYWxzZSB8IFwicHVibGljXCIgfCBcImludGVybmFsXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBkaXJlY3QgRUMyIGFjY2VzcyB3aXRob3V0IEFMQi5cbiAgICogVXNlcyBob3N0IG5ldHdvcmsgbW9kZSBmb3IgcHJlZGljdGFibGUgcG9ydHMuXG4gICAqIEFjY2VzcyB2aWEgRUMyIHB1YmxpYyBJUCBhdCBjb250YWluZXIgcG9ydC5cbiAgICovXG4gIGRpcmVjdEFjY2Vzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VkIGRvbWFpbiBjb25maWd1cmF0aW9uIGZvciByb3V0aW5nIHBvbGljaWVzIChsYXRlbmN5LCB3ZWlnaHRlZCwgZ2VvKS5cbiAgICogT25seSB1c2VkIHdoZW4gZG9tYWluIGlzIHNwZWNpZmllZC5cbiAgICogQWxsb3dzIGZvciBtdWx0aS1yZWdpb24gZGVwbG95bWVudHMgd2l0aCBhZHZhbmNlZCBETlMgcm91dGluZy5cbiAgICovXG4gIGRvbWFpbkNvbmZpZz86IERvbWFpbkNvbmZpZztcbn1cblxuLyoqXG4gKiBSb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIHBhdGgvaG9zdC1iYXNlZCByb3V0aW5nIG9uIHRoZSBBTEIuXG4gKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gKiBPcHRpb25hbCBmb3Igc2luZ2xlIHNlcnZpY2UgKGdldHMgYWxsIHRyYWZmaWMgYXV0b21hdGljYWxseSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzUm91dGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBQYXRoIHBhdHRlcm4gZm9yIHJvdXRpbmcgKGUuZy4sIFwiL2FwaS8qXCIsIFwiL3VzZXJzLypcIikuXG4gICAqIFVzZXMgQUxCIHBhdGgtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvc3QgaGVhZGVyIGZvciByb3V0aW5nIChlLmcuLCBcImFwaS5leGFtcGxlLmNvbVwiKS5cbiAgICogVXNlcyBBTEIgaG9zdC1iYXNlZCByb3V0aW5nLlxuICAgKi9cbiAgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgZm9yIHRoaXMgcm91dGluZyBydWxlICgxLTUwMDAwKS5cbiAgICogTG93ZXIgbnVtYmVyID0gaGlnaGVyIHByaW9yaXR5LlxuICAgKiBBdXRvLWFzc2lnbmVkIGlmIG9taXR0ZWQuXG4gICAqL1xuICBwcmlvcml0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogSGVhbHRoIGNoZWNrIHBhdGggZm9yIHRoaXMgc2VydmljZSdzIHRhcmdldCBncm91cC5cbiAgICogRGVmYXVsdDogXCIvXCJcbiAgICovXG4gIGhlYWx0aENoZWNrUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNlcnZpY2UgaW4gYW4gRUNTIGNsdXN0ZXIuXG4gKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZyBjb25maWcsIGFuZCB0YXJnZXQgZ3JvdXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbXBsZSBzZXJ2aWNlXG4gKiB7IG5hbWU6IFwiYXBpXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggcm91dGluZyAoZm9yIG11bHRpLXNlcnZpY2UgY2x1c3RlcnMpXG4gKiB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIsIHByaW9yaXR5OiAxMDAgfSB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBtdWx0aXBsZSByb3V0aW5nIHJ1bGVzIChzYW1lIHRhcmdldCBncm91cClcbiAqIHsgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogW1xuICogICB7IHBhdGg6IFwiL2FwaS92Mi8qXCIsIHByaW9yaXR5OiA1MCB9LFxuICogICB7IHBhdGg6IFwiLypcIiwgcHJpb3JpdHk6IDIwMCB9LFxuICogXX1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2VydmljZSB3aXRoIHNpZGVjYXJzXG4gKiB7XG4gKiAgIG5hbWU6IFwiYXBpXCIsXG4gKiAgIGNvbnRhaW5lcnM6IFtcbiAqICAgICB7IG5hbWU6IFwiYXBwXCIsIHBvcnQ6IDMwMDAgfSxcbiAqICAgICB7IG5hbWU6IFwiZGF0YWRvZ1wiLCBpbWFnZTogXCJkYXRhZG9nL2FnZW50XCIgfVxuICogICBdXG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIG5hbWUgKHVuaXF1ZSB3aXRoaW4gY2x1c3RlcikgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgaW1hZ2UgZm9yIHRoaXMgc2VydmljZSAoYXBwbGllcyB0byBmaXJzdCBjb250YWluZXIgd2l0aG91dCBleHBsaWNpdCBpbWFnZSkuXG4gICAqIC0gT21pdDogVXNlcyBhcHAncyBkZWZhdWx0IEVDUiByZXBvc2l0b3J5XG4gICAqIC0gc3RyaW5nOiBFQ1IgcmVwb3NpdG9yeSBuYW1lIG9yIHB1YmxpYyBpbWFnZSBVUkxcbiAgICogLSBSZXBvc2l0b3J5OiBDREsgRUNSIFJlcG9zaXRvcnkgY29uc3RydWN0XG4gICAqL1xuICBpbWFnZT86IHN0cmluZyB8IFJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBjb25maWd1cmF0aW9uKHMpIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIEZvciBzaW5nbGUtY29udGFpbmVyIHNlcnZpY2VzLCBjb250YWluZXIgbmFtZSBpcyBvcHRpb25hbCBhbmQgYXV0by1nZW5lcmF0ZWQuXG4gICAqIEZvciBtdWx0aS1jb250YWluZXIgc2VydmljZXMsIHRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgaXMgdGhlIHByaW1hcnkgY29udGFpbmVyLlxuICAgKi9cbiAgY29udGFpbmVycz86IEVjc0NvbnRhaW5lckNvbmZpZ1tdO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIHNlcnZpY2Ugb24gdGhlIGNsdXN0ZXIncyBBTEIuXG4gICAqIFJlcXVpcmVkIHdoZW4gY2x1c3RlciBoYXMgbXVsdGlwbGUgc2VydmljZXMgd2l0aCBwb3J0cy5cbiAgICogT3B0aW9uYWwgZm9yIHNpbmdsZSBzZXJ2aWNlIChnZXRzIC8qIGF1dG9tYXRpY2FsbHkpLlxuICAgKiBDYW4gYmUgYSBzaW5nbGUgcnVsZSBvciBhbiBhcnJheSBvZiBydWxlcyBwb2ludGluZyB0byB0aGUgc2FtZSB0YXJnZXQgZ3JvdXAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE11bHRpcGxlIHJvdXRlcyBmb3IgdGhlIHNhbWUgc2VydmljZVxuICAgKiByb3V0aW5nOiBbXG4gICAqICAgeyBwYXRoOiBcIi9hcGkvdjIvKlwiLCBwcmlvcml0eTogNTAgfSxcbiAgICogICB7IHBhdGg6IFwiLypcIiwgcHJpb3JpdHk6IDIwMCB9LFxuICAgKiBdXG4gICAqL1xuICByb3V0aW5nPzogRWNzUm91dGluZ0NvbmZpZyB8IEVjc1JvdXRpbmdDb25maWdbXTtcblxuICAvKiogQ1BVIHVuaXRzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrcyAoMjU2LTQwOTYpICovXG4gIGNwdT86IG51bWJlcjtcblxuICAvKiogTWVtb3J5IGluIE1pQiBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDUxMi0zMDcyMCkgKi9cbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG5cbiAgLyoqIERlc2lyZWQgbnVtYmVyIG9mIHRhc2tzLiBEZWZhdWx0OiAyICovXG4gIGRlc2lyZWRDb3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogU2NhbGluZyBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGZhbHNlOiBkaXNhYmxlZFxuICAgKi9cbiAgc2NhbGluZz86IEVjc1NjYWxpbmdDb25maWcgfCBmYWxzZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyB0aGlzIHNlcnZpY2UncyBpbWFnZS5cbiAgICogTWV0YWRhdGEgZm9yIENMSSBidWlsZCBwcm9jZXNzLCBub3QgdXNlZCBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAgICovXG4gIGRvY2tlcmZpbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgYnVpbGQgdGFyZ2V0IHN0YWdlIGZvciBtdWx0aS1zdGFnZSBEb2NrZXJmaWxlcy5cbiAgICogV2hlbiBzcGVjaWZpZWQsIHRoZSBDTEkgYnVpbGRzIHdpdGggYC0tdGFyZ2V0IDxkb2NrZXJUYXJnZXQ+YC5cbiAgICogVGhlIGltYWdlIHRhZyBzdWZmaXggaXMgYWxzbyB1cGRhdGVkOiBgPHNlcnZpY2U+LTx0YXJnZXQ+LWxhdGVzdGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIERvY2tlcmZpbGU6IEZST00gbm9kZSBBUyBiYXNlIC4uLiBGUk9NIGJhc2UgQVMgYXBpIC4uLiBGUk9NIGJhc2UgQVMgd29ya2VyXG4gICAqIHsgbmFtZTogXCJhcGlcIiwgZG9ja2VyVGFyZ2V0OiBcImFwaVwiIH0gICAvLyBidWlsZHM6IG15YXBwLWFwaS1hcGktbGF0ZXN0XG4gICAqIHsgbmFtZTogXCJ3b3JrZXJcIiwgZG9ja2VyVGFyZ2V0OiBcIndvcmtlclwiIH0gIC8vIGJ1aWxkczogbXlhcHAtd29ya2VyLXdvcmtlci1sYXRlc3RcbiAgICovXG4gIGRvY2tlclRhcmdldD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBpbmxpbmUgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKiBVc2UgZm9yIHNlcnZpY2Utc3BlY2lmaWMgQVdTIHBlcm1pc3Npb25zIChTMywgRHluYW1vREIsIFNRUywgZXRjLikuXG4gICAqL1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzogUmVjb3JkPHN0cmluZywgUG9saWN5RG9jdW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG1hbmFnZWQgcG9saWNpZXMgZm9yIHRoaXMgc2VydmljZSdzIHRhc2sgcm9sZS5cbiAgICogQWRkZWQgb24gdG9wIG9mIHRoZSBkZWZhdWx0IEVDUyBFeGVjIHBlcm1pc3Npb25zLlxuICAgKi9cbiAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZXMgdGhpcyBzZXJ2aWNlIG5lZWRzIHRvIGNvbm5lY3QgdG8gKGUuZy4sIGRhdGFiYXNlcywgUzMgYnVja2V0cywgU1FTIHF1ZXVlcykuXG4gICAqIENyZWF0ZXMgc2VjdXJpdHkgZ3JvdXAgcnVsZXMgZm9yIElDb25uZWN0YWJsZSByZXNvdXJjZXMgYW5kIElBTSBncmFudHMgZm9yIElBTSByZXNvdXJjZXMuXG4gICAqIEZvbGxvd3MgbGVhc3QtcHJpdmlsZWdlIC0gb25seSB0aGlzIHNlcnZpY2UgZ2V0cyBhY2Nlc3MsIG5vdCBhbGwgc2VydmljZXMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIFN1cHBvcnRzOlxuICAgKiAtIElDb25uZWN0YWJsZTogU2VjdXJpdHkgZ3JvdXAgcmVzb3VyY2VzIChSRFMsIEVDUywgZXRjLilcbiAgICogLSBJU3RvcmFnZUNvbm5lY3RvcjogUzMgYnVja2V0cyAoSUFNIGdyYW50cylcbiAgICogLSBJRHluYW1vREJDb25uZWN0b3I6IER5bmFtb0RCIHRhYmxlcyAoSUFNIGdyYW50cylcbiAgICogLSBJUXVldWVDb25uZWN0b3I6IFNRUyBxdWV1ZXMgKElBTSBncmFudHMpXG4gICAqIC0gQ29ubmVjdGlvbkNvbmZpZzogRXhwbGljaXQgYWNjZXNzIGxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2ltcGxlIGNvbm5lY3Rpb25zIChkZWZhdWx0IHBlcm1pc3Npb25zKVxuICAgKiBjb25uZWN0aW9uczogW2RhdGFiYXNlLCBidWNrZXQsIGNhY2hlLCBxdWV1ZV1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRXhwbGljaXQgYWNjZXNzIGxldmVsc1xuICAgKiBjb25uZWN0aW9uczogW1xuICAgKiAgIGRhdGFiYXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IGdyb3VwIChSRFMpXG4gICAqICAgeyByZXNvdXJjZTogY2FjaGUsIGFjY2VzczogXCJyZWFkXCIgfSwgICAvLyBSZWFkLW9ubHkgRHluYW1vREJcbiAgICogICB7IHJlc291cmNlOiBidWNrZXQsIGFjY2VzczogXCJ3cml0ZVwiIH0sIC8vIFdyaXRlLW9ubHkgUzNcbiAgICogICB7IHJlc291cmNlOiBxdWV1ZSwgYWNjZXNzOiBcImNvbnN1bWVcIiB9IC8vIENvbnN1bWUtb25seSBTUVNcbiAgICogXVxuICAgKi9cbiAgY29ubmVjdGlvbnM/OiBDb25uZWN0aW9uU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBDYXBhY2l0eSBwcm92aWRlciBmb3IgdGhpcyBzZXJ2aWNlLiBSRVFVSVJFRC5cbiAgICogRWFjaCBzZXJ2aWNlIHNwZWNpZmllcyBpdHMgb3duIGNhcGFjaXR5IHByb3ZpZGVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBNaXhlZCBGQVJHQVRFIGFuZCBFQzIgc2VydmljZXMgaW4gc2FtZSBjbHVzdGVyXG4gICAqIHtcbiAgICogICBzZXJ2aWNlczogW1xuICAgKiAgICAgeyBuYW1lOiBcImFwaVwiLCBjYXBhY2l0eVByb3ZpZGVyOiBcIkZBUkdBVEVcIiB9LFxuICAgKiAgICAgeyBuYW1lOiBcIndvcmtlclwiLCBjYXBhY2l0eVByb3ZpZGVyOiBcIkVDMlwiLCBlYzJDb25maWc6IHsgaW5zdGFuY2VUeXBlOiBcInQzLm1pY3JvXCIgfSB9XG4gICAqICAgXVxuICAgKiB9XG4gICAqL1xuICBjYXBhY2l0eVByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBFQzIgY2FwYWNpdHkgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBPbmx5IHVzZWQgd2hlbiBzZXJ2aWNlIGNhcGFjaXR5UHJvdmlkZXIgaXMgXCJFQzJcIi5cbiAgICogU2VydmljZXMgd2l0aCBtYXRjaGluZyBlYzJDb25maWcgc2hhcmUgYW4gQVNHIGZvciBlZmZpY2llbmN5LlxuICAgKi9cbiAgZWMyQ29uZmlnPzogRWMyQ2FwYWNpdHlDb25maWc7XG5cbiAgLyoqXG4gICAqIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBmb3Igc2VjcmV0cy5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgc2VjcmV0cyBhcmUgZmV0Y2hlZCBmcm9tIC88YXBwPi88Y2x1c3Rlcj4vPHNlcnZpY2U+LlxuICAgKiBVc2UgdGhpcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb252ZW50aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBPdmVycmlkZSBkZWZhdWx0IHBhdGhcbiAgICogc3NtU2VjcmV0c1BhdGg6IFwiL2N1c3RvbS9wYXRoL3RvL3NlY3JldHNcIlxuICAgKi9cbiAgc3NtU2VjcmV0c1BhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU1NIIGFjY2VzcyBjb25maWd1cmF0aW9uIGZvciBFQzIgaW5zdGFuY2VzLlxuICogLSBPbWl0OiBkaXNhYmxlZCAoZGVmYXVsdClcbiAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIGF1dG8tZ2VuZXJhdGVkIGtleVxuICogLSBgeyBrZXlOYW1lOiBcIm15LWtleVwiIH1gOiBlbmFibGVkIHdpdGggZXhpc3Rpbmcga2V5XG4gKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTc2hDb25maWcge1xuICAvKiogU1NIIGtleSBwYWlyIG5hbWUgKi9cbiAga2V5TmFtZT86IHN0cmluZztcbiAgLyoqIEFsbG93ZWQgQ0lEUiBibG9ja3MgZm9yIFNTSCBhY2Nlc3MgKi9cbiAgYWxsb3dlZENpZHJzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogTGFtYmRhIGZ1bmN0aW9uIFVSTCBjb25maWd1cmF0aW9uLlxuICogLSBPbWl0OiBkaXNhYmxlZCAoZGVmYXVsdClcbiAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIElBTSBhdXRoXG4gKiAtIGB7IGF1dGhUeXBlOiBcIk5PTkVcIiwgY29yczogey4uLn0gfWA6IHB1YmxpYyB3aXRoIENPUlNcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uVXJsQ29uZmlnIHtcbiAgLyoqIEF1dGhlbnRpY2F0aW9uIHR5cGUuIERlZmF1bHQ6IEFXU19JQU0gKi9cbiAgYXV0aFR5cGU/OiBGdW5jdGlvblVybEF1dGhUeXBlO1xuICAvKiogQ09SUyBjb25maWd1cmF0aW9uICovXG4gIGNvcnM/OiBGdW5jdGlvblVybENvcnNPcHRpb25zO1xuICAvKiogSW52b2tlIG1vZGUuIFVzZSBSRVNQT05TRV9TVFJFQU0gZm9yIExhbWJkYSBzdHJlYW1pbmcuIERlZmF1bHQ6IEJVRkZFUkVEICovXG4gIGludm9rZU1vZGU/OiBJbnZva2VNb2RlO1xufVxuXG5pbnRlcmZhY2UgQmFzZUNvbXB1dGVQcm9wcyB7XG4gIHZwYz86IElWcGM7XG59XG5cbi8qKlxuICogRUNTIGNvbXB1dGUgY29uZmlndXJhdGlvbi5cbiAqIENyZWF0ZXMgYW4gRUNTIGNsdXN0ZXIgd2l0aCBvbmUgb3IgbW9yZSBzZXJ2aWNlcyBzaGFyaW5nIGEgbG9hZCBiYWxhbmNlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIHNlcnZpY2VcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktc2VydmljZSBjbHVzdGVyIHdpdGggcm91dGluZ1xuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJBcGlDbHVzdGVyXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBpLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFtcbiAqICAgICB7IG5hbWU6IFwidXNlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSwgcm91dGluZzogeyBwYXRoOiBcIi91c2Vycy8qXCIgfSB9LFxuICogICAgIHsgbmFtZTogXCJvcmRlcnNcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMSB9XSwgcm91dGluZzogeyBwYXRoOiBcIi9vcmRlcnMvKlwiIH0gfVxuICogICBdXG4gKiB9KSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEludGVybmFsIHdvcmtlcnMgKG5vIEFMQilcbiAqIGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV29ya2Vyc1wiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgbG9hZEJhbGFuY2VyOiBmYWxzZSB9LFxuICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJwcm9jZXNzb3JcIiB9LCB7IG5hbWU6IFwiZW1haWxlclwiIH1dXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ29tcHV0ZVByb3BzIGV4dGVuZHMgQmFzZUNvbXB1dGVQcm9wcyB7XG4gIHR5cGU6IFwiZWNzXCI7XG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIG5hbWUgZm9yIFNTTSBzZWNyZXRzIG5hbWVzcGFjZS5cbiAgICogV2hlbiBjb250YWluZXJzIHVzZSBzZWNyZXRzLCB0aGUgcGF0aCBpcyBkZXJpdmVkIGFzOiAvPGFwcE5hbWU+LzxjbHVzdGVyTmFtZT4vPHNlcnZpY2VOYW1lPlxuICAgKiBBdXRvLWRlcml2ZWQgZnJvbSBBcHAuZ2V0TmFtZSgpIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICBhcHBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIENvbnRyb2xzIHRoZSBzaGFyZWQgQUxCIGZvciBhbGwgc2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLlxuICAgKiAtIE9taXQ6IEFMQiBjcmVhdGVkIHdpdGggZGVmYXVsdCBzZXR0aW5nc1xuICAgKiAtIGB7IGRvbWFpbjogXCIuLi5cIiB9YDogQUxCIHdpdGggSFRUUFMgKyBETlNcbiAgICogLSBgeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH1gOiBObyBBTEIgKGludGVybmFsIHdvcmtlcnMpXG4gICAqL1xuICBjbHVzdGVyPzogRWNzQ2x1c3RlckNvbmZpZztcblxuICAvKipcbiAgICogU2VydmljZXMgaW4gdGhpcyBjbHVzdGVyLlxuICAgKiBFYWNoIHNlcnZpY2UgZ2V0cyBpdHMgb3duIHRhc2sgZGVmaW5pdGlvbiwgc2NhbGluZywgYW5kIHRhcmdldCBncm91cC5cbiAgICogRWFjaCBzZXJ2aWNlIE1VU1Qgc3BlY2lmeSBpdHMgb3duIGNhcGFjaXR5UHJvdmlkZXIuXG4gICAqIEFsbCBzZXJ2aWNlcyBzaGFyZSB0aGUgY2x1c3RlcidzIEFMQiAodW5sZXNzIGRpc2FibGVkKS5cbiAgICovXG4gIHNlcnZpY2VzOiBFY3NTZXJ2aWNlQ29uZmlnW107XG5cbiAgLyoqXG4gICAqIEVDUiByZXBvc2l0b3J5IGZvciBhbGwgc2VydmljZXMgKGRlZmF1bHQgaW1hZ2UpLlxuICAgKiBJbmRpdmlkdWFsIHNlcnZpY2VzIGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBgaW1hZ2VgIHByb3BlcnR5LlxuICAgKi9cbiAgZWNyUmVwb3NpdG9yeT86IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gRG9ja2VyZmlsZSBmb3IgYnVpbGRpbmcgY3VzdG9tIGltYWdlLlxuICAgKiBOb3RlOiBUaGlzIGlzIG1ldGFkYXRhIGZvciB0aGUgQ0xJIGJ1aWxkIHByb2Nlc3MsXG4gICAqIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWMyQ29tcHV0ZVByb3BzIGV4dGVuZHMgQmFzZUNvbXB1dGVQcm9wcyB7XG4gIHR5cGU6IFwiZWMyXCI7XG5cbiAgLyoqIEVDMiBpbnN0YW5jZSB0eXBlLiBEZWZhdWx0OiBcInQzLm1pY3JvXCIgKi9cbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgc3NoPzogU3NoQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBVc2VyIGRhdGEgc2NyaXB0ICovXG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIC8qKiBNYWNoaW5lIGltYWdlIChBTUkpICovXG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQZXJjZW50YWdlIG9mIGNhcGFjaXR5IHRvIHJ1biBvbiBTcG90IGluc3RhbmNlcyAoMC0xMDApLlxuICAgKiAtIE9taXQgb3IgMDogQWxsIE9uLURlbWFuZCBpbnN0YW5jZXMgKGRlZmF1bHQpXG4gICAqIC0gMTAwOiBBbGwgU3BvdCBpbnN0YW5jZXNcbiAgICogLSA1MDogSGFsZiBTcG90LCBoYWxmIE9uLURlbWFuZFxuICAgKlxuICAgKiBTcG90IGluc3RhbmNlcyBjYW4gcmVkdWNlIGNvc3RzIGJ5IHVwIHRvIDkwJSBidXQgbWF5IGJlIGludGVycnVwdGVkLlxuICAgKiBVc2UgZm9yIGZhdWx0LXRvbGVyYW50IHdvcmtsb2Fkcy5cbiAgICovXG4gIHNwb3RDYXBhY2l0eVBlcmNlbnRhZ2U/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBMYW1iZGEgY29uZmlndXJhdGlvbiBzaGFyZWQgYnkgYm90aCBjb250YWluZXIgYW5kIGNvZGUgZGVwbG95bWVudHMuXG4gKi9cbmludGVyZmFjZSBCYXNlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJsYW1iZGFcIjtcbiAgLyoqIFRpbWVvdXQgaW4gc2Vjb25kcy4gRGVmYXVsdDogMyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWVtb3J5IHNpemUgaW4gTUIuIERlZmF1bHQ6IDEyOCAqL1xuICBtZW1vcnlTaXplPzogbnVtYmVyO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqIENQVSBhcmNoaXRlY3R1cmUuIERlZmF1bHQ6IHg4Nl82NC4gVXNlIEFyY2hpdGVjdHVyZS5BUk1fNjQgZm9yIEdyYXZpdG9uMi4gKi9cbiAgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAvKiogTGFtYmRhIGZ1bmN0aW9uIGRlc2NyaXB0aW9uICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogSUFNIHJvbGUgZGVzY3JpcHRpb24gKi9cbiAgcm9sZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vIElubGluZSBwb2xpY2llcyAtIHJvdXRlZCB0byBleGVjdXRpb24gcm9sZSBmb3IgRUNTLCB0YXNrIHJvbGUgZm9yIExhbWJkYVxuICAvKiogSW5saW5lIElBTSBwb2xpY3kgc3RhdGVtZW50cyAqL1xuICBpbmxpbmVQb2xpY3k/OiBQb2xpY3lTdGF0ZW1lbnRbXTtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIFVSTCBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICAgKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBJQU0gYXV0aFxuICAgKiAtIGB7IGF1dGhUeXBlOiBcIk5PTkVcIiB9YDogcHVibGljIGFjY2Vzc1xuICAgKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uVXJsPzogRnVuY3Rpb25VcmxDb25maWcgfCBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyAqL1xuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFNlY3JldHMgZnJvbSBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAgICogQXJyYXkgb2Ygc2VjcmV0IG5hbWVzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGZyb20gdGhlIExhbWJkYSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgYXM6IC88YXBwTmFtZT4vbGFtYmRhLzxmdW5jdGlvbk5hbWU+XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJTVFJJUEVfU0VDUkVUXCJdXG4gICAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBmb3Igc2VjcmV0cy5cbiAgICogSWYgc2VjcmV0cyBhcmUgZGVmaW5lZCwgdGhpcyBwYXRoIGlzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdXNlczogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc3NtU2VjcmV0c1BhdGg6IFwiL215YXBwL2N1c3RvbS9wYXRoXCJcbiAgICovXG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgQ0RLIHJlc291cmNlcyAoQVdTIFNlY3JldHMgTWFuYWdlcikuXG4gICAqIFVzZWQgZm9yIENESy1tYW5hZ2VkIHNlY3JldHMgbGlrZSBkYXRhYmFzZSBjcmVkZW50aWFscy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2VjcmV0c0ltcG9ydDoge1xuICAgKiAgIERBVEFCQVNFX1VTRVJOQU1FOiBkYXRhYmFzZS5nZXRDcmVkZW50aWFscygpLmdldEltcG9ydChcInVzZXJuYW1lXCIpLFxuICAgKiAgIERBVEFCQVNFX1BBU1NXT1JEOiBkYXRhYmFzZS5nZXRDcmVkZW50aWFscygpLmdldEltcG9ydChcInBhc3N3b3JkXCIpXG4gICAqIH1cbiAgICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIGZvciBTU00gc2VjcmV0cyBwYXRoIGRlcml2YXRpb24uXG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcCBpbnN0YW5jZSB3aGVuIHVzaW5nIENvbXB1dGVGYWN0b3J5LlxuICAgKiBPbmx5IHNwZWNpZnkgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIExhbWJkYSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMsIFMzIGJ1Y2tldHMsIFNRUyBxdWV1ZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBJQ29ubmVjdGFibGUgcmVzb3VyY2VzIGFuZCBJQU0gZ3JhbnRzIGZvciBJQU0gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBJQ29ubmVjdGFibGU6IFNlY3VyaXR5IGdyb3VwIHJlc291cmNlcyAoUkRTLCBFQ1MsIGV0Yy4pXG4gICAqIC0gSVN0b3JhZ2VDb25uZWN0b3I6IFMzIGJ1Y2tldHMgKElBTSBncmFudHMpXG4gICAqIC0gSUR5bmFtb0RCQ29ubmVjdG9yOiBEeW5hbW9EQiB0YWJsZXMgKElBTSBncmFudHMpXG4gICAqIC0gSVF1ZXVlQ29ubmVjdG9yOiBTUVMgcXVldWVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIENvbm5lY3Rpb25Db25maWc6IEV4cGxpY2l0IGFjY2VzcyBsZXZlbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbm5lY3Rpb25zOiBbXG4gICAqICAgZGF0YWJhc2UsXG4gICAqICAgeyByZXNvdXJjZTogcXVldWUsIGFjY2VzczogXCJzZW5kXCIgfVxuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IENvbm5lY3Rpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIEV2ZW50QnJpZGdlIHNjaGVkdWxlIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCBMYW1iZGEgaW52b2NhdGlvbnMuXG4gICAqIFVzZXMgY3JvbiBvciByYXRlIHN5bnRheDogXCJyYXRlKDEgaG91cilcIiBvciBcImNyb24oMCAxMiAqICogPyAqKVwiLlxuICAgKi9cbiAgc2NoZWR1bGVFeHByZXNzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnRhaW5lci1iYXNlZCBMYW1iZGEgdXNpbmcgRUNSIGltYWdlLlxuICpcbiAqIFVzZXMgRG9ja2VyIGltYWdlIGZyb20gRUNSIHJlcG9zaXRvcnkuIEhhbmRsZXIgYW5kIHJ1bnRpbWUgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IHNldCB0byBGUk9NX0lNQUdFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkltYWdlTGFtYmRhXCIsIHtcbiAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAqICAgZGVwbG95bWVudDogXCJjb250YWluZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29udGFpbmVyLWJhc2VkIGRlcGxveW1lbnQgdXNpbmcgRUNSIGltYWdlICovXG4gIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCI7XG4gIC8qKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBMYW1iZGEgY29udGFpbmVyIGltYWdlICovXG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG59XG5cbi8qKlxuICogQ29kZS1iYXNlZCBMYW1iZGEgdXNpbmcgaW5saW5lIGNvZGUgb3IgUzMuXG4gKlxuICogVXNlcyB0cmFkaXRpb25hbCBMYW1iZGEgZGVwbG95bWVudCB3aXRoIGNvZGUsIGhhbmRsZXIsIGFuZCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkNvZGVMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvZGVcIixcbiAqICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSxcbiAqICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gKiAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1hcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29kZS1iYXNlZCBkZXBsb3ltZW50ICovXG4gIGRlcGxveW1lbnQ6IFwiY29kZVwiO1xuICAvKiogTGFtYmRhIGNvZGUgKGZyb20gYXNzZXQsIFMzLCBvciBpbmxpbmUpICovXG4gIGNvZGU6IENvZGU7XG4gIC8qKiBIYW5kbGVyIGZ1bmN0aW9uLiBEZWZhdWx0OiBcImluZGV4LmhhbmRsZXJcIiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogTGFtYmRhIHJ1bnRpbWUuIERlZmF1bHQ6IE5PREVKU18yMl9YICovXG4gIHJ1bnRpbWU/OiBSdW50aW1lO1xufVxuXG4vKipcbiAqIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBlbnN1cmluZyB0eXBlLXNhZmUgTGFtYmRhIGNvbmZpZ3VyYXRpb246XG4gKiAtIGBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiYCByZXF1aXJlcyBgZWNyUmVwb3NpdG9yeWBcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29kZVwiYCByZXF1aXJlcyBgY29kZWAgYW5kIGFsbG93cyBgaGFuZGxlcmAvYHJ1bnRpbWVgXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRhaW5lci1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb250YWluZXJcIiwgZWNyUmVwb3NpdG9yeTogZWNyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29kZS1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb2RlXCIsIGNvZGU6IENvZGUuZnJvbUFzc2V0KFwiLi9sYW1iZGFcIikgfVxuICovXG5leHBvcnQgdHlwZSBMYW1iZGFDb21wdXRlUHJvcHMgPSBDb250YWluZXJMYW1iZGFQcm9wcyB8IENvZGVMYW1iZGFQcm9wcztcblxuLy8gVHlwZS1zYWZlIHByb3BzIHdpdGggbGl0ZXJhbCBkaXNjcmltaW5hdG9ycyBmb3IgZmFjdG9yeSBvdmVybG9hZHNcbmV4cG9ydCB0eXBlIElFY3NDb21wdXRlUHJvcHMgPSBFY3NDb21wdXRlUHJvcHM7XG5leHBvcnQgdHlwZSBJTGFtYmRhQ29tcHV0ZVByb3BzID0gTGFtYmRhQ29tcHV0ZVByb3BzO1xuZXhwb3J0IHR5cGUgSUVjMkNvbXB1dGVQcm9wcyA9IEVjMkNvbXB1dGVQcm9wcztcblxuZXhwb3J0IHR5cGUgSUNvbXB1dGVQcm9wcyA9XG4gIHwgSUVjc0NvbXB1dGVQcm9wc1xuICB8IElMYW1iZGFDb21wdXRlUHJvcHNcbiAgfCBJRWMyQ29tcHV0ZVByb3BzO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBjb21wdXRlIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBpZ25vcmVkIG9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqIFRoZXNlIGNoZWNrcyBoZWxwIGNhdGNoIGlzc3VlcyB3aGVuIHByb3BzIGNvbWUgZnJvbSBkeW5hbWljIHNvdXJjZXMgd2hlcmVcbiAqIFR5cGVTY3JpcHQncyBjb21waWxlLXRpbWUgY2hlY2tzIG1heSBub3QgYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzOiBJQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIEVDUy1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQ1MgY29tcHV0ZVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJjYXBhY2l0eVByb3ZpZGVyXCIsIFwiZWMyQ29uZmlnXCIsIFwic2VydmljZXNcIiwgXCJjbHVzdGVyXCJdLFxuICAgIFwiZWNzXCIsXG4gICAgXCJFQ1MgY29tcHV0ZVwiXG4gICk7XG5cbiAgLy8gTGFtYmRhLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUxhbWJkYSBjb21wdXRlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcImZ1bmN0aW9uVXJsXCIsIFwiaGFuZGxlclwiLCBcInJ1bnRpbWVcIl0sXG4gICAgXCJsYW1iZGFcIixcbiAgICBcIkxhbWJkYSBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBFQzItc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUMyIGNvbXB1dGVcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wic3NoXCIsIFwidXNlckRhdGFcIiwgXCJtYWNoaW5lSW1hZ2VcIl0sXG4gICAgXCJlYzJcIixcbiAgICBcIkVDMiBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBFQ1Mtc3BlY2lmaWMgdmFsaWRhdGlvbiAtIHR5cGUgbmFycm93aW5nIGhhbmRsZWQgYnkgZGlzY3JpbWluYXRlZCB1bmlvblxuICBpZiAocHJvcHMudHlwZSA9PT0gXCJlY3NcIikge1xuICAgIHZhbGlkYXRlRWNzUHJvcHMocHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIEVDUy1zcGVjaWZpYyBwcm9wcy5cbiAqIEV4dHJhY3RlZCBmb3IgY2xhcml0eSBhbmQgZGV0YWlsIHBhcml0eSB3aXRoIGRhdGFiYXNlL25ldHdvcmsgcGF0dGVybnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRWNzUHJvcHMocHJvcHM6IEVjc0NvbXB1dGVQcm9wcyk6IHZvaWQge1xuICAvLyBWYWxpZGF0ZSBzZXJ2aWNlcyBhcnJheSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eVxuICBpZiAoIXByb3BzLnNlcnZpY2VzIHx8IHByb3BzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQgaW4gJ3NlcnZpY2VzJyBhcnJheS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1bmlxdWUgc2VydmljZSBuYW1lc1xuICBjb25zdCBzZXJ2aWNlTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gIGNvbnN0IGR1cGxpY2F0ZU5hbWVzID0gc2VydmljZU5hbWVzLmZpbHRlcihcbiAgICAobmFtZSwgaW5kZXgpID0+IHNlcnZpY2VOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICApO1xuICBpZiAoZHVwbGljYXRlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEdXBsaWNhdGUgc2VydmljZSBuYW1lczogJHtbLi4ubmV3IFNldChkdXBsaWNhdGVOYW1lcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHNlcnZpY2UgbmFtZSBmb3JtYXRcbiAgY29uc3QgaW52YWxpZE5hbWVzID0gcHJvcHMuc2VydmljZXMuZmlsdGVyKFxuICAgIChzKSA9PiAhL15bYS16QS1aXVthLXpBLVowLTktXSokLy50ZXN0KHMubmFtZSlcbiAgKTtcbiAgaWYgKGludmFsaWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgc2VydmljZSBuYW1lczogJHtpbnZhbGlkTmFtZXMubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBcIlNlcnZpY2UgbmFtZXMgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGh5cGhlbnMuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgcm91dGluZyB3aGVuIG11bHRpcGxlIHNlcnZpY2VzIGhhdmUgcG9ydHNcbiAgY29uc3Qgc2VydmljZXNXaXRoUG9ydHMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgcy5jb250YWluZXJzPy5zb21lKChjKSA9PiBjLnBvcnQpXG4gICk7XG5cbiAgaWYgKHNlcnZpY2VzV2l0aFBvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBtaXNzaW5nUm91dGluZyA9IHNlcnZpY2VzV2l0aFBvcnRzLmZpbHRlcigocykgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBBcnJheS5pc0FycmF5KHMucm91dGluZylcbiAgICAgICAgPyBzLnJvdXRpbmdcbiAgICAgICAgOiBzLnJvdXRpbmdcbiAgICAgICAgICA/IFtzLnJvdXRpbmddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIHJldHVybiAhcnVsZXMuc29tZSgocikgPT4gci5wYXRoIHx8IHIuaG9zdCk7XG4gICAgfSk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyBoYXMgZWMyQ29uZmlnIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCAnRUMyJy4gYCArXG4gICAgICAgICAgXCJUaGUgZWMyQ29uZmlnIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgY2FwYWNpdHlQcm92aWRlciBpcyBzZXQgdG8gJ0VDMicuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgY29udGFpbmVyIGNvbmZpZ3VyYXRpb25zIGZvciBhbiBFQ1Mgc2VydmljZS5cbiAqIENvbnZlcnRzIHVzZXItZmFjaW5nIEVjc0NvbnRhaW5lckNvbmZpZyB0byBpbnRlcm5hbCBFY3NDbHVzdGVyUHJvcHMgZm9ybWF0LlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29udGFpbmVyQ29uZmlncyhcbiAgc2VydmljZTogRWNzU2VydmljZUNvbmZpZ1xuKTogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl1bbnVtYmVyXVtcImNvbnRhaW5lcnNcIl0ge1xuICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogYy5uYW1lIHx8IGAke3NlcnZpY2UubmFtZX1Db250YWluZXIke2luZGV4ID4gMCA/IGluZGV4IDogXCJcIn1gLFxuICAgICAgaW1hZ2U6IGMuaW1hZ2UsXG4gICAgICBwb3J0OiBjLnBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogYy5lbnZpcm9ubWVudCxcbiAgICAgIHNlY3JldHM6IGMuc2VjcmV0cyxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IGMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIGNvbW1hbmQ6IGMuY29tbWFuZCxcbiAgICAgIGVudHJ5UG9pbnQ6IGMuZW50cnlQb2ludCxcbiAgICAgIGVzc2VudGlhbDogYy5lc3NlbnRpYWwsXG4gICAgICBoZWFsdGhDaGVjazogYy5oZWFsdGhDaGVja1xuICAgIH0pKTtcbiAgfVxuICAvLyBEZWZhdWx0IGNvbnRhaW5lciAobm8gcG9ydCA9IHdvcmtlcilcbiAgcmV0dXJuIFt7IG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgIH1dO1xufVxuXG4vKipcbiAqIFJlc29sdmVkIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmb3IgYW4gRUNTIHNlcnZpY2UuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIHNjYWxpbmdUeXBlOiBTY2FsaW5nVHlwZSB8IHVuZGVmaW5lZDtcbiAgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbWF4Q2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmcm9tIHNlcnZpY2UgcHJvcHMuXG4gKiBIYW5kbGVzIHRoZSB0aHJlZSBjYXNlczogZXhwbGljaXQgY29uZmlnLCBkaXNhYmxlZCAoZmFsc2UpLCBvciBkZWZhdWx0ICh1bmRlZmluZWQpLlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICBzY2FsaW5nOiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbik6IFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIGlmIChzY2FsaW5nID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2FsaW5nVHlwZTogdW5kZWZpbmVkLFxuICAgICAgbWluQ2FwYWNpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG1heENhcGFjaXR5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIGlmIChzY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlLkNQVSxcbiAgICAgIG1pbkNhcGFjaXR5OiB1bmRlZmluZWQsXG4gICAgICBtYXhDYXBhY2l0eTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjYWxpbmdUeXBlOiBzY2FsaW5nLnNjYWxpbmdUeXBlID8/IFNjYWxpbmdUeXBlLkNQVSxcbiAgICBtaW5DYXBhY2l0eTogc2NhbGluZy5taW5DYXBhY2l0eSxcbiAgICBtYXhDYXBhY2l0eTogc2NhbGluZy5tYXhDYXBhY2l0eVxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVkIExhbWJkYSBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50IHtcbiAgY29kZTogQ29kZTtcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBydW50aW1lOiBSdW50aW1lO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFtYmRhIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBmcm9tIHByb3BzLlxuICogSGFuZGxlcyBjb250YWluZXIgdnMgY29kZSBkZXBsb3ltZW50IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQoXG4gIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4pOiBSZXNvbHZlZExhbWJkYURlcGxveW1lbnQge1xuICBpZiAocHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb250YWluZXJcIikge1xuICAgIGlmICghKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgdGFnT3JEaWdlc3Q6IENPTVBVVEVfREVGQVVMVFMuRUNTLklNQUdFX1RBR1xuICAgICAgfSksXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0VcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcHJvcHMuY29kZSxcbiAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkhBTkRMRVIsXG4gICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBDT01QVVRFX0RFRkFVTFRTLkxBTUJEQS5SVU5USU1FXG4gIH07XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29tcHV0ZSByZXNvdXJjZXMgd2l0aCB0eXBlLXNhZmUgcmV0dXJuIHR5cGVzLlxuICpcbiAqIFRoZSBmYWN0b3J5IHVzZXMgb3ZlcmxvYWRzIHRvIGluZmVyIHRoZSBzcGVjaWZpYyBjb21wdXRlIHR5cGUgZnJvbSBwcm9wcyxcbiAqIGVuc3VyaW5nIFR5cGVTY3JpcHQgcHJvdmlkZXMgb25seSB0aGUgcmVsZXZhbnQgbWV0aG9kcyBmb3IgZWFjaCBjb21wdXRlIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVDUyBjb21wdXRlIC0gcmV0dXJucyBFY3NDb21wdXRlIHdpdGggRUNTLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGVjcyA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqIGVjcy5nZXRMb2FkQmFsYW5jZXIoKTsgLy8gQXZhaWxhYmxlIG9uIEVjc0NvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGFtYmRhIGNvbXB1dGUgLSByZXR1cm5zIExhbWJkYUNvbXB1dGUgd2l0aCBMYW1iZGEtc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgbGFtYmRhID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJGblwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpXG4gKiB9KSk7XG4gKiBsYW1iZGEuZ2V0RnVuY3Rpb25VcmwoKTsgLy8gQXZhaWxhYmxlIG9uIExhbWJkYUNvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRUMyIGNvbXB1dGUgLSByZXR1cm5zIEVjMkNvbXB1dGUgd2l0aCBFQzItc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgZWMyID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJJbnN0YW5jZVwiLCB7XG4gKiAgIHR5cGU6IFwiZWMyXCIsXG4gKiAgIGluc3RhbmNlVHlwZTogXCJ0My5taWNyb1wiXG4gKiB9KSk7XG4gKiBlYzIuZ2V0QXV0b1NjYWxpbmdHcm91cCgpOyAvLyBBdmFpbGFibGUgb24gRWMyQ29tcHV0ZVxuICovXG5leHBvcnQgY2xhc3MgQ29tcHV0ZUZhY3Rvcnkge1xuICAvLyBPdmVybG9hZDogRUNTIHByb3BzIHJldHVybnMgRWNzQ29tcHV0ZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUVjc0NvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEVjc0NvbXB1dGU7XG4gIC8vIE92ZXJsb2FkOiBMYW1iZGEgcHJvcHMgcmV0dXJucyBMYW1iZGFDb21wdXRlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gTGFtYmRhQ29tcHV0ZTtcbiAgLy8gT3ZlcmxvYWQ6IEVDMiBwcm9wcyByZXR1cm5zIEVjMkNvbXB1dGVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElFYzJDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBFYzJDb21wdXRlO1xuICAvLyBJbXBsZW1lbnRhdGlvbiBzaWduYXR1cmVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBBbnlDb21wdXRlIHtcbiAgICByZXR1cm4gKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KTogQW55Q29tcHV0ZSA9PiB7XG4gICAgICB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wcyk7XG5cbiAgICAgIC8vIEF1dG8tZGVyaXZlIGFwcE5hbWUgZnJvbSBBcHAgaW5zdGFuY2UgZm9yIEVDUyBjb21wdXRlXG4gICAgICBjb25zdCB0eXBlQ29uZmlnID0gQ09NUFVURV9UWVBFX0NPTkZJR1twcm9wcy50eXBlXTtcbiAgICAgIGNvbnN0IG5lZWRzVnBjID1cbiAgICAgICAgdHlwZUNvbmZpZy5yZXF1aXJlc1ZwYyB8fFxuICAgICAgICAoXCJjb25uZWN0aW9uc1wiIGluIHByb3BzICYmXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShwcm9wcy5jb25uZWN0aW9ucykgJiZcbiAgICAgICAgICBwcm9wcy5jb25uZWN0aW9ucy5sZW5ndGggPiAwKTtcbiAgICAgIGxldCBjb21wdXRlUHJvcHM6IElDb21wdXRlUHJvcHMgPSB7XG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IG5lZWRzVnBjID8gYXBwLmdldFZwYygpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVjclJlcG9zaXRvcnk6IGFwcC5nZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKVxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wc1xuICAgICAgfTtcblxuICAgICAgaWYgKGNvbXB1dGVQcm9wcy50eXBlID09PSBcImVjc1wiKSB7XG4gICAgICAgIGNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgICAuLi5jb21wdXRlUHJvcHMsXG4gICAgICAgICAgYXBwTmFtZTogY29tcHV0ZVByb3BzLmFwcE5hbWUgPz8gYXBwLmdldE5hbWUoKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgc3BlY2lmaWMgY29tcHV0ZSBjbGFzcyBiYXNlZCBvbiB0eXBlIGRpc2NyaW1pbmF0b3JcbiAgICAgIHN3aXRjaCAoY29tcHV0ZVByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImVjc1wiOiB7XG4gICAgICAgICAgLy8gUmVnaXN0ZXIgRUNTIHNlcnZpY2VzIHdpdGggbWFuaWZlc3QgY29sbGVjdG9yIGZvciBDTEkgZGlzY292ZXJ5XG4gICAgICAgICAgY29uc3QgY29sbGVjdG9yID0gYXBwLmdldE1hbmlmZXN0Q29sbGVjdG9yKCk7XG4gICAgICAgICAgY29uc3QgY2x1c3Rlck5hbWUgPSBpZDtcbiAgICAgICAgICBjb25zdCBhcHBOYW1lID0gY29tcHV0ZVByb3BzLmFwcE5hbWUgPz8gYXBwLmdldE5hbWUoKTtcblxuICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBjb21wdXRlUHJvcHMuc2VydmljZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hbmlmZXN0U2VydmljZTogTWFuaWZlc3RTZXJ2aWNlID0ge1xuICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgICAgIGNsdXN0ZXJOYW1lXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIGRvY2tlcmZpbGVQYXRoIGlmIHNwZWNpZmllZCAobWV0YWRhdGEgZm9yIENMSSlcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlLmRvY2tlcmZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5kb2NrZXJmaWxlUGF0aCA9IHNlcnZpY2UuZG9ja2VyZmlsZVBhdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgZG9ja2VyVGFyZ2V0IGlmIHNwZWNpZmllZCAobWV0YWRhdGEgZm9yIENMSSlcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlLmRvY2tlclRhcmdldCkge1xuICAgICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2UuZG9ja2VyVGFyZ2V0ID0gc2VydmljZS5kb2NrZXJUYXJnZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmQgY29udGFpbmVyIHBvcnQgZnJvbSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnRcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcldpdGhQb3J0ID0gc2VydmljZS5jb250YWluZXJzPy5maW5kKFxuICAgICAgICAgICAgICAoYykgPT4gYy5wb3J0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyV2l0aFBvcnQ/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2UuY29udGFpbmVyUG9ydCA9IGNvbnRhaW5lcldpdGhQb3J0LnBvcnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSBzZWNyZXRzIGZyb20gYWxsIGNvbnRhaW5lcnMgKGRlZHVwbGljYXRlZClcbiAgICAgICAgICAgIGNvbnN0IGFsbFNlY3JldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHNlcnZpY2UuY29udGFpbmVycyA/PyBbXSkge1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLnNlY3JldHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3JldCBvZiBjb250YWluZXIuc2VjcmV0cykge1xuICAgICAgICAgICAgICAgICAgYWxsU2VjcmV0cy5hZGQoc2VjcmV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxTZWNyZXRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5zZWNyZXRzID0gQXJyYXkuZnJvbShhbGxTZWNyZXRzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5jbHVkZSBzc21TZWNyZXRzUGF0aCAoZXhwbGljaXQgb3IgZGVyaXZlZClcbiAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5zc21TZWNyZXRzUGF0aCA9XG4gICAgICAgICAgICAgIHNlcnZpY2Uuc3NtU2VjcmV0c1BhdGggPz9cbiAgICAgICAgICAgICAgYC8ke2FwcE5hbWV9LyR7Y2x1c3Rlck5hbWV9LyR7c2VydmljZS5uYW1lfWA7XG5cbiAgICAgICAgICAgIGNvbGxlY3Rvci5hZGRTZXJ2aWNlKG1hbmlmZXN0U2VydmljZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgRWNzQ29tcHV0ZShzY29wZSwgaWQsIGNvbXB1dGVQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImxhbWJkYVwiOiB7XG4gICAgICAgICAgLy8gQWRkIGFwcE5hbWUgdG8gcHJvcHMgZm9yIExhbWJkYSAobmVlZGVkIGZvciBzZWNyZXRzIHBhdGggZGVyaXZhdGlvbilcbiAgICAgICAgICBjb25zdCBsYW1iZGFDb21wdXRlUHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5jb21wdXRlUHJvcHMsXG4gICAgICAgICAgICBhcHBOYW1lOiBhcHAuZ2V0TmFtZSgpXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEFsd2F5cyByZWdpc3RlciBMYW1iZGEgd2l0aCBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIENMSSBkaXNjb3ZlcnlcbiAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIExhbWJkYXMgYXJlIGRpc2NvdmVyYWJsZSBmb3Igc2VjcmV0cyBtYW5hZ2VtZW50LFxuICAgICAgICAgIC8vIGV2ZW4gdGhvc2UgdGhhdCBkb24ndCBjdXJyZW50bHkgaGF2ZSBzZWNyZXRzIGNvbmZpZ3VyZWRcbiAgICAgICAgICBjb25zdCBjb2xsZWN0b3IgPSBhcHAuZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTtcbiAgICAgICAgICBjb25zdCBtYW5pZmVzdExhbWJkYTogTWFuaWZlc3RMYW1iZGEgPSB7XG4gICAgICAgICAgICBuYW1lOiBpZCxcbiAgICAgICAgICAgIHNzbVNlY3JldHNQYXRoOlxuICAgICAgICAgICAgICBsYW1iZGFDb21wdXRlUHJvcHMuc3NtU2VjcmV0c1BhdGggfHxcbiAgICAgICAgICAgICAgYC8ke2xhbWJkYUNvbXB1dGVQcm9wcy5hcHBOYW1lfS9sYW1iZGEvJHtpZH1gXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBsYW1iZGFDb21wdXRlUHJvcHMuc2VjcmV0cyAmJlxuICAgICAgICAgICAgbGFtYmRhQ29tcHV0ZVByb3BzLnNlY3JldHMubGVuZ3RoID4gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbWFuaWZlc3RMYW1iZGEuc2VjcmV0cyA9IGxhbWJkYUNvbXB1dGVQcm9wcy5zZWNyZXRzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xsZWN0b3IuYWRkTGFtYmRhKG1hbmlmZXN0TGFtYmRhKTtcblxuICAgICAgICAgIHJldHVybiBuZXcgTGFtYmRhQ29tcHV0ZShzY29wZSwgaWQsIGxhbWJkYUNvbXB1dGVQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImVjMlwiOlxuICAgICAgICAgIHJldHVybiBuZXcgRWMyQ29tcHV0ZShzY29wZSwgaWQsIGNvbXB1dGVQcm9wcyk7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBjb21wdXRlUHJvcHM7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIGNvbXB1dGUgdHlwZTogJHtTdHJpbmcoKF9leGhhdXN0aXZlIGFzIElDb21wdXRlUHJvcHMpLnR5cGUpfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEVDUyBjb21wdXRlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElFY3NDb21wdXRlLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBFQ1Mtc3BlY2lmaWMgcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRWNzQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElFY3NDb21wdXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXB1dGVUeXBlID0gXCJlY3NcIiBhcyBjb25zdDtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGVjc0NsdXN0ZXI6IEVjc0NsdXN0ZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElFY3NDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gVHJhbnNmb3JtIEVjc1NlcnZpY2VDb25maWdbXSB0byBFY3NTZXJ2aWNlUHJvcHNbXSBmb3IgRWNzQ2x1c3RlclxuICAgIGNvbnN0IHNlcnZpY2VzOiBFY3NDbHVzdGVyUHJvcHNbXCJzZXJ2aWNlc1wiXSA9IHByb3BzLnNlcnZpY2VzLm1hcChcbiAgICAgIChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBidWlsZENvbnRhaW5lckNvbmZpZ3Moc2VydmljZSk7XG4gICAgICAgIGNvbnN0IHsgc2NhbGluZ1R5cGUsIG1pbkNhcGFjaXR5LCBtYXhDYXBhY2l0eSB9ID0gcmVzb2x2ZVNjYWxpbmdDb25maWcoXG4gICAgICAgICAgc2VydmljZS5zY2FsaW5nXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgICAgaW1hZ2U6IHNlcnZpY2UuaW1hZ2UsXG4gICAgICAgICAgY29udGFpbmVycyxcbiAgICAgICAgICBjcHU6IHNlcnZpY2UuY3B1LFxuICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiBzZXJ2aWNlLm1lbW9yeUxpbWl0TWlCLFxuICAgICAgICAgIGRlc2lyZWRDb3VudDogc2VydmljZS5kZXNpcmVkQ291bnQsXG4gICAgICAgICAgc2NhbGluZ1R5cGUsXG4gICAgICAgICAgbWluQ2FwYWNpdHksXG4gICAgICAgICAgbWF4Q2FwYWNpdHksXG4gICAgICAgICAgcm91dGluZzogc2VydmljZS5yb3V0aW5nLFxuICAgICAgICAgIHRhc2tSb2xlSW5saW5lUG9saWNpZXM6IHNlcnZpY2UudGFza1JvbGVJbmxpbmVQb2xpY2llcyxcbiAgICAgICAgICB0YXNrUm9sZU1hbmFnZWRQb2xpY2llczogc2VydmljZS50YXNrUm9sZU1hbmFnZWRQb2xpY2llcyxcbiAgICAgICAgICBjb25uZWN0aW9uczogc2VydmljZS5jb25uZWN0aW9ucyxcbiAgICAgICAgICBjYXBhY2l0eVByb3ZpZGVyOiBzZXJ2aWNlLmNhcGFjaXR5UHJvdmlkZXIsXG4gICAgICAgICAgZWMyQ29uZmlnOiBzZXJ2aWNlLmVjMkNvbmZpZyxcbiAgICAgICAgICBzc21TZWNyZXRzUGF0aDogc2VydmljZS5zc21TZWNyZXRzUGF0aCxcbiAgICAgICAgICBkb2NrZXJUYXJnZXQ6IHNlcnZpY2UuZG9ja2VyVGFyZ2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEJ1aWxkIGNsdXN0ZXIgY29uZmlnXG4gICAgY29uc3QgY2x1c3RlcjogRWNzQ2x1c3RlclByb3BzW1wiY2x1c3RlclwiXSA9IHByb3BzLmNsdXN0ZXJcbiAgICAgID8ge1xuICAgICAgICAgIGRvbWFpbjogcHJvcHMuY2x1c3Rlci5kb21haW4sXG4gICAgICAgICAgbG9hZEJhbGFuY2VyOiBwcm9wcy5jbHVzdGVyLmxvYWRCYWxhbmNlcixcbiAgICAgICAgICBkaXJlY3RBY2Nlc3M6IHByb3BzLmNsdXN0ZXIuZGlyZWN0QWNjZXNzLFxuICAgICAgICAgIGRvbWFpbkNvbmZpZzogcHJvcHMuY2x1c3Rlci5kb21haW5Db25maWdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlY3NQcm9wczogRWNzQ2x1c3RlclByb3BzID0ge1xuICAgICAgY2x1c3Rlck5hbWU6IGlkLFxuICAgICAgYXBwTmFtZTogcHJvcHMuYXBwTmFtZSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZWNyUmVwb3NpdG9yeTogcHJvcHMuZWNyUmVwb3NpdG9yeSB8fCBDT01QVVRFX0RFRkFVTFRTLkVDUy5GQUxMQkFDS19JTUFHRSxcbiAgICAgIGNsdXN0ZXIsXG4gICAgICBzZXJ2aWNlc1xuICAgIH07XG5cbiAgICB0aGlzLmVjc0NsdXN0ZXIgPSBuZXcgRWNzQ2x1c3RlcihzY29wZSwgYCR7aWR9RWNzYCwgZWNzUHJvcHMpO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmVjc0NsdXN0ZXIuY29ubmVjdGlvbnM7XG4gIH1cblxuICAvKiogR2V0IHRoZSBFQ1MgY2x1c3Rlci4gKi9cbiAgZ2V0Q2x1c3RlcigpOiBJQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3Rlci5nZXRDbHVzdGVyKCk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIGlmIG9uZSB3YXMgY3JlYXRlZC4gKi9cbiAgZ2V0TG9hZEJhbGFuY2VyKCk6IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3Rlci5nZXRMb2FkQmFsYW5jZXIoKTtcbiAgfVxuXG4gIC8qKiBHZXQgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IG5hbWUuICovXG4gIGdldFNlcnZpY2UobmFtZTogc3RyaW5nKTogSUJhc2VTZXJ2aWNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyLmdldFNlcnZpY2UobmFtZSk7XG4gIH1cblxuICAvKiogR2V0IGFsbCBzZXJ2aWNlcyBpbiB0aGUgY2x1c3Rlci4gKi9cbiAgZ2V0QWxsU2VydmljZXMoKTogSUJhc2VTZXJ2aWNlW10ge1xuICAgIGNvbnN0IHNlcnZpY2VzTWFwID0gdGhpcy5lY3NDbHVzdGVyLmdldFNlcnZpY2VzKCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2VydmljZXNNYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSBjbHVzdGVyLiAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHtcbiAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHNlY3VyaXR5IGdyb3VwIGZyb20gY29ubmVjdGlvbnNcbiAgICBjb25zdCBzZWN1cml0eUdyb3VwcyA9IHRoaXMuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHM7XG4gICAgaWYgKHNlY3VyaXR5R3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc2VjdXJpdHkgZ3JvdXBzIGZvdW5kIGZvciBFQ1MgY2x1c3RlclwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlY3VyaXR5R3JvdXBzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQUxCIGxpc3RlbmVyIGlmIHRoaXMgaXMgYW4gRUNTIGNvbXB1dGUgd2l0aCBBTEIuXG4gICAqL1xuICBnZXRMaXN0ZW5lcigpOiBBcHBsaWNhdGlvbkxpc3RlbmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lY3NDbHVzdGVyLmdldExpc3RlbmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIEVDUyBjbHVzdGVyIGNvbnN0cnVjdC5cbiAgICovXG4gIGdldEVjc0NsdXN0ZXIoKTogRWNzQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3RlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgZWNzOkV4ZWN1dGVDb21tYW5kIHBlcm1pc3Npb24gZm9yIEVDUyBzZXJ2aWNlcy5cbiAgICogVXNlcyB3aWxkY2FyZCByZXNvdXJjZSBiZWNhdXNlIGVjczpFeGVjdXRlQ29tbWFuZCB0YXJnZXRzIHRhc2sgQVJOc1xuICAgKiB3aGljaCBhcmUgbm90IGtub3duIHVudGlsIHJ1bnRpbWUgKHRhc2tzIGFyZSBlcGhlbWVyYWwpLlxuICAgKi9cbiAgZ3JhbnRFeGVjdXRlQ29tbWFuZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogW1wiZWNzOkV4ZWN1dGVDb21tYW5kXCJdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXCIqXCJdXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYW1iZGEgY29tcHV0ZSB3cmFwcGVyIGltcGxlbWVudGluZyBJTGFtYmRhQ29tcHV0ZS5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gTGFtYmRhLXNwZWNpZmljIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUNvbXB1dGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJTGFtYmRhQ29tcHV0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb21wdXRlVHlwZSA9IFwibGFtYmRhXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElMYW1iZGFDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBoYW5kbGVyLCBydW50aW1lIH0gPSByZXNvbHZlTGFtYmRhRGVwbG95bWVudChwcm9wcyk7XG5cbiAgICAvLyBDb252ZXJ0IHByZXNlbmNlLWJhc2VkIGZ1bmN0aW9uVXJsIGNvbmZpZyB0byBsZWdhY3kgYm9vbGVhbiBmb3JtYXRcbiAgICBjb25zdCBmdW5jdGlvblVybENvbmZpZyA9IHByb3BzLmZ1bmN0aW9uVXJsO1xuICAgIGNvbnN0IGVuYWJsZUZ1bmN0aW9uVXJsID1cbiAgICAgIGZ1bmN0aW9uVXJsQ29uZmlnICE9PSB1bmRlZmluZWQgJiYgZnVuY3Rpb25VcmxDb25maWcgIT09IGZhbHNlO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQXV0aFR5cGUgPVxuICAgICAgZW5hYmxlRnVuY3Rpb25VcmwgJiYgdHlwZW9mIGZ1bmN0aW9uVXJsQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gZnVuY3Rpb25VcmxDb25maWcuYXV0aFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxDb3JzID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmNvcnNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVuY3Rpb25VcmxJbnZva2VNb2RlID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmludm9rZU1vZGVcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBsYW1iZGFQcm9wcyA9IHtcbiAgICAgIGNvZGUsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGhhbmRsZXIsXG4gICAgICBydW50aW1lLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGVEZXNjcmlwdGlvbjogcHJvcHMucm9sZURlc2NyaXB0aW9uLFxuICAgICAgaW5saW5lUG9saWN5OiBwcm9wcy5pbmxpbmVQb2xpY3kgfHwgW10sXG4gICAgICBlbmFibGVGdW5jdGlvblVybCxcbiAgICAgIGZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gICAgICBmdW5jdGlvblVybENvcnMsXG4gICAgICBmdW5jdGlvblVybEludm9rZU1vZGUsXG4gICAgICBzY2hlZHVsZUV4cHJlc3Npb246IHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSxcbiAgICAgIHNlY3JldHM6IHByb3BzLnNlY3JldHMsXG4gICAgICBzc21TZWNyZXRzUGF0aDogcHJvcHMuc3NtU2VjcmV0c1BhdGgsXG4gICAgICBzZWNyZXRzSW1wb3J0OiBwcm9wcy5zZWNyZXRzSW1wb3J0LFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgYXBwTmFtZTogcHJvcHMuYXBwTmFtZSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogaWRcbiAgICB9O1xuXG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYCR7aWR9TGFtYmRhYCwgbGFtYmRhUHJvcHMpO1xuXG4gICAgLy8gQ0RLJ3MgRnVuY3Rpb24uY29ubmVjdGlvbnMgZ2V0dGVyIHRocm93cyBmb3Igbm9uLVZQQyBMYW1iZGFzLCBzbyBvbmx5XG4gICAgLy8gYWNjZXNzIGl0IHdoZW4gYSBWUEMgaXMgY29uZmlndXJlZC4gTm9uLVZQQyBMYW1iZGFzIGdldCBhbiBlbXB0eVxuICAgIC8vIENvbm5lY3Rpb25zIG9iamVjdCB0byBzYXRpc2Z5IHRoZSBJQ29ubmVjdGFibGUgaW50ZXJmYWNlLlxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBwcm9wcy52cGNcbiAgICAgID8gdGhpcy5sYW1iZGFGdW5jdGlvbi5jb25uZWN0aW9uc1xuICAgICAgOiBuZXcgQ29ubmVjdGlvbnMoKTtcblxuICAgIC8vIFByb2Nlc3MgY29ubmVjdGlvbnMgdXNpbmcgdGhlIHVuaWZpZWQgY29ubmVjdG9yIGludGVyZmFjZVxuICAgIGlmIChwcm9wcy5jb25uZWN0aW9ucyAmJiBwcm9wcy5jb25uZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIXByb3BzLnZwYykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYExhbWJkYSAnJHtpZH0nIGhhcyBjb25uZWN0aW9ucyBjb25maWd1cmVkIGJ1dCBubyBWUEMuIGAgK1xuICAgICAgICAgICAgXCJBIFZQQyBpcyByZXF1aXJlZCBmb3Igc2VjdXJpdHkgZ3JvdXAgY29ubmVjdGlvbnMuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3NDb25uZWN0aW9ucyhcbiAgICAgICAgICBwcm9wcy5jb25uZWN0aW9ucyxcbiAgICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uLCAvLyBJR3JhbnRhYmxlIChleGVjdXRpb24gcm9sZSlcbiAgICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uIC8vIElDb25uZWN0YWJsZSAoc2VjdXJpdHkgZ3JvdXApXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBwcm9jZXNzIGNvbm5lY3Rpb25zIGZvciBMYW1iZGEgJyR7aWR9JzogJHtcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIExhbWJkYSBmdW5jdGlvbiBieSBuYW1lLlxuICAgKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGZ1bmN0aW9uLCBuYW1lIGlzIGlnbm9yZWQuXG4gICAqL1xuICBnZXRGdW5jdGlvbihfbmFtZT86IHN0cmluZyk6IElGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb247XG4gIH1cblxuICAvKiogR2V0IGFsbCBMYW1iZGEgZnVuY3Rpb25zLiAqL1xuICBnZXRBbGxGdW5jdGlvbnMoKTogSUZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBbdGhpcy5sYW1iZGFGdW5jdGlvbl07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdW5jdGlvbiBVUkwgZm9yIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ2V0RnVuY3Rpb25VcmwoX25hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmdldEZ1bmN0aW9uVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgaW52b2tlIHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZS5cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IElHcmFudGFibGUsIF9mdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb24uZ3JhbnRJbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWN1cml0eSBncm91cCBmb3IgVlBDLWVuYWJsZWQgTGFtYmRhIGZ1bmN0aW9ucy5cbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIExhbWJkYSBpcyBub3QgVlBDLWVuYWJsZWQuXG4gICAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWN1cml0eUdyb3VwcyA9IHRoaXMuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHM7XG4gICAgcmV0dXJuIHNlY3VyaXR5R3JvdXBzLmxlbmd0aCA+IDAgPyBzZWN1cml0eUdyb3Vwc1swXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgTGFtYmRhIGZ1bmN0aW9uIGNvbnN0cnVjdC5cbiAgICovXG4gIGdldExhbWJkYUZ1bmN0aW9uKCk6IExhbWJkYUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEVDMiBjb21wdXRlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElFYzJDb21wdXRlLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byBFQzItc3BlY2lmaWMgcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRWMyQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElFYzJDb21wdXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXB1dGVUeXBlID0gXCJlYzJcIiBhcyBjb25zdDtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGVjMkluc3RhbmNlOiBFYzJJbnN0YW5jZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSUVjMkNvbXB1dGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBlbmFibGVTU0ggPSBwcm9wcy5zc2ggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zc2ggIT09IGZhbHNlO1xuXG4gICAgY29uc3QgZWMyUHJvcHMgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogYCR7aWR9U2VydmljZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSB8fCBDT01QVVRFX0RFRkFVTFRTLkVDMi5JTlNUQU5DRV9UWVBFLFxuICAgICAgZW5hYmxlU1NILFxuICAgICAgdXNlckRhdGE6IHByb3BzLnVzZXJEYXRhLFxuICAgICAgbWFjaGluZUltYWdlOiBwcm9wcy5tYWNoaW5lSW1hZ2UsXG4gICAgICBtaW5DYXBhY2l0eTogcHJvcHMubWluQ2FwYWNpdHkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQzIuTUlOX0NBUEFDSVRZLFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5IHx8IENPTVBVVEVfREVGQVVMVFMuRUMyLk1BWF9DQVBBQ0lUWSxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgc3BvdENhcGFjaXR5UGVyY2VudGFnZTogcHJvcHMuc3BvdENhcGFjaXR5UGVyY2VudGFnZVxuICAgIH07XG5cbiAgICB0aGlzLmVjMkluc3RhbmNlID0gbmV3IEVjMkluc3RhbmNlKHNjb3BlLCBgJHtpZH1FYzJgLCBlYzJQcm9wcyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZWMySW5zdGFuY2UuY29ubmVjdGlvbnM7XG4gIH1cblxuICAvKiogR2V0IHRoZSBBdXRvIFNjYWxpbmcgR3JvdXAuICovXG4gIGdldEF1dG9TY2FsaW5nR3JvdXAoKTogSUF1dG9TY2FsaW5nR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlLmdldEF1dG9TY2FsaW5nR3JvdXAoKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwLiAqL1xuICBnZXRTZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5lYzJJbnN0YW5jZS5hc2dTZWN1cml0eUdyb3VwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBFQzIgaW5zdGFuY2UgY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0RWMySW5zdGFuY2UoKTogRWMySW5zdGFuY2Uge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlIGd1YXJkcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB7IGlzQ29tcHV0ZSwgaXNFY3NDb21wdXRlLCBpc0xhbWJkYUNvbXB1dGUsIGlzRWMyQ29tcHV0ZSB9O1xuZXhwb3J0IHR5cGUgeyBJRWNzQ29tcHV0ZSwgSUxhbWJkYUNvbXB1dGUsIElFYzJDb21wdXRlLCBBbnlDb21wdXRlIH07XG4iXX0=
625
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtS0Esb0RBRUM7QUFFRCxvRUFJQztBQW93QkQsc0RBbUJDO0FBaUJELG9EQXNCQztBQWVELDBEQXNCQztBQXpnQ0QsaURBQWlEO0FBQ2pELGlEQU02QjtBQUM3Qix1REFTZ0M7QUFDaEMsaURBTTZCO0FBTzdCLDJDQUF1QztBQUV2Qyw4QkFBOEI7QUFDOUIsd0RBU2lDO0FBaThDeEIsMEZBcjhDUCxzQkFBUyxPQXE4Q087QUFBRSw2RkFwOENsQix5QkFBWSxPQW84Q2tCO0FBQUUsZ0dBbjhDaEMsNEJBQWUsT0FtOENnQztBQUFFLDZGQWw4Q2pELHlCQUFZLE9BazhDaUQ7QUEvN0MvRCwrREFBZ0U7QUFHaEUseUVBR3lDO0FBTXpDLHlEQU15QztBQVFoQyw0RkFaUCxpQkFBVyxPQVlPO0FBUHBCLHlEQUE4RDtBQUM5RCwrREFBb0U7QUF3QnZELFFBQUEsbUJBQW1CLEdBQTJDO0lBQ3pFLEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsV0FBVyxFQUFFLEVBQUU7UUFDZixjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7UUFDbEQsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsQ0FBQztRQUNkLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxXQUFXLEVBQUUsS0FBSztLQUNuQjtDQUNGLENBQUM7QUFZVyxRQUFBLDRC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V0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTO1lBQzNCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhO1lBQ3RFLFNBQVM7WUFDVCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ25FLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ25FLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7U0FDckQsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDbEQsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUEzQ0QsZ0NBMkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBSZXBvc2l0b3J5SW1hZ2UsXG4gIHR5cGUgSUNsdXN0ZXIsXG4gIHR5cGUgSUJhc2VTZXJ2aWNlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICB0eXBlIElWcGMsXG4gIHR5cGUgVXNlckRhdGEsXG4gIHR5cGUgSU1hY2hpbmVJbWFnZSxcbiAgdHlwZSBJU2VjdXJpdHlHcm91cFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgUnVudGltZSxcbiAgSGFuZGxlcixcbiAgQXJjaGl0ZWN0dXJlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9ucyxcbiAgdHlwZSBJRnVuY3Rpb24sXG4gIHR5cGUgSW52b2tlTW9kZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBQb2xpY3lTdGF0ZW1lbnQsXG4gIHR5cGUgUG9saWN5RG9jdW1lbnQsXG4gIHR5cGUgSU1hbmFnZWRQb2xpY3ksXG4gIHR5cGUgSUdyYW50YWJsZSxcbiAgR3JhbnRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIHR5cGUgSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxuICB0eXBlIEFwcGxpY2F0aW9uTGlzdGVuZXJcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQgeyB0eXBlIElBdXRvU2NhbGluZ0dyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vLyBJbXBvcnQgdHlwZS1zYWZlIGludGVyZmFjZXNcbmltcG9ydCB7XG4gIHR5cGUgSUVjc0NvbXB1dGUsXG4gIHR5cGUgSUxhbWJkYUNvbXB1dGUsXG4gIHR5cGUgSUVjMkNvbXB1dGUsXG4gIHR5cGUgQW55Q29tcHV0ZSxcbiAgaXNDb21wdXRlLFxuICBpc0Vjc0NvbXB1dGUsXG4gIGlzTGFtYmRhQ29tcHV0ZSxcbiAgaXNFYzJDb21wdXRlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvY29tcHV0ZS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDb25uZWN0aW9uU3BlYyB9IGZyb20gXCIuL2ludGVyZmFjZXMvY29ubmVjdG9yLmpzXCI7XG5pbXBvcnQgeyBwcm9jZXNzQ29ubmVjdGlvbnMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29ubmVjdGlvbnMuanNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIEZqYWxsTG9nZ2VyLFxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5pZmVzdFNlcnZpY2UsXG4gIHR5cGUgTWFuaWZlc3RMYW1iZGFcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21hbmlmZXN0V3JpdGVyLmpzXCI7XG5cbmltcG9ydCBFY3NDbHVzdGVyLCB7XG4gIHR5cGUgRWNzQ2x1c3RlclByb3BzLFxuICBTY2FsaW5nVHlwZSxcbiAgdHlwZSBEb21haW5Db25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZ1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1wiO1xuaW1wb3J0IHsgRWMySW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4vLyBSZS1leHBvcnQgZnJvbSBlY3MudHMgdG8gbWFpbnRhaW4gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuZXhwb3J0IHsgU2NhbGluZ1R5cGUgfTtcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICByZXF1aXJlc1ZwYzogdHJ1ZVxuICB9LFxuICBlYzI6IHtcbiAgICBkZWZhdWx0UG9ydDogMjIsXG4gICAgZGVmYXVsdFNjYWxpbmc6IHsgbWluQ2FwYWNpdHk6IDIsIG1heENhcGFjaXR5OiAzIH0sXG4gICAgcmVxdWlyZXNWcGM6IHRydWVcbiAgfSxcbiAgbGFtYmRhOiB7XG4gICAgZGVmYXVsdFBvcnQ6IDAsXG4gICAgZGVmYXVsdFNjYWxpbmc6IHsgbWluQ2FwYWNpdHk6IDAsIG1heENhcGFjaXR5OiAxMDAgfSxcbiAgICByZXF1aXJlc1ZwYzogZmFsc2VcbiAgfVxufTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBFQ1MgY2FwYWNpdHkgcHJvdmlkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICAvKiogV2hldGhlciB0aGlzIHVzZXMgU3BvdCBwcmljaW5nICovXG4gIHVzZXNTcG90OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGlzIHJ1bnMgb24gRUMyIGluc3RhbmNlcyAodnMgc2VydmVybGVzcyBGYXJnYXRlKSAqL1xuICB1c2VzRWMySW5zdGFuY2VzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJRzogUmVjb3JkPFxuICBFY3NDYXBhY2l0eVByb3ZpZGVyLFxuICBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnXG4+ID0ge1xuICBGQVJHQVRFOiB7XG4gICAgdXNlc1Nwb3Q6IGZhbHNlLFxuICAgIHVzZXNFYzJJbnN0YW5jZXM6IGZhbHNlXG4gIH0sXG4gIEZBUkdBVEVfU1BPVDoge1xuICAgIHVzZXNTcG90OiB0cnVlLFxuICAgIHVzZXNFYzJJbnN0YW5jZXM6IGZhbHNlXG4gIH0sXG4gIEVDMjoge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiB0cnVlXG4gIH1cbn07XG5cbi8qKlxuICogRGVmYXVsdCB2YWx1ZXMgZm9yIGNvbXB1dGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqIENlbnRyYWxpc2VkIGNvbnN0YW50cyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBjb2RlYmFzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTVBVVEVfREVGQVVMVFMgPSB7XG4gIEVDMjoge1xuICAgIElOU1RBTkNFX1RZUEU6IFwidDRnLm1pY3JvXCIsXG4gICAgTUlOX0NBUEFDSVRZOiAxLFxuICAgIE1BWF9DQVBBQ0lUWTogMVxuICB9LFxuICBFQ1M6IHtcbiAgICAvKiogQVdTIHNhbXBsZSBpbWFnZSB1c2VkIHdoZW4gbm8gRUNSIHJlcG9zaXRvcnkgaXMgcHJvdmlkZWQgKi9cbiAgICBGQUxMQkFDS19JTUFHRTogXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIixcbiAgICAvKiogRGVmYXVsdCB0YWcgZm9yIEVDUiBpbWFnZXMgKi9cbiAgICBJTUFHRV9UQUc6IFwibGF0ZXN0XCJcbiAgfSxcbiAgTEFNQkRBOiB7XG4gICAgSEFORExFUjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgUlVOVElNRTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICBBUkNISVRFQ1RVUkU6IEFyY2hpdGVjdHVyZS5BUk1fNjRcbiAgfVxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXB1dGVUeXBlQ29uZmlnKHR5cGU6IENvbXB1dGVUeXBlKTogQ29tcHV0ZVR5cGVDb25maWcge1xuICByZXR1cm4gQ09NUFVURV9UWVBFX0NPTkZJR1t0eXBlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcoXG4gIHByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyXG4pOiBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgcmV0dXJuIEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUdbcHJvdmlkZXJdO1xufVxuXG4vLyBSZS1leHBvcnQgTGFtYmRhIHR5cGVzIGZyb20gQ0RLIGZvciB1c2VyIGNvbnZlbmllbmNlXG5leHBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIEh0dHBNZXRob2QsXG4gIEludm9rZU1vZGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgY29udGFpbmVyIGluIGFuIEVDUyB0YXNrLlxuICpcbiAqIEZvciBzaW5nbGUtY29udGFpbmVyIHNlcnZpY2VzLCBgbmFtZWAgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIGAke3NlcnZpY2VOYW1lfUNvbnRhaW5lcmAuXG4gKiBGb3IgbXVsdGktY29udGFpbmVyIHRhc2tzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBgcG9ydGAgaXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKlxuICogdGhhdCByZWNlaXZlcyBsb2FkIGJhbGFuY2VyIHRyYWZmaWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBjb250YWluZXIgKG5hbWUgYXV0by1nZW5lcmF0ZWQpXG4gKiBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLWNvbnRhaW5lciB3aXRoIHNpZGVjYXJzXG4gKiBjb250YWluZXJzOiBbXG4gKiAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LCAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeSAtIHJlY2VpdmVzIEFMQiB0cmFmZmljXG4gKiAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9ICAgICAvLyBTaWRlY2FyIC0gbW9uaXRvcmluZ1xuICogXVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbnRhaW5lckNvbmZpZyB7XG4gIC8qKiBDb250YWluZXIgbmFtZS4gT3B0aW9uYWwgZm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250YWluZXIgaW1hZ2UuIE9wdGlvbnM6XG4gICAqIC0gT21pdDogVXNlcyBhcHAncyBkZWZhdWx0IEVDUiByZXBvc2l0b3J5IChwcmltYXJ5IGNvbnRhaW5lciBvbmx5KVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuICAvKipcbiAgICogUG9ydCB0aGUgY29udGFpbmVyIGxpc3RlbnMgb24uXG4gICAqIFRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgYmVjb21lcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gICAqIGFuZCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIFNlY3JldHMgZnJvbSBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAgICogQXJyYXkgb2Ygc2VjcmV0IG5hbWVzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGZyb20gdGhlIHNlcnZpY2UncyBTU00gbmFtZXNwYWNlLlxuICAgKiBUaGUgbmFtZXNwYWNlIHBhdGggaXMgYXV0by1kZXRlcm1pbmVkIGZyb20gYXBwL2NsdXN0ZXIvc2VydmljZSBuYW1lcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2VjcmV0cyBhdCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvQVBJX0tFWSBhbmQgL215YXBwL2FwaS1jbHVzdGVyL3VzZXJzL0RCX1BBU1NXT1JEXG4gICAqIHNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJEQl9QQVNTV09SRFwiXVxuICAgKi9cbiAgc2VjcmV0cz86IHN0cmluZ1tdO1xuICAvKiogU2VjcmV0cyBpbXBvcnRlZCBmcm9tIG90aGVyIENESyByZXNvdXJjZXMgKEFXUyBTZWNyZXRzIE1hbmFnZXIpICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuICAvKiogQ29tbWFuZCB0byBydW4gaW4gdGhlIGNvbnRhaW5lciAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG4gIC8qKiBFbnRyeSBwb2ludCBmb3IgdGhlIGNvbnRhaW5lciAqL1xuICBlbnRyeVBvaW50Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIGVzc2VudGlhbC5cbiAgICogSWYgYW4gZXNzZW50aWFsIGNvbnRhaW5lciBzdG9wcywgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgc3RvcC5cbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgZXNzZW50aWFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhlYWx0aCBjaGVjayBjb25maWd1cmF0aW9uLlxuICAgKiBEZWZhdWx0OiBGb3IgcHJpbWFyeSBjb250YWluZXIgd2l0aCBwb3J0LCB1c2VzIGN1cmwgaGVhbHRoIGNoZWNrLlxuICAgKi9cbiAgaGVhbHRoQ2hlY2s/OiB7XG4gICAgY29tbWFuZDogc3RyaW5nW107XG4gICAgaW50ZXJ2YWw/OiBudW1iZXI7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICByZXRyaWVzPzogbnVtYmVyO1xuICAgIHN0YXJ0UGVyaW9kPzogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIEVDUyBzY2FsaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE9taXQ6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBge31gOiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAqIC0gYHsgbWluQ2FwYWNpdHk6IDIsIG1heENhcGFjaXR5OiAxMCB9YDogY3VzdG9tIHNjYWxpbmdcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NjYWxpbmdDb25maWcge1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG59XG5cbi8qKlxuICogQ2x1c3Rlci1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ2x1c3RlckNvbmZpZyB7XG4gIC8qKlxuICAgKiBEb21haW4gZm9yIEhUVFBTIGFjY2Vzcy5cbiAgICogLSBPbWl0OiBBTEIgY3JlYXRlZCB3aXRoIGRlZmF1bHQgRE5TICgqLmVsYi5hbWF6b25hd3MuY29tKVxuICAgKiAtIFNwZWNpZmllZDogQ3JlYXRlcyBBQ00gY2VydGlmaWNhdGUgKyBSb3V0ZTUzIEROUyBBIHJlY29yZFxuICAgKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMb2FkIGJhbGFuY2VyIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdCBvciBcInB1YmxpY1wiOiBJbnRlcm5ldC1mYWNpbmcgQUxCIChkZWZhdWx0KVxuICAgKiAtIFwiaW50ZXJuYWxcIjogVlBDLW9ubHkgQUxCXG4gICAqIC0gZmFsc2U6IE5vIEFMQiAoZm9yIHdvcmtlcnMvYmFja2dyb3VuZCBwcm9jZXNzb3JzKVxuICAgKi9cbiAgbG9hZEJhbGFuY2VyPzogZmFsc2UgfCBcInB1YmxpY1wiIHwgXCJpbnRlcm5hbFwiO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZGlyZWN0IEVDMiBhY2Nlc3Mgd2l0aG91dCBBTEIuXG4gICAqIFVzZXMgaG9zdCBuZXR3b3JrIG1vZGUgZm9yIHByZWRpY3RhYmxlIHBvcnRzLlxuICAgKiBBY2Nlc3MgdmlhIEVDMiBwdWJsaWMgSVAgYXQgY29udGFpbmVyIHBvcnQuXG4gICAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZHZhbmNlZCBkb21haW4gY29uZmlndXJhdGlvbiBmb3Igcm91dGluZyBwb2xpY2llcyAobGF0ZW5jeSwgd2VpZ2h0ZWQsIGdlbykuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGRvbWFpbiBpcyBzcGVjaWZpZWQuXG4gICAqIEFsbG93cyBmb3IgbXVsdGktcmVnaW9uIGRlcGxveW1lbnRzIHdpdGggYWR2YW5jZWQgRE5TIHJvdXRpbmcuXG4gICAqL1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG59XG5cbi8qKlxuICogUm91dGluZyBjb25maWd1cmF0aW9uIGZvciBwYXRoL2hvc3QtYmFzZWQgcm91dGluZyBvbiB0aGUgQUxCLlxuICogUmVxdWlyZWQgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIHBvcnRzLlxuICogT3B0aW9uYWwgZm9yIHNpbmdsZSBzZXJ2aWNlIChnZXRzIGFsbCB0cmFmZmljIGF1dG9tYXRpY2FsbHkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1JvdXRpbmdDb25maWcge1xuICAvKipcbiAgICogUGF0aCBwYXR0ZXJuIGZvciByb3V0aW5nIChlLmcuLCBcIi9hcGkvKlwiLCBcIi91c2Vycy8qXCIpLlxuICAgKiBVc2VzIEFMQiBwYXRoLWJhc2VkIHJvdXRpbmcuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3N0IGhlYWRlciBmb3Igcm91dGluZyAoZS5nLiwgXCJhcGkuZXhhbXBsZS5jb21cIikuXG4gICAqIFVzZXMgQUxCIGhvc3QtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IGZvciB0aGlzIHJvdXRpbmcgcnVsZSAoMS01MDAwMCkuXG4gICAqIExvd2VyIG51bWJlciA9IGhpZ2hlciBwcmlvcml0eS5cbiAgICogQXV0by1hc3NpZ25lZCBpZiBvbWl0dGVkLlxuICAgKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhlYWx0aCBjaGVjayBwYXRoIGZvciB0aGlzIHNlcnZpY2UncyB0YXJnZXQgZ3JvdXAuXG4gICAqIERlZmF1bHQ6IFwiL1wiXG4gICAqL1xuICBoZWFsdGhDaGVja1BhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXJ2aWNlIGluIGFuIEVDUyBjbHVzdGVyLlxuICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcgY29uZmlnLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW1wbGUgc2VydmljZVxuICogeyBuYW1lOiBcImFwaVwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2VydmljZSB3aXRoIHJvdXRpbmcgKGZvciBtdWx0aS1zZXJ2aWNlIGNsdXN0ZXJzKVxuICogeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiLCBwcmlvcml0eTogMTAwIH0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggbXVsdGlwbGUgcm91dGluZyBydWxlcyAoc2FtZSB0YXJnZXQgZ3JvdXApXG4gKiB7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IFtcbiAqICAgeyBwYXRoOiBcIi9hcGkvdjIvKlwiLCBwcmlvcml0eTogNTAgfSxcbiAqICAgeyBwYXRoOiBcIi8qXCIsIHByaW9yaXR5OiAyMDAgfSxcbiAqIF19XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBzaWRlY2Fyc1xuICoge1xuICogICBuYW1lOiBcImFwaVwiLFxuICogICBjb250YWluZXJzOiBbXG4gKiAgICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sXG4gKiAgICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH1cbiAqICAgXVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UgKGFwcGxpZXMgdG8gZmlyc3QgY29udGFpbmVyIHdpdGhvdXQgZXhwbGljaXQgaW1hZ2UpLlxuICAgKiAtIE9taXQ6IFVzZXMgYXBwJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbihzKSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBGb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcywgY29udGFpbmVyIG5hbWUgaXMgb3B0aW9uYWwgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKiBGb3IgbXVsdGktY29udGFpbmVyIHNlcnZpY2VzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnRhaW5lcnM/OiBFY3NDb250YWluZXJDb25maWdbXTtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqIE9wdGlvbmFsIGZvciBzaW5nbGUgc2VydmljZSAoZ2V0cyAvKiBhdXRvbWF0aWNhbGx5KS5cbiAgICogQ2FuIGJlIGEgc2luZ2xlIHJ1bGUgb3IgYW4gYXJyYXkgb2YgcnVsZXMgcG9pbnRpbmcgdG8gdGhlIHNhbWUgdGFyZ2V0IGdyb3VwLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBNdWx0aXBsZSByb3V0ZXMgZm9yIHRoZSBzYW1lIHNlcnZpY2VcbiAgICogcm91dGluZzogW1xuICAgKiAgIHsgcGF0aDogXCIvYXBpL3YyLypcIiwgcHJpb3JpdHk6IDUwIH0sXG4gICAqICAgeyBwYXRoOiBcIi8qXCIsIHByaW9yaXR5OiAyMDAgfSxcbiAgICogXVxuICAgKi9cbiAgcm91dGluZz86IEVjc1JvdXRpbmdDb25maWcgfCBFY3NSb3V0aW5nQ29uZmlnW107XG5cbiAgLyoqIENQVSB1bml0cyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDI1Ni00MDk2KSAqL1xuICBjcHU/OiBudW1iZXI7XG5cbiAgLyoqIE1lbW9yeSBpbiBNaUIgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICg1MTItMzA3MjApICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuXG4gIC8qKiBEZXNpcmVkIG51bWJlciBvZiB0YXNrcy4gRGVmYXVsdDogMiAqL1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0OiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAgICogLSBmYWxzZTogZGlzYWJsZWRcbiAgICovXG4gIHNjYWxpbmc/OiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2U7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gRG9ja2VyZmlsZSBmb3IgYnVpbGRpbmcgdGhpcyBzZXJ2aWNlJ3MgaW1hZ2UuXG4gICAqIE1ldGFkYXRhIGZvciBDTEkgYnVpbGQgcHJvY2Vzcywgbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogRG9ja2VyIGJ1aWxkIHRhcmdldCBzdGFnZSBmb3IgbXVsdGktc3RhZ2UgRG9ja2VyZmlsZXMuXG4gICAqIFdoZW4gc3BlY2lmaWVkLCB0aGUgQ0xJIGJ1aWxkcyB3aXRoIGAtLXRhcmdldCA8ZG9ja2VyVGFyZ2V0PmAuXG4gICAqIFRoZSBpbWFnZSB0YWcgc3VmZml4IGlzIGFsc28gdXBkYXRlZDogYDxzZXJ2aWNlPi08dGFyZ2V0Pi1sYXRlc3RgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBEb2NrZXJmaWxlOiBGUk9NIG5vZGUgQVMgYmFzZSAuLi4gRlJPTSBiYXNlIEFTIGFwaSAuLi4gRlJPTSBiYXNlIEFTIHdvcmtlclxuICAgKiB7IG5hbWU6IFwiYXBpXCIsIGRvY2tlclRhcmdldDogXCJhcGlcIiB9ICAgLy8gYnVpbGRzOiBteWFwcC1hcGktYXBpLWxhdGVzdFxuICAgKiB7IG5hbWU6IFwid29ya2VyXCIsIGRvY2tlclRhcmdldDogXCJ3b3JrZXJcIiB9ICAvLyBidWlsZHM6IG15YXBwLXdvcmtlci13b3JrZXItbGF0ZXN0XG4gICAqL1xuICBkb2NrZXJUYXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgaW5saW5lIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICogVXNlIGZvciBzZXJ2aWNlLXNwZWNpZmljIEFXUyBwZXJtaXNzaW9ucyAoUzMsIER5bmFtb0RCLCBTUVMsIGV0Yy4pLlxuICAgKi9cbiAgdGFza1JvbGVJbmxpbmVQb2xpY2llcz86IFJlY29yZDxzdHJpbmcsIFBvbGljeURvY3VtZW50PjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtYW5hZ2VkIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzPzogSU1hbmFnZWRQb2xpY3lbXTtcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgc2VydmljZSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMsIFMzIGJ1Y2tldHMsIFNRUyBxdWV1ZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBJQ29ubmVjdGFibGUgcmVzb3VyY2VzIGFuZCBJQU0gZ3JhbnRzIGZvciBJQU0gcmVzb3VyY2VzLlxuICAgKiBGb2xsb3dzIGxlYXN0LXByaXZpbGVnZSAtIG9ubHkgdGhpcyBzZXJ2aWNlIGdldHMgYWNjZXNzLCBub3QgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBJQ29ubmVjdGFibGU6IFNlY3VyaXR5IGdyb3VwIHJlc291cmNlcyAoUkRTLCBFQ1MsIGV0Yy4pXG4gICAqIC0gSVN0b3JhZ2VDb25uZWN0b3I6IFMzIGJ1Y2tldHMgKElBTSBncmFudHMpXG4gICAqIC0gSUR5bmFtb0RCQ29ubmVjdG9yOiBEeW5hbW9EQiB0YWJsZXMgKElBTSBncmFudHMpXG4gICAqIC0gSVF1ZXVlQ29ubmVjdG9yOiBTUVMgcXVldWVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIENvbm5lY3Rpb25Db25maWc6IEV4cGxpY2l0IGFjY2VzcyBsZXZlbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNpbXBsZSBjb25uZWN0aW9ucyAoZGVmYXVsdCBwZXJtaXNzaW9ucylcbiAgICogY29ubmVjdGlvbnM6IFtkYXRhYmFzZSwgYnVja2V0LCBjYWNoZSwgcXVldWVdXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEV4cGxpY2l0IGFjY2VzcyBsZXZlbHNcbiAgICogY29ubmVjdGlvbnM6IFtcbiAgICogICBkYXRhYmFzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSBncm91cCAoUkRTKVxuICAgKiAgIHsgcmVzb3VyY2U6IGNhY2hlLCBhY2Nlc3M6IFwicmVhZFwiIH0sICAgLy8gUmVhZC1vbmx5IER5bmFtb0RCXG4gICAqICAgeyByZXNvdXJjZTogYnVja2V0LCBhY2Nlc3M6IFwid3JpdGVcIiB9LCAvLyBXcml0ZS1vbmx5IFMzXG4gICAqICAgeyByZXNvdXJjZTogcXVldWUsIGFjY2VzczogXCJjb25zdW1lXCIgfSAvLyBDb25zdW1lLW9ubHkgU1FTXG4gICAqIF1cbiAgICovXG4gIGNvbm5lY3Rpb25zPzogQ29ubmVjdGlvblNwZWNbXTtcblxuICAvKipcbiAgICogQ2FwYWNpdHkgcHJvdmlkZXIgZm9yIHRoaXMgc2VydmljZS4gUkVRVUlSRUQuXG4gICAqIEVhY2ggc2VydmljZSBzcGVjaWZpZXMgaXRzIG93biBjYXBhY2l0eSBwcm92aWRlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWl4ZWQgRkFSR0FURSBhbmQgRUMyIHNlcnZpY2VzIGluIHNhbWUgY2x1c3RlclxuICAgKiB7XG4gICAqICAgc2VydmljZXM6IFtcbiAgICogICAgIHsgbmFtZTogXCJhcGlcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJGQVJHQVRFXCIgfSxcbiAgICogICAgIHsgbmFtZTogXCJ3b3JrZXJcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJFQzJcIiwgZWMyQ29uZmlnOiB7IGluc3RhbmNlVHlwZTogXCJ0NGcubWljcm9cIiB9IH1cbiAgICogICBdXG4gICAqIH1cbiAgICovXG4gIGNhcGFjaXR5UHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIE9ubHkgdXNlZCB3aGVuIHNlcnZpY2UgY2FwYWNpdHlQcm92aWRlciBpcyBcIkVDMlwiLlxuICAgKiBTZXJ2aWNlcyB3aXRoIG1hdGNoaW5nIGVjMkNvbmZpZyBzaGFyZSBhbiBBU0cgZm9yIGVmZmljaWVuY3kuXG4gICAqL1xuICBlYzJDb25maWc/OiBFYzJDYXBhY2l0eUNvbmZpZztcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBTdG9yZSBwYXRoIGZvciBzZWNyZXRzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBzZWNyZXRzIGFyZSBmZXRjaGVkIGZyb20gLzxhcHA+LzxjbHVzdGVyPi88c2VydmljZT4uXG4gICAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE92ZXJyaWRlIGRlZmF1bHQgcGF0aFxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvY3VzdG9tL3BhdGgvdG8vc2VjcmV0c1wiXG4gICAqL1xuICBzc21TZWNyZXRzUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24gZm9yIEVDMiBpbnN0YW5jZXMuXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggYXV0by1nZW5lcmF0ZWQga2V5XG4gKiAtIGB7IGtleU5hbWU6IFwibXkta2V5XCIgfWA6IGVuYWJsZWQgd2l0aCBleGlzdGluZyBrZXlcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzaENvbmZpZyB7XG4gIC8qKiBTU0gga2V5IHBhaXIgbmFtZSAqL1xuICBrZXlOYW1lPzogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBDSURSIGJsb2NrcyBmb3IgU1NIIGFjY2VzcyAqL1xuICBhbGxvd2VkQ2lkcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgZnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggSUFNIGF1dGhcbiAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiLCBjb3JzOiB7Li4ufSB9YDogcHVibGljIHdpdGggQ09SU1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25VcmxDb25maWcge1xuICAvKiogQXV0aGVudGljYXRpb24gdHlwZS4gRGVmYXVsdDogQVdTX0lBTSAqL1xuICBhdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIC8qKiBDT1JTIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29ycz86IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnM7XG4gIC8qKiBJbnZva2UgbW9kZS4gVXNlIFJFU1BPTlNFX1NUUkVBTSBmb3IgTGFtYmRhIHN0cmVhbWluZy4gRGVmYXVsdDogQlVGRkVSRUQgKi9cbiAgaW52b2tlTW9kZT86IEludm9rZU1vZGU7XG59XG5cbmludGVyZmFjZSBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBFQ1MgY29tcHV0ZSBjb25maWd1cmF0aW9uLlxuICogQ3JlYXRlcyBhbiBFQ1MgY2x1c3RlciB3aXRoIG9uZSBvciBtb3JlIHNlcnZpY2VzIHNoYXJpbmcgYSBsb2FkIGJhbGFuY2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXZWJBcHBcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcHAuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSB9XVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaUNsdXN0ZXJcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ1c2Vyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL3VzZXJzLypcIiB9IH0sXG4gKiAgICAgeyBuYW1lOiBcIm9yZGVyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAxIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL29yZGVycy8qXCIgfSB9XG4gKiAgIF1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW50ZXJuYWwgd29ya2VycyAobm8gQUxCKVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJzXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcInByb2Nlc3NvclwiIH0sIHsgbmFtZTogXCJlbWFpbGVyXCIgfV1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlY3NcIjtcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSBmb3IgU1NNIHNlY3JldHMgbmFtZXNwYWNlLlxuICAgKiBXaGVuIGNvbnRhaW5lcnMgdXNlIHNlY3JldHMsIHRoZSBwYXRoIGlzIGRlcml2ZWQgYXM6IC88YXBwTmFtZT4vPGNsdXN0ZXJOYW1lPi88c2VydmljZU5hbWU+XG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcC5nZXROYW1lKCkgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgY29uZmlndXJhdGlvbi5cbiAgICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IHNldHRpbmdzXG4gICAqIC0gYHsgZG9tYWluOiBcIi4uLlwiIH1gOiBBTEIgd2l0aCBIVFRQUyArIEROU1xuICAgKiAtIGB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfWA6IE5vIEFMQiAoaW50ZXJuYWwgd29ya2VycylcbiAgICovXG4gIGNsdXN0ZXI/OiBFY3NDbHVzdGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBzY2FsaW5nLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKi9cbiAgc2VydmljZXM6IEVjc1NlcnZpY2VDb25maWdbXTtcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgZm9yIGFsbCBzZXJ2aWNlcyAoZGVmYXVsdCBpbWFnZSkuXG4gICAqIEluZGl2aWR1YWwgc2VydmljZXMgY2FuIG92ZXJyaWRlIHdpdGggdGhlaXIgb3duIGBpbWFnZWAgcHJvcGVydHkuXG4gICAqL1xuICBlY3JSZXBvc2l0b3J5PzogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyBjdXN0b20gaW1hZ2UuXG4gICAqIE5vdGU6IFRoaXMgaXMgbWV0YWRhdGEgZm9yIHRoZSBDTEkgYnVpbGQgcHJvY2VzcyxcbiAgICogbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFYzJDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlYzJcIjtcblxuICAvKiogRUMyIGluc3RhbmNlIHR5cGUuIERlZmF1bHQ6IFwidDRnLm1pY3JvXCIgKi9cbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgc3NoPzogU3NoQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBVc2VyIGRhdGEgc2NyaXB0ICovXG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIC8qKiBNYWNoaW5lIGltYWdlIChBTUkpICovXG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQZXJjZW50YWdlIG9mIGNhcGFjaXR5IHRvIHJ1biBvbiBTcG90IGluc3RhbmNlcyAoMC0xMDApLlxuICAgKiAtIE9taXQgb3IgMDogQWxsIE9uLURlbWFuZCBpbnN0YW5jZXMgKGRlZmF1bHQpXG4gICAqIC0gMTAwOiBBbGwgU3BvdCBpbnN0YW5jZXNcbiAgICogLSA1MDogSGFsZiBTcG90LCBoYWxmIE9uLURlbWFuZFxuICAgKlxuICAgKiBTcG90IGluc3RhbmNlcyBjYW4gcmVkdWNlIGNvc3RzIGJ5IHVwIHRvIDkwJSBidXQgbWF5IGJlIGludGVycnVwdGVkLlxuICAgKiBVc2UgZm9yIGZhdWx0LXRvbGVyYW50IHdvcmtsb2Fkcy5cbiAgICovXG4gIHNwb3RDYXBhY2l0eVBlcmNlbnRhZ2U/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBMYW1iZGEgY29uZmlndXJhdGlvbiBzaGFyZWQgYnkgYm90aCBjb250YWluZXIgYW5kIGNvZGUgZGVwbG95bWVudHMuXG4gKi9cbmludGVyZmFjZSBCYXNlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJsYW1iZGFcIjtcbiAgLyoqIFRpbWVvdXQgaW4gc2Vjb25kcy4gRGVmYXVsdDogMyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWVtb3J5IHNpemUgaW4gTUIuIERlZmF1bHQ6IDEyOCAqL1xuICBtZW1vcnlTaXplPzogbnVtYmVyO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqIENQVSBhcmNoaXRlY3R1cmUuIERlZmF1bHQ6IHg4Nl82NC4gVXNlIEFyY2hpdGVjdHVyZS5BUk1fNjQgZm9yIEdyYXZpdG9uMi4gKi9cbiAgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAvKiogTGFtYmRhIGZ1bmN0aW9uIGRlc2NyaXB0aW9uICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogSUFNIHJvbGUgZGVzY3JpcHRpb24gKi9cbiAgcm9sZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vIElubGluZSBwb2xpY2llcyAtIHJvdXRlZCB0byBleGVjdXRpb24gcm9sZSBmb3IgRUNTLCB0YXNrIHJvbGUgZm9yIExhbWJkYVxuICAvKiogSW5saW5lIElBTSBwb2xpY3kgc3RhdGVtZW50cyAqL1xuICBpbmxpbmVQb2xpY3k/OiBQb2xpY3lTdGF0ZW1lbnRbXTtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIFVSTCBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICAgKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBJQU0gYXV0aFxuICAgKiAtIGB7IGF1dGhUeXBlOiBcIk5PTkVcIiB9YDogcHVibGljIGFjY2Vzc1xuICAgKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uVXJsPzogRnVuY3Rpb25VcmxDb25maWcgfCBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyAqL1xuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFNlY3JldHMgZnJvbSBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAgICogQXJyYXkgb2Ygc2VjcmV0IG5hbWVzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGZyb20gdGhlIExhbWJkYSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgYXM6IC88YXBwTmFtZT4vbGFtYmRhLzxmdW5jdGlvbk5hbWU+XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJTVFJJUEVfU0VDUkVUXCJdXG4gICAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBmb3Igc2VjcmV0cy5cbiAgICogSWYgc2VjcmV0cyBhcmUgZGVmaW5lZCwgdGhpcyBwYXRoIGlzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdXNlczogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc3NtU2VjcmV0c1BhdGg6IFwiL215YXBwL2N1c3RvbS9wYXRoXCJcbiAgICovXG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgQ0RLIHJlc291cmNlcyAoQVdTIFNlY3JldHMgTWFuYWdlcikuXG4gICAqIFVzZWQgZm9yIENESy1tYW5hZ2VkIHNlY3JldHMgbGlrZSBkYXRhYmFzZSBjcmVkZW50aWFscy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2VjcmV0c0ltcG9ydDoge1xuICAgKiAgIERBVEFCQVNFX1VTRVJOQU1FOiBkYXRhYmFzZS5nZXRDcmVkZW50aWFscygpLmdldEltcG9ydChcInVzZXJuYW1lXCIpLFxuICAgKiAgIERBVEFCQVNFX1BBU1NXT1JEOiBkYXRhYmFzZS5nZXRDcmVkZW50aWFscygpLmdldEltcG9ydChcInBhc3N3b3JkXCIpXG4gICAqIH1cbiAgICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIGZvciBTU00gc2VjcmV0cyBwYXRoIGRlcml2YXRpb24uXG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcCBpbnN0YW5jZSB3aGVuIHVzaW5nIENvbXB1dGVGYWN0b3J5LlxuICAgKiBPbmx5IHNwZWNpZnkgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIExhbWJkYSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMsIFMzIGJ1Y2tldHMsIFNRUyBxdWV1ZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBJQ29ubmVjdGFibGUgcmVzb3VyY2VzIGFuZCBJQU0gZ3JhbnRzIGZvciBJQU0gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBJQ29ubmVjdGFibGU6IFNlY3VyaXR5IGdyb3VwIHJlc291cmNlcyAoUkRTLCBFQ1MsIGV0Yy4pXG4gICAqIC0gSVN0b3JhZ2VDb25uZWN0b3I6IFMzIGJ1Y2tldHMgKElBTSBncmFudHMpXG4gICAqIC0gSUR5bmFtb0RCQ29ubmVjdG9yOiBEeW5hbW9EQiB0YWJsZXMgKElBTSBncmFudHMpXG4gICAqIC0gSVF1ZXVlQ29ubmVjdG9yOiBTUVMgcXVldWVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIENvbm5lY3Rpb25Db25maWc6IEV4cGxpY2l0IGFjY2VzcyBsZXZlbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbm5lY3Rpb25zOiBbXG4gICAqICAgZGF0YWJhc2UsXG4gICAqICAgeyByZXNvdXJjZTogcXVldWUsIGFjY2VzczogXCJzZW5kXCIgfVxuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IENvbm5lY3Rpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIEV2ZW50QnJpZGdlIHNjaGVkdWxlIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCBMYW1iZGEgaW52b2NhdGlvbnMuXG4gICAqIFVzZXMgY3JvbiBvciByYXRlIHN5bnRheDogXCJyYXRlKDEgaG91cilcIiBvciBcImNyb24oMCAxMiAqICogPyAqKVwiLlxuICAgKi9cbiAgc2NoZWR1bGVFeHByZXNzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnRhaW5lci1iYXNlZCBMYW1iZGEgdXNpbmcgRUNSIGltYWdlLlxuICpcbiAqIFVzZXMgRG9ja2VyIGltYWdlIGZyb20gRUNSIHJlcG9zaXRvcnkuIEhhbmRsZXIgYW5kIHJ1bnRpbWUgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IHNldCB0byBGUk9NX0lNQUdFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkltYWdlTGFtYmRhXCIsIHtcbiAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAqICAgZGVwbG95bWVudDogXCJjb250YWluZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29udGFpbmVyLWJhc2VkIGRlcGxveW1lbnQgdXNpbmcgRUNSIGltYWdlICovXG4gIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCI7XG4gIC8qKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBMYW1iZGEgY29udGFpbmVyIGltYWdlICovXG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG59XG5cbi8qKlxuICogQ29kZS1iYXNlZCBMYW1iZGEgdXNpbmcgaW5saW5lIGNvZGUgb3IgUzMuXG4gKlxuICogVXNlcyB0cmFkaXRpb25hbCBMYW1iZGEgZGVwbG95bWVudCB3aXRoIGNvZGUsIGhhbmRsZXIsIGFuZCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkNvZGVMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvZGVcIixcbiAqICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSxcbiAqICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gKiAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1hcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29kZS1iYXNlZCBkZXBsb3ltZW50ICovXG4gIGRlcGxveW1lbnQ6IFwiY29kZVwiO1xuICAvKiogTGFtYmRhIGNvZGUgKGZyb20gYXNzZXQsIFMzLCBvciBpbmxpbmUpICovXG4gIGNvZGU6IENvZGU7XG4gIC8qKiBIYW5kbGVyIGZ1bmN0aW9uLiBEZWZhdWx0OiBcImluZGV4LmhhbmRsZXJcIiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogTGFtYmRhIHJ1bnRpbWUuIERlZmF1bHQ6IE5PREVKU18yMl9YICovXG4gIHJ1bnRpbWU/OiBSdW50aW1lO1xufVxuXG4vKipcbiAqIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBlbnN1cmluZyB0eXBlLXNhZmUgTGFtYmRhIGNvbmZpZ3VyYXRpb246XG4gKiAtIGBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiYCByZXF1aXJlcyBgZWNyUmVwb3NpdG9yeWBcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29kZVwiYCByZXF1aXJlcyBgY29kZWAgYW5kIGFsbG93cyBgaGFuZGxlcmAvYHJ1bnRpbWVgXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRhaW5lci1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb250YWluZXJcIiwgZWNyUmVwb3NpdG9yeTogZWNyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29kZS1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb2RlXCIsIGNvZGU6IENvZGUuZnJvbUFzc2V0KFwiLi9sYW1iZGFcIikgfVxuICovXG5leHBvcnQgdHlwZSBMYW1iZGFDb21wdXRlUHJvcHMgPSBDb250YWluZXJMYW1iZGFQcm9wcyB8IENvZGVMYW1iZGFQcm9wcztcblxuLy8gVHlwZS1zYWZlIHByb3BzIHdpdGggbGl0ZXJhbCBkaXNjcmltaW5hdG9ycyBmb3IgZmFjdG9yeSBvdmVybG9hZHNcbmV4cG9ydCB0eXBlIElFY3NDb21wdXRlUHJvcHMgPSBFY3NDb21wdXRlUHJvcHM7XG5leHBvcnQgdHlwZSBJTGFtYmRhQ29tcHV0ZVByb3BzID0gTGFtYmRhQ29tcHV0ZVByb3BzO1xuZXhwb3J0IHR5cGUgSUVjMkNvbXB1dGVQcm9wcyA9IEVjMkNvbXB1dGVQcm9wcztcblxuZXhwb3J0IHR5cGUgSUNvbXB1dGVQcm9wcyA9XG4gIHwgSUVjc0NvbXB1dGVQcm9wc1xuICB8IElMYW1iZGFDb21wdXRlUHJvcHNcbiAgfCBJRWMyQ29tcHV0ZVByb3BzO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBjb21wdXRlIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBpZ25vcmVkIG9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqIFRoZXNlIGNoZWNrcyBoZWxwIGNhdGNoIGlzc3VlcyB3aGVuIHByb3BzIGNvbWUgZnJvbSBkeW5hbWljIHNvdXJjZXMgd2hlcmVcbiAqIFR5cGVTY3JpcHQncyBjb21waWxlLXRpbWUgY2hlY2tzIG1heSBub3QgYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzOiBJQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIEVDUy1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQ1MgY29tcHV0ZVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJjYXBhY2l0eVByb3ZpZGVyXCIsIFwiZWMyQ29uZmlnXCIsIFwic2VydmljZXNcIiwgXCJjbHVzdGVyXCJdLFxuICAgIFwiZWNzXCIsXG4gICAgXCJFQ1MgY29tcHV0ZVwiXG4gICk7XG5cbiAgLy8gTGFtYmRhLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUxhbWJkYSBjb21wdXRlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcImZ1bmN0aW9uVXJsXCIsIFwiaGFuZGxlclwiLCBcInJ1bnRpbWVcIl0sXG4gICAgXCJsYW1iZGFcIixcbiAgICBcIkxhbWJkYSBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBFQzItc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUMyIGNvbXB1dGVcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wic3NoXCIsIFwidXNlckRhdGFcIiwgXCJtYWNoaW5lSW1hZ2VcIl0sXG4gICAgXCJlYzJcIixcbiAgICBcIkVDMiBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBFQ1Mtc3BlY2lmaWMgdmFsaWRhdGlvbiAtIHR5cGUgbmFycm93aW5nIGhhbmRsZWQgYnkgZGlzY3JpbWluYXRlZCB1bmlvblxuICBpZiAocHJvcHMudHlwZSA9PT0gXCJlY3NcIikge1xuICAgIHZhbGlkYXRlRWNzUHJvcHMocHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIEVDUy1zcGVjaWZpYyBwcm9wcy5cbiAqIEV4dHJhY3RlZCBmb3IgY2xhcml0eSBhbmQgZGV0YWlsIHBhcml0eSB3aXRoIGRhdGFiYXNlL25ldHdvcmsgcGF0dGVybnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRWNzUHJvcHMocHJvcHM6IEVjc0NvbXB1dGVQcm9wcyk6IHZvaWQge1xuICAvLyBWYWxpZGF0ZSBzZXJ2aWNlcyBhcnJheSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eVxuICBpZiAoIXByb3BzLnNlcnZpY2VzIHx8IHByb3BzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQgaW4gJ3NlcnZpY2VzJyBhcnJheS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1bmlxdWUgc2VydmljZSBuYW1lc1xuICBjb25zdCBzZXJ2aWNlTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gIGNvbnN0IGR1cGxpY2F0ZU5hbWVzID0gc2VydmljZU5hbWVzLmZpbHRlcihcbiAgICAobmFtZSwgaW5kZXgpID0+IHNlcnZpY2VOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICApO1xuICBpZiAoZHVwbGljYXRlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEdXBsaWNhdGUgc2VydmljZSBuYW1lczogJHtbLi4ubmV3IFNldChkdXBsaWNhdGVOYW1lcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHNlcnZpY2UgbmFtZSBmb3JtYXRcbiAgY29uc3QgaW52YWxpZE5hbWVzID0gcHJvcHMuc2VydmljZXMuZmlsdGVyKFxuICAgIChzKSA9PiAhL15bYS16QS1aXVthLXpBLVowLTktXSokLy50ZXN0KHMubmFtZSlcbiAgKTtcbiAgaWYgKGludmFsaWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgc2VydmljZSBuYW1lczogJHtpbnZhbGlkTmFtZXMubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBcIlNlcnZpY2UgbmFtZXMgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGh5cGhlbnMuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgcm91dGluZyB3aGVuIG11bHRpcGxlIHNlcnZpY2VzIGhhdmUgcG9ydHNcbiAgY29uc3Qgc2VydmljZXNXaXRoUG9ydHMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgcy5jb250YWluZXJzPy5zb21lKChjKSA9PiBjLnBvcnQpXG4gICk7XG5cbiAgaWYgKHNlcnZpY2VzV2l0aFBvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBtaXNzaW5nUm91dGluZyA9IHNlcnZpY2VzV2l0aFBvcnRzLmZpbHRlcigocykgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBBcnJheS5pc0FycmF5KHMucm91dGluZylcbiAgICAgICAgPyBzLnJvdXRpbmdcbiAgICAgICAgOiBzLnJvdXRpbmdcbiAgICAgICAgICA/IFtzLnJvdXRpbmddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIHJldHVybiAhcnVsZXMuc29tZSgocikgPT4gci5wYXRoIHx8IHIuaG9zdCk7XG4gICAgfSk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyBoYXMgZWMyQ29uZmlnIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCAnRUMyJy4gYCArXG4gICAgICAgICAgXCJUaGUgZWMyQ29uZmlnIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgY2FwYWNpdHlQcm92aWRlciBpcyBzZXQgdG8gJ0VDMicuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgY29udGFpbmVyIGNvbmZpZ3VyYXRpb25zIGZvciBhbiBFQ1Mgc2VydmljZS5cbiAqIENvbnZlcnRzIHVzZXItZmFjaW5nIEVjc0NvbnRhaW5lckNvbmZpZyB0byBpbnRlcm5hbCBFY3NDbHVzdGVyUHJvcHMgZm9ybWF0LlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29udGFpbmVyQ29uZmlncyhcbiAgc2VydmljZTogRWNzU2VydmljZUNvbmZpZ1xuKTogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl1bbnVtYmVyXVtcImNvbnRhaW5lcnNcIl0ge1xuICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogYy5uYW1lIHx8IGAke3NlcnZpY2UubmFtZX1Db250YWluZXIke2luZGV4ID4gMCA/IGluZGV4IDogXCJcIn1gLFxuICAgICAgaW1hZ2U6IGMuaW1hZ2UsXG4gICAgICBwb3J0OiBjLnBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogYy5lbnZpcm9ubWVudCxcbiAgICAgIHNlY3JldHM6IGMuc2VjcmV0cyxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IGMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIGNvbW1hbmQ6IGMuY29tbWFuZCxcbiAgICAgIGVudHJ5UG9pbnQ6IGMuZW50cnlQb2ludCxcbiAgICAgIGVzc2VudGlhbDogYy5lc3NlbnRpYWwsXG4gICAgICBoZWFsdGhDaGVjazogYy5oZWFsdGhDaGVja1xuICAgIH0pKTtcbiAgfVxuICAvLyBEZWZhdWx0IGNvbnRhaW5lciAobm8gcG9ydCA9IHdvcmtlcilcbiAgcmV0dXJuIFt7IG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgIH1dO1xufVxuXG4vKipcbiAqIFJlc29sdmVkIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmb3IgYW4gRUNTIHNlcnZpY2UuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIHNjYWxpbmdUeXBlOiBTY2FsaW5nVHlwZSB8IHVuZGVmaW5lZDtcbiAgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbWF4Q2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmcm9tIHNlcnZpY2UgcHJvcHMuXG4gKiBIYW5kbGVzIHRoZSB0aHJlZSBjYXNlczogZXhwbGljaXQgY29uZmlnLCBkaXNhYmxlZCAoZmFsc2UpLCBvciBkZWZhdWx0ICh1bmRlZmluZWQpLlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICBzY2FsaW5nOiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbik6IFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIGlmIChzY2FsaW5nID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2FsaW5nVHlwZTogdW5kZWZpbmVkLFxuICAgICAgbWluQ2FwYWNpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG1heENhcGFjaXR5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIGlmIChzY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlLkNQVSxcbiAgICAgIG1pbkNhcGFjaXR5OiB1bmRlZmluZWQsXG4gICAgICBtYXhDYXBhY2l0eTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjYWxpbmdUeXBlOiBzY2FsaW5nLnNjYWxpbmdUeXBlID8/IFNjYWxpbmdUeXBlLkNQVSxcbiAgICBtaW5DYXBhY2l0eTogc2NhbGluZy5taW5DYXBhY2l0eSxcbiAgICBtYXhDYXBhY2l0eTogc2NhbGluZy5tYXhDYXBhY2l0eVxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVkIExhbWJkYSBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50IHtcbiAgY29kZTogQ29kZTtcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBydW50aW1lOiBSdW50aW1lO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFtYmRhIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBmcm9tIHByb3BzLlxuICogSGFuZGxlcyBjb250YWluZXIgdnMgY29kZSBkZXBsb3ltZW50IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQoXG4gIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4pOiBSZXNvbHZlZExhbWJkYURlcGxveW1lbnQge1xuICBpZiAocHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb250YWluZXJcIikge1xuICAgIGlmICghKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgdGFnT3JEaWdlc3Q6IENPTVBVVEVfREVGQVVMVFMuRUNTLklNQUdFX1RBR1xuICAgICAgfSksXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0VcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcHJvcHMuY29kZSxcbiAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkhBTkRMRVIsXG4gICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBDT01QVVRFX0RFRkFVTFRTLkxBTUJEQS5SVU5USU1FXG4gIH07XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29tcHV0ZSByZXNvdXJjZXMgd2l0aCB0eXBlLXNhZmUgcmV0dXJuIHR5cGVzLlxuICpcbiAqIFRoZSBmYWN0b3J5IHVzZXMgb3ZlcmxvYWRzIHRvIGluZmVyIHRoZSBzcGVjaWZpYyBjb21wdXRlIHR5cGUgZnJvbSBwcm9wcyxcbiAqIGVuc3VyaW5nIFR5cGVTY3JpcHQgcHJvdmlkZXMgb25seSB0aGUgcmVsZXZhbnQgbWV0aG9kcyBmb3IgZWFjaCBjb21wdXRlIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVDUyBjb21wdXRlIC0gcmV0dXJucyBFY3NDb21wdXRlIHdpdGggRUNTLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGVjcyA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqIGVjcy5nZXRMb2FkQmFsYW5jZXIoKTsgLy8gQXZhaWxhYmxlIG9uIEVjc0NvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGFtYmRhIGNvbXB1dGUgLSByZXR1cm5zIExhbWJkYUNvbXB1dGUgd2l0aCBMYW1iZGEtc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgbGFtYmRhID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJGblwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpXG4gKiB9KSk7XG4gKiBsYW1iZGEuZ2V0RnVuY3Rpb25VcmwoKTsgLy8gQXZhaWxhYmxlIG9uIExhbWJkYUNvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRUMyIGNvbXB1dGUgLSByZXR1cm5zIEVjMkNvbXB1dGUgd2l0aCBFQzItc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgZWMyID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJJbnN0YW5jZVwiLCB7XG4gKiAgIHR5cGU6IFwiZWMyXCIsXG4gKiAgIGluc3RhbmNlVHlwZTogXCJ0NGcubWljcm9cIlxuICogfSkpO1xuICogZWMyLmdldEF1dG9TY2FsaW5nR3JvdXAoKTsgLy8gQXZhaWxhYmxlIG9uIEVjMkNvbXB1dGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXB1dGVGYWN0b3J5IHtcbiAgLy8gT3ZlcmxvYWQ6IEVDUyBwcm9wcyByZXR1cm5zIEVjc0NvbXB1dGVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElFY3NDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBFY3NDb21wdXRlO1xuICAvLyBPdmVybG9hZDogTGFtYmRhIHByb3BzIHJldHVybnMgTGFtYmRhQ29tcHV0ZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUxhbWJkYUNvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IExhbWJkYUNvbXB1dGU7XG4gIC8vIE92ZXJsb2FkOiBFQzIgcHJvcHMgcmV0dXJucyBFYzJDb21wdXRlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJRWMyQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gRWMyQ29tcHV0ZTtcbiAgLy8gSW1wbGVtZW50YXRpb24gc2lnbmF0dXJlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQW55Q29tcHV0ZSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCk6IEFueUNvbXB1dGUgPT4ge1xuICAgICAgdmFsaWRhdGVDb21wdXRlUHJvcHMocHJvcHMpO1xuXG4gICAgICAvLyBBdXRvLWRlcml2ZSBhcHBOYW1lIGZyb20gQXBwIGluc3RhbmNlIGZvciBFQ1MgY29tcHV0ZVxuICAgICAgY29uc3QgdHlwZUNvbmZpZyA9IENPTVBVVEVfVFlQRV9DT05GSUdbcHJvcHMudHlwZV07XG4gICAgICBjb25zdCBuZWVkc1ZwYyA9XG4gICAgICAgIHR5cGVDb25maWcucmVxdWlyZXNWcGMgfHxcbiAgICAgICAgKFwiY29ubmVjdGlvbnNcIiBpbiBwcm9wcyAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocHJvcHMuY29ubmVjdGlvbnMpICYmXG4gICAgICAgICAgcHJvcHMuY29ubmVjdGlvbnMubGVuZ3RoID4gMCk7XG4gICAgICBsZXQgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBuZWVkc1ZwYyA/IGFwcC5nZXRWcGMoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlY3JSZXBvc2l0b3J5OiBhcHAuZ2V0RGVmYXVsdENvbnRhaW5lclJlZ2lzdHJ5KClcbiAgICAgICAgfSxcbiAgICAgICAgLi4ucHJvcHNcbiAgICAgIH07XG5cbiAgICAgIGlmIChjb21wdXRlUHJvcHMudHlwZSA9PT0gXCJlY3NcIikge1xuICAgICAgICBjb21wdXRlUHJvcHMgPSB7XG4gICAgICAgICAgLi4uY29tcHV0ZVByb3BzLFxuICAgICAgICAgIGFwcE5hbWU6IGNvbXB1dGVQcm9wcy5hcHBOYW1lID8/IGFwcC5nZXROYW1lKClcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNwZWNpZmljIGNvbXB1dGUgY2xhc3MgYmFzZWQgb24gdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICBzd2l0Y2ggKGNvbXB1dGVQcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJlY3NcIjoge1xuICAgICAgICAgIC8vIFJlZ2lzdGVyIEVDUyBzZXJ2aWNlcyB3aXRoIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgQ0xJIGRpc2NvdmVyeVxuICAgICAgICAgIGNvbnN0IGNvbGxlY3RvciA9IGFwcC5nZXRNYW5pZmVzdENvbGxlY3RvcigpO1xuICAgICAgICAgIGNvbnN0IGNsdXN0ZXJOYW1lID0gaWQ7XG4gICAgICAgICAgY29uc3QgYXBwTmFtZSA9IGNvbXB1dGVQcm9wcy5hcHBOYW1lID8/IGFwcC5nZXROYW1lKCk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgY29tcHV0ZVByb3BzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBtYW5pZmVzdFNlcnZpY2U6IE1hbmlmZXN0U2VydmljZSA9IHtcbiAgICAgICAgICAgICAgbmFtZTogc2VydmljZS5uYW1lLFxuICAgICAgICAgICAgICBjbHVzdGVyTmFtZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gSW5jbHVkZSBkb2NrZXJmaWxlUGF0aCBpZiBzcGVjaWZpZWQgKG1ldGFkYXRhIGZvciBDTEkpXG4gICAgICAgICAgICBpZiAoc2VydmljZS5kb2NrZXJmaWxlUGF0aCkge1xuICAgICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2UuZG9ja2VyZmlsZVBhdGggPSBzZXJ2aWNlLmRvY2tlcmZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIGRvY2tlclRhcmdldCBpZiBzcGVjaWZpZWQgKG1ldGFkYXRhIGZvciBDTEkpXG4gICAgICAgICAgICBpZiAoc2VydmljZS5kb2NrZXJUYXJnZXQpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmRvY2tlclRhcmdldCA9IHNlcnZpY2UuZG9ja2VyVGFyZ2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5kIGNvbnRhaW5lciBwb3J0IGZyb20gZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJXaXRoUG9ydCA9IHNlcnZpY2UuY29udGFpbmVycz8uZmluZChcbiAgICAgICAgICAgICAgKGMpID0+IGMucG9ydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lcldpdGhQb3J0Py5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmNvbnRhaW5lclBvcnQgPSBjb250YWluZXJXaXRoUG9ydC5wb3J0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZ2dyZWdhdGUgc2VjcmV0cyBmcm9tIGFsbCBjb250YWluZXJzIChkZWR1cGxpY2F0ZWQpXG4gICAgICAgICAgICBjb25zdCBhbGxTZWNyZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBzZXJ2aWNlLmNvbnRhaW5lcnMgPz8gW10pIHtcbiAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5zZWNyZXRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZWNyZXQgb2YgY29udGFpbmVyLnNlY3JldHMpIHtcbiAgICAgICAgICAgICAgICAgIGFsbFNlY3JldHMuYWRkKHNlY3JldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsU2VjcmV0cy5zaXplID4gMCkge1xuICAgICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2Uuc2VjcmV0cyA9IEFycmF5LmZyb20oYWxsU2VjcmV0cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgc3NtU2VjcmV0c1BhdGggKGV4cGxpY2l0IG9yIGRlcml2ZWQpXG4gICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2Uuc3NtU2VjcmV0c1BhdGggPVxuICAgICAgICAgICAgICBzZXJ2aWNlLnNzbVNlY3JldHNQYXRoID8/XG4gICAgICAgICAgICAgIGAvJHthcHBOYW1lfS8ke2NsdXN0ZXJOYW1lfS8ke3NlcnZpY2UubmFtZX1gO1xuXG4gICAgICAgICAgICBjb2xsZWN0b3IuYWRkU2VydmljZShtYW5pZmVzdFNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IEVjc0NvbXB1dGUoc2NvcGUsIGlkLCBjb21wdXRlUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJsYW1iZGFcIjoge1xuICAgICAgICAgIC8vIEFkZCBhcHBOYW1lIHRvIHByb3BzIGZvciBMYW1iZGEgKG5lZWRlZCBmb3Igc2VjcmV0cyBwYXRoIGRlcml2YXRpb24pXG4gICAgICAgICAgY29uc3QgbGFtYmRhQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAgICAgLi4uY29tcHV0ZVByb3BzLFxuICAgICAgICAgICAgYXBwTmFtZTogYXBwLmdldE5hbWUoKVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBBbHdheXMgcmVnaXN0ZXIgTGFtYmRhIHdpdGggbWFuaWZlc3QgY29sbGVjdG9yIGZvciBDTEkgZGlzY292ZXJ5XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBMYW1iZGFzIGFyZSBkaXNjb3ZlcmFibGUgZm9yIHNlY3JldHMgbWFuYWdlbWVudCxcbiAgICAgICAgICAvLyBldmVuIHRob3NlIHRoYXQgZG9uJ3QgY3VycmVudGx5IGhhdmUgc2VjcmV0cyBjb25maWd1cmVkXG4gICAgICAgICAgY29uc3QgY29sbGVjdG9yID0gYXBwLmdldE1hbmlmZXN0Q29sbGVjdG9yKCk7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3RMYW1iZGE6IE1hbmlmZXN0TGFtYmRhID0ge1xuICAgICAgICAgICAgbmFtZTogaWQsXG4gICAgICAgICAgICBzc21TZWNyZXRzUGF0aDpcbiAgICAgICAgICAgICAgbGFtYmRhQ29tcHV0ZVByb3BzLnNzbVNlY3JldHNQYXRoIHx8XG4gICAgICAgICAgICAgIGAvJHtsYW1iZGFDb21wdXRlUHJvcHMuYXBwTmFtZX0vbGFtYmRhLyR7aWR9YFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGFtYmRhQ29tcHV0ZVByb3BzLnNlY3JldHMgJiZcbiAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zZWNyZXRzLmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hbmlmZXN0TGFtYmRhLnNlY3JldHMgPSBsYW1iZGFDb21wdXRlUHJvcHMuc2VjcmV0cztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdG9yLmFkZExhbWJkYShtYW5pZmVzdExhbWJkYSk7XG5cbiAgICAgICAgICByZXR1cm4gbmV3IExhbWJkYUNvbXB1dGUoc2NvcGUsIGlkLCBsYW1iZGFDb21wdXRlUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJlYzJcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IEVjMkNvbXB1dGUoc2NvcGUsIGlkLCBjb21wdXRlUHJvcHMpO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gY29tcHV0ZVByb3BzO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBjb21wdXRlIHR5cGU6ICR7U3RyaW5nKChfZXhoYXVzdGl2ZSBhcyBJQ29tcHV0ZVByb3BzKS50eXBlKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBFQ1MgY29tcHV0ZSB3cmFwcGVyIGltcGxlbWVudGluZyBJRWNzQ29tcHV0ZS5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gRUNTLXNwZWNpZmljIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVjc0NvbXB1dGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJRWNzQ29tcHV0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb21wdXRlVHlwZSA9IFwiZWNzXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlY3NDbHVzdGVyOiBFY3NDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJRWNzQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIFRyYW5zZm9ybSBFY3NTZXJ2aWNlQ29uZmlnW10gdG8gRWNzU2VydmljZVByb3BzW10gZm9yIEVjc0NsdXN0ZXJcbiAgICBjb25zdCBzZXJ2aWNlczogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl0gPSBwcm9wcy5zZXJ2aWNlcy5tYXAoXG4gICAgICAoc2VydmljZSkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJzID0gYnVpbGRDb250YWluZXJDb25maWdzKHNlcnZpY2UpO1xuICAgICAgICBjb25zdCB7IHNjYWxpbmdUeXBlLCBtaW5DYXBhY2l0eSwgbWF4Q2FwYWNpdHkgfSA9IHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICAgICAgICAgIHNlcnZpY2Uuc2NhbGluZ1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogc2VydmljZS5uYW1lLFxuICAgICAgICAgIGltYWdlOiBzZXJ2aWNlLmltYWdlLFxuICAgICAgICAgIGNvbnRhaW5lcnMsXG4gICAgICAgICAgY3B1OiBzZXJ2aWNlLmNwdSxcbiAgICAgICAgICBtZW1vcnlMaW1pdE1pQjogc2VydmljZS5tZW1vcnlMaW1pdE1pQixcbiAgICAgICAgICBkZXNpcmVkQ291bnQ6IHNlcnZpY2UuZGVzaXJlZENvdW50LFxuICAgICAgICAgIHNjYWxpbmdUeXBlLFxuICAgICAgICAgIG1pbkNhcGFjaXR5LFxuICAgICAgICAgIG1heENhcGFjaXR5LFxuICAgICAgICAgIHJvdXRpbmc6IHNlcnZpY2Uucm91dGluZyxcbiAgICAgICAgICB0YXNrUm9sZUlubGluZVBvbGljaWVzOiBzZXJ2aWNlLnRhc2tSb2xlSW5saW5lUG9saWNpZXMsXG4gICAgICAgICAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM6IHNlcnZpY2UudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMsXG4gICAgICAgICAgY29ubmVjdGlvbnM6IHNlcnZpY2UuY29ubmVjdGlvbnMsXG4gICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyLFxuICAgICAgICAgIGVjMkNvbmZpZzogc2VydmljZS5lYzJDb25maWcsXG4gICAgICAgICAgc3NtU2VjcmV0c1BhdGg6IHNlcnZpY2Uuc3NtU2VjcmV0c1BhdGgsXG4gICAgICAgICAgZG9ja2VyVGFyZ2V0OiBzZXJ2aWNlLmRvY2tlclRhcmdldFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBCdWlsZCBjbHVzdGVyIGNvbmZpZ1xuICAgIGNvbnN0IGNsdXN0ZXI6IEVjc0NsdXN0ZXJQcm9wc1tcImNsdXN0ZXJcIl0gPSBwcm9wcy5jbHVzdGVyXG4gICAgICA/IHtcbiAgICAgICAgICBkb21haW46IHByb3BzLmNsdXN0ZXIuZG9tYWluLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuY2x1c3Rlci5sb2FkQmFsYW5jZXIsXG4gICAgICAgICAgZGlyZWN0QWNjZXNzOiBwcm9wcy5jbHVzdGVyLmRpcmVjdEFjY2VzcyxcbiAgICAgICAgICBkb21haW5Db25maWc6IHByb3BzLmNsdXN0ZXIuZG9tYWluQ29uZmlnXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZWNzUHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyA9IHtcbiAgICAgIGNsdXN0ZXJOYW1lOiBpZCxcbiAgICAgIGFwcE5hbWU6IHByb3BzLmFwcE5hbWUsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGVjclJlcG9zaXRvcnk6IHByb3BzLmVjclJlcG9zaXRvcnkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQ1MuRkFMTEJBQ0tfSU1BR0UsXG4gICAgICBjbHVzdGVyLFxuICAgICAgc2VydmljZXNcbiAgICB9O1xuXG4gICAgdGhpcy5lY3NDbHVzdGVyID0gbmV3IEVjc0NsdXN0ZXIoc2NvcGUsIGAke2lkfUVjc2AsIGVjc1Byb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5lY3NDbHVzdGVyLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgRUNTIGNsdXN0ZXIuICovXG4gIGdldENsdXN0ZXIoKTogSUNsdXN0ZXIge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0Q2x1c3RlcigpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlciBpZiBvbmUgd2FzIGNyZWF0ZWQuICovXG4gIGdldExvYWRCYWxhbmNlcigpOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0TG9hZEJhbGFuY2VyKCk7XG4gIH1cblxuICAvKiogR2V0IGEgc3BlY2lmaWMgc2VydmljZSBieSBuYW1lLiAqL1xuICBnZXRTZXJ2aWNlKG5hbWU6IHN0cmluZyk6IElCYXNlU2VydmljZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3Rlci5nZXRTZXJ2aWNlKG5hbWUpO1xuICB9XG5cbiAgLyoqIEdldCBhbGwgc2VydmljZXMgaW4gdGhlIGNsdXN0ZXIuICovXG4gIGdldEFsbFNlcnZpY2VzKCk6IElCYXNlU2VydmljZVtdIHtcbiAgICBjb25zdCBzZXJ2aWNlc01hcCA9IHRoaXMuZWNzQ2x1c3Rlci5nZXRTZXJ2aWNlcygpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHNlcnZpY2VzTWFwLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwIGZvciB0aGUgY2x1c3Rlci4gKi9cbiAgZ2V0U2VjdXJpdHlHcm91cCgpOiBJU2VjdXJpdHlHcm91cCB7XG4gICAgLy8gUmV0dXJuIHRoZSBmaXJzdCBzZWN1cml0eSBncm91cCBmcm9tIGNvbm5lY3Rpb25zXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSB0aGlzLmNvbm5lY3Rpb25zLnNlY3VyaXR5R3JvdXBzO1xuICAgIGlmIChzZWN1cml0eUdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNlY3VyaXR5IGdyb3VwcyBmb3VuZCBmb3IgRUNTIGNsdXN0ZXJcIik7XG4gICAgfVxuICAgIHJldHVybiBzZWN1cml0eUdyb3Vwc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEFMQiBsaXN0ZW5lciBpZiB0aGlzIGlzIGFuIEVDUyBjb21wdXRlIHdpdGggQUxCLlxuICAgKi9cbiAgZ2V0TGlzdGVuZXIoKTogQXBwbGljYXRpb25MaXN0ZW5lciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3Rlci5nZXRMaXN0ZW5lcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBFQ1MgY2x1c3RlciBjb25zdHJ1Y3QuXG4gICAqL1xuICBnZXRFY3NDbHVzdGVyKCk6IEVjc0NsdXN0ZXIge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXI7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIGVjczpFeGVjdXRlQ29tbWFuZCBwZXJtaXNzaW9uIGZvciBFQ1Mgc2VydmljZXMuXG4gICAqIFVzZXMgd2lsZGNhcmQgcmVzb3VyY2UgYmVjYXVzZSBlY3M6RXhlY3V0ZUNvbW1hbmQgdGFyZ2V0cyB0YXNrIEFSTnNcbiAgICogd2hpY2ggYXJlIG5vdCBrbm93biB1bnRpbCBydW50aW1lICh0YXNrcyBhcmUgZXBoZW1lcmFsKS5cbiAgICovXG4gIGdyYW50RXhlY3V0ZUNvbW1hbmQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcImVjczpFeGVjdXRlQ29tbWFuZFwiXSxcbiAgICAgIHJlc291cmNlQXJuczogW1wiKlwiXVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTGFtYmRhIGNvbXB1dGUgd3JhcHBlciBpbXBsZW1lbnRpbmcgSUxhbWJkYUNvbXB1dGUuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIExhbWJkYS1zcGVjaWZpYyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUxhbWJkYUNvbXB1dGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHV0ZVR5cGUgPSBcImxhbWJkYVwiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgaGFuZGxlciwgcnVudGltZSB9ID0gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQocHJvcHMpO1xuXG4gICAgLy8gQ29udmVydCBwcmVzZW5jZS1iYXNlZCBmdW5jdGlvblVybCBjb25maWcgdG8gbGVnYWN5IGJvb2xlYW4gZm9ybWF0XG4gICAgY29uc3QgZnVuY3Rpb25VcmxDb25maWcgPSBwcm9wcy5mdW5jdGlvblVybDtcbiAgICBjb25zdCBlbmFibGVGdW5jdGlvblVybCA9XG4gICAgICBmdW5jdGlvblVybENvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGZ1bmN0aW9uVXJsQ29uZmlnICE9PSBmYWxzZTtcbiAgICBjb25zdCBmdW5jdGlvblVybEF1dGhUeXBlID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmF1dGhUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQ29ycyA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5jb3JzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsSW52b2tlTW9kZSA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5pbnZva2VNb2RlXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbGFtYmRhUHJvcHMgPSB7XG4gICAgICBjb2RlLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBoYW5kbGVyLFxuICAgICAgcnVudGltZSxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlID8/IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkFSQ0hJVEVDVFVSRSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplLFxuICAgICAgbGFtYmRhRGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZURlc2NyaXB0aW9uOiBwcm9wcy5yb2xlRGVzY3JpcHRpb24sXG4gICAgICBpbmxpbmVQb2xpY3k6IHByb3BzLmlubGluZVBvbGljeSB8fCBbXSxcbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsLFxuICAgICAgZnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgICAgIGZ1bmN0aW9uVXJsQ29ycyxcbiAgICAgIGZ1bmN0aW9uVXJsSW52b2tlTW9kZSxcbiAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogcHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIHNzbVNlY3JldHNQYXRoOiBwcm9wcy5zc21TZWNyZXRzUGF0aCxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IHByb3BzLnNlY3JldHNJbXBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICBhcHBOYW1lOiBwcm9wcy5hcHBOYW1lLFxuICAgICAgZnVuY3Rpb25OYW1lOiBpZFxuICAgIH07XG5cbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gbmV3IExhbWJkYUZ1bmN0aW9uKHNjb3BlLCBgJHtpZH1MYW1iZGFgLCBsYW1iZGFQcm9wcyk7XG5cbiAgICAvLyBDREsncyBGdW5jdGlvbi5jb25uZWN0aW9ucyBnZXR0ZXIgdGhyb3dzIGZvciBub24tVlBDIExhbWJkYXMsIHNvIG9ubHlcbiAgICAvLyBhY2Nlc3MgaXQgd2hlbiBhIFZQQyBpcyBjb25maWd1cmVkLiBOb24tVlBDIExhbWJkYXMgZ2V0IGFuIGVtcHR5XG4gICAgLy8gQ29ubmVjdGlvbnMgb2JqZWN0IHRvIHNhdGlzZnkgdGhlIElDb25uZWN0YWJsZSBpbnRlcmZhY2UuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHByb3BzLnZwY1xuICAgICAgPyB0aGlzLmxhbWJkYUZ1bmN0aW9uLmNvbm5lY3Rpb25zXG4gICAgICA6IG5ldyBDb25uZWN0aW9ucygpO1xuXG4gICAgLy8gUHJvY2VzcyBjb25uZWN0aW9ucyB1c2luZyB0aGUgdW5pZmllZCBjb25uZWN0b3IgaW50ZXJmYWNlXG4gICAgaWYgKHByb3BzLmNvbm5lY3Rpb25zICYmIHByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghcHJvcHMudnBjKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTGFtYmRhICcke2lkfScgaGFzIGNvbm5lY3Rpb25zIGNvbmZpZ3VyZWQgYnV0IG5vIFZQQy4gYCArXG4gICAgICAgICAgICBcIkEgVlBDIGlzIHJlcXVpcmVkIGZvciBzZWN1cml0eSBncm91cCBjb25uZWN0aW9ucy5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25zKFxuICAgICAgICAgIHByb3BzLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIHRoaXMubGFtYmRhRnVuY3Rpb24sIC8vIElHcmFudGFibGUgKGV4ZWN1dGlvbiByb2xlKVxuICAgICAgICAgIHRoaXMubGFtYmRhRnVuY3Rpb24gLy8gSUNvbm5lY3RhYmxlIChzZWN1cml0eSBncm91cClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHByb2Nlc3MgY29ubmVjdGlvbnMgZm9yIExhbWJkYSAnJHtpZH0nOiAke1xuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgTGFtYmRhIGZ1bmN0aW9uIGJ5IG5hbWUuXG4gICAqIFNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgZnVuY3Rpb24sIG5hbWUgaXMgaWdub3JlZC5cbiAgICovXG4gIGdldEZ1bmN0aW9uKF9uYW1lPzogc3RyaW5nKTogSUZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIExhbWJkYSBmdW5jdGlvbnMuICovXG4gIGdldEFsbEZ1bmN0aW9ucygpOiBJRnVuY3Rpb25bXSB7XG4gICAgcmV0dXJuIFt0aGlzLmxhbWJkYUZ1bmN0aW9uXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZ1bmN0aW9uIFVSTCBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBnZXRGdW5jdGlvblVybChfbmFtZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb24uZ2V0RnVuY3Rpb25VcmwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBpbnZva2UgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UoZ3JhbnRlZTogSUdyYW50YWJsZSwgX2Z1bmN0aW9uTmFtZT86IHN0cmluZyk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbi5ncmFudEludm9rZShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwIGZvciBWUEMtZW5hYmxlZCBMYW1iZGEgZnVuY3Rpb25zLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgTGFtYmRhIGlzIG5vdCBWUEMtZW5hYmxlZC5cbiAgICovXG4gIGdldFNlY3VyaXR5R3JvdXAoKTogSVNlY3VyaXR5R3JvdXAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3VwcztcbiAgICByZXR1cm4gc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCA/IHNlY3VyaXR5R3JvdXBzWzBdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBMYW1iZGEgZnVuY3Rpb24gY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0TGFtYmRhRnVuY3Rpb24oKTogTGFtYmRhRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYUZ1bmN0aW9uO1xuICB9XG59XG5cbi8qKlxuICogRUMyIGNvbXB1dGUgd3JhcHBlciBpbXBsZW1lbnRpbmcgSUVjMkNvbXB1dGUuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIEVDMi1zcGVjaWZpYyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFYzJDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUVjMkNvbXB1dGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHV0ZVR5cGUgPSBcImVjMlwiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWMySW5zdGFuY2U6IEVjMkluc3RhbmNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJRWMyQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGVuYWJsZVNTSCA9IHByb3BzLnNzaCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLnNzaCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBlYzJQcm9wcyA9IHtcbiAgICAgIHNlcnZpY2VOYW1lOiBgJHtpZH1TZXJ2aWNlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlIHx8IENPTVBVVEVfREVGQVVMVFMuRUMyLklOU1RBTkNFX1RZUEUsXG4gICAgICBlbmFibGVTU0gsXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBhY2l0eSB8fCBDT01QVVRFX0RFRkFVTFRTLkVDMi5NSU5fQ0FQQUNJVFksXG4gICAgICBtYXhDYXBhY2l0eTogcHJvcHMubWF4Q2FwYWNpdHkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQzIuTUFYX0NBUEFDSVRZLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBzcG90Q2FwYWNpdHlQZXJjZW50YWdlOiBwcm9wcy5zcG90Q2FwYWNpdHlQZXJjZW50YWdlXG4gICAgfTtcblxuICAgIHRoaXMuZWMySW5zdGFuY2UgPSBuZXcgRWMySW5zdGFuY2Uoc2NvcGUsIGAke2lkfUVjMmAsIGVjMlByb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5lYzJJbnN0YW5jZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEF1dG8gU2NhbGluZyBHcm91cC4gKi9cbiAgZ2V0QXV0b1NjYWxpbmdHcm91cCgpOiBJQXV0b1NjYWxpbmdHcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZWMySW5zdGFuY2UuZ2V0QXV0b1NjYWxpbmdHcm91cCgpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgc2VjdXJpdHkgZ3JvdXAuICovXG4gIGdldFNlY3VyaXR5R3JvdXAoKTogSVNlY3VyaXR5R3JvdXAge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlLmFzZ1NlY3VyaXR5R3JvdXA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIEVDMiBpbnN0YW5jZSBjb25zdHJ1Y3QuXG4gICAqL1xuICBnZXRFYzJJbnN0YW5jZSgpOiBFYzJJbnN0YW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuZWMySW5zdGFuY2U7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGUgZ3VhcmRzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHsgaXNDb21wdXRlLCBpc0Vjc0NvbXB1dGUsIGlzTGFtYmRhQ29tcHV0ZSwgaXNFYzJDb21wdXRlIH07XG5leHBvcnQgdHlwZSB7IElFY3NDb21wdXRlLCBJTGFtYmRhQ29tcHV0ZSwgSUVjMkNvbXB1dGUsIEFueUNvbXB1dGUgfTtcbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  import { Construct } from "constructs";
2
2
  import type App from "../../app";
3
3
  import { type DynamoDBKeySchema, type DynamoDBGlobalSecondaryIndex } from "../../resources/aws/database/dynamodb";
4
- import { type Connections, type IConnectable, type IVpc, type SubnetSelection } from "aws-cdk-lib/aws-ec2";
4
+ import { type Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
5
5
  import { type ITable } from "aws-cdk-lib/aws-dynamodb";
6
6
  import { type Secret } from "../../resources/aws/secrets";
7
7
  import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
@@ -9,13 +9,9 @@ import { type IRelationalDatabase, type IDynamoDBDatabase, type RelationalDataba
9
9
  import { type IDynamoDBConnector, type ISecurityGroupConnector } from "./interfaces/connector.js";
10
10
  import { type IInstanceEngine, type IClusterEngine } from "aws-cdk-lib/aws-rds";
11
11
  import { Duration } from "aws-cdk-lib";
12
- import { type IKey } from "aws-cdk-lib/aws-kms";
13
- export type DatabaseEngine = "postgresql" | "mysql";
14
- export interface EngineConfig {
15
- defaultUsername: string;
16
- sslParameters: Record<string, string>;
17
- rotationAppName: string;
18
- }
12
+ import { type DatabaseEngine, type EngineConfig, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type DatabaseInsightsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig } from "../../utils/databaseTypes";
13
+ export type { DatabaseEngine, EngineConfig } from "../../utils/databaseTypes";
14
+ export { type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type SecretRotationConfig, type EncryptionConfig, type DatabaseInsightsConfig, type AwsManagedKey, type CustomerManagedKeyMarker, type EncryptionKeySpec, type AuroraEncryptionConfig, type AuroraReaderConfig, type AuroraWriterConfig, type AuroraReadersConfig, isAwsManagedKey, isCMKRequested, AWS_MANAGED, USE_CMK } from "../../utils/databaseTypes";
19
15
  export declare const DATABASE_ENGINE_CONFIG: Record<DatabaseEngine, {
20
16
  aurora: {
21
17
  version: string;
@@ -32,82 +28,6 @@ export declare const DATABASE_ENGINE_CONFIG: Record<DatabaseEngine, {
32
28
  export declare function getAuroraClusterEngine(engine: DatabaseEngine): IClusterEngine;
33
29
  export declare function getInstanceEngine(engine: DatabaseEngine): IInstanceEngine;
34
30
  export declare function getEngineConfig(engine: DatabaseEngine): EngineConfig;
35
- export interface ProxyConfig {
36
- maxConnections?: number;
37
- maxIdleConnections?: number;
38
- connectionBorrowTimeout?: number;
39
- requireTLS?: boolean;
40
- vpcSubnets?: SubnetSelection;
41
- }
42
- export interface ReadReplicaConfig {
43
- instanceType?: string;
44
- availabilityZone?: string;
45
- }
46
- export interface CredentialsConfig {
47
- username?: string;
48
- secretRotation?: SecretRotationConfig | false;
49
- }
50
- export interface SecretRotationConfig {
51
- automaticallyAfter?: Duration;
52
- }
53
- export interface EncryptionConfig {
54
- storageKey?: EncryptionKeySpec;
55
- }
56
- export type PerformanceInsightsRetentionPeriod = 7 | 31 | 93 | 186 | 372;
57
- export interface PerformanceInsightsConfig {
58
- encryptionKey?: EncryptionKeySpec;
59
- /** Retention period in days. Default: 31 (1 month). */
60
- retentionPeriod?: PerformanceInsightsRetentionPeriod;
61
- }
62
- export interface AwsManagedKey {
63
- readonly awsManaged: true;
64
- }
65
- export interface CustomerManagedKeyMarker {
66
- readonly useCMK: true;
67
- }
68
- export type EncryptionKeySpec = IKey | AwsManagedKey | CustomerManagedKeyMarker;
69
- export declare function isAwsManagedKey(spec: EncryptionKeySpec | undefined): spec is AwsManagedKey;
70
- /**
71
- * Type guard to check if CMK is explicitly requested.
72
- */
73
- export declare function isCMKRequested(spec: EncryptionKeySpec | undefined): spec is CustomerManagedKeyMarker;
74
- /**
75
- * Convenience constant for specifying AWS managed encryption (the default).
76
- * @example
77
- * encryption: { storageKey: AWS_MANAGED }
78
- */
79
- export declare const AWS_MANAGED: AwsManagedKey;
80
- /**
81
- * Convenience constant for explicitly requesting CMK.
82
- * @example
83
- * encryption: { storageKey: USE_CMK }
84
- */
85
- export declare const USE_CMK: CustomerManagedKeyMarker;
86
- /**
87
- * **DESTRUCTIVE**: Changing `storageKey` after cluster creation causes cluster REPLACEMENT.
88
- */
89
- export interface AuroraEncryptionConfig {
90
- /** DESTRUCTIVE: Changing after creation causes cluster replacement */
91
- storageKey?: EncryptionKeySpec;
92
- }
93
- export interface AuroraReaderConfig {
94
- scaleWithWriter?: boolean;
95
- enablePerformanceInsights?: boolean;
96
- identifierSuffix?: string;
97
- availabilityZone?: string;
98
- }
99
- export interface AuroraWriterConfig {
100
- enablePerformanceInsights?: boolean;
101
- identifierSuffix?: string;
102
- availabilityZone?: string;
103
- }
104
- export interface AuroraReadersConfig {
105
- /** Mutually exclusive with instances */
106
- count?: number;
107
- /** Mutually exclusive with count */
108
- instances?: AuroraReaderConfig[];
109
- defaultEnablePerformanceInsights?: boolean;
110
- }
111
31
  /**
112
32
  * Base props for database configuration.
113
33
  */
@@ -132,7 +52,7 @@ export interface AuroraDatabaseProps extends BaseDatabaseProps {
132
52
  monitoringInterval?: Duration;
133
53
  preferredMaintenanceWindow?: string;
134
54
  port?: number;
135
- performanceInsights?: PerformanceInsightsConfig | false;
55
+ databaseInsights?: DatabaseInsightsConfig | false;
136
56
  /** ARN or identifier of DB cluster snapshot to restore from */
137
57
  snapshotIdentifier?: string;
138
58
  /** Username from the snapshot (required when restoring from snapshot to reset password) */
@@ -172,7 +92,7 @@ export interface GlobalAuroraDatabaseProps extends BaseDatabaseProps {
172
92
  monitoringInterval?: Duration;
173
93
  preferredMaintenanceWindow?: string;
174
94
  port?: number;
175
- performanceInsights?: PerformanceInsightsConfig | false;
95
+ databaseInsights?: DatabaseInsightsConfig | false;
176
96
  /** ARN or identifier of DB cluster snapshot to restore from */
177
97
  snapshotIdentifier?: string;
178
98
  /** Username from the snapshot (required when restoring from snapshot to reset password) */
@@ -187,7 +107,7 @@ export interface InstanceDatabaseProps extends BaseDatabaseProps {
187
107
  port?: number;
188
108
  multiAz?: boolean;
189
109
  backupRetention?: number;
190
- performanceInsights?: PerformanceInsightsConfig | false;
110
+ databaseInsights?: DatabaseInsightsConfig | false;
191
111
  proxy?: ProxyConfig | false;
192
112
  readReplica?: ReadReplicaConfig | false;
193
113
  credentials?: CredentialsConfig;
@@ -230,7 +150,7 @@ export type IDatabaseProps = AuroraDatabaseProps | InstanceDatabaseProps | Globa
230
150
  * // Aurora database - returns RelationalDatabase
231
151
  * const aurora = app.addDatabase(DatabaseFactory.build("Main", {
232
152
  * type: "Aurora",
233
- * databaseName: "myapp"
153
+ * databaseName: "my_app"
234
154
  * }));
235
155
  * aurora.getHostEndpoint(); // Available
236
156
  *
@@ -283,7 +203,7 @@ export declare class DynamoDBDatabase extends Construct implements IDynamoDBData
283
203
  * @example
284
204
  * const db = app.addDatabase(DatabaseFactory.build("Main", {
285
205
  * type: "Aurora",
286
- * databaseName: "myapp"
206
+ * databaseName: "my_app"
287
207
  * }));
288
208
  * db.grantConnect(lambda);
289
209
  */