@ashishpandeyone/cdk-lambda-web-function 0.1.8 → 0.1.9

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.
@@ -43,6 +43,7 @@ const logs = __importStar(require("aws-cdk-lib/aws-logs"));
43
43
  const code_1 = require("./private/code");
44
44
  const log_group_1 = require("./private/log-group");
45
45
  const metrics_1 = require("./private/metrics");
46
+ const nag_1 = require("./private/nag");
46
47
  const resource_policy_statements_1 = require("./private/resource-policy-statements");
47
48
  const revision_cleanup_1 = require("./private/revision-cleanup");
48
49
  const validation_1 = require("./private/validation");
@@ -55,7 +56,7 @@ const MAX_ENDPOINTS = 10;
55
56
  * What `WebFunction` and imported functions have in common.
56
57
  */
57
58
  class WebFunctionBase extends aws_cdk_lib_1.Resource {
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase", version: "0.1.8" };
59
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase", version: "0.1.9" };
59
60
  /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
60
61
  get webFunctionRef() {
61
62
  return { functionArn: this.webFunctionArn };
@@ -152,7 +153,7 @@ exports.WebFunctionBase = WebFunctionBase;
152
153
  * @resource AWS::Lambda::WebFunction
153
154
  */
154
155
  class WebFunction extends WebFunctionBase {
155
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.8" };
156
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.9" };
156
157
  /**
157
158
  * Imports an existing Web Function by its ARN (in any region or account).
158
159
  */
@@ -228,13 +229,10 @@ class WebFunction extends WebFunctionBase {
228
229
  if (props.entrypoint !== undefined) {
229
230
  this.environment.AWS_LAMBDA_NODEJS_ENTRYPOINT = props.entrypoint;
230
231
  }
231
- this.role = props.role ?? new iam.Role(this, 'ServiceRole', {
232
- assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
233
- managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')],
234
- });
232
+ const logGroupName = `/aws/lambda/web/${this.webFunctionName}`;
233
+ this.role = props.role ?? this.createRole(logGroupName);
235
234
  this.grantPrincipal = this.role;
236
235
  // Log groups first: the service would otherwise create them without retention.
237
- const logGroupName = `/aws/lambda/web/${this.webFunctionName}`;
238
236
  this.logGroupName = logGroupName;
239
237
  this.logOptions = { logRetention: props.logRetention, logRemovalPolicy: props.logRemovalPolicy };
240
238
  const logGroups = this.createLogGroups(logGroupName);
@@ -375,6 +373,30 @@ class WebFunction extends WebFunctionBase {
375
373
  }
376
374
  return endpoint;
377
375
  }
376
+ /**
377
+ * The default execution role: write to the function's own log groups only (the home region's and every region's
378
+ * `.local` copy), the minimum AWS documents for Web Functions. Not `AWSLambdaBasicExecutionRole`, whose
379
+ * `logs:CreateLogGroup` on `*` lets environments still shutting down re-create a deleted or renamed group.
380
+ */
381
+ createRole(logGroupName) {
382
+ const stack = aws_cdk_lib_1.Stack.of(this);
383
+ const logGroupArn = (region, name) => stack.formatArn({
384
+ service: 'logs', region, resource: 'log-group', resourceName: `${name}:*`, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
385
+ });
386
+ const role = new iam.Role(this, 'ServiceRole', {
387
+ assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
388
+ inlinePolicies: {
389
+ Logs: new iam.PolicyDocument({
390
+ statements: [new iam.PolicyStatement({
391
+ actions: ['logs:CreateLogStream', 'logs:PutLogEvents'],
392
+ resources: [logGroupArn(stack.region, logGroupName), logGroupArn('*', `${logGroupName}.local`)],
393
+ })],
394
+ }),
395
+ },
396
+ });
397
+ (0, nag_1.acknowledgeIamFindings)(role.node.defaultChild, 'Log streams of this function\'s own log groups, in every region it serves from');
398
+ return role;
399
+ }
378
400
  createLogGroups(logGroupName) {
379
401
  const home = aws_cdk_lib_1.Stack.of(this).region;
380
402
  return [
@@ -432,4 +454,4 @@ function importedArn(scope, id, attrs) {
432
454
  }
433
455
  return arn;
434
456
  }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXNLO0FBQ3RLLHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MsK0RBQWlEO0FBQ2pELDJEQUE2QztBQUc3Qyx5Q0FBaUQ7QUFDakQsbURBQTBEO0FBQzFELCtDQUFrRTtBQUNsRSxxRkFBZ0Y7QUFDaEYsaUVBQTZEO0FBQzdELHFEQUFxRjtBQUNyRixtRUFBbUk7QUFDbkksK0RBQTBEO0FBQzFELG1FQUF5RjtBQUV6Riw4REFBOEQ7QUFDOUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBMFB6Qjs7R0FFRztBQUNILE1BQXNCLGVBQWdCLFNBQVEsc0JBQVE7O0lBSXBELG1GQUFtRjtJQUNuRixJQUFXLGNBQWM7UUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQVFEOzs7Ozs7O09BT0c7SUFDSSxtQkFBbUIsQ0FBQyxTQUE4QjtRQUN2RCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsS0FBZ0IsRUFBRSxTQUE4QjtRQUM5RSxNQUFNLElBQUksR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLG1CQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyw2QkFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZGLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxnREFBZ0QsRUFDaEYs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QUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGNBQWUsQ0FBQztJQUNsQyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx3RUFBd0UsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwSCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxNQUFNLEdBQUcsNkZBQTZGLENBQUMsQ0FBQztJQUNqSSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIEFybiwgQXJuRm9ybWF0LCBEdXJhdGlvbiwgdHlwZSBJUmVzb3VyY2UsIExhenksIE5hbWVzLCBSZW1vdmFsUG9saWN5LCBSZXNvdXJjZSwgU3RhY2ssIFRva2VuLCBUb2tlbkNvbXBhcmlzb24sIFZhbGlkYXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Db2RlIH0gZnJvbSAnLi9wcml2YXRlL2NvZGUnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Mb2dHcm91cCB9IGZyb20gJy4vcHJpdmF0ZS9sb2ctZ3JvdXAnO1xuaW1wb3J0IHsgREVGQVVMVF9QRVJJT0QsIFdFQl9OQU1FU1BBQ0UgfSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVBvbGljeVN0YXRlbWVudHMgfSBmcm9tICcuL3ByaXZhdGUvcmVzb3VyY2UtcG9saWN5LXN0YXRlbWVudHMnO1xuaW1wb3J0IHsgUmV2aXNpb25DbGVhbnVwIH0gZnJvbSAnLi9wcml2YXRlL3JldmlzaW9uLWNsZWFudXAnO1xuaW1wb3J0IHsgQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSwgYXNzZXJ0UmVzb3VyY2VOYW1lIH0gZnJvbSAnLi9wcml2YXRlL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25FbmRwb2ludCwgdHlwZSBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgdHlwZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uUmV2aXNpb24sIHR5cGUgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKiBFbmRwb2ludHMgcGVyIGZ1bmN0aW9uIChzZXJ2aWNlIHF1b3RhLCBub3QgYWRqdXN0YWJsZSkuICovXG5jb25zdCBNQVhfRU5EUE9JTlRTID0gMTA7XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgYFdlYkZ1bmN0aW9uYCBhbmQgYE5vZGVqc1dlYkZ1bmN0aW9uYDogZXZlcnl0aGluZyBleGNlcHQgaG93IHRoZSBjb2RlIGlzIHN1cHBsaWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGUgZW5kcG9pbnQgYXJlIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kcG9pbnQgKGBmbi5lbmRwb2ludGApOiB3aGVyZSBpdCBzZXJ2ZXMgZnJvbSwgaXRzIG5hbWUgYW5kIGxpbWl0cy5cbiAgICogSXQgc2VydmVzIHRoZSBjdXJyZW50IHJldmlzaW9uOyByb3V0ZSBpdCBlbHNld2hlcmUgd2l0aCBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKClgLlxuICAgKiBBZGQgbW9yZSBlbmRwb2ludHMgd2l0aCBgYWRkRW5kcG9pbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmluZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucztcblxuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhlIG5ld2VzdCByZXZpc2lvbnMgdG8ga2VlcCAoMS01MCkuIEVhY2ggZGVwbG95bWVudCB0aGF0IGNoYW5nZXMgdGhlIGNvZGUgb3JcbiAgICogY29uZmlndXJhdGlvbiBjcmVhdGVzIGEgcmV2aXNpb247IG9sZGVyIG9uZXMgc3RheSBhdmFpbGFibGUgdG8gcm9sbCBiYWNrIHRvIG9yIHJvdXRlIHRyYWZmaWMgdG8sXG4gICAqIGFuZCB0aGUgb2xkZXN0IGJleW9uZCB0aGlzIGNvdW50IGFyZSBkZWxldGVkIGFmdGVyIGVhY2ggZGVwbG95bWVudC5cbiAgICpcbiAgICogUmV2aXNpb25zIHRoYXQgYW4gZW5kcG9pbnQgcm91dGVzIHRvIGFyZSBuZXZlciBkZWxldGVkLCBhbmQgbmVpdGhlciBhcmUgdGhvc2UgdGhlIHByZXZpb3VzXG4gICAqIGRlcGxveW1lbnQgdXNlZCAoYSByb2xsYmFjayByZXR1cm5zIHRvIHRoZW0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb25SZXRlbnRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuIFJlbmFtaW5nIGEgZnVuY3Rpb24gcmVwbGFjZXMgaXQsIGFuZCBpdHMgZW5kcG9pbnQgZ2V0cyBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSB1bmlxdWUgbmFtZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uc3RydWN0IHBhdGggKG1vdmluZyB0aGUgY29uc3RydWN0IGNoYW5nZXMgaXQpXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgY29kZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogQW4gYGlhbS5JUm9sZWAgKG5vdCBgSVJvbGVSZWZgKSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBhZGRzIHN0YXRlbWVudHMgdG8gaXQgYW5kIGdyYW50cyB0aHJvdWdoIGl0LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSB0cnVzdGluZyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdpdGggYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWBcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogSG93IGxvbmcgYSBzaW5nbGUgcmVxdWVzdCBtYXkgcnVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBvbmUgZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZXMgYXQgdGhlIHNhbWUgdGltZSAoMS0xMjgpLlxuICAgKiBSZXF1ZXN0cyBzaGFyZSBtb2R1bGUtbGV2ZWwgc3RhdGUsIHNvIGhhbmRsZXJzIG11c3QgYmUgY29uY3VycmVuY3ktc2FmZS5cbiAgICpcbiAgICogQGRlZmF1bHQgNjRcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldGVudGlvbiBmb3IgZXZlcnkgbG9nIGdyb3VwIG9mIHRoZSBmdW5jdGlvbiwgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRIXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVucyB0byB0aGUgbG9nIGdyb3VwcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyByZW1vdmVkOiBSRVRBSU4gb3IgREVTVFJPWS5cbiAgICogV2l0aCBERVNUUk9ZLCBkZWxldGlvbiB3YWl0cyBhYm91dCBhIG1pbnV0ZSBmb3IgZW52aXJvbm1lbnRzIHRvIGZsdXNoIHRoZWlyIGxhc3QgbGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgYXBwbGljYXRpb24gbG9ncyB0byBrZWVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkxvZ0xldmVsVjI/OiBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbDtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gbGV2ZWwgb2YgcGxhdGZvcm0gbG9ncyB0byBrZWVwIChERUJVRywgSU5GTyBvciBXQVJOKS5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk9cbiAgICovXG4gIHJlYWRvbmx5IHN5c3RlbUxvZ0xldmVsVjI/OiBsYW1iZGEuU3lzdGVtTG9nTGV2ZWw7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBgV2ViRnVuY3Rpb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE5vZGUuanMgcnVudGltZSwgZS5nLiBgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzI0X1hgLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZTogbGFtYmRhLlJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2RlOiBhIHppcCBpbiBTMyAoYENvZGUuZnJvbUFzc2V0YCwgYENvZGUuZnJvbUJ1Y2tldGAsIGBDb2RlLmZyb21DdXN0b21Db21tYW5kYCwgYENvZGUuZnJvbURvY2tlckJ1aWxkYCkuXG4gICAqIElubGluZSBjb2RlIGFuZCBjb250YWluZXIgaW1hZ2VzIGFyZW4ndCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIFRoZSBjb2RlIGlzIGNvcGllZCBpbnRvIHRoZSBzdGFjaydzIGNvZGUgYnVja2V0LCB3aGljaCBMYW1iZGEgV2ViIEZ1bmN0aW9ucyBjYW4gcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IGxhbWJkYS5Db2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IHN0YXJ0cyB5b3VyIHNlcnZlciwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdpbmRleC5qcydcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBBIExhbWJkYSBXZWIgRnVuY3Rpb24sIGNyZWF0ZWQgaW4gdGhpcyBhcHAgKGBXZWJGdW5jdGlvbmApIG9yIGltcG9ydGVkIChgV2ViRnVuY3Rpb24uZnJvbVdlYkZ1bmN0aW9uQXJuYCkuXG4gKlxuICogYGFkZFRvUmVzb3VyY2VQb2xpY3lgIGFkZHMgdG8gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5ICh3aG8gZWxzZSBtYXkgY2FsbCBvciBtYW5hZ2UgaXQpLiBFYWNoIHN0YWNrIHdyaXRlc1xuICogb25seSBpdHMgb3duIHN0YXRlbWVudHMgaW50byB0aGUgZnVuY3Rpb24ncyBzaW5nbGUgcG9saWN5LCBzbyBhbnkgc3RhY2sgaW4gdGhlIGZ1bmN0aW9uJ3MgYWNjb3VudCBjYW4gYWRkIHRoZW0sXG4gKiBpbmNsdWRpbmcgb25lIHRoYXQgaW1wb3J0cyB0aGUgZnVuY3Rpb24uIEZyb20gYW5vdGhlciBhY2NvdW50LCBub3RoaW5nIGlzIGFkZGVkIChgc3RhdGVtZW50QWRkZWQ6IGZhbHNlYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkZ1bmN0aW9uIGV4dGVuZHMgSVJlc291cmNlLCBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmLCBpYW0uSVJlc291cmNlV2l0aFBvbGljeSB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGZ1bmN0aW9uJ3MgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApOiB0aGUgZGVmYXVsdCBlbmRwb2ludFxuICAgKiBvZiBhIGBXZWJGdW5jdGlvbmA7IGZvciBhbiBpbXBvcnRlZCBmdW5jdGlvbiwgdGhlIGVuZHBvaW50IG5hbWVkIGluIGl0cyBhdHRyaWJ1dGVzLCBvciBldmVyeSBlbmRwb2ludC5cbiAgICpcbiAgICogQSBncmFudGVlIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgZ2V0cyBhbiBJQU0gcG9saWN5IHN0YXRlbWVudDsgYW5vdGhlciBhY2NvdW50IG9yIGFuIEFXUyBzZXJ2aWNlIGFsc28gZ2V0cyBhXG4gICAqIHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgKG5vdCB3aGVuIHRoZSBmdW5jdGlvbiBpdHNlbGYgaXMgaW4gYW5vdGhlciBhY2NvdW50IHRoYW4gdGhpcyBzdGFjaykuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoZSBmdW5jdGlvbidzIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgaW4gYEFXUy9MYW1iZGEvV2ViYCAoZGltZW5zaW9uIGBGdW5jdGlvbk5hbWVgKS5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIFRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgd2VyZSBhY3RpdmUgKGBFbnZpcm9ubWVudEFjdGl2ZVRpbWVgKS4gKi9cbiAgbWV0cmljQWN0aXZlVGltZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBDUFUgdGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB1c2VkIChgRW52aXJvbm1lbnRDUFVUaW1lYCkuICovXG4gIG1ldHJpY0NwdVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogUmVxdWVzdHMgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZWQgYXQgb25jZSAoYEVudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzYCwgbWF4aW11bSkuICovXG4gIG1ldHJpY0NvbmN1cnJlbnRSZXF1ZXN0cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBQZWFrIG1lbW9yeSBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgdXNlZCAoYEVudmlyb25tZW50TWF4TWVtb3J5VXNhZ2VgLCBtYXhpbXVtKS4gKi9cbiAgbWV0cmljTWF4TWVtb3J5VXNhZ2UocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogQnl0ZXMgc2VudCBpbiByZXNwb25zZXMgKGBSZXNwb25zZUJ5dGVzYCkuICovXG4gIG1ldHJpY1Jlc3BvbnNlQnl0ZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIG9mIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbi4gR2l2ZSBpdHMgQVJOIG9yIGl0cyBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBBUk4sIGUuZy4gYGFybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMTExMjIyMjMzMzM6d2ViLWZ1bmN0aW9uL29yZGVyc2AuIEl0IG1heSBiZSBpbiBhbm90aGVyXG4gICAqIHJlZ2lvbiBvciBhY2NvdW50OyBhY3Jvc3MgYWNjb3VudHMsIGBncmFudEludm9rZWAgYWxzbyBuZWVkcyB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgdG8gYWxsb3cgdGhlIGNhbGxlci5cbiAgICogQSB0b2tlbiAoZS5nLiBmcm9tIGFub3RoZXIgc3RhY2spIGlzIHRha2VuIHRvIGJlIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZCByZWdpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYnVpbHQgZnJvbSBgd2ViRnVuY3Rpb25OYW1lYCwgaW4gdGhpcyBzdGFjaydzIGFjY291bnQgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFrZW4gZnJvbSBgd2ViRnVuY3Rpb25Bcm5gXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCBgZ3JhbnRJbnZva2VgIGFsbG93cyBjYWxsaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV2ZXJ5IGVuZHBvaW50IG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb24gZm9yIGEgcHJpbmNpcGFsIG91dHNpZGUgdGhpcyBhY2NvdW50LCBhbiBBV1Mgc2VydmljZSBvciBhbiBvcmdhbml6YXRpb24gdG8gY2FsbCBhIGZ1bmN0aW9uJ3MgZW5kcG9pbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUGVybWlzc2lvbiB7XG4gIC8qKlxuICAgKiBXaG8gbWF5IGNhbGw6IGFuIGFjY291bnQgKGBpYW0uQWNjb3VudFByaW5jaXBhbGApLCBhIHJvbGUgb3IgdXNlciAoYGlhbS5Bcm5QcmluY2lwYWxgKSwgYW4gQVdTIHNlcnZpY2VcbiAgICogKGBpYW0uU2VydmljZVByaW5jaXBhbGAsIHdpdGggYHNvdXJjZUFybmAgb3IgYHNvdXJjZUFjY291bnRgKSBvciBhbiBvcmdhbml6YXRpb24gKGBpYW0uT3JnYW5pemF0aW9uUHJpbmNpcGFsYCkuXG4gICAqXG4gICAqIEEgcHJpbmNpcGFsIGluIGFub3RoZXIgYWNjb3VudCBhbHNvIG5lZWRzIGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGAgaW4gaXRzIG93biBJQU0gcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHRoZSBwcmluY2lwYWwgbWF5IGNhbGwuIEl0IG11c3QgYmVsb25nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZXZlcnkgZW5kcG9pbnQgb2YgdGhlIGZ1bmN0aW9uLCBpbmNsdWRpbmcgb25lcyBhZGRlZCBsYXRlclxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBXZWJGdW5jdGlvbkVuZHBvaW50O1xuXG4gIC8qKlxuICAgKiBGb3IgYW4gQVdTIHNlcnZpY2U6IHRoZSBBUk4gb2YgdGhlIHJlc291cmNlIGNhbGxpbmcgb24gaXRzIGJlaGFsZiAoY29uZGl0aW9uIGBhd3M6U291cmNlQXJuYCwgYEFybkxpa2VgKSxcbiAgICogZS5nLiBhIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLiBXaXRob3V0IGl0IG9yIGBzb3VyY2VBY2NvdW50YCwgYW55IGFjY291bnQncyB1c2Ugb2YgdGhlIHNlcnZpY2UgY291bGQgY2FsbCB0aGUgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciBhbiBBV1Mgc2VydmljZTogdGhlIGFjY291bnQgdGhhdCBvd25zIHRoZSByZXNvdXJjZSBjYWxsaW5nIG9uIGl0cyBiZWhhbGYgKGNvbmRpdGlvbiBgYXdzOlNvdXJjZUFjY291bnRgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb25kaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUFjY291bnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBgV2ViRnVuY3Rpb25gIGFuZCBpbXBvcnRlZCBmdW5jdGlvbnMgaGF2ZSBpbiBjb21tb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXZWJGdW5jdGlvbkJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElXZWJGdW5jdGlvbiB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoaXMgZnVuY3Rpb24sIGZvciBBUElzIHRoYXQgYWNjZXB0IGBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmYC4gKi9cbiAgcHVibGljIGdldCB3ZWJGdW5jdGlvblJlZigpOiBsYW1iZGEuV2ViRnVuY3Rpb25SZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uQXJuOiB0aGlzLndlYkZ1bmN0aW9uQXJuIH07XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3ksIGUuZy4gdG8gbGV0IGFub3RoZXIgYWNjb3VudCBtYW5hZ2UgdGhlIGZ1bmN0aW9uLlxuICAgKiBGb3IgaW52b2tpbmcsIHByZWZlciBgYWRkUGVybWlzc2lvbmAgb3IgYGdyYW50SW52b2tlYC5cbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhcyBhIHNpbmdsZSByZXNvdXJjZSBwb2xpY3kuIEVhY2ggc3RhY2sgd3JpdGVzIG9ubHkgaXRzIG93biBzdGF0ZW1lbnRzIGludG8gaXQsIHRocm91Z2ggYSBjdXN0b21cbiAgICogcmVzb3VyY2UgdGhhdCBtZXJnZXMgdGhlbSB3aXRoIGV2ZXJ5IG90aGVyIHN0YWNrJ3MsIGFuZCB3aXRoIHN0YXRlbWVudHMgYWRkZWQgb3V0c2lkZSBDbG91ZEZvcm1hdGlvbi4gRnJvbSBhXG4gICAqIHN0YWNrIGluIGFub3RoZXIgYWNjb3VudCB0aGFuIHRoZSBmdW5jdGlvbiwgbm90aGluZyBpcyBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5fYWRkVG9SZXNvdXJjZVBvbGljeUZyb20odGhpcywgc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeSBmcm9tIGBzY29wZWAncyBzdGFjaywgZS5nLiB0aGUgc3RhY2sgb2YgYSBDbG91ZEZyb250XG4gICAqIGRpc3RyaWJ1dGlvbiB0aGF0IHVzZXMgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYWRkVG9SZXNvdXJjZVBvbGljeUZyb20oc2NvcGU6IENvbnN0cnVjdCwgc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGNvbnN0IGZyb20gPSBTdGFjay5vZihzY29wZSk7XG4gICAgaWYgKFRva2VuLmNvbXBhcmVTdHJpbmdzKGZyb20uYWNjb3VudCwgdGhpcy5lbnYuYWNjb3VudCkgPT09IFRva2VuQ29tcGFyaXNvbi5ESUZGRVJFTlQpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOnJlc291cmNlUG9saWN5RnJvbU90aGVyQWNjb3VudCcsXG4gICAgICAgIGBBIHN0YXRlbWVudCBmb3IgdGhlIHJlc291cmNlIHBvbGljeSBvZiBhIGZ1bmN0aW9uIGluIGFjY291bnQgJHt0aGlzLmVudi5hY2NvdW50fSB3YXMgbm90IGFkZGVkOiBzdGFjayAke2Zyb20uc3RhY2tOYW1lfSBpcyBpbiBhY2NvdW50ICR7ZnJvbS5hY2NvdW50fS4gQWRkIGl0IGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQuYCk7XG4gICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgY29uc3Qgd3JpdGVyID0gUmVzb3VyY2VQb2xpY3lTdGF0ZW1lbnRzLm9mKHNjb3BlLCB0aGlzLCB0aGlzLndlYkZ1bmN0aW9uQXJuKTtcbiAgICB3cml0ZXIuYWRkKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHdyaXRlci5yZXNvdXJjZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCksIGFjcm9zcyBhbGwgZW5kcG9pbnRzLlxuICAgKiBGb3IgcmVxdWVzdCBhbmQgZXJyb3IgY291bnRzLCB1c2UgdGhlIGVuZHBvaW50J3MgbWV0cmljcyAoYGZuLmVuZHBvaW50Lm1ldHJpY1JlcXVlc3RzKClgKS5cbiAgICpcbiAgICogTWV0cmljcyBhcmUgcHVibGlzaGVkIGluIHRoZSByZWdpb24gdGhhdCBzZXJ2ZWQgdGhlIHJlcXVlc3Q6IHBhc3MgYHJlZ2lvbmAgZm9yIGFub3RoZXIgc2VydmluZyByZWdpb24uXG4gICAqIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGZ1bmN0aW9uJ3MgaG9tZSByZWdpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICAvLyBBbiBpbXBvcnRlZCBmdW5jdGlvbiBpbiBhbm90aGVyIHJlZ2lvbiBwdWJsaXNoZXMgaXRzIG1ldHJpY3MgdGhlcmUuXG4gICAgY29uc3QgcmVnaW9uID0gIVRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmVudi5yZWdpb24pICYmIHRoaXMuZW52LnJlZ2lvbiAhPT0gU3RhY2sub2YodGhpcykucmVnaW9uID8gdGhpcy5lbnYucmVnaW9uIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBXRUJfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgRnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSB9LFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICByZWdpb24sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIHB1YmxpYyBtZXRyaWNBY3RpdmVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRBY3RpdmVUaW1lJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIENQVSB0aW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHVzZWQgKGBFbnZpcm9ubWVudENQVVRpbWVgKS4gKi9cbiAgcHVibGljIG1ldHJpY0NwdVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudENQVVRpbWUnLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZWQgYXQgb25jZSAoYEVudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzYCksIHRvIGNvbXBhcmUgd2l0aFxuICAgKiBgbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDEgbWludXRlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29uY3VycmVudFJlcXVlc3RzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRDb25jdXJyZW50UmVxdWVzdHMnLCB7IHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NQVhJTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZWFrIG1lbW9yeSBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgdXNlZCAoYEVudmlyb25tZW50TWF4TWVtb3J5VXNhZ2VgKTsgZWFjaCBlbnZpcm9ubWVudCBoYXMgMiBHQi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGVcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNNYXhNZW1vcnlVc2FnZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50TWF4TWVtb3J5VXNhZ2UnLCB7IHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NQVhJTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKiBCeXRlcyBzZW50IGluIHJlc3BvbnNlcyAoYFJlc3BvbnNlQnl0ZXNgKS4gKi9cbiAgcHVibGljIG1ldHJpY1Jlc3BvbnNlQnl0ZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSZXNwb25zZUJ5dGVzJywgcHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogQSBOb2RlLmpzIEhUVFAgc2VydmVyIHJ1bm5pbmcgYXMgYW4gQVdTIExhbWJkYSBXZWIgRnVuY3Rpb24sIHNlcnZlZCBmcm9tIG9uZSBvciBtb3JlIHJlZ2lvbnMuXG4gKlxuICogQ3JlYXRlcyB0aGUgZnVuY3Rpb24sIGl0cyBjdXJyZW50IHJldmlzaW9uIChjb2RlIGFuZCBjb25maWd1cmF0aW9uOyBhbnkgY2hhbmdlIGNyZWF0ZXMgYSBuZXcgb25lLFxuICogYW5kIHRoZSBuZXdlc3QgYHJldmlzaW9uUmV0ZW50aW9uYCBhcmUga2VwdCksIGEgZGVmYXVsdCBIVFRQUyBlbmRwb2ludCwgYW4gZXhlY3V0aW9uIHJvbGUsIGFuZCBvd25zXG4gKiB0aGUgZnVuY3Rpb24ncyBsb2cgZ3JvdXBzIGluIGV2ZXJ5IHJlZ2lvbiBpdHMgZW5kcG9pbnRzIHNlcnZlIGZyb20uXG4gKlxuICogVXNlIGBmcm9tV2ViRnVuY3Rpb25Bcm5gLCBgZnJvbVdlYkZ1bmN0aW9uTmFtZWAgb3IgYGZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXNgIGZvciBhIGZ1bmN0aW9uIGRlZmluZWQgZWxzZXdoZXJlLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkxhbWJkYTo6V2ViRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uIGV4dGVuZHMgV2ViRnVuY3Rpb25CYXNlIGltcGxlbWVudHMgaWFtLklHcmFudGFibGUge1xuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24gYnkgaXRzIEFSTiAoaW4gYW55IHJlZ2lvbiBvciBhY2NvdW50KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmcpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbi5mcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB3ZWJGdW5jdGlvbkFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbiBpbiB0aGlzIHN0YWNrJ3MgYWNjb3VudCBhbmQgcmVnaW9uIGJ5IGl0cyBuYW1lLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25OYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb24uZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgd2ViRnVuY3Rpb25OYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXhpc3RpbmcgV2ViIEZ1bmN0aW9uOiBnaXZlIGl0cyBBUk4gb3IgaXRzIG5hbWUsIGFuZCBvcHRpb25hbGx5IHRoZSBlbmRwb2ludCBgZ3JhbnRJbnZva2VgIGFsbG93cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydGVkV2ViRnVuY3Rpb24oc2NvcGUsIGlkLCBhdHRycyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgcmV2aXNpb24uIFNhbWUgYXMgYGN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldmlzaW9uSWQ6IHN0cmluZztcblxuICAvKiogVGhlIHJldmlzaW9uIGJ1aWx0IGZyb20gdGhlIGN1cnJlbnQgY29kZSBhbmQgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRSZXZpc2lvbjogSVdlYkZ1bmN0aW9uUmV2aXNpb247XG5cbiAgLyoqIFRoZSBkZWZhdWx0IGVuZHBvaW50LiBBZGQgbW9yZSB3aXRoIGBhZGRFbmRwb2ludGAuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKiogR3JhbnRzIG9uIHRoZSBkZWZhdWx0IGVuZHBvaW50IChlLmcuIGBncmFudHMuaW52b2tlKHByaW5jaXBhbClgKS4gT3RoZXIgZW5kcG9pbnRzIGhhdmUgdGhlaXIgb3duIGBncmFudHNgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKiogVGhlIGV4ZWN1dGlvbiByb2xlLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvICh0aGUgZXhlY3V0aW9uIHJvbGUpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZS1yZWdpb24gbG9nIGdyb3VwIHRoYXQgcmVjZWl2ZXMgdGhlIGxvZ3Mgb2YgZXZlcnkgcmVnaW9uIHRoZSBmdW5jdGlvbiBzZXJ2ZXMgZnJvbS5cbiAgICogU3Vic2NyaWJlIHRvIHRoaXMgb25lIG9ubHk6IGVhY2ggcmVnaW9uJ3MgYC5sb2NhbGAgZ3JvdXAgaG9sZHMgYSBjb3B5IG9mIHRoZSBzYW1lIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50czogV2ViRnVuY3Rpb25FbmRwb2ludFtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3RlTG9nR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFdlYkZ1bmN0aW9uTG9nR3JvdXA+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nT3B0aW9uczogUGljazxXZWJGdW5jdGlvblByb3BzLCAnbG9nUmV0ZW50aW9uJyB8ICdsb2dSZW1vdmFsUG9saWN5Jz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZpc2lvbkNsZWFudXA6IFJldmlzaW9uQ2xlYW51cDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzLnJ1bnRpbWUuZmFtaWx5ICE9PSBsYW1iZGEuUnVudGltZUZhbWlseS5OT0RFSlMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IExhbWJkYSBXZWIgRnVuY3Rpb25zIHJ1biBOb2RlLmpzIG9ubHksIGdvdCAke3Byb3BzLnJ1bnRpbWUubmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgdGltZW91dCA9IHByb3BzLnRpbWVvdXQ/LnRvU2Vjb25kcygpID8/IDMwO1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHRpbWVvdXQpICYmICh0aW1lb3V0IDwgMyB8fCB0aW1lb3V0ID4gOTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGltZW91dCBtdXN0IGJlIGJldHdlZW4gMyBzZWNvbmRzIGFuZCAxNSBtaW51dGVzLCBnb3QgJHt0aW1lb3V0fXNgKTtcbiAgICB9XG4gICAgY29uc3QgbWF4Q29uY3VycmVuY3kgPSBwcm9wcy5tYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50O1xuICAgIGNvbnN0IHZhbGlkQ29uY3VycmVuY3kgPSAobjogbnVtYmVyKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gMSAmJiBuIDw9IDEyODtcbiAgICBpZiAobWF4Q29uY3VycmVuY3kgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKG1heENvbmN1cnJlbmN5KSAmJiAhdmFsaWRDb25jdXJyZW5jeShtYXhDb25jdXJyZW5jeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0byAxMjgsIGdvdCAke21heENvbmN1cnJlbmN5fWApO1xuICAgIH1cbiAgICBjb25zdCByZXZpc2lvblJldGVudGlvbiA9IHByb3BzLnJldmlzaW9uUmV0ZW50aW9uID8/IDIwO1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHJldmlzaW9uUmV0ZW50aW9uKSAmJiAoIU51bWJlci5pc0ludGVnZXIocmV2aXNpb25SZXRlbnRpb24pIHx8IHJldmlzaW9uUmV0ZW50aW9uIDwgMSB8fCByZXZpc2lvblJldGVudGlvbiA+IDUwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmV2aXNpb25SZXRlbnRpb24gbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0byA1MCwgZ290ICR7cmV2aXNpb25SZXRlbnRpb259YCk7XG4gICAgfVxuICAgIGNvbnN0IHN5c3RlbUxvZ0xldmVscyA9IFtsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuREVCVUcsIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPLCBsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuV0FSTl07XG4gICAgaWYgKHByb3BzLnN5c3RlbUxvZ0xldmVsVjIgIT09IHVuZGVmaW5lZCAmJiAhc3lzdGVtTG9nTGV2ZWxzLmluY2x1ZGVzKHByb3BzLnN5c3RlbUxvZ0xldmVsVjIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBzeXN0ZW1Mb2dMZXZlbFYyIG11c3QgYmUgREVCVUcsIElORk8gb3IgV0FSTiBmb3IgTGFtYmRhIFdlYiBGdW5jdGlvbnNgKTtcbiAgICB9XG5cbiAgICB0aGlzLndlYkZ1bmN0aW9uTmFtZSA9IHByb3BzLndlYkZ1bmN0aW9uTmFtZSA/PyBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywgeyBtYXhMZW5ndGg6IDY0LCBzZXBhcmF0b3I6ICctJyB9KTtcbiAgICBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ3dlYkZ1bmN0aW9uTmFtZScsIHRoaXMud2ViRnVuY3Rpb25OYW1lKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzLmVudmlyb25tZW50ID8/IHt9KSkge1xuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmVudHJ5cG9pbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbnZpcm9ubWVudC5BV1NfTEFNQkRBX05PREVKU19FTlRSWVBPSU5UID0gcHJvcHMuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlID8/IG5ldyBpYW0uUm9sZSh0aGlzLCAnU2VydmljZVJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpXSxcbiAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gTG9nIGdyb3VwcyBmaXJzdDogdGhlIHNlcnZpY2Ugd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSB0aGVtIHdpdGhvdXQgcmV0ZW50aW9uLlxuICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IGAvYXdzL2xhbWJkYS93ZWIvJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX1gO1xuICAgIHRoaXMubG9nR3JvdXBOYW1lID0gbG9nR3JvdXBOYW1lO1xuICAgIHRoaXMubG9nT3B0aW9ucyA9IHsgbG9nUmV0ZW50aW9uOiBwcm9wcy5sb2dSZXRlbnRpb24sIGxvZ1JlbW92YWxQb2xpY3k6IHByb3BzLmxvZ1JlbW92YWxQb2xpY3kgfTtcbiAgICBjb25zdCBsb2dHcm91cHMgPSB0aGlzLmNyZWF0ZUxvZ0dyb3Vwcyhsb2dHcm91cE5hbWUpO1xuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLkxvZ0dyb3VwLmZyb21Mb2dHcm91cE5hbWUodGhpcywgJ0xvZ0dyb3VwJywgbG9nR3JvdXBOYW1lKTtcblxuICAgIGNvbnN0IGNvZGUgPSBuZXcgV2ViRnVuY3Rpb25Db2RlKHRoaXMsICdDb2RlJywgcHJvcHMuY29kZSkubG9jYXRpb247XG5cbiAgICBjb25zdCBmbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb24odGhpcywgJ1Jlc291cmNlJywgeyBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lIH0pO1xuICAgIC8vIFRoZSBmdW5jdGlvbiBpcyBkZWxldGVkIGJlZm9yZSBpdHMgbG9nIGdyb3Vwcywgd2hpY2ggdGhlbiB3YWl0IGZvciBsYXRlIGZsdXNoZXMuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBsb2dHcm91cHMpIGZuLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgVmFsaWRhdGlvbnMub2YoZm4pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSBmbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uQXJuID0gZm4uYXR0ckZ1bmN0aW9uQXJuO1xuXG4gICAgY29uc3QgcmV2aXNpb24gPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uUmV2aXNpb24odGhpcywgJ1JldmlzaW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBidWlsZENvbmZpZzoge1xuICAgICAgICBjb2RlQ29uZmlnOiB7IHMzT2JqZWN0OiB7IGJ1Y2tldDogY29kZS5idWNrZXROYW1lLCBrZXk6IGNvZGUub2JqZWN0S2V5LCB2ZXJzaW9uSWQ6IGNvZGUub2JqZWN0VmVyc2lvbiB9IH0sXG4gICAgICAgIHJ1bnRpbWVDb25maWc6IHsgcnVudGltZTogcHJvcHMucnVudGltZS5uYW1lIH0sXG4gICAgICB9LFxuICAgICAgc2VydmljZUNvbmZpZzoge1xuICAgICAgICBleGVjdXRpb25Sb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gKE9iamVjdC5rZXlzKHRoaXMuZW52aXJvbm1lbnQpLmxlbmd0aCA+IDAgPyB7IC4uLnRoaXMuZW52aXJvbm1lbnQgfSA6IHVuZGVmaW5lZCkgfSksXG4gICAgICAgIHRpbWVvdXRTZWNvbmRzOiB0aW1lb3V0LFxuICAgICAgICBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50OiBtYXhDb25jdXJyZW5jeSxcbiAgICAgICAgdGVsZW1ldHJ5Q29uZmlnOiB7XG4gICAgICAgICAgbG9nZ2luZ0NvbmZpZzoge1xuICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWw6IHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWxWMixcbiAgICAgICAgICAgIHN5c3RlbUxvZ0xldmVsOiBwcm9wcy5zeXN0ZW1Mb2dMZXZlbFYyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFdhaXQgZm9yIHRoZSByb2xlJ3MgcG9saWNpZXMsIHNvIHRoZSBmaXJzdCBlbnZpcm9ubWVudCBzdGFydHMgd2l0aCBpdHMgcGVybWlzc2lvbnMuXG4gICAgcmV2aXNpb24ubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucm9sZSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmV2aXNpb24pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIC8vIFJlcGxhY2VkIHJldmlzaW9ucyBzdGF5IGFzIHJvbGxiYWNrIHRhcmdldHM7IFJldmlzaW9uQ2xlYW51cCBkZWxldGVzIHRoZSBvbGRlc3QuIERlbGV0aW5nIHRoZSBmdW5jdGlvbiBkZWxldGVzIHRoZW0gYWxsLlxuICAgIHJldmlzaW9uLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgdGhpcy5yZXZpc2lvbklkID0gcmV2aXNpb24uYXR0clJldmlzaW9uSWQ7XG4gICAgdGhpcy5jdXJyZW50UmV2aXNpb24gPSBXZWJGdW5jdGlvblJldmlzaW9uLl9jdXJyZW50KHRoaXMsICdDdXJyZW50UmV2aXNpb24nLCB0aGlzLCByZXZpc2lvbi5hdHRyUmV2aXNpb25JZCwgcmV2aXNpb24uYXR0clJldmlzaW9uQXJuKTtcblxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwID0gbmV3IFJldmlzaW9uQ2xlYW51cCh0aGlzLCAnUmV2aXNpb25DbGVhbnVwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICBrZWVwOiByZXZpc2lvblJldGVudGlvbixcbiAgICAgIHJldmlzaW9uSWRzOiAoKSA9PiBbdGhpcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCwgLi4udGhpcy5lbmRwb2ludHMuZmxhdE1hcCgoZSkgPT4gZS5fcmV2aXNpb25JZHMoKSldLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmRwb2ludCA9IHRoaXMuY3JlYXRlRW5kcG9pbnQoJ0VuZHBvaW50JywgeyAuLi5wcm9wcy5lbmRwb2ludCwgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlIH0sICdkZWZhdWx0Jyk7XG4gICAgdGhpcy5ncmFudHMgPSB0aGlzLmVuZHBvaW50LmdyYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVuZHBvaW50ICh1cCB0byAxMCBwZXIgZnVuY3Rpb24pLCBlLmcuIGEgcHVibGljIG9uZSBuZXh0IHRvIGFuIElBTS1vbmx5IG9uZSwgb3Igb25lIHBpbm5lZCB0byBhblxuICAgKiBlYXJsaWVyIHJldmlzaW9uLiBFYWNoIGVuZHBvaW50IGhhcyBpdHMgb3duIFVSTCwgYXV0aGVudGljYXRpb24sIHJlZ2lvbnMgYW5kIGxpbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIGlkIHRoZSBlbmRwb2ludCdzIGNvbnN0cnVjdCBJRCwgYWxzbyB1c2VkIGluIGl0cyBnZW5lcmF0ZWQgbmFtZSAoYDxpZD4tPGhhc2g+YClcbiAgICovXG4gIHB1YmxpYyBhZGRFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGNvbnN0IHByZWZpeCA9IGlkLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tKy8sICcnKS5zbGljZSgwLCA1NSkucmVwbGFjZSgvLSskLywgJycpIHx8ICdlbmRwb2ludCc7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRW5kcG9pbnQoaWQsIG9wdGlvbnMsIHByZWZpeCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFdlYkZ1bmN0aW9uIHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0FXU18nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogZW52aXJvbm1lbnQgdmFyaWFibGUgJHtrZXl9IGlzIHJlc2VydmVkIChuYW1lcyBzdGFydGluZyB3aXRoIEFXU18gYXJlIHNldCBieSB0aGUgcnVudGltZSkke2tleSA9PT0gJ0FXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQnID8gJzsgdXNlIHRoZSBlbnRyeXBvaW50IHByb3BlcnR5JyA6ICcnfWApO1xuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSBleGVjdXRpb24gcm9sZSdzIHBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBlbmRwb2ludC4gU2hvcnRjdXQgZm9yIGBncmFudHMuaW52b2tlKGdyYW50ZWUpYCwgYXMgb24gYGxhbWJkYS5GdW5jdGlvbmAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIHByaW5jaXBhbCBpbiBhbm90aGVyIGFjY291bnQsIGFuIEFXUyBzZXJ2aWNlIG9yIGFuIG9yZ2FuaXphdGlvbiB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50cyxcbiAgICogdGhyb3VnaCB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kuIEZvciBhIHJvbGUgaW4gdGhpcyBhY2NvdW50LCB1c2UgYGdyYW50SW52b2tlYC5cbiAgICpcbiAgICogQHBhcmFtIGlkIHRoZSBzdGF0ZW1lbnQgSUQgKGBTaWRgKTogbGV0dGVycyBhbmQgZGlnaXRzLCB1bmlxdWUgd2l0aGluIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGFkZFBlcm1pc3Npb24oaWQ6IHN0cmluZywgcGVybWlzc2lvbjogV2ViRnVuY3Rpb25QZXJtaXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaWQpICYmICEvXltBLVphLXowLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBwZXJtaXNzaW9uIGlkICcke2lkfScgbXVzdCBiZSBsZXR0ZXJzIGFuZCBkaWdpdHMgb25seSAoaXQgaXMgdGhlIHN0YXRlbWVudCdzIFNpZClgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVybWlzc2lvbklkcy5oYXMoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aGVyZSBpcyBhbHJlYWR5IGEgcGVybWlzc2lvbiB3aXRoIGlkICcke2lkfSdgKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBwZXJtaXNzaW9uLmVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmVuZHBvaW50cy5pbmNsdWRlcyhlbmRwb2ludCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCAke2VuZHBvaW50Lm5vZGUucGF0aH0gYmVsb25ncyB0byBhbm90aGVyIGZ1bmN0aW9uYCk7XG4gICAgfVxuICAgIHRoaXMucGVybWlzc2lvbklkcy5hZGQoaWQpO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogaWQsXG4gICAgICBwcmluY2lwYWxzOiBbcGVybWlzc2lvbi5wcmluY2lwYWxdLFxuICAgICAgYWN0aW9uczogWydsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludCddLFxuICAgICAgcmVzb3VyY2VzOiBbZW5kcG9pbnQ/LmVuZHBvaW50QXJuID8/IGAke3RoaXMud2ViRnVuY3Rpb25Bcm59L2VuZHBvaW50LypgXSxcbiAgICB9KTtcbiAgICBpZiAocGVybWlzc2lvbi5zb3VyY2VBcm4gIT09IHVuZGVmaW5lZCkgc3RhdGVtZW50LmFkZENvbmRpdGlvbignQXJuTGlrZScsIHsgJ2F3czpTb3VyY2VBcm4nOiBwZXJtaXNzaW9uLnNvdXJjZUFybiB9KTtcbiAgICBpZiAocGVybWlzc2lvbi5zb3VyY2VBY2NvdW50ICE9PSB1bmRlZmluZWQpIHN0YXRlbWVudC5hZGRDb25kaXRpb24oJ1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb3VyY2VBY2NvdW50JzogcGVybWlzc2lvbi5zb3VyY2VBY2NvdW50IH0pO1xuICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgbmFtZVByZWZpeDogc3RyaW5nLCBuYW1lU2VlZD86IHN0cmluZyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGlmICh0aGlzLmVuZHBvaW50cy5sZW5ndGggPj0gTUFYX0VORFBPSU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYSBXZWIgRnVuY3Rpb24gY2FuIGhhdmUgYXQgbW9zdCAke01BWF9FTkRQT0lOVFN9IGVuZHBvaW50c2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IFdlYkZ1bmN0aW9uRW5kcG9pbnQuX2NyZWF0ZSh0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdlYkZ1bmN0aW9uOiB0aGlzLFxuICAgICAgY3VycmVudFJldmlzaW9uOiB0aGlzLmN1cnJlbnRSZXZpc2lvbixcbiAgICAgIG5hbWVQcmVmaXgsXG4gICAgICBuYW1lU2VlZCxcbiAgICB9KTtcbiAgICBjb25zdCBjbGFzaCA9IHRoaXMuZW5kcG9pbnRzLmZpbmQoKGUpID0+ICFUb2tlbi5pc1VucmVzb2x2ZWQoZS5lbmRwb2ludE5hbWUpICYmIGUuZW5kcG9pbnROYW1lID09PSBlbmRwb2ludC5lbmRwb2ludE5hbWUpO1xuICAgIGlmIChjbGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IGVuZHBvaW50TmFtZSAnJHtlbmRwb2ludC5lbmRwb2ludE5hbWV9JyBpcyBhbHJlYWR5IHVzZWQgYnkgJHtjbGFzaC5ub2RlLnBhdGh9YCk7XG4gICAgfVxuICAgIHRoaXMuZW5kcG9pbnRzLnB1c2goZW5kcG9pbnQpO1xuICAgIC8vIFJldmlzaW9ucyBhbiBlbmRwb2ludCBzdG9wcyByb3V0aW5nIHRvIG9ubHkgYmVjb21lIGRlbGV0YWJsZSBvbmNlIGl0J3MgdXBkYXRlZC5cbiAgICB0aGlzLnJldmlzaW9uQ2xlYW51cC5ub2RlLmFkZERlcGVuZGVuY3koZW5kcG9pbnQpO1xuICAgIC8vIEVhY2ggc2VydmluZyByZWdpb24ncyAubG9jYWwgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgdHJhZmZpYywgYW5kIG91dGxpdmUgdGhlIGZ1bmN0aW9uLlxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIGVuZHBvaW50LnJlZ2lvbnMuc2xpY2UoMSkpIHtcbiAgICAgIGlmICh0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5oYXMocmVnaW9uKSkgY29udGludWU7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMubG9nR3JvdXBJbihgTG9jYWxMb2dzLSR7cmVnaW9ufWAsIHJlZ2lvbiwgYCR7dGhpcy5sb2dHcm91cE5hbWV9LmxvY2FsYCk7XG4gICAgICB0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5zZXQocmVnaW9uLCBncm91cCk7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cFtdIHtcbiAgICBjb25zdCBob21lID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvZ3MnLCBob21lLCBsb2dHcm91cE5hbWUpLFxuICAgICAgdGhpcy5sb2dHcm91cEluKCdMb2NhbExvZ3MnLCBob21lLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nR3JvdXBJbihpZDogc3RyaW5nLCByZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkxvZ0dyb3VwKHRoaXMsIGlkLCB7XG4gICAgICByZWdpb24sXG4gICAgICBsb2dHcm91cE5hbWU6IG5hbWUsXG4gICAgICByZXRlbnRpb246IHRoaXMubG9nT3B0aW9ucy5sb2dSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMubG9nT3B0aW9ucy5sb2dSZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBBIFdlYiBGdW5jdGlvbiBkZWZpbmVkIG91dHNpZGUgdGhpcyBhcHAuICovXG5jbGFzcyBJbXBvcnRlZFdlYkZ1bmN0aW9uIGV4dGVuZHMgV2ViRnVuY3Rpb25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdlYkZ1bmN0aW9uQXR0cmlidXRlcykge1xuICAgIGNvbnN0IGFybiA9IGltcG9ydGVkQXJuKHNjb3BlLCBpZCwgYXR0cnMpO1xuICAgIC8vIEEgdG9rZW4gQVJOIChlLmcuIGEgV2ViRnVuY3Rpb24gaW4gYW5vdGhlciBzdGFjaywgb3IgRm4uaW1wb3J0VmFsdWUpIGlzIHRha2VuIHRvIGJlIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZFxuICAgIC8vIHJlZ2lvbiwgYXMgaXRzIG1ldHJpY3MgYWxyZWFkeSBhcmU6IGEgZ3JhbnQgdG8gYSByb2xlIG9mIHRoaXMgYWNjb3VudCB0aGVuIHN0YXlzIGlkZW50aXR5LW9ubHkuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCBUb2tlbi5pc1VucmVzb2x2ZWQoYXJuKSA/IHt9IDogeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9KTtcbiAgICB0aGlzLndlYkZ1bmN0aW9uQXJuID0gYXJuO1xuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gYXR0cnMud2ViRnVuY3Rpb25OYW1lID8/IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhO1xuICAgIGlmIChhdHRycy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBhdHRycy5lbmRwb2ludE5hbWUpO1xuICAgIHRoaXMuZW5kcG9pbnROYW1lID0gYXR0cnMuZW5kcG9pbnROYW1lO1xuICB9XG5cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb25HcmFudHMuX2ZvckVuZHBvaW50QXJucyhbYCR7dGhpcy53ZWJGdW5jdGlvbkFybn0vZW5kcG9pbnQvJHt0aGlzLmVuZHBvaW50TmFtZSA/PyAnKid9YF0sIHRoaXMpLmludm9rZShncmFudGVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbXBvcnRlZEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IGAke3Njb3BlLm5vZGUucGF0aH0vJHtpZH1gO1xuICBpZiAoKGF0dHJzLndlYkZ1bmN0aW9uQXJuID09PSB1bmRlZmluZWQpID09PSAoYXR0cnMud2ViRnVuY3Rpb25OYW1lID09PSB1bmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhdGh9OiBnaXZlIGVpdGhlciB3ZWJGdW5jdGlvbkFybiBvciB3ZWJGdW5jdGlvbk5hbWVgKTtcbiAgfVxuICBpZiAoYXR0cnMud2ViRnVuY3Rpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhdHRycy53ZWJGdW5jdGlvbk5hbWUpKSB7XG4gICAgICAvLyBWYWxpZGF0ZWQgYWdhaW5zdCB0aGUgc2NvcGUsIGJlZm9yZSB0aGUgaW1wb3J0IGV4aXN0cy5cbiAgICAgIGFzc2VydFJlc291cmNlTmFtZShzY29wZSwgJ3dlYkZ1bmN0aW9uTmFtZScsIGF0dHJzLndlYkZ1bmN0aW9uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdsYW1iZGEnLCByZXNvdXJjZTogJ3dlYi1mdW5jdGlvbicsIHJlc291cmNlTmFtZTogYXR0cnMud2ViRnVuY3Rpb25OYW1lLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGFybiA9IGF0dHJzLndlYkZ1bmN0aW9uQXJuITtcbiAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYXJuKSAmJiAhL15hcm46W146XSs6bGFtYmRhOlthLXowLTktXSs6XFxkezEyfTp3ZWItZnVuY3Rpb25cXC9bQS1aYS16MC05Xy1dezEsNjR9JC8udGVzdChhcm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhdGh9OiAnJHthcm59JyBpcyBub3QgYSBXZWIgRnVuY3Rpb24gQVJOIChhcm46PHBhcnRpdGlvbj46bGFtYmRhOjxyZWdpb24+OjxhY2NvdW50Pjp3ZWItZnVuY3Rpb24vPG5hbWU+KWApO1xuICB9XG4gIHJldHVybiBhcm47XG59XG4iXX0=
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdMO0FBQ3hMLHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MsK0RBQWlEO0FBQ2pELDJEQUE2QztBQUc3Qyx5Q0FBaUQ7QUFDakQsbURBQTBEO0FBQzFELCtDQUFrRTtBQUNsRSx1Q0FBdUQ7QUFDdkQscUZBQWdGO0FBQ2hGLGlFQUE2RDtBQUM3RCxxREFBcUY7QUFDckYsbUVBQW1JO0FBQ25JLCtEQUEwRDtBQUMxRCxtRUFBeUY7QUFFekYsOERBQThEO0FBQzlELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQTBQekI7O0dBRUc7QUFDSCxNQUFzQixlQUFnQixTQUFRLHNCQUFROztJQUlwRCxtRkFBbUY7SUFDbkYsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFRRDs7Ozs7OztPQU9HO0lBQ0ksbUJBQW1CLENBQUMsU0FBOEI7UUFDdkQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHdCQUF3QixDQUFDLEtBQWdCLEVBQUUsU0FBOEI7UUFDOUUsTUFBTSxJQUFJLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxtQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssNkJBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2Rix5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMs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LENBQUM7SUFDakksQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBBcm4sIEFybkZvcm1hdCwgdHlwZSBDZm5SZXNvdXJjZSwgRHVyYXRpb24sIHR5cGUgSVJlc291cmNlLCBMYXp5LCBOYW1lcywgUmVtb3ZhbFBvbGljeSwgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiwgVG9rZW5Db21wYXJpc29uLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQXV0aFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQ29kZSB9IGZyb20gJy4vcHJpdmF0ZS9jb2RlJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uTG9nR3JvdXAgfSBmcm9tICcuL3ByaXZhdGUvbG9nLWdyb3VwJztcbmltcG9ydCB7IERFRkFVTFRfUEVSSU9ELCBXRUJfTkFNRVNQQUNFIH0gZnJvbSAnLi9wcml2YXRlL21ldHJpY3MnO1xuaW1wb3J0IHsgYWNrbm93bGVkZ2VJYW1GaW5kaW5ncyB9IGZyb20gJy4vcHJpdmF0ZS9uYWcnO1xuaW1wb3J0IHsgUmVzb3VyY2VQb2xpY3lTdGF0ZW1lbnRzIH0gZnJvbSAnLi9wcml2YXRlL3Jlc291cmNlLXBvbGljeS1zdGF0ZW1lbnRzJztcbmltcG9ydCB7IFJldmlzaW9uQ2xlYW51cCB9IGZyb20gJy4vcHJpdmF0ZS9yZXZpc2lvbi1jbGVhbnVwJztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHR5cGUgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMsIHR5cGUgV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1lbmRwb2ludCc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkdyYW50cyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWdyYW50cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvblJldmlzaW9uLCB0eXBlIElXZWJGdW5jdGlvblJldmlzaW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tcmV2aXNpb24nO1xuXG4vKiogRW5kcG9pbnRzIHBlciBmdW5jdGlvbiAoc2VydmljZSBxdW90YSwgbm90IGFkanVzdGFibGUpLiAqL1xuY29uc3QgTUFYX0VORFBPSU5UUyA9IDEwO1xuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IGBXZWJGdW5jdGlvbmAgYW5kIGBOb2RlanNXZWJGdW5jdGlvbmA6IGV2ZXJ5dGhpbmcgZXhjZXB0IGhvdyB0aGUgY29kZSBpcyBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGNhbGxlcnMgb2YgdGhlIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGVuZHBvaW50IChgZm4uZW5kcG9pbnRgKTogd2hlcmUgaXQgc2VydmVzIGZyb20sIGl0cyBuYW1lIGFuZCBsaW1pdHMuXG4gICAqIEl0IHNlcnZlcyB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGUgaXQgZWxzZXdoZXJlIHdpdGggYGZuLmVuZHBvaW50LnJvdXRlVHJhZmZpYygpYC5cbiAgICogQWRkIG1vcmUgZW5kcG9pbnRzIHdpdGggYGFkZEVuZHBvaW50YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IG9mIHRoZSBuZXdlc3QgcmV2aXNpb25zIHRvIGtlZXAgKDEtNTApLiBFYWNoIGRlcGxveW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBjb2RlIG9yXG4gICAqIGNvbmZpZ3VyYXRpb24gY3JlYXRlcyBhIHJldmlzaW9uOyBvbGRlciBvbmVzIHN0YXkgYXZhaWxhYmxlIHRvIHJvbGwgYmFjayB0byBvciByb3V0ZSB0cmFmZmljIHRvLFxuICAgKiBhbmQgdGhlIG9sZGVzdCBiZXlvbmQgdGhpcyBjb3VudCBhcmUgZGVsZXRlZCBhZnRlciBlYWNoIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIFJldmlzaW9ucyB0aGF0IGFuIGVuZHBvaW50IHJvdXRlcyB0byBhcmUgbmV2ZXIgZGVsZXRlZCwgYW5kIG5laXRoZXIgYXJlIHRob3NlIHRoZSBwcmV2aW91c1xuICAgKiBkZXBsb3ltZW50IHVzZWQgKGEgcm9sbGJhY2sgcmV0dXJucyB0byB0aGVtKS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICovXG4gIHJlYWRvbmx5IHJldmlzaW9uUmV0ZW50aW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLiBSZW5hbWluZyBhIGZ1bmN0aW9uIHJlcGxhY2VzIGl0LCBhbmQgaXRzIGVuZHBvaW50IGdldHMgYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgdW5pcXVlIG5hbWUgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnN0cnVjdCBwYXRoIChtb3ZpbmcgdGhlIGNvbnN0cnVjdCBjaGFuZ2VzIGl0KVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvbidzIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUuXG4gICAqXG4gICAqIEFuIGBpYW0uSVJvbGVgIChub3QgYElSb2xlUmVmYCkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gYWRkcyBzdGF0ZW1lbnRzIHRvIGl0IGFuZCBncmFudHMgdGhyb3VnaCBpdC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJvbGUgdHJ1c3RpbmcgYGxhbWJkYS5hbWF6b25hd3MuY29tYCB3aXRoIGBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVgXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGEgc2luZ2xlIHJlcXVlc3QgbWF5IHJ1bi5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IG1hbnkgcmVxdWVzdHMgb25lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVzIGF0IHRoZSBzYW1lIHRpbWUgKDEtMTI4KS5cbiAgICogUmVxdWVzdHMgc2hhcmUgbW9kdWxlLWxldmVsIHN0YXRlLCBzbyBoYW5kbGVycyBtdXN0IGJlIGNvbmN1cnJlbmN5LXNhZmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDY0XG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXRlbnRpb24gZm9yIGV2ZXJ5IGxvZyBncm91cCBvZiB0aGUgZnVuY3Rpb24sIGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBXaGF0IGhhcHBlbnMgdG8gdGhlIGxvZyBncm91cHMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgcmVtb3ZlZDogUkVUQUlOIG9yIERFU1RST1kuXG4gICAqIFdpdGggREVTVFJPWSwgZGVsZXRpb24gd2FpdHMgYWJvdXQgYSBtaW51dGUgZm9yIGVudmlyb25tZW50cyB0byBmbHVzaCB0aGVpciBsYXN0IGxpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIGFwcGxpY2F0aW9uIGxvZ3MgdG8ga2VlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbFYyPzogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIHBsYXRmb3JtIGxvZ3MgdG8ga2VlcCAoREVCVUcsIElORk8gb3IgV0FSTikuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1Mb2dMZXZlbFYyPzogbGFtYmRhLlN5c3RlbUxvZ0xldmVsO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgYFdlYkZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblByb3BzIGV4dGVuZHMgV2ViRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBOb2RlLmpzIHJ1bnRpbWUsIGUuZy4gYGxhbWJkYS5SdW50aW1lLk5PREVKU18yNF9YYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgY29kZTogYSB6aXAgaW4gUzMgKGBDb2RlLmZyb21Bc3NldGAsIGBDb2RlLmZyb21CdWNrZXRgLCBgQ29kZS5mcm9tQ3VzdG9tQ29tbWFuZGAsIGBDb2RlLmZyb21Eb2NrZXJCdWlsZGApLlxuICAgKiBJbmxpbmUgY29kZSBhbmQgY29udGFpbmVyIGltYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBUaGUgY29kZSBpcyBjb3BpZWQgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCwgd2hpY2ggTGFtYmRhIFdlYiBGdW5jdGlvbnMgY2FuIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBsYW1iZGEuQ29kZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIsIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXguanMnXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQSBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBjcmVhdGVkIGluIHRoaXMgYXBwIChgV2ViRnVuY3Rpb25gKSBvciBpbXBvcnRlZCAoYFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkFybmApLlxuICpcbiAqIGBhZGRUb1Jlc291cmNlUG9saWN5YCBhZGRzIHRvIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeSAod2hvIGVsc2UgbWF5IGNhbGwgb3IgbWFuYWdlIGl0KS4gRWFjaCBzdGFjayB3cml0ZXNcbiAqIG9ubHkgaXRzIG93biBzdGF0ZW1lbnRzIGludG8gdGhlIGZ1bmN0aW9uJ3Mgc2luZ2xlIHBvbGljeSwgc28gYW55IHN0YWNrIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgY2FuIGFkZCB0aGVtLFxuICogaW5jbHVkaW5nIG9uZSB0aGF0IGltcG9ydHMgdGhlIGZ1bmN0aW9uLiBGcm9tIGFub3RoZXIgYWNjb3VudCwgbm90aGluZyBpcyBhZGRlZCAoYHN0YXRlbWVudEFkZGVkOiBmYWxzZWApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXZWJGdW5jdGlvbiBleHRlbmRzIElSZXNvdXJjZSwgbGFtYmRhLklXZWJGdW5jdGlvblJlZiwgaWFtLklSZXNvdXJjZVdpdGhQb2xpY3kge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgbmFtZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIEFSTi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50IChgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgKTogdGhlIGRlZmF1bHQgZW5kcG9pbnRcbiAgICogb2YgYSBgV2ViRnVuY3Rpb25gOyBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24sIHRoZSBlbmRwb2ludCBuYW1lZCBpbiBpdHMgYXR0cmlidXRlcywgb3IgZXZlcnkgZW5kcG9pbnQuXG4gICAqXG4gICAqIEEgZ3JhbnRlZSBpbiB0aGUgZnVuY3Rpb24ncyBhY2NvdW50IGdldHMgYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQ7IGFub3RoZXIgYWNjb3VudCBvciBhbiBBV1Mgc2VydmljZSBhbHNvIGdldHMgYVxuICAgKiBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IChub3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXRzZWxmIGlzIGluIGFub3RoZXIgYWNjb3VudCB0aGFuIHRoaXMgc3RhY2spLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIG1ldHJpY0FjdGl2ZVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogQ1BVIHRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdXNlZCAoYEVudmlyb25tZW50Q1BVVGltZWApLiAqL1xuICBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2AsIG1heGltdW0pLiAqL1xuICBtZXRyaWNDb25jdXJyZW50UmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCwgbWF4aW11bSkuICovXG4gIG1ldHJpY01heE1lbW9yeVVzYWdlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIEJ5dGVzIHNlbnQgaW4gcmVzcG9uc2VzIChgUmVzcG9uc2VCeXRlc2ApLiAqL1xuICBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBvZiBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24uIEdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLCBlLmcuIGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTExMTIyMjIzMzMzOndlYi1mdW5jdGlvbi9vcmRlcnNgLiBJdCBtYXkgYmUgaW4gYW5vdGhlclxuICAgKiByZWdpb24gb3IgYWNjb3VudDsgYWNyb3NzIGFjY291bnRzLCBgZ3JhbnRJbnZva2VgIGFsc28gbmVlZHMgdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IHRvIGFsbG93IHRoZSBjYWxsZXIuXG4gICAqIEEgdG9rZW4gKGUuZy4gZnJvbSBhbm90aGVyIHN0YWNrKSBpcyB0YWtlbiB0byBiZSBpbiB0aGlzIHN0YWNrJ3MgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJ1aWx0IGZyb20gYHdlYkZ1bmN0aW9uTmFtZWAsIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZCByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRha2VuIGZyb20gYHdlYkZ1bmN0aW9uQXJuYFxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgYGdyYW50SW52b2tlYCBhbGxvd3MgY2FsbGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBldmVyeSBlbmRwb2ludCBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9uIGZvciBhIHByaW5jaXBhbCBvdXRzaWRlIHRoaXMgYWNjb3VudCwgYW4gQVdTIHNlcnZpY2Ugb3IgYW4gb3JnYW5pemF0aW9uIHRvIGNhbGwgYSBmdW5jdGlvbidzIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblBlcm1pc3Npb24ge1xuICAvKipcbiAgICogV2hvIG1heSBjYWxsOiBhbiBhY2NvdW50IChgaWFtLkFjY291bnRQcmluY2lwYWxgKSwgYSByb2xlIG9yIHVzZXIgKGBpYW0uQXJuUHJpbmNpcGFsYCksIGFuIEFXUyBzZXJ2aWNlXG4gICAqIChgaWFtLlNlcnZpY2VQcmluY2lwYWxgLCB3aXRoIGBzb3VyY2VBcm5gIG9yIGBzb3VyY2VBY2NvdW50YCkgb3IgYW4gb3JnYW5pemF0aW9uIChgaWFtLk9yZ2FuaXphdGlvblByaW5jaXBhbGApLlxuICAgKlxuICAgKiBBIHByaW5jaXBhbCBpbiBhbm90aGVyIGFjY291bnQgYWxzbyBuZWVkcyBgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgIGluIGl0cyBvd24gSUFNIHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCB0aGUgcHJpbmNpcGFsIG1heSBjYWxsLiBJdCBtdXN0IGJlbG9uZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV2ZXJ5IGVuZHBvaW50IG9mIHRoZSBmdW5jdGlvbiwgaW5jbHVkaW5nIG9uZXMgYWRkZWQgbGF0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKipcbiAgICogRm9yIGFuIEFXUyBzZXJ2aWNlOiB0aGUgQVJOIG9mIHRoZSByZXNvdXJjZSBjYWxsaW5nIG9uIGl0cyBiZWhhbGYgKGNvbmRpdGlvbiBgYXdzOlNvdXJjZUFybmAsIGBBcm5MaWtlYCksXG4gICAqIGUuZy4gYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi4gV2l0aG91dCBpdCBvciBgc291cmNlQWNjb3VudGAsIGFueSBhY2NvdW50J3MgdXNlIG9mIHRoZSBzZXJ2aWNlIGNvdWxkIGNhbGwgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbmRpdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3IgYW4gQVdTIHNlcnZpY2U6IHRoZSBhY2NvdW50IHRoYXQgb3ducyB0aGUgcmVzb3VyY2UgY2FsbGluZyBvbiBpdHMgYmVoYWxmIChjb25kaXRpb24gYGF3czpTb3VyY2VBY2NvdW50YCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBY2NvdW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYFdlYkZ1bmN0aW9uYCBhbmQgaW1wb3J0ZWQgZnVuY3Rpb25zIGhhdmUgaW4gY29tbW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2ViRnVuY3Rpb25CYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJV2ViRnVuY3Rpb24ge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIGZ1bmN0aW9uLCBmb3IgQVBJcyB0aGF0IGFjY2VwdCBgbGFtYmRhLklXZWJGdW5jdGlvblJlZmAuICovXG4gIHB1YmxpYyBnZXQgd2ViRnVuY3Rpb25SZWYoKTogbGFtYmRhLldlYkZ1bmN0aW9uUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbkFybiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZnVuY3Rpb24ncyBlbmRwb2ludC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5LCBlLmcuIHRvIGxldCBhbm90aGVyIGFjY291bnQgbWFuYWdlIHRoZSBmdW5jdGlvbi5cbiAgICogRm9yIGludm9raW5nLCBwcmVmZXIgYGFkZFBlcm1pc3Npb25gIG9yIGBncmFudEludm9rZWAuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYXMgYSBzaW5nbGUgcmVzb3VyY2UgcG9saWN5LiBFYWNoIHN0YWNrIHdyaXRlcyBvbmx5IGl0cyBvd24gc3RhdGVtZW50cyBpbnRvIGl0LCB0aHJvdWdoIGEgY3VzdG9tXG4gICAqIHJlc291cmNlIHRoYXQgbWVyZ2VzIHRoZW0gd2l0aCBldmVyeSBvdGhlciBzdGFjaydzLCBhbmQgd2l0aCBzdGF0ZW1lbnRzIGFkZGVkIG91dHNpZGUgQ2xvdWRGb3JtYXRpb24uIEZyb20gYVxuICAgKiBzdGFjayBpbiBhbm90aGVyIGFjY291bnQgdGhhbiB0aGUgZnVuY3Rpb24sIG5vdGhpbmcgaXMgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHRoaXMsIHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgZnJvbSBgc2NvcGVgJ3Mgc3RhY2ssIGUuZy4gdGhlIHN0YWNrIG9mIGEgQ2xvdWRGcm9udFxuICAgKiBkaXN0cmlidXRpb24gdGhhdCB1c2VzIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHNjb3BlOiBDb25zdHJ1Y3QsIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICBjb25zdCBmcm9tID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGlmIChUb2tlbi5jb21wYXJlU3RyaW5ncyhmcm9tLmFjY291bnQsIHRoaXMuZW52LmFjY291bnQpID09PSBUb2tlbkNvbXBhcmlzb24uRElGRkVSRU5UKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpyZXNvdXJjZVBvbGljeUZyb21PdGhlckFjY291bnQnLFxuICAgICAgICBgQSBzdGF0ZW1lbnQgZm9yIHRoZSByZXNvdXJjZSBwb2xpY3kgb2YgYSBmdW5jdGlvbiBpbiBhY2NvdW50ICR7dGhpcy5lbnYuYWNjb3VudH0gd2FzIG5vdCBhZGRlZDogc3RhY2sgJHtmcm9tLnN0YWNrTmFtZX0gaXMgaW4gYWNjb3VudCAke2Zyb20uYWNjb3VudH0uIEFkZCBpdCBpbiB0aGUgZnVuY3Rpb24ncyBhY2NvdW50LmApO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGNvbnN0IHdyaXRlciA9IFJlc291cmNlUG9saWN5U3RhdGVtZW50cy5vZihzY29wZSwgdGhpcywgdGhpcy53ZWJGdW5jdGlvbkFybik7XG4gICAgd3JpdGVyLmFkZChzdGF0ZW1lbnQpO1xuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiB0cnVlLCBwb2xpY3lEZXBlbmRhYmxlOiB3cml0ZXIucmVzb3VyY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGlzIGZ1bmN0aW9uJ3MgZXhlY3V0aW9uIGVudmlyb25tZW50cyBpbiBgQVdTL0xhbWJkYS9XZWJgIChkaW1lbnNpb24gYEZ1bmN0aW9uTmFtZWApLCBhY3Jvc3MgYWxsIGVuZHBvaW50cy5cbiAgICogRm9yIHJlcXVlc3QgYW5kIGVycm9yIGNvdW50cywgdXNlIHRoZSBlbmRwb2ludCdzIG1ldHJpY3MgKGBmbi5lbmRwb2ludC5tZXRyaWNSZXF1ZXN0cygpYCkuXG4gICAqXG4gICAqIE1ldHJpY3MgYXJlIHB1Ymxpc2hlZCBpbiB0aGUgcmVnaW9uIHRoYXQgc2VydmVkIHRoZSByZXF1ZXN0OiBwYXNzIGByZWdpb25gIGZvciBhbm90aGVyIHNlcnZpbmcgcmVnaW9uLlxuICAgKiBBbiBhbGFybSBjYW4gb25seSB1c2UgbWV0cmljcyBmcm9tIGl0cyBvd24gc3RhY2sncyByZWdpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgMSBtaW51dGUsIGluIHRoZSBmdW5jdGlvbidzIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgLy8gQW4gaW1wb3J0ZWQgZnVuY3Rpb24gaW4gYW5vdGhlciByZWdpb24gcHVibGlzaGVzIGl0cyBtZXRyaWNzIHRoZXJlLlxuICAgIGNvbnN0IHJlZ2lvbiA9ICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5lbnYucmVnaW9uKSAmJiB0aGlzLmVudi5yZWdpb24gIT09IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbiA/IHRoaXMuZW52LnJlZ2lvbiA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogV0VCX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IEZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbk5hbWUgfSxcbiAgICAgIHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5TVU0sXG4gICAgICBwZXJpb2Q6IERFRkFVTFRfUEVSSU9ELFxuICAgICAgcmVnaW9uLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogVGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB3ZXJlIGFjdGl2ZSAoYEVudmlyb25tZW50QWN0aXZlVGltZWApLiAqL1xuICBwdWJsaWMgbWV0cmljQWN0aXZlVGltZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50QWN0aXZlVGltZScsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBDUFUgdGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB1c2VkIChgRW52aXJvbm1lbnRDUFVUaW1lYCkuICovXG4gIHB1YmxpYyBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRDUFVUaW1lJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2ApLCB0byBjb21wYXJlIHdpdGhcbiAgICogYG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciAxIG1pbnV0ZVxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbmN1cnJlbnRSZXF1ZXN0cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzJywgeyBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCk7IGVhY2ggZW52aXJvbm1lbnQgaGFzIDIgR0IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDEgbWludXRlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTWF4TWVtb3J5VXNhZ2UocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlJywgeyBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKiogQnl0ZXMgc2VudCBpbiByZXNwb25zZXMgKGBSZXNwb25zZUJ5dGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUmVzcG9uc2VCeXRlcycsIHByb3BzKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTm9kZS5qcyBIVFRQIHNlcnZlciBydW5uaW5nIGFzIGFuIEFXUyBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBzZXJ2ZWQgZnJvbSBvbmUgb3IgbW9yZSByZWdpb25zLlxuICpcbiAqIENyZWF0ZXMgdGhlIGZ1bmN0aW9uLCBpdHMgY3VycmVudCByZXZpc2lvbiAoY29kZSBhbmQgY29uZmlndXJhdGlvbjsgYW55IGNoYW5nZSBjcmVhdGVzIGEgbmV3IG9uZSxcbiAqIGFuZCB0aGUgbmV3ZXN0IGByZXZpc2lvblJldGVudGlvbmAgYXJlIGtlcHQpLCBhIGRlZmF1bHQgSFRUUFMgZW5kcG9pbnQsIGFuIGV4ZWN1dGlvbiByb2xlLCBhbmQgb3duc1xuICogdGhlIGZ1bmN0aW9uJ3MgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24gaXRzIGVuZHBvaW50cyBzZXJ2ZSBmcm9tLlxuICpcbiAqIFVzZSBgZnJvbVdlYkZ1bmN0aW9uQXJuYCwgYGZyb21XZWJGdW5jdGlvbk5hbWVgIG9yIGBmcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzYCBmb3IgYSBmdW5jdGlvbiBkZWZpbmVkIGVsc2V3aGVyZS5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpMYW1iZGE6OldlYkZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbiBleHRlbmRzIFdlYkZ1bmN0aW9uQmFzZSBpbXBsZW1lbnRzIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXhpc3RpbmcgV2ViIEZ1bmN0aW9uIGJ5IGl0cyBBUk4gKGluIGFueSByZWdpb24gb3IgYWNjb3VudCkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21XZWJGdW5jdGlvbkFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB3ZWJGdW5jdGlvbkFybjogc3RyaW5nKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb24uZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgd2ViRnVuY3Rpb25Bcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24gaW4gdGhpcyBzdGFjaydzIGFjY291bnQgYW5kIHJlZ2lvbiBieSBpdHMgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZyk6IElXZWJGdW5jdGlvbiB7XG4gICAgcmV0dXJuIFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IHdlYkZ1bmN0aW9uTmFtZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbjogZ2l2ZSBpdHMgQVJOIG9yIGl0cyBuYW1lLCBhbmQgb3B0aW9uYWxseSB0aGUgZW5kcG9pbnQgYGdyYW50SW52b2tlYCBhbGxvd3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdlYkZ1bmN0aW9uQXR0cmlidXRlcyk6IElXZWJGdW5jdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZFdlYkZ1bmN0aW9uKHNjb3BlLCBpZCwgYXR0cnMpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcblxuICAvKiogVGhlIElEIG9mIHRoZSBjdXJyZW50IHJldmlzaW9uLiBTYW1lIGFzIGBjdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZGAuICovXG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSByZXZpc2lvbiBidWlsdCBmcm9tIHRoZSBjdXJyZW50IGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBUaGUgZGVmYXVsdCBlbmRwb2ludC4gQWRkIG1vcmUgd2l0aCBgYWRkRW5kcG9pbnRgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQ7XG5cbiAgLyoqIEdyYW50cyBvbiB0aGUgZGVmYXVsdCBlbmRwb2ludCAoZS5nLiBgZ3JhbnRzLmludm9rZShwcmluY2lwYWwpYCkuIE90aGVyIGVuZHBvaW50cyBoYXZlIHRoZWlyIG93biBgZ3JhbnRzYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50czogV2ViRnVuY3Rpb25HcmFudHM7XG5cbiAgLyoqIFRoZSBleGVjdXRpb24gcm9sZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcblxuICAvKiogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0byAodGhlIGV4ZWN1dGlvbiByb2xlKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIGhvbWUtcmVnaW9uIGxvZyBncm91cCB0aGF0IHJlY2VpdmVzIHRoZSBsb2dzIG9mIGV2ZXJ5IHJlZ2lvbiB0aGUgZnVuY3Rpb24gc2VydmVzIGZyb20uXG4gICAqIFN1YnNjcmliZSB0byB0aGlzIG9uZSBvbmx5OiBlYWNoIHJlZ2lvbidzIGAubG9jYWxgIGdyb3VwIGhvbGRzIGEgY29weSBvZiB0aGUgc2FtZSBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUxvZ0dyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBXZWJGdW5jdGlvbkxvZ0dyb3VwPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ09wdGlvbnM6IFBpY2s8V2ViRnVuY3Rpb25Qcm9wcywgJ2xvZ1JldGVudGlvbicgfCAnbG9nUmVtb3ZhbFBvbGljeSc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2aXNpb25DbGVhbnVwOiBSZXZpc2lvbkNsZWFudXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcy5ydW50aW1lLmZhbWlseSAhPT0gbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBMYW1iZGEgV2ViIEZ1bmN0aW9ucyBydW4gTm9kZS5qcyBvbmx5LCBnb3QgJHtwcm9wcy5ydW50aW1lLm5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSBwcm9wcy50aW1lb3V0Py50b1NlY29uZHMoKSA/PyAzMDtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh0aW1lb3V0KSAmJiAodGltZW91dCA8IDMgfHwgdGltZW91dCA+IDkwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDMgc2Vjb25kcyBhbmQgMTUgbWludXRlcywgZ290ICR7dGltZW91dH1zYCk7XG4gICAgfVxuICAgIGNvbnN0IG1heENvbmN1cnJlbmN5ID0gcHJvcHMubWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudDtcbiAgICBjb25zdCB2YWxpZENvbmN1cnJlbmN5ID0gKG46IG51bWJlcikgPT4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDEgJiYgbiA8PSAxMjg7XG4gICAgaWYgKG1heENvbmN1cnJlbmN5ICE9PSB1bmRlZmluZWQgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChtYXhDb25jdXJyZW5jeSkgJiYgIXZhbGlkQ29uY3VycmVuY3kobWF4Q29uY3VycmVuY3kpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50IG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDEgdG8gMTI4LCBnb3QgJHttYXhDb25jdXJyZW5jeX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmV2aXNpb25SZXRlbnRpb24gPSBwcm9wcy5yZXZpc2lvblJldGVudGlvbiA/PyAyMDtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChyZXZpc2lvblJldGVudGlvbikgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJldmlzaW9uUmV0ZW50aW9uKSB8fCByZXZpc2lvblJldGVudGlvbiA8IDEgfHwgcmV2aXNpb25SZXRlbnRpb24gPiA1MCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJldmlzaW9uUmV0ZW50aW9uIG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDEgdG8gNTAsIGdvdCAke3JldmlzaW9uUmV0ZW50aW9ufWApO1xuICAgIH1cbiAgICBjb25zdCBzeXN0ZW1Mb2dMZXZlbHMgPSBbbGFtYmRhLlN5c3RlbUxvZ0xldmVsLkRFQlVHLCBsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuSU5GTywgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLldBUk5dO1xuICAgIGlmIChwcm9wcy5zeXN0ZW1Mb2dMZXZlbFYyICE9PSB1bmRlZmluZWQgJiYgIXN5c3RlbUxvZ0xldmVscy5pbmNsdWRlcyhwcm9wcy5zeXN0ZW1Mb2dMZXZlbFYyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogc3lzdGVtTG9nTGV2ZWxWMiBtdXN0IGJlIERFQlVHLCBJTkZPIG9yIFdBUk4gZm9yIExhbWJkYSBXZWIgRnVuY3Rpb25zYCk7XG4gICAgfVxuXG4gICAgdGhpcy53ZWJGdW5jdGlvbk5hbWUgPSBwcm9wcy53ZWJGdW5jdGlvbk5hbWUgPz8gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiA2NCwgc2VwYXJhdG9yOiAnLScgfSk7XG4gICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICd3ZWJGdW5jdGlvbk5hbWUnLCB0aGlzLndlYkZ1bmN0aW9uTmFtZSk7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy5lbnZpcm9ubWVudCA/PyB7fSkpIHtcbiAgICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5lbnRyeXBvaW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnQuQVdTX0xBTUJEQV9OT0RFSlNfRU5UUllQT0lOVCA9IHByb3BzLmVudHJ5cG9pbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nR3JvdXBOYW1lID0gYC9hd3MvbGFtYmRhL3dlYi8ke3RoaXMud2ViRnVuY3Rpb25OYW1lfWA7XG4gICAgdGhpcy5yb2xlID0gcHJvcHMucm9sZSA/PyB0aGlzLmNyZWF0ZVJvbGUobG9nR3JvdXBOYW1lKTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gTG9nIGdyb3VwcyBmaXJzdDogdGhlIHNlcnZpY2Ugd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSB0aGVtIHdpdGhvdXQgcmV0ZW50aW9uLlxuICAgIHRoaXMubG9nR3JvdXBOYW1lID0gbG9nR3JvdXBOYW1lO1xuICAgIHRoaXMubG9nT3B0aW9ucyA9IHsgbG9nUmV0ZW50aW9uOiBwcm9wcy5sb2dSZXRlbnRpb24sIGxvZ1JlbW92YWxQb2xpY3k6IHByb3BzLmxvZ1JlbW92YWxQb2xpY3kgfTtcbiAgICBjb25zdCBsb2dHcm91cHMgPSB0aGlzLmNyZWF0ZUxvZ0dyb3Vwcyhsb2dHcm91cE5hbWUpO1xuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLkxvZ0dyb3VwLmZyb21Mb2dHcm91cE5hbWUodGhpcywgJ0xvZ0dyb3VwJywgbG9nR3JvdXBOYW1lKTtcblxuICAgIGNvbnN0IGNvZGUgPSBuZXcgV2ViRnVuY3Rpb25Db2RlKHRoaXMsICdDb2RlJywgcHJvcHMuY29kZSkubG9jYXRpb247XG5cbiAgICBjb25zdCBmbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb24odGhpcywgJ1Jlc291cmNlJywgeyBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lIH0pO1xuICAgIC8vIFRoZSBmdW5jdGlvbiBpcyBkZWxldGVkIGJlZm9yZSBpdHMgbG9nIGdyb3Vwcywgd2hpY2ggdGhlbiB3YWl0IGZvciBsYXRlIGZsdXNoZXMuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBsb2dHcm91cHMpIGZuLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgVmFsaWRhdGlvbnMub2YoZm4pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSBmbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uQXJuID0gZm4uYXR0ckZ1bmN0aW9uQXJuO1xuXG4gICAgY29uc3QgcmV2aXNpb24gPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uUmV2aXNpb24odGhpcywgJ1JldmlzaW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBidWlsZENvbmZpZzoge1xuICAgICAgICBjb2RlQ29uZmlnOiB7IHMzT2JqZWN0OiB7IGJ1Y2tldDogY29kZS5idWNrZXROYW1lLCBrZXk6IGNvZGUub2JqZWN0S2V5LCB2ZXJzaW9uSWQ6IGNvZGUub2JqZWN0VmVyc2lvbiB9IH0sXG4gICAgICAgIHJ1bnRpbWVDb25maWc6IHsgcnVudGltZTogcHJvcHMucnVudGltZS5uYW1lIH0sXG4gICAgICB9LFxuICAgICAgc2VydmljZUNvbmZpZzoge1xuICAgICAgICBleGVjdXRpb25Sb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gKE9iamVjdC5rZXlzKHRoaXMuZW52aXJvbm1lbnQpLmxlbmd0aCA+IDAgPyB7IC4uLnRoaXMuZW52aXJvbm1lbnQgfSA6IHVuZGVmaW5lZCkgfSksXG4gICAgICAgIHRpbWVvdXRTZWNvbmRzOiB0aW1lb3V0LFxuICAgICAgICBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50OiBtYXhDb25jdXJyZW5jeSxcbiAgICAgICAgdGVsZW1ldHJ5Q29uZmlnOiB7XG4gICAgICAgICAgbG9nZ2luZ0NvbmZpZzoge1xuICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWw6IHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWxWMixcbiAgICAgICAgICAgIHN5c3RlbUxvZ0xldmVsOiBwcm9wcy5zeXN0ZW1Mb2dMZXZlbFYyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFdhaXQgZm9yIHRoZSByb2xlJ3MgcG9saWNpZXMsIHNvIHRoZSBmaXJzdCBlbnZpcm9ubWVudCBzdGFydHMgd2l0aCBpdHMgcGVybWlzc2lvbnMuXG4gICAgcmV2aXNpb24ubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucm9sZSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmV2aXNpb24pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIC8vIFJlcGxhY2VkIHJldmlzaW9ucyBzdGF5IGFzIHJvbGxiYWNrIHRhcmdldHM7IFJldmlzaW9uQ2xlYW51cCBkZWxldGVzIHRoZSBvbGRlc3QuIERlbGV0aW5nIHRoZSBmdW5jdGlvbiBkZWxldGVzIHRoZW0gYWxsLlxuICAgIHJldmlzaW9uLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgdGhpcy5yZXZpc2lvbklkID0gcmV2aXNpb24uYXR0clJldmlzaW9uSWQ7XG4gICAgdGhpcy5jdXJyZW50UmV2aXNpb24gPSBXZWJGdW5jdGlvblJldmlzaW9uLl9jdXJyZW50KHRoaXMsICdDdXJyZW50UmV2aXNpb24nLCB0aGlzLCByZXZpc2lvbi5hdHRyUmV2aXNpb25JZCwgcmV2aXNpb24uYXR0clJldmlzaW9uQXJuKTtcblxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwID0gbmV3IFJldmlzaW9uQ2xlYW51cCh0aGlzLCAnUmV2aXNpb25DbGVhbnVwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICBrZWVwOiByZXZpc2lvblJldGVudGlvbixcbiAgICAgIHJldmlzaW9uSWRzOiAoKSA9PiBbdGhpcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCwgLi4udGhpcy5lbmRwb2ludHMuZmxhdE1hcCgoZSkgPT4gZS5fcmV2aXNpb25JZHMoKSldLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmRwb2ludCA9IHRoaXMuY3JlYXRlRW5kcG9pbnQoJ0VuZHBvaW50JywgeyAuLi5wcm9wcy5lbmRwb2ludCwgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlIH0sICdkZWZhdWx0Jyk7XG4gICAgdGhpcy5ncmFudHMgPSB0aGlzLmVuZHBvaW50LmdyYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVuZHBvaW50ICh1cCB0byAxMCBwZXIgZnVuY3Rpb24pLCBlLmcuIGEgcHVibGljIG9uZSBuZXh0IHRvIGFuIElBTS1vbmx5IG9uZSwgb3Igb25lIHBpbm5lZCB0byBhblxuICAgKiBlYXJsaWVyIHJldmlzaW9uLiBFYWNoIGVuZHBvaW50IGhhcyBpdHMgb3duIFVSTCwgYXV0aGVudGljYXRpb24sIHJlZ2lvbnMgYW5kIGxpbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIGlkIHRoZSBlbmRwb2ludCdzIGNvbnN0cnVjdCBJRCwgYWxzbyB1c2VkIGluIGl0cyBnZW5lcmF0ZWQgbmFtZSAoYDxpZD4tPGhhc2g+YClcbiAgICovXG4gIHB1YmxpYyBhZGRFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGNvbnN0IHByZWZpeCA9IGlkLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tKy8sICcnKS5zbGljZSgwLCA1NSkucmVwbGFjZSgvLSskLywgJycpIHx8ICdlbmRwb2ludCc7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRW5kcG9pbnQoaWQsIG9wdGlvbnMsIHByZWZpeCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFdlYkZ1bmN0aW9uIHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0FXU18nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogZW52aXJvbm1lbnQgdmFyaWFibGUgJHtrZXl9IGlzIHJlc2VydmVkIChuYW1lcyBzdGFydGluZyB3aXRoIEFXU18gYXJlIHNldCBieSB0aGUgcnVudGltZSkke2tleSA9PT0gJ0FXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQnID8gJzsgdXNlIHRoZSBlbnRyeXBvaW50IHByb3BlcnR5JyA6ICcnfWApO1xuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSBleGVjdXRpb24gcm9sZSdzIHBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBlbmRwb2ludC4gU2hvcnRjdXQgZm9yIGBncmFudHMuaW52b2tlKGdyYW50ZWUpYCwgYXMgb24gYGxhbWJkYS5GdW5jdGlvbmAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIHByaW5jaXBhbCBpbiBhbm90aGVyIGFjY291bnQsIGFuIEFXUyBzZXJ2aWNlIG9yIGFuIG9yZ2FuaXphdGlvbiB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50cyxcbiAgICogdGhyb3VnaCB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kuIEZvciBhIHJvbGUgaW4gdGhpcyBhY2NvdW50LCB1c2UgYGdyYW50SW52b2tlYC5cbiAgICpcbiAgICogQHBhcmFtIGlkIHRoZSBzdGF0ZW1lbnQgSUQgKGBTaWRgKTogbGV0dGVycyBhbmQgZGlnaXRzLCB1bmlxdWUgd2l0aGluIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGFkZFBlcm1pc3Npb24oaWQ6IHN0cmluZywgcGVybWlzc2lvbjogV2ViRnVuY3Rpb25QZXJtaXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaWQpICYmICEvXltBLVphLXowLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBwZXJtaXNzaW9uIGlkICcke2lkfScgbXVzdCBiZSBsZXR0ZXJzIGFuZCBkaWdpdHMgb25seSAoaXQgaXMgdGhlIHN0YXRlbWVudCdzIFNpZClgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVybWlzc2lvbklkcy5oYXMoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aGVyZSBpcyBhbHJlYWR5IGEgcGVybWlzc2lvbiB3aXRoIGlkICcke2lkfSdgKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBwZXJtaXNzaW9uLmVuZHBvaW50O1xuICAgIGlmIChlbmRwb2ludCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmVuZHBvaW50cy5pbmNsdWRlcyhlbmRwb2ludCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCAke2VuZHBvaW50Lm5vZGUucGF0aH0gYmVsb25ncyB0byBhbm90aGVyIGZ1bmN0aW9uYCk7XG4gICAgfVxuICAgIHRoaXMucGVybWlzc2lvbklkcy5hZGQoaWQpO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogaWQsXG4gICAgICBwcmluY2lwYWxzOiBbcGVybWlzc2lvbi5wcmluY2lwYWxdLFxuICAgICAgYWN0aW9uczogWydsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludCddLFxuICAgICAgcmVzb3VyY2VzOiBbZW5kcG9pbnQ/LmVuZHBvaW50QXJuID8/IGAke3RoaXMud2ViRnVuY3Rpb25Bcm59L2VuZHBvaW50LypgXSxcbiAgICB9KTtcbiAgICBpZiAocGVybWlzc2lvbi5zb3VyY2VBcm4gIT09IHVuZGVmaW5lZCkgc3RhdGVtZW50LmFkZENvbmRpdGlvbignQXJuTGlrZScsIHsgJ2F3czpTb3VyY2VBcm4nOiBwZXJtaXNzaW9uLnNvdXJjZUFybiB9KTtcbiAgICBpZiAocGVybWlzc2lvbi5zb3VyY2VBY2NvdW50ICE9PSB1bmRlZmluZWQpIHN0YXRlbWVudC5hZGRDb25kaXRpb24oJ1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb3VyY2VBY2NvdW50JzogcGVybWlzc2lvbi5zb3VyY2VBY2NvdW50IH0pO1xuICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgbmFtZVByZWZpeDogc3RyaW5nLCBuYW1lU2VlZD86IHN0cmluZyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGlmICh0aGlzLmVuZHBvaW50cy5sZW5ndGggPj0gTUFYX0VORFBPSU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYSBXZWIgRnVuY3Rpb24gY2FuIGhhdmUgYXQgbW9zdCAke01BWF9FTkRQT0lOVFN9IGVuZHBvaW50c2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IFdlYkZ1bmN0aW9uRW5kcG9pbnQuX2NyZWF0ZSh0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdlYkZ1bmN0aW9uOiB0aGlzLFxuICAgICAgY3VycmVudFJldmlzaW9uOiB0aGlzLmN1cnJlbnRSZXZpc2lvbixcbiAgICAgIG5hbWVQcmVmaXgsXG4gICAgICBuYW1lU2VlZCxcbiAgICB9KTtcbiAgICBjb25zdCBjbGFzaCA9IHRoaXMuZW5kcG9pbnRzLmZpbmQoKGUpID0+ICFUb2tlbi5pc1VucmVzb2x2ZWQoZS5lbmRwb2ludE5hbWUpICYmIGUuZW5kcG9pbnROYW1lID09PSBlbmRwb2ludC5lbmRwb2ludE5hbWUpO1xuICAgIGlmIChjbGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IGVuZHBvaW50TmFtZSAnJHtlbmRwb2ludC5lbmRwb2ludE5hbWV9JyBpcyBhbHJlYWR5IHVzZWQgYnkgJHtjbGFzaC5ub2RlLnBhdGh9YCk7XG4gICAgfVxuICAgIHRoaXMuZW5kcG9pbnRzLnB1c2goZW5kcG9pbnQpO1xuICAgIC8vIFJldmlzaW9ucyBhbiBlbmRwb2ludCBzdG9wcyByb3V0aW5nIHRvIG9ubHkgYmVjb21lIGRlbGV0YWJsZSBvbmNlIGl0J3MgdXBkYXRlZC5cbiAgICB0aGlzLnJldmlzaW9uQ2xlYW51cC5ub2RlLmFkZERlcGVuZGVuY3koZW5kcG9pbnQpO1xuICAgIC8vIEVhY2ggc2VydmluZyByZWdpb24ncyAubG9jYWwgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgdHJhZmZpYywgYW5kIG91dGxpdmUgdGhlIGZ1bmN0aW9uLlxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIGVuZHBvaW50LnJlZ2lvbnMuc2xpY2UoMSkpIHtcbiAgICAgIGlmICh0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5oYXMocmVnaW9uKSkgY29udGludWU7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMubG9nR3JvdXBJbihgTG9jYWxMb2dzLSR7cmVnaW9ufWAsIHJlZ2lvbiwgYCR7dGhpcy5sb2dHcm91cE5hbWV9LmxvY2FsYCk7XG4gICAgICB0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5zZXQocmVnaW9uLCBncm91cCk7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBleGVjdXRpb24gcm9sZTogd3JpdGUgdG8gdGhlIGZ1bmN0aW9uJ3Mgb3duIGxvZyBncm91cHMgb25seSAodGhlIGhvbWUgcmVnaW9uJ3MgYW5kIGV2ZXJ5IHJlZ2lvbidzXG4gICAqIGAubG9jYWxgIGNvcHkpLCB0aGUgbWluaW11bSBBV1MgZG9jdW1lbnRzIGZvciBXZWIgRnVuY3Rpb25zLiBOb3QgYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWAsIHdob3NlXG4gICAqIGBsb2dzOkNyZWF0ZUxvZ0dyb3VwYCBvbiBgKmAgbGV0cyBlbnZpcm9ubWVudHMgc3RpbGwgc2h1dHRpbmcgZG93biByZS1jcmVhdGUgYSBkZWxldGVkIG9yIHJlbmFtZWQgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJvbGUobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBsb2dHcm91cEFybiA9IChyZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xvZ3MnLCByZWdpb24sIHJlc291cmNlOiAnbG9nLWdyb3VwJywgcmVzb3VyY2VOYW1lOiBgJHtuYW1lfToqYCwgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgTG9nczogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW25ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpQdXRMb2dFdmVudHMnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2xvZ0dyb3VwQXJuKHN0YWNrLnJlZ2lvbiwgbG9nR3JvdXBOYW1lKSwgbG9nR3JvdXBBcm4oJyonLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCldLFxuICAgICAgICAgIH0pXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFja25vd2xlZGdlSWFtRmluZGluZ3Mocm9sZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5SZXNvdXJjZSwgJ0xvZyBzdHJlYW1zIG9mIHRoaXMgZnVuY3Rpb25cXCdzIG93biBsb2cgZ3JvdXBzLCBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzIGZyb20nKTtcbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cFtdIHtcbiAgICBjb25zdCBob21lID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvZ3MnLCBob21lLCBsb2dHcm91cE5hbWUpLFxuICAgICAgdGhpcy5sb2dHcm91cEluKCdMb2NhbExvZ3MnLCBob21lLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nR3JvdXBJbihpZDogc3RyaW5nLCByZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkxvZ0dyb3VwKHRoaXMsIGlkLCB7XG4gICAgICByZWdpb24sXG4gICAgICBsb2dHcm91cE5hbWU6IG5hbWUsXG4gICAgICByZXRlbnRpb246IHRoaXMubG9nT3B0aW9ucy5sb2dSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMubG9nT3B0aW9ucy5sb2dSZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBBIFdlYiBGdW5jdGlvbiBkZWZpbmVkIG91dHNpZGUgdGhpcyBhcHAuICovXG5jbGFzcyBJbXBvcnRlZFdlYkZ1bmN0aW9uIGV4dGVuZHMgV2ViRnVuY3Rpb25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdlYkZ1bmN0aW9uQXR0cmlidXRlcykge1xuICAgIGNvbnN0IGFybiA9IGltcG9ydGVkQXJuKHNjb3BlLCBpZCwgYXR0cnMpO1xuICAgIC8vIEEgdG9rZW4gQVJOIChlLmcuIGEgV2ViRnVuY3Rpb24gaW4gYW5vdGhlciBzdGFjaywgb3IgRm4uaW1wb3J0VmFsdWUpIGlzIHRha2VuIHRvIGJlIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZFxuICAgIC8vIHJlZ2lvbiwgYXMgaXRzIG1ldHJpY3MgYWxyZWFkeSBhcmU6IGEgZ3JhbnQgdG8gYSByb2xlIG9mIHRoaXMgYWNjb3VudCB0aGVuIHN0YXlzIGlkZW50aXR5LW9ubHkuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCBUb2tlbi5pc1VucmVzb2x2ZWQoYXJuKSA/IHt9IDogeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9KTtcbiAgICB0aGlzLndlYkZ1bmN0aW9uQXJuID0gYXJuO1xuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gYXR0cnMud2ViRnVuY3Rpb25OYW1lID8/IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhO1xuICAgIGlmIChhdHRycy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBhdHRycy5lbmRwb2ludE5hbWUpO1xuICAgIHRoaXMuZW5kcG9pbnROYW1lID0gYXR0cnMuZW5kcG9pbnROYW1lO1xuICB9XG5cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb25HcmFudHMuX2ZvckVuZHBvaW50QXJucyhbYCR7dGhpcy53ZWJGdW5jdGlvbkFybn0vZW5kcG9pbnQvJHt0aGlzLmVuZHBvaW50TmFtZSA/PyAnKid9YF0sIHRoaXMpLmludm9rZShncmFudGVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbXBvcnRlZEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IGAke3Njb3BlLm5vZGUucGF0aH0vJHtpZH1gO1xuICBpZiAoKGF0dHJzLndlYkZ1bmN0aW9uQXJuID09PSB1bmRlZmluZWQpID09PSAoYXR0cnMud2ViRnVuY3Rpb25OYW1lID09PSB1bmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhdGh9OiBnaXZlIGVpdGhlciB3ZWJGdW5jdGlvbkFybiBvciB3ZWJGdW5jdGlvbk5hbWVgKTtcbiAgfVxuICBpZiAoYXR0cnMud2ViRnVuY3Rpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhdHRycy53ZWJGdW5jdGlvbk5hbWUpKSB7XG4gICAgICAvLyBWYWxpZGF0ZWQgYWdhaW5zdCB0aGUgc2NvcGUsIGJlZm9yZSB0aGUgaW1wb3J0IGV4aXN0cy5cbiAgICAgIGFzc2VydFJlc291cmNlTmFtZShzY29wZSwgJ3dlYkZ1bmN0aW9uTmFtZScsIGF0dHJzLndlYkZ1bmN0aW9uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdsYW1iZGEnLCByZXNvdXJjZTogJ3dlYi1mdW5jdGlvbicsIHJlc291cmNlTmFtZTogYXR0cnMud2ViRnVuY3Rpb25OYW1lLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGFybiA9IGF0dHJzLndlYkZ1bmN0aW9uQXJuITtcbiAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYXJuKSAmJiAhL15hcm46W146XSs6bGFtYmRhOlthLXowLTktXSs6XFxkezEyfTp3ZWItZnVuY3Rpb25cXC9bQS1aYS16MC05Xy1dezEsNjR9JC8udGVzdChhcm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhdGh9OiAnJHthcm59JyBpcyBub3QgYSBXZWIgRnVuY3Rpb24gQVJOIChhcm46PHBhcnRpdGlvbj46bGFtYmRhOjxyZWdpb24+OjxhY2NvdW50Pjp3ZWItZnVuY3Rpb24vPG5hbWU+KWApO1xuICB9XG4gIHJldHVybiBhcm47XG59XG4iXX0=
package/package.json CHANGED
@@ -111,7 +111,7 @@
111
111
  "main": "lib/index.js",
112
112
  "license": "Apache-2.0",
113
113
  "stability": "experimental",
114
- "version": "0.1.8",
114
+ "version": "0.1.9",
115
115
  "jest": {
116
116
  "coverageProvider": "v8",
117
117
  "testMatch": [