@pwrdrvr/microapps-cdk 0.2.8 → 0.2.11

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 (40) hide show
  1. package/.gitattributes +18 -18
  2. package/.jsii +1264 -165
  3. package/API.md +511 -8
  4. package/README.md +29 -0
  5. package/changelog.md +2 -0
  6. package/lib/MicroApps.d.ts +126 -105
  7. package/lib/MicroApps.d.ts.map +1 -0
  8. package/lib/MicroApps.js +32 -30
  9. package/lib/MicroAppsAPIGwy.d.ts +28 -61
  10. package/lib/MicroAppsAPIGwy.d.ts.map +1 -0
  11. package/lib/MicroAppsAPIGwy.js +17 -25
  12. package/lib/MicroAppsCF.d.ts +85 -104
  13. package/lib/MicroAppsCF.d.ts.map +1 -0
  14. package/lib/MicroAppsCF.js +58 -41
  15. package/lib/MicroAppsEdgeToOrigin.d.ts +108 -0
  16. package/lib/MicroAppsEdgeToOrigin.d.ts.map +1 -0
  17. package/lib/MicroAppsEdgeToOrigin.js +139 -0
  18. package/lib/MicroAppsS3.d.ts +19 -69
  19. package/lib/MicroAppsS3.d.ts.map +1 -0
  20. package/lib/MicroAppsS3.js +5 -32
  21. package/lib/MicroAppsSvcs.d.ts +58 -86
  22. package/lib/MicroAppsSvcs.d.ts.map +1 -0
  23. package/lib/MicroAppsSvcs.js +36 -95
  24. package/lib/MicroAppsTable.d.ts +60 -0
  25. package/lib/MicroAppsTable.d.ts.map +1 -0
  26. package/lib/MicroAppsTable.js +42 -0
  27. package/lib/index.d.ts +3 -0
  28. package/lib/index.d.ts.map +1 -0
  29. package/lib/index.js +3 -1
  30. package/lib/microapps-deployer/index.js +174 -113
  31. package/lib/microapps-deployer/index.js.map +3 -3
  32. package/lib/microapps-router/index.js +54 -69
  33. package/lib/microapps-router/index.js.map +3 -3
  34. package/lib/microapps-router/templates/appFrame.html +0 -0
  35. package/lib/utils/ReverseDomain.d.ts +1 -0
  36. package/lib/utils/ReverseDomain.d.ts.map +1 -0
  37. package/package.json +29 -24
  38. package/releasetag.txt +1 -0
  39. package/version.txt +1 -0
  40. package/patches/@aws-cdk+aws-apigatewayv2-alpha+2.8.0-alpha.0.patch +0 -39
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MicroAppsCF.d.ts","sourceRoot":"","sources":["../src/MicroAppsCF.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAO,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,oCAAoC,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACjD,OAAO,KAAK,SAAS,MAAM,oCAAoC,CAAC;AAChE,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAE/C,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,YAAY,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;IAEjC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;IAEjC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAEtC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAE3C;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,yBAAyB,EAAE,EAAE,CAAC,oBAAoB,CAAC;IAE5D;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAEtC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAE3C;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,SAAU,YAAW,YAAY;IAChE;;;;;;;;;;;;OAYG;WACW,qBAAqB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,4BAA4B,GACnC,EAAE,CAAC,oBAAoB;IAqC1B;;;;OAIG;WACW,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB;IA0ElE,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,IAAW,gBAAgB,IAAI,EAAE,CAAC,YAAY,CAE7C;gBAEW,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB;CA+GlE"}
@@ -12,14 +12,9 @@ const r53targets = require("aws-cdk-lib/aws-route53-targets");
12
12
  const constructs_1 = require("constructs");
13
13
  const ReverseDomain_1 = require("./utils/ReverseDomain");
14
14
  /**
15
- * (experimental) Create a new MicroApps CloudFront Distribution.
16
- *
17
- * @experimental
15
+ * Create a new MicroApps CloudFront Distribution.
18
16
  */
19
17
  class MicroAppsCF extends constructs_1.Construct {
20
- /**
21
- * @experimental
22
- */
23
18
  constructor(scope, id, props) {
24
19
  super(scope, id);
25
20
  if (props === undefined) {
@@ -29,7 +24,7 @@ class MicroAppsCF extends constructs_1.Construct {
29
24
  (props.r53Zone !== undefined && props.domainNameEdge === undefined)) {
30
25
  throw new Error('If either of r53Zone or domainNameEdge are set then the other must be set');
31
26
  }
32
- const { domainNameEdge, domainNameOrigin, httpApi, removalPolicy, certEdge, assetNameRoot, assetNameSuffix, r53Zone, bucketLogs, bucketAppsOrigin, rootPathPrefix, createAPIPathRoute = true, } = props;
27
+ const { domainNameEdge, domainNameOrigin, httpApi, removalPolicy, certEdge, assetNameRoot, assetNameSuffix, r53Zone, bucketLogs, bucketAppsOrigin, rootPathPrefix, createAPIPathRoute = true, createNextDataPathRoute = true, edgeToOriginLambdas, } = props;
33
28
  const apigwyOriginRequestPolicy = MicroAppsCF.createAPIOriginPolicy(this, {
34
29
  assetNameRoot,
35
30
  assetNameSuffix,
@@ -46,6 +41,9 @@ class MicroAppsCF extends constructs_1.Construct {
46
41
  httpOriginFQDN = `${httpApi.apiId}.execute-api.${aws_cdk_lib_1.Aws.REGION}.amazonaws.com`;
47
42
  }
48
43
  //
44
+ // Get the Edge to Origin Lambdas
45
+ //
46
+ //
49
47
  // CloudFront Distro
50
48
  //
51
49
  const apiGwyOrigin = new cforigins.HttpOrigin(httpOriginFQDN, {
@@ -64,6 +62,7 @@ class MicroAppsCF extends constructs_1.Construct {
64
62
  originRequestPolicy: apigwyOriginRequestPolicy,
65
63
  origin: apiGwyOrigin,
66
64
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
65
+ edgeLambdas: edgeToOriginLambdas,
67
66
  },
68
67
  enableIpv6: true,
69
68
  priceClass: cf.PriceClass.PRICE_CLASS_100,
@@ -83,6 +82,8 @@ class MicroAppsCF extends constructs_1.Construct {
83
82
  apigwyOriginRequestPolicy: apigwyOriginRequestPolicy,
84
83
  rootPathPrefix,
85
84
  createAPIPathRoute,
85
+ createNextDataPathRoute,
86
+ apigwyEdgeFunctions: edgeToOriginLambdas,
86
87
  });
87
88
  //
88
89
  // Create the edge name for the CloudFront distro
@@ -100,7 +101,7 @@ class MicroAppsCF extends constructs_1.Construct {
100
101
  }
101
102
  }
102
103
  /**
103
- * (experimental) Create or get the origin request policy.
104
+ * Create or get the origin request policy
104
105
  *
105
106
  * If a custom domain name is NOT used for the origin then a policy
106
107
  * will be created.
@@ -109,39 +110,49 @@ class MicroAppsCF extends constructs_1.Construct {
109
110
  * policy will be returned. This policy passes the Host header to the
110
111
  * origin, which is fine when using a custom domain name on the origin.
111
112
  *
112
- * @experimental
113
+ * @param _scope
114
+ * @param _props
113
115
  */
114
- static createAPIOriginPolicy(scope, props) {
115
- const { assetNameRoot, assetNameSuffix, domainNameEdge } = props;
116
- let apigwyOriginRequestPolicy = cf.OriginRequestPolicy.ALL_VIEWER;
117
- if (domainNameEdge === undefined) {
118
- // When not using a custom domain name we must limit down the origin policy to
119
- // prevent it from passing the Host header (distribution_id.cloudfront.net) to
120
- // apigwy which will then reject it with a 403 because it does not match the
121
- // execute-api name that apigwy is expecting.
122
- //
123
- // 2021-12-28 - There is a bug in the name generation that causes the same asset
124
- // in different stacks to have the same generated name. We have to make the id
125
- // in all cases to ensure the generated name is unique.
126
- apigwyOriginRequestPolicy = new cf.OriginRequestPolicy(scope, `apigwy-origin-policy-${aws_cdk_lib_1.Stack.of(scope).stackName}`, {
127
- comment: assetNameRoot ? `${assetNameRoot}-apigwy${assetNameSuffix}` : undefined,
128
- originRequestPolicyName: assetNameRoot
129
- ? `${assetNameRoot}-apigwy${assetNameSuffix}`
130
- : undefined,
131
- cookieBehavior: cf.OriginRequestCookieBehavior.all(),
132
- queryStringBehavior: cf.OriginRequestQueryStringBehavior.all(),
133
- headerBehavior: cf.OriginRequestHeaderBehavior.allowList('user-agent', 'referer'),
134
- });
135
- }
136
- return apigwyOriginRequestPolicy;
116
+ static createAPIOriginPolicy(_scope, _props) {
117
+ // const { assetNameRoot, assetNameSuffix, domainNameEdge } = props;
118
+ // let apigwyOriginRequestPolicy: cf.IOriginRequestPolicy = cf.OriginRequestPolicy.ALL_VIEWER;
119
+ // if (domainNameEdge === undefined) {
120
+ // // When not using a custom domain name we must limit down the origin policy to
121
+ // // prevent it from passing the Host header (distribution_id.cloudfront.net) to
122
+ // // apigwy which will then reject it with a 403 because it does not match the
123
+ // // execute-api name that apigwy is expecting.
124
+ // //
125
+ // // 2021-12-28 - There is a bug in the name generation that causes the same asset
126
+ // // in different stacks to have the same generated name. We have to make the id
127
+ // // in all cases to ensure the generated name is unique.
128
+ // apigwyOriginRequestPolicy = new cf.OriginRequestPolicy(
129
+ // scope,
130
+ // `apigwy-origin-policy-${Stack.of(scope).stackName}`,
131
+ // {
132
+ // comment: assetNameRoot ? `${assetNameRoot}-apigwy${assetNameSuffix}` : undefined,
133
+ // originRequestPolicyName: assetNameRoot
134
+ // ? `${assetNameRoot}-apigwy${assetNameSuffix}`
135
+ // : undefined,
136
+ // cookieBehavior: cf.OriginRequestCookieBehavior.all(),
137
+ // queryStringBehavior: cf.OriginRequestQueryStringBehavior.all(),
138
+ // // TODO: If signing is enabled this should forward all signature headers
139
+ // // TODO: If set to "cfront.OriginRequestHeaderBehavior.all()" then
140
+ // // `replaceHostHeader` must be set to true to prevent API Gateway from rejecting
141
+ // // the request
142
+ // // headerBehavior: cf.OriginRequestHeaderBehavior.allowList('user-agent', 'referer'),
143
+ // headerBehavior: cf.OriginRequestHeaderBehavior.all(),
144
+ // },
145
+ // );
146
+ // }
147
+ return cf.OriginRequestPolicy.ALL_VIEWER;
137
148
  }
138
149
  /**
139
- * (experimental) Add API Gateway and S3 routes to an existing CloudFront Distribution.
140
- *
141
- * @experimental
150
+ * Add API Gateway and S3 routes to an existing CloudFront Distribution
151
+ * @param _scope
152
+ * @param props
142
153
  */
143
154
  static addRoutes(_scope, props) {
144
- const { apiGwyOrigin, bucketAppsOrigin, distro, apigwyOriginRequestPolicy, rootPathPrefix = '', createAPIPathRoute = true, } = props;
155
+ const { apiGwyOrigin, bucketAppsOrigin, distro, apigwyOriginRequestPolicy, rootPathPrefix = '', createAPIPathRoute = true, createNextDataPathRoute = true, } = props;
145
156
  //
146
157
  // Add Behaviors
147
158
  //
@@ -159,6 +170,7 @@ class MicroAppsCF extends constructs_1.Construct {
159
170
  compress: true,
160
171
  originRequestPolicy: apigwyOriginRequestPolicy,
161
172
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
173
+ edgeLambdas: props.apigwyEdgeFunctions,
162
174
  };
163
175
  //
164
176
  // If a route specifically has `/api/` in it, send it to API Gateway
@@ -169,6 +181,14 @@ class MicroAppsCF extends constructs_1.Construct {
169
181
  distro.addBehavior(path_1.posix.join(rootPathPrefix, '/*/*/api/*'), apiGwyOrigin, apiGwyBehaviorOptions);
170
182
  }
171
183
  //
184
+ // If a route specifically has `/_next/data/` in it, send it to API Gateway
185
+ // This is needed to catch routes that have periods in the API path data,
186
+ // such as: /release/0.0.0/_next/data/app.json
187
+ //
188
+ if (createNextDataPathRoute) {
189
+ distro.addBehavior(path_1.posix.join(rootPathPrefix, '/*/*/_next/data/*'), apiGwyOrigin, apiGwyBehaviorOptions);
190
+ }
191
+ //
172
192
  // All static assets are assumed to have a dot in them
173
193
  //
174
194
  distro.addBehavior(path_1.posix.join(rootPathPrefix, '/*/*/*.*'), bucketAppsOrigin, s3BehaviorOptions);
@@ -179,14 +199,11 @@ class MicroAppsCF extends constructs_1.Construct {
179
199
  //
180
200
  distro.addBehavior(path_1.posix.join(rootPathPrefix, '/*'), apiGwyOrigin, apiGwyBehaviorOptions);
181
201
  }
182
- /**
183
- * @experimental
184
- */
185
202
  get cloudFrontDistro() {
186
203
  return this._cloudFrontDistro;
187
204
  }
188
205
  }
189
206
  exports.MicroAppsCF = MicroAppsCF;
190
207
  _a = JSII_RTTI_SYMBOL_1;
191
- MicroAppsCF[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroAppsCF", version: "0.2.8" };
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzQ0YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWljcm9BcHBzQ0YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFBMEM7QUFFMUMsNkNBQXdEO0FBR3hELGlEQUFpRDtBQUNqRCxnRUFBZ0U7QUFDaEUsK0NBQStDO0FBQy9DLDhEQUE4RDtBQUU5RCwyQ0FBdUM7QUFDdkMseURBQXNEOzs7Ozs7QUFnRnRELE1BQWEsV0FBWSxTQUFRLHNCQUFTOzs7O0lBc0d4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0QztRQUVELElBQ0UsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQztZQUNuRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLEVBQ25FO1lBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGFBQWEsRUFDYixRQUFRLEVBQ1IsYUFBYSxFQUNiLGVBQWUsRUFDZixPQUFPLEVBQ1AsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixjQUFjLEVBQ2Qsa0JBQWtCLEdBQUcsSUFBSSxHQUMxQixHQUFHLEtBQUssQ0FBQztRQUVWLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRTtZQUN4RSxhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxFQUFFO1FBQ0Ys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LENBQUM7UUFFRixFQUFFO1FBQ0YsK0RBQStEO1FBQy9ELDhEQUE4RDtRQUM5RCw0REFBNEQ7UUFDNUQsRUFBRTtRQUNGLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDaEcsQ0FBQzs7OztJQUdELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7O0FBcEdILGtDQTRNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBvc2l4IGFzIHBvc2l4UGF0aCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgYXBpZ3d5IGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItYWxwaGEnO1xuaW1wb3J0IHsgQXdzLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbi8vIGltcG9ydCAqIGFzIGFwaWd3eWNmbiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGNmIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCAqIGFzIGNmb3JpZ2lucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCAqIGFzIHI1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyByNTN0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgcmV2ZXJzZURvbWFpbiB9IGZyb20gJy4vdXRpbHMvUmV2ZXJzZURvbWFpbic7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNDRiB7XG4gIHJlYWRvbmx5IGNsb3VkRnJvbnREaXN0cm86IGNmLkRpc3RyaWJ1dGlvbjtcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBzQ0ZQcm9wcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBidWNrZXRBcHBzT3JpZ2luOiBjZm9yaWdpbnMuUzNPcmlnaW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0TG9ncz86IHMzLklCdWNrZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVPcmlnaW4/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgaHR0cEFwaTogYXBpZ3d5Lkh0dHBBcGk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lUm9vdD86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgY2VydEVkZ2U/OiBhY20uSUNlcnRpZmljYXRlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcjUzWm9uZT86IHI1My5JSG9zdGVkWm9uZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcm9vdFBhdGhQcmVmaXg/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGNyZWF0ZUFQSVBhdGhSb3V0ZT86IGJvb2xlYW47XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFQSU9yaWdpblBvbGljeU9wdGlvbnMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhc3NldE5hbWVSb290Pzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhc3NldE5hbWVTdWZmaXg/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlPzogc3RyaW5nO1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIEFkZFJvdXRlc09wdGlvbnMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFwaUd3eU9yaWdpbjogY2YuSU9yaWdpbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYnVja2V0QXBwc09yaWdpbjogY2ZvcmlnaW5zLlMzT3JpZ2luO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRpc3RybzogY2YuRGlzdHJpYnV0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k6IGNmLklPcmlnaW5SZXF1ZXN0UG9saWN5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSByb290UGF0aFByZWZpeD86IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgY3JlYXRlQVBJUGF0aFJvdXRlPzogYm9vbGVhbjtcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNsYXNzIE1pY3JvQXBwc0NGIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSU1pY3JvQXBwc0NGIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVBUElPcmlnaW5Qb2xpY3koXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBwcm9wczogQ3JlYXRlQVBJT3JpZ2luUG9saWN5T3B0aW9ucyxcbiAgKTogY2YuSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuICAgIGNvbnN0IHsgYXNzZXROYW1lUm9vdCwgYXNzZXROYW1lU3VmZml4LCBkb21haW5OYW1lRWRnZSB9ID0gcHJvcHM7XG5cbiAgICBsZXQgYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeTogY2YuSU9yaWdpblJlcXVlc3RQb2xpY3kgPSBjZi5PcmlnaW5SZXF1ZXN0UG9saWN5LkFMTF9WSUVXRVI7XG4gICAgaWYgKGRvbWFpbk5hbWVFZGdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdoZW4gbm90IHVzaW5nIGEgY3VzdG9tIGRvbWFpbiBuYW1lIHdlIG11c3QgbGltaXQgZG93biB0aGUgb3JpZ2luIHBvbGljeSB0b1xuICAgICAgLy8gcHJldmVudCBpdCBmcm9tIHBhc3NpbmcgdGhlIEhvc3QgaGVhZGVyIChkaXN0cmlidXRpb25faWQuY2xvdWRmcm9udC5uZXQpIHRvXG4gICAgICAvLyBhcGlnd3kgd2hpY2ggd2lsbCB0aGVuIHJlamVjdCBpdCB3aXRoIGEgNDAzIGJlY2F1c2UgaXQgZG9lcyBub3QgbWF0Y2ggdGhlXG4gICAgICAvLyBleGVjdXRlLWFwaSBuYW1lIHRoYXQgYXBpZ3d5IGlzIGV4cGVjdGluZy5cbiAgICAgIC8vXG4gICAgICAvLyAyMDIxLTEyLTI4IC0gVGhlcmUgaXMgYSBidWcgaW4gdGhlIG5hbWUgZ2VuZXJhdGlvbiB0aGF0IGNhdXNlcyB0aGUgc2FtZSBhc3NldFxuICAgICAgLy8gaW4gZGlmZmVyZW50IHN0YWNrcyB0byBoYXZlIHRoZSBzYW1lIGdlbmVyYXRlZCBuYW1lLiAgV2UgaGF2ZSB0byBtYWtlIHRoZSBpZFxuICAgICAgLy8gaW4gYWxsIGNhc2VzIHRvIGVuc3VyZSB0aGUgZ2VuZXJhdGVkIG5hbWUgaXMgdW5pcXVlLlxuICAgICAgYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeSA9IG5ldyBjZi5PcmlnaW5SZXF1ZXN0UG9saWN5KFxuICAgICAgICBzY29wZSxcbiAgICAgICAgYGFwaWd3eS1vcmlnaW4tcG9saWN5LSR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICB7XG4gICAgICAgICAgY29tbWVudDogYXNzZXROYW1lUm9vdCA/IGAke2Fzc2V0TmFtZVJvb3R9LWFwaWd3eSR7YXNzZXROYW1lU3VmZml4fWAgOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5TmFtZTogYXNzZXROYW1lUm9vdFxuICAgICAgICAgICAgPyBgJHthc3NldE5hbWVSb290fS1hcGlnd3kke2Fzc2V0TmFtZVN1ZmZpeH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb29raWVCZWhhdmlvcjogY2YuT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IGNmLk9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBjZi5PcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KCd1c2VyLWFnZW50JywgJ3JlZmVyZXInKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcHVibGljIHN0YXRpYyBhZGRSb3V0ZXMoX3Njb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBBZGRSb3V0ZXNPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpR3d5T3JpZ2luLFxuICAgICAgYnVja2V0QXBwc09yaWdpbixcbiAgICAgIGRpc3RybyxcbiAgICAgIGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3ksXG4gICAgICByb290UGF0aFByZWZpeCA9ICcnLFxuICAgICAgY3JlYXRlQVBJUGF0aFJvdXRlID0gdHJ1ZSxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvL1xuICAgIC8vIEFkZCBCZWhhdmlvcnNcbiAgICAvL1xuICAgIGNvbnN0IHMzQmVoYXZpb3JPcHRpb25zOiBjZi5BZGRCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogY2YuT3JpZ2luUmVxdWVzdFBvbGljeS5DT1JTX1MzX09SSUdJTixcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaUd3eUJlaGF2aW9yT3B0aW9uczogY2YuQWRkQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgIC8vIFRPRE86IENhY2hpbmcgbmVlZHMgdG8gYmUgc2V0IGJ5IHRoZSBhcHAgcmVzcG9uc2VcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNmLlZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIElmIGEgcm91dGUgc3BlY2lmaWNhbGx5IGhhcyBgL2FwaS9gIGluIGl0LCBzZW5kIGl0IHRvIEFQSSBHYXRld2F5XG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gY2F0Y2ggcm91dGVzIHRoYXQgaGF2ZSBwZXJpb2RzIGluIHRoZSBBUEkgcGF0aCBkYXRhLFxuICAgIC8vIHN1Y2ggYXM6IC9yZWxlYXNlLzAuMC4wL2FwaS91cGRhdGUvZGVmYXVsdC9yZWxlYXNlLzAuMC4wXG4gICAgLy9cbiAgICBpZiAoY3JlYXRlQVBJUGF0aFJvdXRlKSB7XG4gICAgICBkaXN0cm8uYWRkQmVoYXZpb3IoXG4gICAgICAgIHBvc2l4UGF0aC5qb2luKHJvb3RQYXRoUHJlZml4LCAnLyovKi9hcGkvKicpLFxuICAgICAgICBhcGlHd3lPcmlnaW4sXG4gICAgICAgIGFwaUd3eUJlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBBbGwgc3RhdGljIGFzc2V0cyBhcmUgYXNzdW1lZCB0byBoYXZlIGEgZG90IGluIHRoZW1cbiAgICAvL1xuICAgIGRpc3Ryby5hZGRCZWhhdmlvcihcbiAgICAgIHBvc2l4UGF0aC5qb2luKHJvb3RQYXRoUHJlZml4LCAnLyovKi8qLionKSxcbiAgICAgIGJ1Y2tldEFwcHNPcmlnaW4sXG4gICAgICBzM0JlaGF2aW9yT3B0aW9ucyxcbiAgICApO1xuXG4gICAgLy9cbiAgICAvLyBFdmVyeXRoaW5nIHRoYXQgaXNuJ3QgYSBzdGF0aWMgYXNzZXQgaXMgZ29pbmcgdG8gQVBJIEdhdGV3YXlcbiAgICAvLyBUaGVyZSBpcyBubyB0cmFpbGluZyBzbGFzaCBiZWNhdXNlIFNlcnZlcmxlc3MgTmV4dC5qcyB3YW50c1xuICAgIC8vIGdvIGxvYWQgcGFnZXMgYXQgL3JlbGVhc2UvMC4wLjMgKHdpdGggbm8gdHJhaWxpbmcgc2xhc2gpLlxuICAgIC8vXG4gICAgZGlzdHJvLmFkZEJlaGF2aW9yKHBvc2l4UGF0aC5qb2luKHJvb3RQYXRoUHJlZml4LCAnLyonKSwgYXBpR3d5T3JpZ2luLCBhcGlHd3lCZWhhdmlvck9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xvdWRGcm9udERpc3RybzogY2YuRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgZ2V0IGNsb3VkRnJvbnREaXN0cm8oKTogY2YuRGlzdHJpYnV0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvdWRGcm9udERpc3RybztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNaWNyb0FwcHNDRlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb3BzLnI1M1pvbmUgPT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kb21haW5OYW1lRWRnZSAhPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgKHByb3BzLnI1M1pvbmUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kb21haW5OYW1lRWRnZSA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiBlaXRoZXIgb2YgcjUzWm9uZSBvciBkb21haW5OYW1lRWRnZSBhcmUgc2V0IHRoZW4gdGhlIG90aGVyIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZG9tYWluTmFtZUVkZ2UsXG4gICAgICBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgaHR0cEFwaSxcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgICBjZXJ0RWRnZSxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgICByNTNab25lLFxuICAgICAgYnVja2V0TG9ncyxcbiAgICAgIGJ1Y2tldEFwcHNPcmlnaW4sXG4gICAgICByb290UGF0aFByZWZpeCxcbiAgICAgIGNyZWF0ZUFQSVBhdGhSb3V0ZSA9IHRydWUsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeSA9IE1pY3JvQXBwc0NGLmNyZWF0ZUFQSU9yaWdpblBvbGljeSh0aGlzLCB7XG4gICAgICBhc3NldE5hbWVSb290LFxuICAgICAgYXNzZXROYW1lU3VmZml4LFxuICAgICAgZG9tYWluTmFtZUVkZ2UsXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIERldGVybWluZSBVUkwgb2YgdGhlIG9yaWdpbiBGUUROXG4gICAgLy9cbiAgICBsZXQgaHR0cE9yaWdpbkZRRE46IHN0cmluZyA9ICdpbnZhbGlkLnB3cmRydnIuY29tJztcbiAgICBpZiAoZG9tYWluTmFtZU9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBodHRwT3JpZ2luRlFETiA9IGRvbWFpbk5hbWVPcmlnaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBPcmlnaW5GUUROID0gYCR7aHR0cEFwaS5hcGlJZH0uZXhlY3V0ZS1hcGkuJHtBd3MuUkVHSU9OfS5hbWF6b25hd3MuY29tYDtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIENsb3VkRnJvbnQgRGlzdHJvXG4gICAgLy9cbiAgICBjb25zdCBhcGlHd3lPcmlnaW4gPSBuZXcgY2ZvcmlnaW5zLkh0dHBPcmlnaW4oaHR0cE9yaWdpbkZRRE4sIHtcbiAgICAgIHByb3RvY29sUG9saWN5OiBjZi5PcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgICAgb3JpZ2luU3NsUHJvdG9jb2xzOiBbY2YuT3JpZ2luU3NsUG9saWN5LlRMU19WMV8yXSxcbiAgICB9KTtcbiAgICB0aGlzLl9jbG91ZEZyb250RGlzdHJvID0gbmV3IGNmLkRpc3RyaWJ1dGlvbih0aGlzLCAnY2Z0Jywge1xuICAgICAgY29tbWVudDogYXNzZXROYW1lUm9vdCA/IGAke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YCA6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgZG9tYWluTmFtZXM6IGRvbWFpbk5hbWVFZGdlICE9PSB1bmRlZmluZWQgPyBbZG9tYWluTmFtZUVkZ2VdIDogdW5kZWZpbmVkLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRFZGdlLFxuICAgICAgaHR0cFZlcnNpb246IGNmLkh0dHBWZXJzaW9uLkhUVFAyLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIGFsbG93ZWRNZXRob2RzOiBjZi5BbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICAgICAgb3JpZ2luOiBhcGlHd3lPcmlnaW4sXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIH0sXG4gICAgICBlbmFibGVJcHY2OiB0cnVlLFxuICAgICAgcHJpY2VDbGFzczogY2YuUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAsXG4gICAgICBsb2dCdWNrZXQ6IGJ1Y2tldExvZ3MsXG4gICAgICBsb2dGaWxlUHJlZml4OiBwcm9wcy5kb21haW5OYW1lRWRnZVxuICAgICAgICA/IGAke3JldmVyc2VEb21haW4ocHJvcHMuZG9tYWluTmFtZUVkZ2UpfS9jbG91ZGZyb250LXJhdy9gXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGlmIChyZW1vdmFsUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2Nsb3VkRnJvbnREaXN0cm8uYXBwbHlSZW1vdmFsUG9saWN5KHJlbW92YWxQb2xpY3kpO1xuICAgIH1cblxuICAgIC8vIEFkZCByb3V0ZXMgdG8gdGhlIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uXG4gICAgTWljcm9BcHBzQ0YuYWRkUm91dGVzKHNjb3BlLCB7XG4gICAgICBhcGlHd3lPcmlnaW4sXG4gICAgICBidWNrZXRBcHBzT3JpZ2luLFxuICAgICAgZGlzdHJvOiB0aGlzLl9jbG91ZEZyb250RGlzdHJvLFxuICAgICAgYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeTogYXBpZ3d5T3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICAgIHJvb3RQYXRoUHJlZml4LFxuICAgICAgY3JlYXRlQVBJUGF0aFJvdXRlLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBDcmVhdGUgdGhlIGVkZ2UgbmFtZSBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJvXG4gICAgLy9cblxuICAgIGlmIChyNTNab25lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJyQXBwc0VkZ2UgPSBuZXcgcjUzLlJlY29yZFNldCh0aGlzLCAnZWRnZS1hcmVjb3JkJywge1xuICAgICAgICByZWNvcmROYW1lOiBkb21haW5OYW1lRWRnZSxcbiAgICAgICAgcmVjb3JkVHlwZTogcjUzLlJlY29yZFR5cGUuQSxcbiAgICAgICAgdGFyZ2V0OiByNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgcjUzdGFyZ2V0cy5DbG91ZEZyb250VGFyZ2V0KHRoaXMuX2Nsb3VkRnJvbnREaXN0cm8pKSxcbiAgICAgICAgem9uZTogcjUzWm9uZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlbW92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByckFwcHNFZGdlLmFwcGx5UmVtb3ZhbFBvbGljeShyZW1vdmFsUG9saWN5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
208
+ MicroAppsCF[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroAppsCF", version: "0.2.11" };
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzQ0YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTWljcm9BcHBzQ0YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFBMEM7QUFFMUMsNkNBQWlEO0FBRWpELGlEQUFpRDtBQUNqRCxnRUFBZ0U7QUFDaEUsK0NBQStDO0FBQy9DLDhEQUE4RDtBQUU5RCwyQ0FBdUM7QUFDdkMseURBQXNEO0FBME50RDs7R0FFRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBMEl4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0QztRQUVELElBQ0UsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQztZQUNuRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLEVBQ25FO1lBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGFBQWEsRUFDYixRQUFRLEVBQ1IsYUFBYSxFQUNiLGVBQWUsRUFDZixPQUFPLEVBQ1AsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixjQUFjLEVBQ2Qsa0JBQWtCLEdBQUcsSUFBSSxFQUN6Qix1QkFBdUIsR0FBRyxJQUFJLEVBQzlCLG1CQUFtQixHQUNwQixHQUFHLEtBQUssQ0FBQztRQUVWLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRTtZQUN4RSxhQUFhO1lBQ2IsZUFBZTtZ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LENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsRUFDMUMsZ0JBQWdCLEVBQ2hCLGlCQUFpQixDQUNsQixDQUFDO1FBRUYsRUFBRTtRQUNGLCtEQUErRDtRQUMvRCw4REFBOEQ7UUFDOUQsNERBQTREO1FBQzVELEVBQUU7UUFDRixNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFHRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDOztBQXhJSCxrQ0F5UEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb3NpeCBhcyBwb3NpeFBhdGggfSBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaWd3eSBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWFscGhhJztcbmltcG9ydCB7IEF3cywgUmVtb3ZhbFBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGNmIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCAqIGFzIGNmb3JpZ2lucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCAqIGFzIHI1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyByNTN0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgcmV2ZXJzZURvbWFpbiB9IGZyb20gJy4vdXRpbHMvUmV2ZXJzZURvbWFpbic7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIE1pY3JvQXBwcyBDbG91ZEZyb250XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU1pY3JvQXBwc0NGIHtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRGcm9udERpc3RybzogY2YuRGlzdHJpYnV0aW9uO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBgTWljcm9BcHBzQ0ZgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pY3JvQXBwc0NGUHJvcHMge1xuICAvKipcbiAgICogUmVtb3ZhbFBvbGljeSBvdmVycmlkZSBmb3IgY2hpbGQgcmVzb3VyY2VzXG4gICAqXG4gICAqIE5vdGU6IGlmIHNldCB0byBERVNUUk9ZIHRoZSBTMyBidWNrZXMgd2lsbCBoYXZlIGBhdXRvRGVsZXRlT2JqZWN0c2Agc2V0IHRvIGB0cnVlYFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBlciByZXNvdXJjZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogUzMgYnVja2V0IG9yaWdpbiBmb3IgZGVwbG95ZWQgYXBwbGljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcHBzT3JpZ2luOiBjZm9yaWdpbnMuUzNPcmlnaW47XG5cbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBmb3IgQ2xvdWRGcm9udCBsb2dzXG4gICAqL1xuICByZWFkb25seSBidWNrZXRMb2dzPzogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogQ2xvdWRGcm9udCBEaXN0cmlidXRpb24gZG9tYWluIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGUgYXBwcy5wd3JkcnZyLmNvbVxuICAgKiBAZGVmYXVsdCBhdXRvLWFzc2lnbmVkXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lRWRnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQVBJIEdhdGV3YXkgY3VzdG9tIG9yaWdpbiBkb21haW4gbmFtZVxuICAgKlxuICAgKiBAZXhhbXBsZSBhcHBzLnB3cmRydnIuY29tXG4gICAqIEBkZWZhdWx0IC0gcmV0cmlldmVkIGZyb20gaHR0cEFwaSwgaWYgcG9zc2libGVcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVPcmlnaW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFQSSBHYXRld2F5IHYyIEhUVFAgQVBJIGZvciBhcHBzXG4gICAqL1xuICByZWFkb25seSBodHRwQXBpOiBhcGlnd3kuSHR0cEFwaTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYXNzZXQgbmFtZSByb290XG4gICAqXG4gICAqIEBleGFtcGxlIG1pY3JvYXBwc1xuICAgKiBAZGVmYXVsdCAtIHJlc291cmNlIG5hbWVzIGF1dG8gYXNzaWduZWRcbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFzc2V0IG5hbWUgc3VmZml4XG4gICAqXG4gICAqIEBleGFtcGxlIC1kZXYtcHItMTJcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBQ00gQ2VydGlmaWNhdGUgdGhhdCBjb3ZlcnMgYGRvbWFpbk5hbWVFZGdlYCBuYW1lXG4gICAqL1xuICByZWFkb25seSBjZXJ0RWRnZT86IGFjbS5JQ2VydGlmaWNhdGU7XG5cbiAgLyoqXG4gICAqIFJvdXRlNTMgem9uZSBpbiB3aGljaCB0byBjcmVhdGUgb3B0aW9uYWwgYGRvbWFpbk5hbWVFZGdlYCByZWNvcmRcbiAgICovXG4gIHJlYWRvbmx5IHI1M1pvbmU/OiByNTMuSUhvc3RlZFpvbmU7XG5cbiAgLyoqXG4gICAqIFBhdGggcHJlZml4IG9uIHRoZSByb290IG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvblxuICAgKlxuICAgKiBAZXhhbXBsZSBkZXYvXG4gICAqL1xuICByZWFkb25seSByb290UGF0aFByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4dHJhIEJlaGF2aW9yIChSb3V0ZSkgZm9yIC9hcGkvIHRoYXQgYWxsb3dzXG4gICAqIEFQSSByb3V0ZXMgdG8gaGF2ZSBhIHBlcmlvZCBpbiB0aGVtLlxuICAgKlxuICAgKiBXaGVuIGZhbHNlIEFQSSByb3V0ZXMgd2l0aCBhIHBlcmlvZCBpbiB0aGUgcGF0aCB3aWxsIGdldCByb3V0ZWQgdG8gUzMuXG4gICAqXG4gICAqIFdoZW4gdHJ1ZSBBUEkgcm91dGVzIHRoYXQgY29udGFpbiAvYXBpLyBpbiB0aGUgcGF0aCB3aWxsIGdldCByb3V0ZWQgdG8gQVBJIEdhdGV3YXlcbiAgICogZXZlbiBpZiB0aGV5IGhhdmUgYSBwZXJpb2QgaW4gdGhlIHBhdGguXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUFQSVBhdGhSb3V0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHRyYSBCZWhhdmlvciAoUm91dGUpIGZvciAvX25leHQvZGF0YS9cbiAgICogVGhpcyByb3V0ZSBpcyB1c2VkIGJ5IE5leHQuanMgdG8gbG9hZCBkYXRhIGZyb20gdGhlIEFQSSBHYXRld2F5XG4gICAqIG9uIGBnZXRTZXJ2ZXJTaWRlUHJvcHNgIGNhbGxzLiAgVGhlIHJlcXVlc3RzIGNhbiBlbmQgaW4gYC5qc29uYCxcbiAgICogd2hpY2ggd291bGQgY2F1c2UgdGhlbSB0byBiZSByb3V0ZWQgdG8gUzMgaWYgdGhpcyByb3V0ZSBpcyBub3QgY3JlYXRlZC5cbiAgICpcbiAgICogV2hlbiBmYWxzZSBBUEkgcm91dGVzIHdpdGggYSBwZXJpb2QgaW4gdGhlIHBhdGggd2lsbCBnZXQgcm91dGVkIHRvIFMzLlxuICAgKlxuICAgKiBXaGVuIHRydWUgQVBJIHJvdXRlcyB0aGF0IGNvbnRhaW4gL19uZXh0L2RhdGEvIGluIHRoZSBwYXRoIHdpbGwgZ2V0IHJvdXRlZCB0byBBUEkgR2F0ZXdheVxuICAgKiBldmVuIGlmIHRoZXkgaGF2ZSBhIHBlcmlvZCBpbiB0aGUgcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlTmV4dERhdGFQYXRoUm91dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9mIHRoZSBlZGdlIHRvIG9yaWdpbiBsYW1iZGEgZnVuY3Rpb25zXG4gICAqXG4gICAqIEBkZWZhdW50IC0gbm8gZWRnZSB0byBBUEkgR2F0ZXdheSBvcmlnaW4gZnVuY3Rpb25zIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBlZGdlVG9PcmlnaW5MYW1iZGFzPzogY2YuRWRnZUxhbWJkYVtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBgQ3JlYXRlQVBJT3JpZ2luUG9saWN5YFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFQSU9yaWdpblBvbGljeU9wdGlvbnMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYXNzZXQgbmFtZSByb290XG4gICAqXG4gICAqIEBleGFtcGxlIG1pY3JvYXBwc1xuICAgKiBAZGVmYXVsdCAtIHJlc291cmNlIG5hbWVzIGF1dG8gYXNzaWduZWRcbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFzc2V0IG5hbWUgc3VmZml4XG4gICAqXG4gICAqIEBleGFtcGxlIC1kZXYtcHItMTJcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFZGdlIGRvbWFpbiBuYW1lIHVzZWQgYnkgQ2xvdWRGcm9udCAtIElmIHNldCBhIGN1c3RvbVxuICAgKiBPcmlnaW5SZXF1ZXN0UG9saWN5IHdpbGwgYmUgY3JlYXRlZCB0aGF0IHByZXZlbnRzXG4gICAqIHRoZSBIb3N0IGhlYWRlciBmcm9tIGJlaW5nIHBhc3NlZCB0byB0aGUgb3JpZ2luLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZUVkZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEFkZFJvdXRlc2BcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRSb3V0ZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFQSSBHYXRld2F5IENsb3VkRnJvbnQgT3JpZ2luIGZvciBBUEkgY2FsbHNcbiAgICovXG4gIHJlYWRvbmx5IGFwaUd3eU9yaWdpbjogY2YuSU9yaWdpbjtcblxuICAvKipcbiAgICogUzMgQnVja2V0IENsb3VkRnJvbnQgT3JpZ2luIGZvciBzdGF0aWMgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSBidWNrZXRBcHBzT3JpZ2luOiBjZm9yaWdpbnMuUzNPcmlnaW47XG5cbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIHRvIGFkZCB0aGUgQmVoYXZpb3JzIChSb3V0ZXMpIHRvXG4gICAqL1xuICByZWFkb25seSBkaXN0cm86IGNmLkRpc3RyaWJ1dGlvbjtcblxuICAvKipcbiAgICogT3JpZ2luIFJlcXVlc3QgcG9saWN5IGZvciBBUEkgR2F0ZXdheSBPcmlnaW5cbiAgICovXG4gIHJlYWRvbmx5IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k6IGNmLklPcmlnaW5SZXF1ZXN0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBQYXRoIHByZWZpeCBvbiB0aGUgcm9vdCBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb25cbiAgICpcbiAgICogQGV4YW1wbGUgZGV2L1xuICAgKi9cbiAgcmVhZG9ubHkgcm9vdFBhdGhQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHRyYSBCZWhhdmlvciAoUm91dGUpIGZvciAvYXBpLyB0aGF0IGFsbG93c1xuICAgKiBBUEkgcm91dGVzIHRvIGhhdmUgYSBwZXJpb2QgaW4gdGhlbS5cbiAgICpcbiAgICogV2hlbiBmYWxzZSBBUEkgcm91dGVzIHdpdGggYSBwZXJpb2QgaW4gdGhlIHBhdGggd2lsbCBnZXQgcm91dGVkIHRvIFMzLlxuICAgKlxuICAgKiBXaGVuIHRydWUgQVBJIHJvdXRlcyB0aGF0IGNvbnRhaW4gL2FwaS8gaW4gdGhlIHBhdGggd2lsbCBnZXQgcm91dGVkIHRvIEFQSSBHYXRld2F5XG4gICAqIGV2ZW4gaWYgdGhleSBoYXZlIGEgcGVyaW9kIGluIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVBUElQYXRoUm91dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXh0cmEgQmVoYXZpb3IgKFJvdXRlKSBmb3IgL19uZXh0L2RhdGEvXG4gICAqIFRoaXMgcm91dGUgaXMgdXNlZCBieSBOZXh0LmpzIHRvIGxvYWQgZGF0YSBmcm9tIHRoZSBBUEkgR2F0ZXdheVxuICAgKiBvbiBgZ2V0U2VydmVyU2lkZVByb3BzYCBjYWxscy4gIFRoZSByZXF1ZXN0cyBjYW4gZW5kIGluIGAuanNvbmAsXG4gICAqIHdoaWNoIHdvdWxkIGNhdXNlIHRoZW0gdG8gYmUgcm91dGVkIHRvIFMzIGlmIHRoaXMgcm91dGUgaXMgbm90IGNyZWF0ZWQuXG4gICAqXG4gICAqIFdoZW4gZmFsc2UgQVBJIHJvdXRlcyB3aXRoIGEgcGVyaW9kIGluIHRoZSBwYXRoIHdpbGwgZ2V0IHJvdXRlZCB0byBTMy5cbiAgICpcbiAgICogV2hlbiB0cnVlIEFQSSByb3V0ZXMgdGhhdCBjb250YWluIC9fbmV4dC9kYXRhLyBpbiB0aGUgcGF0aCB3aWxsIGdldCByb3V0ZWQgdG8gQVBJIEdhdGV3YXlcbiAgICogZXZlbiBpZiB0aGV5IGhhdmUgYSBwZXJpb2QgaW4gdGhlIHBhdGguXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZU5leHREYXRhUGF0aFJvdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRWRnZSBsYW1iZGFzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBBUEkgR2F0ZXdheSByb3V0ZXNcbiAgICovXG4gIHJlYWRvbmx5IGFwaWd3eUVkZ2VGdW5jdGlvbnM/OiBjZi5FZGdlTGFtYmRhW107XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IE1pY3JvQXBwcyBDbG91ZEZyb250IERpc3RyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pY3JvQXBwc0NGIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSU1pY3JvQXBwc0NGIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBvciBnZXQgdGhlIG9yaWdpbiByZXF1ZXN0IHBvbGljeVxuICAgKlxuICAgKiBJZiBhIGN1c3RvbSBkb21haW4gbmFtZSBpcyBOT1QgdXNlZCBmb3IgdGhlIG9yaWdpbiB0aGVuIGEgcG9saWN5XG4gICAqIHdpbGwgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogSWYgYSBjdXN0b20gZG9tYWluIG5hbWUgSVMgdXNlZCBmb3IgdGhlIG9yaWdpbiB0aGVuIHRoZSBBTExfVklFV0VSXG4gICAqIHBvbGljeSB3aWxsIGJlIHJldHVybmVkLiAgVGhpcyBwb2xpY3kgcGFzc2VzIHRoZSBIb3N0IGhlYWRlciB0byB0aGVcbiAgICogb3JpZ2luLCB3aGljaCBpcyBmaW5lIHdoZW4gdXNpbmcgYSBjdXN0b20gZG9tYWluIG5hbWUgb24gdGhlIG9yaWdpbi5cbiAgICpcbiAgICogQHBhcmFtIF9zY29wZVxuICAgKiBAcGFyYW0gX3Byb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFQSU9yaWdpblBvbGljeShcbiAgICBfc2NvcGU6IENvbnN0cnVjdCxcbiAgICBfcHJvcHM6IENyZWF0ZUFQSU9yaWdpblBvbGljeU9wdGlvbnMsXG4gICk6IGNmLklPcmlnaW5SZXF1ZXN0UG9saWN5IHtcbiAgICAvLyBjb25zdCB7IGFzc2V0TmFtZVJvb3QsIGFzc2V0TmFtZVN1ZmZpeCwgZG9tYWluTmFtZUVkZ2UgfSA9IHByb3BzO1xuXG4gICAgLy8gbGV0IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3k6IGNmLklPcmlnaW5SZXF1ZXN0UG9saWN5ID0gY2YuT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSO1xuICAgIC8vIGlmIChkb21haW5OYW1lRWRnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gICAvLyBXaGVuIG5vdCB1c2luZyBhIGN1c3RvbSBkb21haW4gbmFtZSB3ZSBtdXN0IGxpbWl0IGRvd24gdGhlIG9yaWdpbiBwb2xpY3kgdG9cbiAgICAvLyAgIC8vIHByZXZlbnQgaXQgZnJvbSBwYXNzaW5nIHRoZSBIb3N0IGhlYWRlciAoZGlzdHJpYnV0aW9uX2lkLmNsb3VkZnJvbnQubmV0KSB0b1xuICAgIC8vICAgLy8gYXBpZ3d5IHdoaWNoIHdpbGwgdGhlbiByZWplY3QgaXQgd2l0aCBhIDQwMyBiZWNhdXNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZVxuICAgIC8vICAgLy8gZXhlY3V0ZS1hcGkgbmFtZSB0aGF0IGFwaWd3eSBpcyBleHBlY3RpbmcuXG4gICAgLy8gICAvL1xuICAgIC8vICAgLy8gMjAyMS0xMi0yOCAtIFRoZXJlIGlzIGEgYnVnIGluIHRoZSBuYW1lIGdlbmVyYXRpb24gdGhhdCBjYXVzZXMgdGhlIHNhbWUgYXNzZXRcbiAgICAvLyAgIC8vIGluIGRpZmZlcmVudCBzdGFja3MgdG8gaGF2ZSB0aGUgc2FtZSBnZW5lcmF0ZWQgbmFtZS4gIFdlIGhhdmUgdG8gbWFrZSB0aGUgaWRcbiAgICAvLyAgIC8vIGluIGFsbCBjYXNlcyB0byBlbnN1cmUgdGhlIGdlbmVyYXRlZCBuYW1lIGlzIHVuaXF1ZS5cbiAgICAvLyAgIGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3kgPSBuZXcgY2YuT3JpZ2luUmVxdWVzdFBvbGljeShcbiAgICAvLyAgICAgc2NvcGUsXG4gICAgLy8gICAgIGBhcGlnd3ktb3JpZ2luLXBvbGljeS0ke1N0YWNrLm9mKHNjb3BlKS5zdGFja05hbWV9YCxcbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgIGNvbW1lbnQ6IGFzc2V0TmFtZVJvb3QgPyBgJHthc3NldE5hbWVSb290fS1hcGlnd3kke2Fzc2V0TmFtZVN1ZmZpeH1gIDogdW5kZWZpbmVkLFxuXG4gICAgLy8gICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWU6IGFzc2V0TmFtZVJvb3RcbiAgICAvLyAgICAgICAgID8gYCR7YXNzZXROYW1lUm9vdH0tYXBpZ3d5JHthc3NldE5hbWVTdWZmaXh9YFxuICAgIC8vICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgLy8gICAgICAgY29va2llQmVoYXZpb3I6IGNmLk9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5hbGwoKSxcbiAgICAvLyAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBjZi5PcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAvLyAgICAgICAvLyBUT0RPOiBJZiBzaWduaW5nIGlzIGVuYWJsZWQgdGhpcyBzaG91bGQgZm9yd2FyZCBhbGwgc2lnbmF0dXJlIGhlYWRlcnNcbiAgICAvLyAgICAgICAvLyBUT0RPOiBJZiBzZXQgdG8gXCJjZnJvbnQuT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbCgpXCIgdGhlblxuICAgIC8vICAgICAgIC8vIGByZXBsYWNlSG9zdEhlYWRlcmAgbXVzdCBiZSBzZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IEFQSSBHYXRld2F5IGZyb20gcmVqZWN0aW5nXG4gICAgLy8gICAgICAgLy8gdGhlIHJlcXVlc3RcbiAgICAvLyAgICAgICAvLyBoZWFkZXJCZWhhdmlvcjogY2YuT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCgndXNlci1hZ2VudCcsICdyZWZlcmVyJyksXG4gICAgLy8gICAgICAgaGVhZGVyQmVoYXZpb3I6IGNmLk9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5hbGwoKSxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICk7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIGNmLk9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgQVBJIEdhdGV3YXkgYW5kIFMzIHJvdXRlcyB0byBhbiBleGlzdGluZyBDbG91ZEZyb250IERpc3RyaWJ1dGlvblxuICAgKiBAcGFyYW0gX3Njb3BlXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZGRSb3V0ZXMoX3Njb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBBZGRSb3V0ZXNPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXBpR3d5T3JpZ2luLFxuICAgICAgYnVja2V0QXBwc09yaWdpbixcbiAgICAgIGRpc3RybyxcbiAgICAgIGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3ksXG4gICAgICByb290UGF0aFByZWZpeCA9ICcnLFxuICAgICAgY3JlYXRlQVBJUGF0aFJvdXRlID0gdHJ1ZSxcbiAgICAgIGNyZWF0ZU5leHREYXRhUGF0aFJvdXRlID0gdHJ1ZSxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvL1xuICAgIC8vIEFkZCBCZWhhdmlvcnNcbiAgICAvL1xuICAgIGNvbnN0IHMzQmVoYXZpb3JPcHRpb25zOiBjZi5BZGRCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogY2YuT3JpZ2luUmVxdWVzdFBvbGljeS5DT1JTX1MzX09SSUdJTixcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaUd3eUJlaGF2aW9yT3B0aW9uczogY2YuQWRkQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgIC8vIFRPRE86IENhY2hpbmcgbmVlZHMgdG8gYmUgc2V0IGJ5IHRoZSBhcHAgcmVzcG9uc2VcbiAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNmLlZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgZWRnZUxhbWJkYXM6IHByb3BzLmFwaWd3eUVkZ2VGdW5jdGlvbnMsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gSWYgYSByb3V0ZSBzcGVjaWZpY2FsbHkgaGFzIGAvYXBpL2AgaW4gaXQsIHNlbmQgaXQgdG8gQVBJIEdhdGV3YXlcbiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBjYXRjaCByb3V0ZXMgdGhhdCBoYXZlIHBlcmlvZHMgaW4gdGhlIEFQSSBwYXRoIGRhdGEsXG4gICAgLy8gc3VjaCBhczogL3JlbGVhc2UvMC4wLjAvYXBpL3VwZGF0ZS9kZWZhdWx0L3JlbGVhc2UvMC4wLjBcbiAgICAvL1xuICAgIGlmIChjcmVhdGVBUElQYXRoUm91dGUpIHtcbiAgICAgIGRpc3Ryby5hZGRCZWhhdmlvcihcbiAgICAgICAgcG9zaXhQYXRoLmpvaW4ocm9vdFBhdGhQcmVmaXgsICcvKi8qL2FwaS8qJyksXG4gICAgICAgIGFwaUd3eU9yaWdpbixcbiAgICAgICAgYXBpR3d5QmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIElmIGEgcm91dGUgc3BlY2lmaWNhbGx5IGhhcyBgL19uZXh0L2RhdGEvYCBpbiBpdCwgc2VuZCBpdCB0byBBUEkgR2F0ZXdheVxuICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGNhdGNoIHJvdXRlcyB0aGF0IGhhdmUgcGVyaW9kcyBpbiB0aGUgQVBJIHBhdGggZGF0YSxcbiAgICAvLyBzdWNoIGFzOiAvcmVsZWFzZS8wLjAuMC9fbmV4dC9kYXRhL2FwcC5qc29uXG4gICAgLy9cbiAgICBpZiAoY3JlYXRlTmV4dERhdGFQYXRoUm91dGUpIHtcbiAgICAgIGRpc3Ryby5hZGRCZWhhdmlvcihcbiAgICAgICAgcG9zaXhQYXRoLmpvaW4ocm9vdFBhdGhQcmVmaXgsICcvKi8qL19uZXh0L2RhdGEvKicpLFxuICAgICAgICBhcGlHd3lPcmlnaW4sXG4gICAgICAgIGFwaUd3eUJlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBBbGwgc3RhdGljIGFzc2V0cyBhcmUgYXNzdW1lZCB0byBoYXZlIGEgZG90IGluIHRoZW1cbiAgICAvL1xuICAgIGRpc3Ryby5hZGRCZWhhdmlvcihcbiAgICAgIHBvc2l4UGF0aC5qb2luKHJvb3RQYXRoUHJlZml4LCAnLyovKi8qLionKSxcbiAgICAgIGJ1Y2tldEFwcHNPcmlnaW4sXG4gICAgICBzM0JlaGF2aW9yT3B0aW9ucyxcbiAgICApO1xuXG4gICAgLy9cbiAgICAvLyBFdmVyeXRoaW5nIHRoYXQgaXNuJ3QgYSBzdGF0aWMgYXNzZXQgaXMgZ29pbmcgdG8gQVBJIEdhdGV3YXlcbiAgICAvLyBUaGVyZSBpcyBubyB0cmFpbGluZyBzbGFzaCBiZWNhdXNlIFNlcnZlcmxlc3MgTmV4dC5qcyB3YW50c1xuICAgIC8vIGdvIGxvYWQgcGFnZXMgYXQgL3JlbGVhc2UvMC4wLjMgKHdpdGggbm8gdHJhaWxpbmcgc2xhc2gpLlxuICAgIC8vXG4gICAgZGlzdHJvLmFkZEJlaGF2aW9yKHBvc2l4UGF0aC5qb2luKHJvb3RQYXRoUHJlZml4LCAnLyonKSwgYXBpR3d5T3JpZ2luLCBhcGlHd3lCZWhhdmlvck9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xvdWRGcm9udERpc3RybzogY2YuRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgZ2V0IGNsb3VkRnJvbnREaXN0cm8oKTogY2YuRGlzdHJpYnV0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvdWRGcm9udERpc3RybztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNaWNyb0FwcHNDRlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb3BzLnI1M1pvbmUgPT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kb21haW5OYW1lRWRnZSAhPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgKHByb3BzLnI1M1pvbmUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kb21haW5OYW1lRWRnZSA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJZiBlaXRoZXIgb2YgcjUzWm9uZSBvciBkb21haW5OYW1lRWRnZSBhcmUgc2V0IHRoZW4gdGhlIG90aGVyIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZG9tYWluTmFtZUVkZ2UsXG4gICAgICBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgaHR0cEFwaSxcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgICBjZXJ0RWRnZSxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgICByNTNab25lLFxuICAgICAgYnVja2V0TG9ncyxcbiAgICAgIGJ1Y2tldEFwcHNPcmlnaW4sXG4gICAgICByb290UGF0aFByZWZpeCxcbiAgICAgIGNyZWF0ZUFQSVBhdGhSb3V0ZSA9IHRydWUsXG4gICAgICBjcmVhdGVOZXh0RGF0YVBhdGhSb3V0ZSA9IHRydWUsXG4gICAgICBlZGdlVG9PcmlnaW5MYW1iZGFzLFxuICAgIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3kgPSBNaWNyb0FwcHNDRi5jcmVhdGVBUElPcmlnaW5Qb2xpY3kodGhpcywge1xuICAgICAgYXNzZXROYW1lUm9vdCxcbiAgICAgIGFzc2V0TmFtZVN1ZmZpeCxcbiAgICAgIGRvbWFpbk5hbWVFZGdlLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBEZXRlcm1pbmUgVVJMIG9mIHRoZSBvcmlnaW4gRlFETlxuICAgIC8vXG4gICAgbGV0IGh0dHBPcmlnaW5GUUROOiBzdHJpbmcgPSAnaW52YWxpZC5wd3JkcnZyLmNvbSc7XG4gICAgaWYgKGRvbWFpbk5hbWVPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaHR0cE9yaWdpbkZRRE4gPSBkb21haW5OYW1lT3JpZ2luO1xuICAgIH0gZWxzZSB7XG4gICAgICBodHRwT3JpZ2luRlFETiA9IGAke2h0dHBBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7QXdzLlJFR0lPTn0uYW1hem9uYXdzLmNvbWA7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBHZXQgdGhlIEVkZ2UgdG8gT3JpZ2luIExhbWJkYXNcbiAgICAvL1xuXG4gICAgLy9cbiAgICAvLyBDbG91ZEZyb250IERpc3Ryb1xuICAgIC8vXG4gICAgY29uc3QgYXBpR3d5T3JpZ2luID0gbmV3IGNmb3JpZ2lucy5IdHRwT3JpZ2luKGh0dHBPcmlnaW5GUUROLCB7XG4gICAgICBwcm90b2NvbFBvbGljeTogY2YuT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICAgIG9yaWdpblNzbFByb3RvY29sczogW2NmLk9yaWdpblNzbFBvbGljeS5UTFNfVjFfMl0sXG4gICAgfSk7XG4gICAgdGhpcy5fY2xvdWRGcm9udERpc3RybyA9IG5ldyBjZi5EaXN0cmlidXRpb24odGhpcywgJ2NmdCcsIHtcbiAgICAgIGNvbW1lbnQ6IGFzc2V0TmFtZVJvb3QgPyBgJHthc3NldE5hbWVSb290fSR7YXNzZXROYW1lU3VmZml4fWAgOiBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVzOiBkb21haW5OYW1lRWRnZSAhPT0gdW5kZWZpbmVkID8gW2RvbWFpbk5hbWVFZGdlXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNlcnRpZmljYXRlOiBjZXJ0RWRnZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMixcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICBjYWNoZVBvbGljeTogY2YuQ2FjaGVQb2xpY3kuQ0FDSElOR19ESVNBQkxFRCxcbiAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IGFwaWd3eU9yaWdpblJlcXVlc3RQb2xpY3ksXG4gICAgICAgIG9yaWdpbjogYXBpR3d5T3JpZ2luLFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIGVkZ2VMYW1iZGFzOiBlZGdlVG9PcmlnaW5MYW1iZGFzLFxuICAgICAgfSxcbiAgICAgIGVuYWJsZUlwdjY6IHRydWUsXG4gICAgICBwcmljZUNsYXNzOiBjZi5QcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMCxcbiAgICAgIGxvZ0J1Y2tldDogYnVja2V0TG9ncyxcbiAgICAgIGxvZ0ZpbGVQcmVmaXg6IHByb3BzLmRvbWFpbk5hbWVFZGdlXG4gICAgICAgID8gYCR7cmV2ZXJzZURvbWFpbihwcm9wcy5kb21haW5OYW1lRWRnZSl9L2Nsb3VkZnJvbnQtcmF3L2BcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgaWYgKHJlbW92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fY2xvdWRGcm9udERpc3Ryby5hcHBseVJlbW92YWxQb2xpY3kocmVtb3ZhbFBvbGljeSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJvdXRlcyB0byB0aGUgQ2xvdWRGcm9udCBEaXN0cmlidXRpb25cbiAgICBNaWNyb0FwcHNDRi5hZGRSb3V0ZXMoc2NvcGUsIHtcbiAgICAgIGFwaUd3eU9yaWdpbixcbiAgICAgIGJ1Y2tldEFwcHNPcmlnaW4sXG4gICAgICBkaXN0cm86IHRoaXMuX2Nsb3VkRnJvbnREaXN0cm8sXG4gICAgICBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5OiBhcGlnd3lPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgICAgcm9vdFBhdGhQcmVmaXgsXG4gICAgICBjcmVhdGVBUElQYXRoUm91dGUsXG4gICAgICBjcmVhdGVOZXh0RGF0YVBhdGhSb3V0ZSxcbiAgICAgIGFwaWd3eUVkZ2VGdW5jdGlvbnM6IGVkZ2VUb09yaWdpbkxhbWJkYXMsXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIENyZWF0ZSB0aGUgZWRnZSBuYW1lIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cm9cbiAgICAvL1xuXG4gICAgaWYgKHI1M1pvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcnJBcHBzRWRnZSA9IG5ldyByNTMuUmVjb3JkU2V0KHRoaXMsICdlZGdlLWFyZWNvcmQnLCB7XG4gICAgICAgIHJlY29yZE5hbWU6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgICByZWNvcmRUeXBlOiByNTMuUmVjb3JkVHlwZS5BLFxuICAgICAgICB0YXJnZXQ6IHI1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyByNTN0YXJnZXRzLkNsb3VkRnJvbnRUYXJnZXQodGhpcy5fY2xvdWRGcm9udERpc3RybykpLFxuICAgICAgICB6b25lOiByNTNab25lLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVtb3ZhbFBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJyQXBwc0VkZ2UuYXBwbHlSZW1vdmFsUG9saWN5KHJlbW92YWxQb2xpY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,108 @@
1
+ import { RemovalPolicy } from 'aws-cdk-lib';
2
+ import * as cf from 'aws-cdk-lib/aws-cloudfront';
3
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
4
+ import { Construct } from 'constructs';
5
+ /**
6
+ * Represents a MicroApps Edge to Origin Function
7
+ */
8
+ export interface IMicroAppsEdgeToOrigin {
9
+ /**
10
+ * The edge to origin function for API Gateway Request Origin Edge Lambda
11
+ *
12
+ * The generated `config.yml` is included in the Lambda's code.
13
+ */
14
+ readonly edgeToOriginFunction: lambda.Function | cf.experimental.EdgeFunction;
15
+ /**
16
+ * Configuration of the edge to origin lambda functions
17
+ */
18
+ readonly edgeToOriginLambdas: cf.EdgeLambda[];
19
+ }
20
+ /**
21
+ * Properties to initialize an instance of `MicroAppsEdgeToOrigin`.
22
+ */
23
+ export interface MicroAppsEdgeToOriginProps {
24
+ /**
25
+ * RemovalPolicy override for child resources
26
+ *
27
+ * @default - per resource default
28
+ */
29
+ readonly removalPolicy?: RemovalPolicy;
30
+ /**
31
+ * Optional asset name root
32
+ *
33
+ * @example microapps
34
+ * @default - resource names auto assigned
35
+ */
36
+ readonly assetNameRoot?: string;
37
+ /**
38
+ * Optional asset name suffix
39
+ *
40
+ * @example -dev-pr-12
41
+ * @default none
42
+ */
43
+ readonly assetNameSuffix?: string;
44
+ /**
45
+ * Adds an X-Forwarded-Host-Header when calling API Gateway
46
+ *
47
+ * Can only be trusted if `signingMode` is enabled, which restricts
48
+ * access to API Gateway to only IAM signed requests.
49
+ *
50
+ * Note: if true, creates OriginRequest Lambda @ Edge function for API Gateway Origin
51
+ * @default true
52
+ */
53
+ readonly addXForwardedHostHeader?: boolean;
54
+ /**
55
+ * Replaces Host header (which will be the Edge domain name) with the Origin domain name
56
+ * when enabled. This is necessary when API Gateway has not been configured
57
+ * with a custom domain name that matches the exact domain name used by the CloudFront
58
+ * Distribution AND when the OriginRequestPolicy.HeadersBehavior is set
59
+ * to pass all headers to the origin.
60
+ *
61
+ * Note: if true, creates OriginRequest Lambda @ Edge function for API Gateway Origin
62
+ * @default true
63
+ */
64
+ readonly replaceHostHeader?: boolean;
65
+ /**
66
+ * Requires IAM auth on the API Gateway origin if not set to 'none'.
67
+ *
68
+ * 'sign' - Uses request headers for auth.
69
+ * 'presign' - Uses query string for auth.
70
+ *
71
+ * If enabled,
72
+ *
73
+ * Note: if 'sign' or 'presign', creates OriginRequest Lambda @ Edge function for API Gateway Origin
74
+ * @default 'sign'
75
+ */
76
+ readonly signingMode?: 'sign' | 'presign' | 'none';
77
+ /**
78
+ * Origin region that API Gateway will be deployed to, used
79
+ * for the config.yml on the Edge function to sign requests for
80
+ * the correct region
81
+ *
82
+ * @default undefined
83
+ */
84
+ readonly originRegion?: string;
85
+ }
86
+ export interface GenerateEdgeToOriginConfigOptions {
87
+ readonly originRegion: string;
88
+ readonly signingMode: 'sign' | 'presign' | '';
89
+ readonly addXForwardedHostHeader: boolean;
90
+ readonly replaceHostHeader: boolean;
91
+ }
92
+ /**
93
+ * Create a new MicroApps Edge to Origin Function w/ `config.yml`
94
+ */
95
+ export declare class MicroAppsEdgeToOrigin extends Construct implements IMicroAppsEdgeToOrigin {
96
+ /**
97
+ * Generate the yaml config for the edge lambda
98
+ * @param props
99
+ * @returns
100
+ */
101
+ static generateEdgeToOriginConfig(props: GenerateEdgeToOriginConfigOptions): string;
102
+ private _edgeToOriginFunction;
103
+ get edgeToOriginFunction(): lambda.Function | cf.experimental.EdgeFunction;
104
+ private _edgeToOriginLambdas;
105
+ get edgeToOriginLambdas(): cf.EdgeLambda[];
106
+ constructor(scope: Construct, id: string, props: MicroAppsEdgeToOriginProps);
107
+ }
108
+ //# sourceMappingURL=MicroAppsEdgeToOrigin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MicroAppsEdgeToOrigin.d.ts","sourceRoot":"","sources":["../src/MicroAppsEdgeToOrigin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAEjD,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;IAE9E;;OAEG;IACH,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAEvC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAElC;;;;;;;;OAQG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAE3C;;;;;;;;;OASG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAErC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAEnD;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,CAAC;IAC9C,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,SAAU,YAAW,sBAAsB;IACpF;;;;OAIG;WACW,0BAA0B,CAAC,KAAK,EAAE,iCAAiC;IAOjF,OAAO,CAAC,qBAAqB,CAAiD;IAC9E,IAAW,oBAAoB,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAEhF;IAED,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,IAAW,mBAAmB,IAAI,EAAE,CAAC,UAAU,EAAE,CAEhD;gBAEW,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B;CA4I5E"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MicroAppsEdgeToOrigin = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const fs_1 = require("fs");
7
+ const os = require("os");
8
+ const path = require("path");
9
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
10
+ const cf = require("aws-cdk-lib/aws-cloudfront");
11
+ const iam = require("aws-cdk-lib/aws-iam");
12
+ const lambda = require("aws-cdk-lib/aws-lambda");
13
+ const lambdaNodejs = require("aws-cdk-lib/aws-lambda-nodejs");
14
+ const logs = require("aws-cdk-lib/aws-logs");
15
+ const constructs_1 = require("constructs");
16
+ /**
17
+ * Create a new MicroApps Edge to Origin Function w/ `config.yml`
18
+ */
19
+ class MicroAppsEdgeToOrigin extends constructs_1.Construct {
20
+ constructor(scope, id, props) {
21
+ super(scope, id);
22
+ if (props === undefined) {
23
+ throw new Error('props must be set');
24
+ }
25
+ const { removalPolicy, assetNameRoot, assetNameSuffix, signingMode = 'sign', addXForwardedHostHeader = true, replaceHostHeader = true, originRegion, } = props;
26
+ // Create the edge function config file from the construct options
27
+ const edgeToOriginConfigYaml = MicroAppsEdgeToOrigin.generateEdgeToOriginConfig({
28
+ originRegion: originRegion || aws_cdk_lib_1.Aws.REGION,
29
+ addXForwardedHostHeader,
30
+ replaceHostHeader,
31
+ signingMode: signingMode === 'none' ? '' : signingMode,
32
+ });
33
+ //
34
+ // Create the Edge to Origin Function
35
+ //
36
+ const edgeToOriginFuncProps = {
37
+ functionName: assetNameRoot ? `${assetNameRoot}-edge-to-origin${assetNameSuffix}` : undefined,
38
+ memorySize: 1769,
39
+ logRetention: logs.RetentionDays.ONE_MONTH,
40
+ runtime: lambda.Runtime.NODEJS_14_X,
41
+ timeout: aws_cdk_lib_1.Duration.seconds(5),
42
+ initialPolicy: [
43
+ // This can't have a reference to the httpApi because it would mean
44
+ // the parent stack (this stack) has to be created before the us-east-1
45
+ // child stack for the Edge Lambda Function.
46
+ // That's why we use a tag-based policy to allow the Edge Function
47
+ // to invoke any API Gateway API that we apply a tag to
48
+ // We allow the edge function to sign for all regions since
49
+ // we may use custom closest region in the future.
50
+ new iam.PolicyStatement({
51
+ actions: ['execute-api:Invoke'],
52
+ resources: [`arn:aws:execute-api:*:${aws_cdk_lib_1.Aws.ACCOUNT_ID}:*/*/*/*`],
53
+ }),
54
+ ],
55
+ ...(removalPolicy ? { removalPolicy } : {}),
56
+ };
57
+ if (process.env.NODE_ENV === 'test' ||
58
+ fs_1.existsSync(path.join(__dirname, '..', '..', 'microapps-edge-to-origin', 'dist', 'index.js'))) {
59
+ // Emit the config file from the construct options
60
+ fs_1.writeFileSync(path.join(__dirname, '..', '..', 'microapps-edge-to-origin', 'dist', 'config.yml'), edgeToOriginConfigYaml);
61
+ // copyFileSync(
62
+ // path.join(__dirname, '..', '..', '..', 'configs', 'microapps-edge-to-origin', 'config.yml'),
63
+ // path.join(__dirname, '..', '..', 'microapps-edge-to-origin', 'dist', 'config.yml'),
64
+ // );
65
+ // This is for tests run under jest
66
+ // This is also for anytime when the edge function has already been bundled
67
+ this._edgeToOriginFunction = new cf.experimental.EdgeFunction(this, 'edge-to-apigwy-func', {
68
+ code: lambda.Code.fromAsset(path.join(__dirname, '..', '..', 'microapps-edge-to-origin', 'dist')),
69
+ handler: 'index.handler',
70
+ ...edgeToOriginFuncProps,
71
+ });
72
+ }
73
+ else if (fs_1.existsSync(path.join(__dirname, 'microapps-edge-to-origin', 'index.js'))) {
74
+ // Emit the config file from the construct options
75
+ fs_1.writeFileSync(path.join(__dirname, 'microapps-edge-to-origin', 'config.yml'), edgeToOriginConfigYaml);
76
+ // This is for built apps packaged with the CDK construct
77
+ this._edgeToOriginFunction = new cf.experimental.EdgeFunction(this, 'edge-to-apigwy-func', {
78
+ code: lambda.Code.fromAsset(path.join(__dirname, 'microapps-edge-to-origin')),
79
+ handler: 'index.handler',
80
+ ...edgeToOriginFuncProps,
81
+ });
82
+ }
83
+ else {
84
+ // Emit the config file from the construct options
85
+ fs_1.writeFileSync(path.join(__dirname, '..', '..', 'microapps-edge-to-origin', 'config.yml'), edgeToOriginConfigYaml);
86
+ // This builds the function for distribution with the CDK Construct
87
+ // and will be used during local builds and PR builds of microapps-core
88
+ // if the microapps-edge-to-origin function is not already bundled.
89
+ // This will fail to deploy in any region other than us-east-1
90
+ // We cannot use NodejsFunction because it will not create in us-east-1
91
+ this._edgeToOriginFunction = new lambdaNodejs.NodejsFunction(this, 'edge-to-apigwy-func', {
92
+ entry: path.join(__dirname, '..', '..', 'microapps-edge-to-origin', 'src', 'index.ts'),
93
+ handler: 'handler',
94
+ bundling: {
95
+ minify: true,
96
+ sourceMap: true,
97
+ commandHooks: {
98
+ beforeInstall: () => [],
99
+ beforeBundling: () => [],
100
+ afterBundling: (_inputDir, outputDir) => {
101
+ return [
102
+ `${os.platform() === 'win32' ? 'copy' : 'cp'} ${path.join(__dirname, '..', '..', '..', 'configs', 'microapps-edge-to-origin', 'config.yml')} ${outputDir}`,
103
+ ];
104
+ },
105
+ },
106
+ },
107
+ ...edgeToOriginFuncProps,
108
+ });
109
+ }
110
+ this._edgeToOriginLambdas = [
111
+ {
112
+ eventType: cf.LambdaEdgeEventType.ORIGIN_REQUEST,
113
+ functionVersion: this._edgeToOriginFunction.currentVersion,
114
+ includeBody: true,
115
+ },
116
+ ];
117
+ }
118
+ /**
119
+ * Generate the yaml config for the edge lambda
120
+ * @param props
121
+ * @returns
122
+ */
123
+ static generateEdgeToOriginConfig(props) {
124
+ return `originRegion: ${props.originRegion}
125
+ ${props.signingMode === '' ? '' : `signingMode: ${props.signingMode}`}
126
+ addXForwardedHostHeader: ${props.addXForwardedHostHeader}
127
+ replaceHostHeader: ${props.replaceHostHeader}`;
128
+ }
129
+ get edgeToOriginFunction() {
130
+ return this._edgeToOriginFunction;
131
+ }
132
+ get edgeToOriginLambdas() {
133
+ return this._edgeToOriginLambdas;
134
+ }
135
+ }
136
+ exports.MicroAppsEdgeToOrigin = MicroAppsEdgeToOrigin;
137
+ _a = JSII_RTTI_SYMBOL_1;
138
+ MicroAppsEdgeToOrigin[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroAppsEdgeToOrigin", version: "0.2.11" };
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzRWRnZVRvT3JpZ2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01pY3JvQXBwc0VkZ2VUb09yaWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJCQUErQztBQUMvQyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZDQUEyRDtBQUMzRCxpREFBaUQ7QUFDakQsMkNBQTJDO0FBQzNDLGlEQUFpRDtBQUNqRCw4REFBOEQ7QUFDOUQsNkNBQTZDO0FBQzdDLDJDQUF1QztBQW1HdkM7O0dBRUc7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBdUJsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWlDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0QztRQUVELE1BQU0sRUFDSixhQUFhLEVBQ2IsYUFBYSxFQUNiLGVBQWUsRUFDZixXQUFXLEdBQUcsTUFBTSxFQUNwQix1QkFBdUIsR0FBRyxJQUFJLEVBQzlCLGlCQUFpQixHQUFHLElBQUksRUFDeEIsWUFBWSxHQUNiLEdBQUcsS0FBSyxDQUFDO1FBRVYsa0VBQWtFO1FBQ2xFLE1BQU0sc0JBQXNCLEdBQUcscUJBQXFCLENBQUMsMEJBQTBCLENBQUM7WUFDOUUsWUFBWSxFQUFFLFlBQVksSUFBSSxpQkFBRyxDQUFDLE1BQU07WUFDeEMsdUJBQXVCO1lBQ3ZCLGlCQUFpQjtZQUNqQixXQUFXLEVBQUUsV0FBVyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXO1NBQ3ZELENBQUMsQ0FBQztRQUVILEVBQUU7UUFDRixxQ0FBcUM7UUFDckMsRUFBRTtRQUNGLE1BQU0scUJBQXFCLEdBQW1EO1lBQzVFLFlBQVksRUFBRSxhQUFhLENBQUMs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d0M7UUFDL0UsT0FBTyxpQkFBaUIsS0FBSyxDQUFDLFlBQVk7RUFDNUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxXQUFXLEVBQUU7MkJBQzFDLEtBQUssQ0FBQyx1QkFBdUI7cUJBQ25DLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFHRCxJQUFXLG9CQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBR0QsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQzs7QUFyQkgsc0RBbUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBBd3MsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2YgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZWpzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIE1pY3JvQXBwcyBFZGdlIHRvIE9yaWdpbiBGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNFZGdlVG9PcmlnaW4ge1xuICAvKipcbiAgICogVGhlIGVkZ2UgdG8gb3JpZ2luIGZ1bmN0aW9uIGZvciBBUEkgR2F0ZXdheSBSZXF1ZXN0IE9yaWdpbiBFZGdlIExhbWJkYVxuICAgKlxuICAgKiBUaGUgZ2VuZXJhdGVkIGBjb25maWcueW1sYCBpcyBpbmNsdWRlZCBpbiB0aGUgTGFtYmRhJ3MgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IGVkZ2VUb09yaWdpbkZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb24gfCBjZi5leHBlcmltZW50YWwuRWRnZUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9mIHRoZSBlZGdlIHRvIG9yaWdpbiBsYW1iZGEgZnVuY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBlZGdlVG9PcmlnaW5MYW1iZGFzOiBjZi5FZGdlTGFtYmRhW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIGBNaWNyb0FwcHNFZGdlVG9PcmlnaW5gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pY3JvQXBwc0VkZ2VUb09yaWdpblByb3BzIHtcbiAgLyoqXG4gICAqIFJlbW92YWxQb2xpY3kgb3ZlcnJpZGUgZm9yIGNoaWxkIHJlc291cmNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBlciByZXNvdXJjZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYXNzZXQgbmFtZSByb290XG4gICAqXG4gICAqIEBleGFtcGxlIG1pY3JvYXBwc1xuICAgKiBAZGVmYXVsdCAtIHJlc291cmNlIG5hbWVzIGF1dG8gYXNzaWduZWRcbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFzc2V0IG5hbWUgc3VmZml4XG4gICAqXG4gICAqIEBleGFtcGxlIC1kZXYtcHItMTJcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIFgtRm9yd2FyZGVkLUhvc3QtSGVhZGVyIHdoZW4gY2FsbGluZyBBUEkgR2F0ZXdheVxuICAgKlxuICAgKiBDYW4gb25seSBiZSB0cnVzdGVkIGlmIGBzaWduaW5nTW9kZWAgaXMgZW5hYmxlZCwgd2hpY2ggcmVzdHJpY3RzXG4gICAqIGFjY2VzcyB0byBBUEkgR2F0ZXdheSB0byBvbmx5IElBTSBzaWduZWQgcmVxdWVzdHMuXG4gICAqXG4gICAqIE5vdGU6IGlmIHRydWUsIGNyZWF0ZXMgT3JpZ2luUmVxdWVzdCBMYW1iZGEgQCBFZGdlIGZ1bmN0aW9uIGZvciBBUEkgR2F0ZXdheSBPcmlnaW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkWEZvcndhcmRlZEhvc3RIZWFkZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBIb3N0IGhlYWRlciAod2hpY2ggd2lsbCBiZSB0aGUgRWRnZSBkb21haW4gbmFtZSkgd2l0aCB0aGUgT3JpZ2luIGRvbWFpbiBuYW1lXG4gICAqIHdoZW4gZW5hYmxlZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gQVBJIEdhdGV3YXkgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWRcbiAgICogd2l0aCBhIGN1c3RvbSBkb21haW4gbmFtZSB0aGF0IG1hdGNoZXMgdGhlIGV4YWN0IGRvbWFpbiBuYW1lIHVzZWQgYnkgdGhlIENsb3VkRnJvbnRcbiAgICogRGlzdHJpYnV0aW9uIEFORCB3aGVuIHRoZSBPcmlnaW5SZXF1ZXN0UG9saWN5LkhlYWRlcnNCZWhhdmlvciBpcyBzZXRcbiAgICogdG8gcGFzcyBhbGwgaGVhZGVycyB0byB0aGUgb3JpZ2luLlxuICAgKlxuICAgKiBOb3RlOiBpZiB0cnVlLCBjcmVhdGVzIE9yaWdpblJlcXVlc3QgTGFtYmRhIEAgRWRnZSBmdW5jdGlvbiBmb3IgQVBJIEdhdGV3YXkgT3JpZ2luXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VIb3N0SGVhZGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVxdWlyZXMgSUFNIGF1dGggb24gdGhlIEFQSSBHYXRld2F5IG9yaWdpbiBpZiBub3Qgc2V0IHRvICdub25lJy5cbiAgICpcbiAgICogJ3NpZ24nIC0gVXNlcyByZXF1ZXN0IGhlYWRlcnMgZm9yIGF1dGguXG4gICAqICdwcmVzaWduJyAtIFVzZXMgcXVlcnkgc3RyaW5nIGZvciBhdXRoLlxuICAgKlxuICAgKiBJZiBlbmFibGVkLFxuICAgKlxuICAgKiBOb3RlOiBpZiAnc2lnbicgb3IgJ3ByZXNpZ24nLCBjcmVhdGVzIE9yaWdpblJlcXVlc3QgTGFtYmRhIEAgRWRnZSBmdW5jdGlvbiBmb3IgQVBJIEdhdGV3YXkgT3JpZ2luXG4gICAqIEBkZWZhdWx0ICdzaWduJ1xuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmluZ01vZGU/OiAnc2lnbicgfCAncHJlc2lnbicgfCAnbm9uZSc7XG5cbiAgLyoqXG4gICAqIE9yaWdpbiByZWdpb24gdGhhdCBBUEkgR2F0ZXdheSB3aWxsIGJlIGRlcGxveWVkIHRvLCB1c2VkXG4gICAqIGZvciB0aGUgY29uZmlnLnltbCBvbiB0aGUgRWRnZSBmdW5jdGlvbiB0byBzaWduIHJlcXVlc3RzIGZvclxuICAgKiB0aGUgY29ycmVjdCByZWdpb25cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5SZWdpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVFZGdlVG9PcmlnaW5Db25maWdPcHRpb25zIHtcbiAgcmVhZG9ubHkgb3JpZ2luUmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNpZ25pbmdNb2RlOiAnc2lnbicgfCAncHJlc2lnbicgfCAnJztcbiAgcmVhZG9ubHkgYWRkWEZvcndhcmRlZEhvc3RIZWFkZXI6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlcGxhY2VIb3N0SGVhZGVyOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBNaWNyb0FwcHMgRWRnZSB0byBPcmlnaW4gRnVuY3Rpb24gdy8gYGNvbmZpZy55bWxgXG4gKi9cbmV4cG9ydCBjbGFzcyBNaWNyb0FwcHNFZGdlVG9PcmlnaW4gZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJTWljcm9BcHBzRWRnZVRvT3JpZ2luIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRoZSB5YW1sIGNvbmZpZyBmb3IgdGhlIGVkZ2UgbGFtYmRhXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUVkZ2VUb09yaWdpbkNvbmZpZyhwcm9wczogR2VuZXJhdGVFZGdlVG9PcmlnaW5Db25maWdPcHRpb25zKSB7XG4gICAgcmV0dXJuIGBvcmlnaW5SZWdpb246ICR7cHJvcHMub3JpZ2luUmVnaW9ufVxuJHtwcm9wcy5zaWduaW5nTW9kZSA9PT0gJycgPyAnJyA6IGBzaWduaW5nTW9kZTogJHtwcm9wcy5zaWduaW5nTW9kZX1gfVxuYWRkWEZvcndhcmRlZEhvc3RIZWFkZXI6ICR7cHJvcHMuYWRkWEZvcndhcmRlZEhvc3RIZWFkZXJ9XG5yZXBsYWNlSG9zdEhlYWRlcjogJHtwcm9wcy5yZXBsYWNlSG9zdEhlYWRlcn1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWRnZVRvT3JpZ2luRnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbiB8IGNmLmV4cGVyaW1lbnRhbC5FZGdlRnVuY3Rpb247XG4gIHB1YmxpYyBnZXQgZWRnZVRvT3JpZ2luRnVuY3Rpb24oKTogbGFtYmRhLkZ1bmN0aW9uIHwgY2YuZXhwZXJpbWVudGFsLkVkZ2VGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkZ2VUb09yaWdpbkZ1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWRnZVRvT3JpZ2luTGFtYmRhczogY2YuRWRnZUxhbWJkYVtdO1xuICBwdWJsaWMgZ2V0IGVkZ2VUb09yaWdpbkxhbWJkYXMoKTogY2YuRWRnZUxhbWJkYVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZWRnZVRvT3JpZ2luTGFtYmRhcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNaWNyb0FwcHNFZGdlVG9PcmlnaW5Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wcyBtdXN0IGJlIHNldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHJlbW92YWxQb2xpY3ksXG4gICAgICBhc3NldE5hbWVSb290LFxuICAgICAgYXNzZXROYW1lU3VmZml4LFxuICAgICAgc2lnbmluZ01vZGUgPSAnc2lnbicsXG4gICAgICBhZGRYRm9yd2FyZGVkSG9zdEhlYWRlciA9IHRydWUsXG4gICAgICByZXBsYWNlSG9zdEhlYWRlciA9IHRydWUsXG4gICAgICBvcmlnaW5SZWdpb24sXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBlZGdlIGZ1bmN0aW9uIGNvbmZpZyBmaWxlIGZyb20gdGhlIGNvbnN0cnVjdCBvcHRpb25zXG4gICAgY29uc3QgZWRnZVRvT3JpZ2luQ29uZmlnWWFtbCA9IE1pY3JvQXBwc0VkZ2VUb09yaWdpbi5nZW5lcmF0ZUVkZ2VUb09yaWdpbkNvbmZpZyh7XG4gICAgICBvcmlnaW5SZWdpb246IG9yaWdpblJlZ2lvbiB8fCBBd3MuUkVHSU9OLFxuICAgICAgYWRkWEZvcndhcmRlZEhvc3RIZWFkZXIsXG4gICAgICByZXBsYWNlSG9zdEhlYWRlcixcbiAgICAgIHNpZ25pbmdNb2RlOiBzaWduaW5nTW9kZSA9PT0gJ25vbmUnID8gJycgOiBzaWduaW5nTW9kZSxcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy8gQ3JlYXRlIHRoZSBFZGdlIHRvIE9yaWdpbiBGdW5jdGlvblxuICAgIC8vXG4gICAgY29uc3QgZWRnZVRvT3JpZ2luRnVuY1Byb3BzOiBPbWl0PGxhbWJkYS5GdW5jdGlvblByb3BzLCAnaGFuZGxlcicgfCAnY29kZSc+ID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBhc3NldE5hbWVSb290ID8gYCR7YXNzZXROYW1lUm9vdH0tZWRnZS10by1vcmlnaW4ke2Fzc2V0TmFtZVN1ZmZpeH1gIDogdW5kZWZpbmVkLFxuICAgICAgbWVtb3J5U2l6ZTogMTc2OSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgIGluaXRpYWxQb2xpY3k6IFtcbiAgICAgICAgLy8gVGhpcyBjYW4ndCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBodHRwQXBpIGJlY2F1c2UgaXQgd291bGQgbWVhblxuICAgICAgICAvLyB0aGUgcGFyZW50IHN0YWNrICh0aGlzIHN0YWNrKSBoYXMgdG8gYmUgY3JlYXRlZCBiZWZvcmUgdGhlIHVzLWVhc3QtMVxuICAgICAgICAvLyBjaGlsZCBzdGFjayBmb3IgdGhlIEVkZ2UgTGFtYmRhIEZ1bmN0aW9uLlxuICAgICAgICAvLyBUaGF0J3Mgd2h5IHdlIHVzZSBhIHRhZy1iYXNlZCBwb2xpY3kgdG8gYWxsb3cgdGhlIEVkZ2UgRnVuY3Rpb25cbiAgICAgICAgLy8gdG8gaW52b2tlIGFueSBBUEkgR2F0ZXdheSBBUEkgdGhhdCB3ZSBhcHBseSBhIHRhZyB0b1xuICAgICAgICAvLyBXZSBhbGxvdyB0aGUgZWRnZSBmdW5jdGlvbiB0byBzaWduIGZvciBhbGwgcmVnaW9ucyBzaW5jZVxuICAgICAgICAvLyB3ZSBtYXkgdXNlIGN1c3RvbSBjbG9zZXN0IHJlZ2lvbiBpbiB0aGUgZnV0dXJlLlxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogWydleGVjdXRlLWFwaTpJbnZva2UnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpleGVjdXRlLWFwaToqOiR7QXdzLkFDQ09VTlRfSUR9OiovKi8qLypgXSxcbiAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBBUEkgR2F0ZXdheSBhY2Nlc3MgY2Fubm90IGJlIHJlc3RyaWN0ZWQgdXNpbmdcbiAgICAgICAgICAvLyB0YWdzIG9uIHRoZSB0YXJnZXQgcmVzb3VyY2VcbiAgICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvYWNjZXNzX3RhZ3MuaHRtbFxuICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfYXdzLXNlcnZpY2VzLXRoYXQtd29yay13aXRoLWlhbS5odG1sI25ldHdvcmtpbmdfc3Zjc1xuICAgICAgICAgIC8vIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAvLyAgIC8vIFRPRE86IFNldCB0aGlzIHRvIGEgc3RyaW5nIHVuaXF1ZSB0byBlYWNoIHN0YWNrXG4gICAgICAgICAgLy8gICBTdHJpbmdFcXVhbHM6IHsgJ2F3czpSZXNvdXJjZVRhZy9taWNyb2FwcC1tYW5hZ2VkJzogJ3RydWUnIH0sXG4gICAgICAgICAgLy8gfSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgLi4uKHJlbW92YWxQb2xpY3kgPyB7IHJlbW92YWxQb2xpY3kgfSA6IHt9KSxcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgfHxcbiAgICAgIGV4aXN0c1N5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1lZGdlLXRvLW9yaWdpbicsICdkaXN0JywgJ2luZGV4LmpzJykpXG4gICAgKSB7XG4gICAgICAvLyBFbWl0IHRoZSBjb25maWcgZmlsZSBmcm9tIHRoZSBjb25zdHJ1Y3Qgb3B0aW9uc1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1lZGdlLXRvLW9yaWdpbicsICdkaXN0JywgJ2NvbmZpZy55bWwnKSxcbiAgICAgICAgZWRnZVRvT3JpZ2luQ29uZmlnWWFtbCxcbiAgICAgICk7XG4gICAgICAvLyBjb3B5RmlsZVN5bmMoXG4gICAgICAvLyAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdjb25maWdzJywgJ21pY3JvYXBwcy1lZGdlLXRvLW9yaWdpbicsICdjb25maWcueW1sJyksXG4gICAgICAvLyAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdtaWNyb2FwcHMtZWRnZS10by1vcmlnaW4nLCAnZGlzdCcsICdjb25maWcueW1sJyksXG4gICAgICAvLyApO1xuICAgICAgLy8gVGhpcyBpcyBmb3IgdGVzdHMgcnVuIHVuZGVyIGplc3RcbiAgICAgIC8vIFRoaXMgaXMgYWxzbyBmb3IgYW55dGltZSB3aGVuIHRoZSBlZGdlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYnVuZGxlZFxuICAgICAgdGhpcy5fZWRnZVRvT3JpZ2luRnVuY3Rpb24gPSBuZXcgY2YuZXhwZXJpbWVudGFsLkVkZ2VGdW5jdGlvbih0aGlzLCAnZWRnZS10by1hcGlnd3ktZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdtaWNyb2FwcHMtZWRnZS10by1vcmlnaW4nLCAnZGlzdCcpLFxuICAgICAgICApLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLmVkZ2VUb09yaWdpbkZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWljcm9hcHBzLWVkZ2UtdG8tb3JpZ2luJywgJ2luZGV4LmpzJykpKSB7XG4gICAgICAvLyBFbWl0IHRoZSBjb25maWcgZmlsZSBmcm9tIHRoZSBjb25zdHJ1Y3Qgb3B0aW9uc1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJ21pY3JvYXBwcy1lZGdlLXRvLW9yaWdpbicsICdjb25maWcueW1sJyksXG4gICAgICAgIGVkZ2VUb09yaWdpbkNvbmZpZ1lhbWwsXG4gICAgICApO1xuXG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIHRoaXMuX2VkZ2VUb09yaWdpbkZ1bmN0aW9uID0gbmV3IGNmLmV4cGVyaW1lbnRhbC5FZGdlRnVuY3Rpb24odGhpcywgJ2VkZ2UtdG8tYXBpZ3d5LWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnbWljcm9hcHBzLWVkZ2UtdG8tb3JpZ2luJykpLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLmVkZ2VUb09yaWdpbkZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbWl0IHRoZSBjb25maWcgZmlsZSBmcm9tIHRoZSBjb25zdHJ1Y3Qgb3B0aW9uc1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ21pY3JvYXBwcy1lZGdlLXRvLW9yaWdpbicsICdjb25maWcueW1sJyksXG4gICAgICAgIGVkZ2VUb09yaWdpbkNvbmZpZ1lhbWwsXG4gICAgICApO1xuXG4gICAgICAvLyBUaGlzIGJ1aWxkcyB0aGUgZnVuY3Rpb24gZm9yIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSBDREsgQ29uc3RydWN0XG4gICAgICAvLyBhbmQgd2lsbCBiZSB1c2VkIGR1cmluZyBsb2NhbCBidWlsZHMgYW5kIFBSIGJ1aWxkcyBvZiBtaWNyb2FwcHMtY29yZVxuICAgICAgLy8gaWYgdGhlIG1pY3JvYXBwcy1lZGdlLXRvLW9yaWdpbiBmdW5jdGlvbiBpcyBub3QgYWxyZWFkeSBidW5kbGVkLlxuICAgICAgLy8gVGhpcyB3aWxsIGZhaWwgdG8gZGVwbG95IGluIGFueSByZWdpb24gb3RoZXIgdGhhbiB1cy1lYXN0LTFcbiAgICAgIC8vIFdlIGNhbm5vdCB1c2UgTm9kZWpzRnVuY3Rpb24gYmVjYXVzZSBpdCB3aWxsIG5vdCBjcmVhdGUgaW4gdXMtZWFzdC0xXG4gICAgICB0aGlzLl9lZGdlVG9PcmlnaW5GdW5jdGlvbiA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ2VkZ2UtdG8tYXBpZ3d5LWZ1bmMnLCB7XG4gICAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnbWljcm9hcHBzLWVkZ2UtdG8tb3JpZ2luJywgJ3NyYycsICdpbmRleC50cycpLFxuICAgICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgbWluaWZ5OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgICBjb21tYW5kSG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZUluc3RhbGw6ICgpID0+IFtdLFxuICAgICAgICAgICAgYmVmb3JlQnVuZGxpbmc6ICgpID0+IFtdLFxuICAgICAgICAgICAgYWZ0ZXJCdW5kbGluZzogKF9pbnB1dERpcjogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGAke29zLnBsYXRmb3JtKCkgPT09ICd3aW4zMicgPyAnY29weScgOiAnY3AnfSAke3BhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgICAgICAgICAgICcuLicsXG4gICAgICAgICAgICAgICAgICAnLi4nLFxuICAgICAgICAgICAgICAgICAgJy4uJyxcbiAgICAgICAgICAgICAgICAgICdjb25maWdzJyxcbiAgICAgICAgICAgICAgICAgICdtaWNyb2FwcHMtZWRnZS10by1vcmlnaW4nLFxuICAgICAgICAgICAgICAgICAgJ2NvbmZpZy55bWwnLFxuICAgICAgICAgICAgICAgICl9ICR7b3V0cHV0RGlyfWAsXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVkZ2VUb09yaWdpbkZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2VkZ2VUb09yaWdpbkxhbWJkYXMgPSBbXG4gICAgICB7XG4gICAgICAgIGV2ZW50VHlwZTogY2YuTGFtYmRhRWRnZUV2ZW50VHlwZS5PUklHSU5fUkVRVUVTVCxcbiAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiB0aGlzLl9lZGdlVG9PcmlnaW5GdW5jdGlvbi5jdXJyZW50VmVyc2lvbixcbiAgICAgICAgaW5jbHVkZUJvZHk6IHRydWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbn1cbiJdfQ==