aws-cdk 2.19.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +59 -11
  2. package/build-info.json +2 -2
  3. package/does-not-exist.json +1 -1
  4. package/lib/api/bootstrap/bootstrap-template.yaml +3 -1
  5. package/lib/api/cloudformation-deployments.d.ts +12 -1
  6. package/lib/api/cloudformation-deployments.js +31 -8
  7. package/lib/api/deploy-stack.d.ts +24 -0
  8. package/lib/api/deploy-stack.js +35 -8
  9. package/lib/api/evaluate-cloudformation-template.js +3 -2
  10. package/lib/api/hotswap/common.js +2 -2
  11. package/lib/api/util/cloudformation/stack-activity-monitor.js +7 -6
  12. package/lib/api/util/cloudformation/stack-status.js +2 -2
  13. package/lib/api/util/cloudformation.d.ts +3 -0
  14. package/lib/api/util/cloudformation.js +1 -1
  15. package/lib/api/util/display.d.ts +2 -0
  16. package/lib/api/util/display.js +15 -2
  17. package/lib/cdk-toolkit.d.ts +44 -21
  18. package/lib/cdk-toolkit.js +68 -1
  19. package/lib/cli.js +46 -3
  20. package/lib/commands/doctor.js +2 -2
  21. package/lib/import.d.ts +151 -0
  22. package/lib/import.js +245 -0
  23. package/lib/index.js +2296 -815
  24. package/lib/settings.js +3 -2
  25. package/lib/util/asset-publishing.d.ts +7 -1
  26. package/lib/util/asset-publishing.js +13 -6
  27. package/lib/version.js +2 -2
  28. package/package.json +10 -10
  29. package/test/api/hotswap/state-machine-hotswap-deployments.test.js +75 -1
  30. package/test/api/util/display.test.d.ts +1 -0
  31. package/test/api/util/display.test.js +34 -0
  32. package/test/bockfs.js +2 -2
  33. package/test/cdk-toolkit.test.js +4 -2
  34. package/test/import.test.d.ts +1 -0
  35. package/test/import.test.js +189 -0
  36. package/test/integ/cli/app/app.js +25 -0
  37. package/test/integ/cli/app/docker/Dockerfile +1 -1
  38. package/test/integ/cli/app/docker/Dockerfile.Custom +1 -1
  39. package/test/integ/cli/cli.integtest.js +33 -1
  40. package/test/integ/cli-regression-patches/v1.64.0/cdk-helpers.js +1 -1
  41. package/test/integ/cli-regression-patches/v1.64.1/cdk-helpers.js +1 -1
  42. package/test/integ/cli-regression-patches/v1.67.0/cdk-helpers.js +1 -1
  43. package/test/integ/helpers/cdk.js +4 -5
  44. package/test/integ/helpers/test-helpers.js +1 -3
  45. package/test/settings.test.js +10 -1
  46. package/test/util/mock-sdk.d.ts +2 -0
  47. package/test/util/mock-sdk.js +8 -2
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.destroyStack = exports.deployStack = void 0;
3
+ exports.destroyStack = exports.makeBodyParameterAndUpload = exports.deployStack = void 0;
4
4
  const cxapi = require("@aws-cdk/cx-api");
5
5
  const chalk = require("chalk");
6
+ const fs = require("fs-extra");
6
7
  const uuid = require("uuid");
7
8
  const assets_1 = require("../assets");
8
9
  const logging_1 = require("../logging");
@@ -61,7 +62,7 @@ async function deployStack(options) {
61
62
  else {
62
63
  logging_1.debug(`${deployName}: deploying...`);
63
64
  }
64
- const bodyParameter = await makeBodyParameter(stackArtifact, options.resolvedEnvironment, legacyAssets, options.toolkitInfo, options.sdk);
65
+ const bodyParameter = await makeBodyParameter(stackArtifact, options.resolvedEnvironment, legacyAssets, options.toolkitInfo, options.sdk, options.overrideTemplate);
65
66
  await asset_publishing_1.publishAssets(legacyAssets.toManifest(stackArtifact.assembly.directory), options.sdkProvider, stackEnv);
66
67
  if (options.hotswap) {
67
68
  // attempt to short-circuit the deployment if possible
@@ -107,7 +108,8 @@ async function prepareAndExecuteChangeSet(options, cloudFormationStack, stackArt
107
108
  const changeSet = await cfn.createChangeSet({
108
109
  StackName: deployName,
109
110
  ChangeSetName: changeSetName,
110
- ChangeSetType: update ? 'UPDATE' : 'CREATE',
111
+ ChangeSetType: options.resourcesToImport ? 'IMPORT' : update ? 'UPDATE' : 'CREATE',
112
+ ResourcesToImport: options.resourcesToImport,
111
113
  Description: `CDK Changeset for execution ${executionId}`,
112
114
  TemplateBody: bodyParameter.TemplateBody,
113
115
  TemplateURL: bodyParameter.TemplateURL,
@@ -185,13 +187,13 @@ async function prepareAndExecuteChangeSet(options, cloudFormationStack, stackArt
185
187
  * @param stack the synthesized stack that provides the CloudFormation template
186
188
  * @param toolkitInfo information about the toolkit stack
187
189
  */
188
- async function makeBodyParameter(stack, resolvedEnvironment, assetManifest, toolkitInfo, sdk) {
190
+ async function makeBodyParameter(stack, resolvedEnvironment, assetManifest, toolkitInfo, sdk, overrideTemplate) {
189
191
  // If the template has already been uploaded to S3, just use it from there.
190
- if (stack.stackTemplateAssetObjectUrl) {
192
+ if (stack.stackTemplateAssetObjectUrl && !overrideTemplate) {
191
193
  return { TemplateURL: restUrlFromManifest(stack.stackTemplateAssetObjectUrl, resolvedEnvironment, sdk) };
192
194
  }
193
195
  // Otherwise, pass via API call (if small) or upload here (if large)
194
- const templateJson = serialize_1.toYAML(stack.template);
196
+ const templateJson = serialize_1.toYAML(overrideTemplate !== null && overrideTemplate !== void 0 ? overrideTemplate : stack.template);
195
197
  if (templateJson.length <= LARGE_TEMPLATE_SIZE_KB * 1024) {
196
198
  return { TemplateBody: templateJson };
197
199
  }
@@ -203,8 +205,14 @@ async function makeBodyParameter(stack, resolvedEnvironment, assetManifest, tool
203
205
  }
204
206
  const templateHash = content_hash_1.contentHash(templateJson);
205
207
  const key = `cdk/${stack.id}/${templateHash}.yml`;
208
+ let templateFile = stack.templateFile;
209
+ if (overrideTemplate) {
210
+ // Add a variant of this template
211
+ templateFile = `${stack.templateFile}-${templateHash}.yaml`;
212
+ await fs.writeFile(templateFile, templateJson, { encoding: 'utf-8' });
213
+ }
206
214
  assetManifest.addFileAsset(templateHash, {
207
- path: stack.templateFile,
215
+ path: templateFile,
208
216
  }, {
209
217
  bucketName: toolkitInfo.bucketName,
210
218
  objectKey: key,
@@ -213,6 +221,25 @@ async function makeBodyParameter(stack, resolvedEnvironment, assetManifest, tool
213
221
  logging_1.debug('Storing template in S3 at:', templateURL);
214
222
  return { TemplateURL: templateURL };
215
223
  }
224
+ /**
225
+ * Prepare a body parameter for CFN, performing the upload
226
+ *
227
+ * Return it as-is if it is small enough to pass in the API call,
228
+ * upload to S3 and return the coordinates if it is not.
229
+ */
230
+ async function makeBodyParameterAndUpload(stack, resolvedEnvironment, toolkitInfo, sdkProvider, sdk, overrideTemplate) {
231
+ // We don't have access to the actual asset manifest here, so pretend that the
232
+ // stack doesn't have a pre-published URL.
233
+ const forceUploadStack = Object.create(stack, {
234
+ stackTemplateAssetObjectUrl: { value: undefined },
235
+ });
236
+ const builder = new asset_manifest_builder_1.AssetManifestBuilder();
237
+ const bodyparam = await makeBodyParameter(forceUploadStack, resolvedEnvironment, builder, toolkitInfo, sdk, overrideTemplate);
238
+ const manifest = builder.toManifest(stack.assembly.directory);
239
+ await asset_publishing_1.publishAssets(manifest, sdkProvider, resolvedEnvironment, { quiet: true });
240
+ return bodyparam;
241
+ }
242
+ exports.makeBodyParameterAndUpload = makeBodyParameterAndUpload;
216
243
  async function destroyStack(options) {
217
244
  const deployName = options.deployName || options.stack.stackName;
218
245
  const cfn = options.sdk.cloudFormation();
@@ -342,4 +369,4 @@ function restUrlFromManifest(url, environment, sdk) {
342
369
  const urlSuffix = sdk.getEndpointSuffix(environment.region);
343
370
  return `https://s3.${environment.region}.${urlSuffix}/${bucketName}/${objectKey}`;
344
371
  }
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF5QztBQUN6QywrQkFBK0I7QUFDL0IsNkJBQTZCO0FBQzdCLHNDQUF3RDtBQUV4RCx3Q0FBaUQ7QUFDakQsNENBQXNDO0FBQ3RDLDJFQUFzRTtBQUN0RSwrREFBeUQ7QUFDekQsdURBQW1EO0FBRW5ELHlGQUE0RTtBQUM1RSwrREFBNkQ7QUFDN0QsNkNBQXdDO0FBRXhDLDBEQUcrQjtBQUMvQix5RkFBMkc7QUE4SzNHLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBRTNCLEtBQUssVUFBVSxXQUFXLENBQUMsT0FBMkI7SUFDM0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUVwQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFFN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDakUsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLG9DQUFtQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFNUUsSUFBSSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUU7UUFDckQsZUFBSyxDQUFDLHdCQUF3QixVQUFVLHNGQUFzRixDQUFDLENBQUM7UUFDaEksTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxtQ0FBa0Is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TSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxLQUFLLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztLQUFFO0lBRTNCLHdHQUF3RztJQUN4Ryw0RUFBNEU7SUFDNUUsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUzQixNQUFNLFNBQVMsR0FBVyxHQUFHLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sY0FBYyxXQUFXLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxVQUFVLElBQUksU0FBUyxFQUFFLENBQUM7QUFDcEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0IH0gZnJvbSAnLi4vYXNzZXRzJztcbmltcG9ydCB7IFRhZyB9IGZyb20gJy4uL2Nkay10b29sa2l0JztcbmltcG9ydCB7IGRlYnVnLCBlcnJvciwgcHJpbnQgfSBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IHRvWUFNTCB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBBc3NldE1hbmlmZXN0QnVpbGRlciB9IGZyb20gJy4uL3V0aWwvYXNzZXQtbWFuaWZlc3QtYnVpbGRlcic7XG5pbXBvcnQgeyBwdWJsaXNoQXNzZXRzIH0gZnJvbSAnLi4vdXRpbC9hc3NldC1wdWJsaXNoaW5nJztcbmltcG9ydCB7IGNvbnRlbnRIYXNoIH0gZnJvbSAnLi4vdXRpbC9jb250ZW50LWhhc2gnO1xuaW1wb3J0IHsgSVNESywgU2RrUHJvdmlkZXIgfSBmcm9tICcuL2F3cy1hdXRoJztcbmltcG9ydCB7IENmbkV2YWx1YXRpb25FeGNlcHRpb24gfSBmcm9tICcuL2V2YWx1YXRlLWNsb3VkZm9ybWF0aW9uLXRlbXBsYXRlJztcbmltcG9ydCB7IHRyeUhvdHN3YXBEZXBsb3ltZW50IH0gZnJvbSAnLi9ob3Rzd2FwLWRlcGxveW1lbnRzJztcbmltcG9ydCB7IElDT04gfSBmcm9tICcuL2hvdHN3YXAvY29tbW9uJztcbmltcG9ydCB7IFRvb2xraXRJbmZvIH0gZnJvbSAnLi90b29sa2l0LWluZm8nO1xuaW1wb3J0IHtcbiAgY2hhbmdlU2V0SGFzTm9DaGFuZ2VzLCBDbG91ZEZvcm1hdGlvblN0YWNrLCBUZW1wbGF0ZVBhcmFtZXRlcnMsIHdhaXRGb3JDaGFuZ2VTZXQsXG4gIHdhaXRGb3JTdGFja0RlcGxveSwgd2FpdEZvclN0YWNrRGVsZXRlLCBQYXJhbWV0ZXJWYWx1ZXMsIFBhcmFtZXRlckNoYW5nZXMsXG59IGZyb20gJy4vdXRpbC9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5TW9uaXRvciwgU3RhY2tBY3Rpdml0eVByb2dyZXNzIH0gZnJvbSAnLi91dGlsL2Nsb3VkZm9ybWF0aW9uL3N0YWNrLWFjdGl2aXR5LW1vbml0b3InO1xuXG50eXBlIFRlbXBsYXRlQm9keVBhcmFtZXRlciA9IHtcbiAgVGVtcGxhdGVCb2R5Pzogc3RyaW5nXG4gIFRlbXBsYXRlVVJMPzogc3RyaW5nXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWNrUmVzdWx0IHtcbiAgcmVhZG9ubHkgbm9PcDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3V0cHV0czogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHJlYWRvbmx5IHN0YWNrQXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBiZSBkZXBsb3llZFxuICAgKi9cbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHRvIGRlcGxveSB0aGlzIHN0YWNrIGluXG4gICAqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvbiB0aGUgc3RhY2sgYXJ0aWZhY3QgbWF5IGJlIHVucmVzb2x2ZWQsIHRoaXMgb25lXG4gICAqIG11c3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZXNvbHZlZEVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogVGhlIFNESyB0byB1c2UgZm9yIGRlcGxveWluZyB0aGUgc3RhY2tcbiAgICpcbiAgICogU2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSBjb3JyZWN0IHJvbGUgd2l0aCB3aGljaFxuICAgKiBzdGFjayBvcGVyYXRpb25zIHNob3VsZCBiZSBwZXJmb3JtZWQuXG4gICAqL1xuICBzZGs6IElTREs7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciAoc2VlZGVkIHdpdGggZGVmYXVsdCBjcmVkZW50aWFscylcbiAgICpcbiAgICogV2lsbCBleGNsdXNpdmVseSBiZSB1c2VkIHRvIGFzc3VtZSBwdWJsaXNoaW5nIGNyZWRlbnRpYWxzICh3aGljaCBtdXN0XG4gICAqIHN0YXJ0IG91dCBmcm9tIGN1cnJlbnQgY3JlZGVudGlhbHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlJ3ZlIGFzc3VtZWQgYW5cbiAgICogYWN0aW9uIHJvbGUgdG8gdG91Y2ggdGhlIHN0YWNrIG9yIG5vdCkuXG4gICAqXG4gICAqIFVzZWQgZm9yIHRoZSBmb2xsb3dpbmcgcHVycG9zZXM6XG4gICAqXG4gICAqIC0gUHVibGlzaCBsZWdhY3kgYXNzZXRzLlxuICAgKiAtIFVwbG9hZCBsYXJnZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMgdG8gdGhlIHN0YWdpbmcgYnVja2V0LlxuICAgKi9cbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYm9vdHN0cmFwIHN0YWNrIGZvdW5kIGluIHRoZSB0YXJnZXQgZW52aXJvbm1lbnRcbiAgICovXG4gIHRvb2xraXRJbmZvOiBUb29sa2l0SW5mbztcblxuICAvKipcbiAgICogUm9sZSB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIGV4ZWN1dGUgdGhlIGNoYW5nZSBzZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBSb2xlIHNwZWNpZmllZCBvbiBzdGFjaywgb3RoZXJ3aXNlIGN1cnJlbnRcbiAgICovXG4gIHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5vdGlmaWNhdGlvbiBBUk5zIHRvIHBhc3MgdG8gQ2xvdWRGb3JtYXRpb24gdG8gbm90aWZ5IHdoZW4gdGhlIGNoYW5nZSBzZXQgaGFzIGNvbXBsZXRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG5vdGlmaWNhdGlvbnNcbiAgICovXG4gIG5vdGlmaWNhdGlvbkFybnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTmFtZSB0byBkZXBsb3kgdGhlIHN0YWNrIHVuZGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTmFtZSBmcm9tIGFzc2VtYmx5XG4gICAqL1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBRdWlldCBvciB2ZXJib3NlIGRlcGxveW1lbnRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHF1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBhc3NldCBJRHMgd2hpY2ggc2hvdWxkbid0IGJlIGJ1aWx0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGFncyB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIGFkZCB0byBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHRhZ3M/OiBUYWdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBleGVjdXRlIHRoZSBjaGFuZ2VzZXQgb3IgbGVhdmUgaXQgaW4gcmV2aWV3LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBleGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbmFtZSB0byB1c2UgZm9yIHRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2Ugc2V0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgY2hhbmdlU2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbGxlY3Rpb24gb2YgZXh0cmEgcGFyYW1ldGVyc1xuICAgKiAoaW4gYWRkaXRpb24gdG8gdGhvc2UgdXNlZCBmb3IgYXNzZXRzKVxuICAgKiB0byBwYXNzIHRvIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZS5cbiAgICogTm90ZSB0aGF0IHBhcmFtZXRlcnMgd2l0aCBgdW5kZWZpbmVkYCBvciBlbXB0eSB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLFxuICAgKiBhbmQgbm90IHBhc3NlZCB0byB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZVxuICAgKi9cbiAgcGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gIC8qKlxuICAgKiBVc2UgcHJldmlvdXMgdmFsdWVzIGZvciB1bnNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIElmIG5vdCBzZXQsIGFsbCBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIGZvciBldmVyeSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGxheSBtb2RlIGZvciBzdGFjayBkZXBsb3ltZW50IHByb2dyZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQmFyIHN0YWNrIGV2ZW50cyB3aWxsIGJlIGRpc3BsYXllZCBmb3JcbiAgICogICB0aGUgcmVzb3VyY2UgY3VycmVudGx5IGJlaW5nIGRlcGxveWVkLlxuICAgKi9cbiAgcHJvZ3Jlc3M/OiBTdGFja0FjdGl2aXR5UHJvZ3Jlc3M7XG5cbiAgLyoqXG4gICAqIERlcGxveSBldmVuIGlmIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZSBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gZGVwbG95LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIGFyZSBvbiBhIENJIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSb2xsYmFjayBmYWlsZWQgZGVwbG95bWVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qXG4gICAqIFdoZXRoZXIgdG8gcGVyZm9ybSBhICdob3Rzd2FwJyBkZXBsb3ltZW50LlxuICAgKiBBICdob3Rzd2FwJyBkZXBsb3ltZW50IHdpbGwgYXR0ZW1wdCB0byBzaG9ydC1jaXJjdWl0IENsb3VkRm9ybWF0aW9uXG4gICAqIGFuZCB1cGRhdGUgdGhlIGFmZmVjdGVkIHJlc291cmNlcyBsaWtlIExhbWJkYSBmdW5jdGlvbnMgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2UgZm9yIHJlZ3VsYXIgZGVwbG95bWVudHMsIHRydWUgZm9yICd3YXRjaCcgZGVwbG95bWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmEgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXIgd2hlbiBwZXJmb3JtaW5nIEFXUyBTREsgY2FsbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90aGluZyBleHRyYSBpcyBhcHBlbmRlZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhVXNlckFnZW50Pzogc3RyaW5nO1xufVxuXG5jb25zdCBMQVJHRV9URU1QTEFURV9TSVpFX0tCID0gNTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXBsb3lTdGFjayhvcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMpOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gIGNvbnN0IHN0YWNrQXJ0aWZhY3QgPSBvcHRpb25zLnN0YWNrO1xuXG4gIGNvbnN0IHN0YWNrRW52ID0gb3B0aW9ucy5yZXNvbHZlZEVudmlyb25tZW50O1xuXG4gIG9wdGlvbnMuc2RrLmFwcGVuZEN1c3RvbVVzZXJBZ2VudChvcHRpb25zLmV4dHJhVXNlckFnZW50KTtcbiAgY29uc3QgY2ZuID0gb3B0aW9ucy5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuZGVwbG95TmFtZSB8fCBzdGFja0FydGlmYWN0LnN0YWNrTmFtZTtcbiAgbGV0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuXG4gIGlmIChjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLmlzQ3JlYXRpb25GYWlsdXJlKSB7XG4gICAgZGVidWcoYEZvdW5kIGV4aXN0aW5nIHN0YWNrICR7ZGVwbG95TmFtZX0gdGhhdCBoYWQgcHJldmlvdXNseSBmYWlsZWQgY3JlYXRpb24uIERlbGV0aW5nIGl0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlLWNyZWF0ZSBpdC5gKTtcbiAgICBhd2FpdCBjZm4uZGVsZXRlU3RhY2soeyBTdGFja05hbWU6IGRlcGxveU5hbWUgfSkucHJvbWlzZSgpO1xuICAgIGNvbnN0IGRlbGV0ZWRTdGFjayA9IGF3YWl0IHdhaXRGb3JTdGFja0RlbGV0ZShjZm4sIGRlcGxveU5hbWUpO1xuICAgIGlmIChkZWxldGVkU3RhY2sgJiYgZGVsZXRlZFN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdERUxFVEVfQ09NUExFVEUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCBkZWxldGluZyBzdGFjayAke2RlcGxveU5hbWV9IHRoYXQgaGFkIHByZXZpb3VzbHkgZmFpbGVkIGNyZWF0aW9uIChjdXJyZW50IHN0YXRlOiAke2RlbGV0ZWRTdGFjay5zdGFja1N0YXR1c30pYCk7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB0byBtYXJrIHRoYXQgdGhlIHN0YWNrIGRvZXMgbm90IGV4aXN0IGFueW1vcmUsIGJ1dCBhdm9pZFxuICAgIC8vIGRvaW5nIGFuIGFjdHVhbCBsb29rdXAgaW4gQ2xvdWRGb3JtYXRpb24gKHdoaWNoIHdvdWxkIGJlIHNpbGx5IHRvIGRvIGlmXG4gICAgLy8gd2UganVzdCBkZWxldGVkIGl0KS5cbiAgICBjbG91ZEZvcm1hdGlvblN0YWNrID0gQ2xvdWRGb3JtYXRpb25TdGFjay5kb2VzTm90RXhpc3QoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgfVxuXG4gIC8vIERldGVjdCBcImxlZ2FjeVwiIGFzc2V0cyAod2hpY2ggcmVtYWluIGluIHRoZSBtZXRhZGF0YSkgYW5kIHB1Ymxpc2ggdGhlbSB2aWFcbiAgLy8gYW4gYWQtaG9jIGFzc2V0IG1hbmlmZXN0LCB3aGlsZSBwYXNzaW5nIHRoZWlyIGxvY2F0aW9ucyB2aWEgdGVtcGxhdGVcbiAgLy8gcGFyYW1ldGVycy5cbiAgY29uc3QgbGVnYWN5QXNzZXRzID0gbmV3IEFzc2V0TWFuaWZlc3RCdWlsZGVyKCk7XG4gIGNvbnN0IGFzc2V0UGFyYW1zID0gYXdhaXQgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0KHN0YWNrQXJ0aWZhY3QsIGxlZ2FjeUFzc2V0cywgb3B0aW9ucy50b29sa2l0SW5mbywgb3B0aW9ucy5yZXVzZUFzc2V0cyk7XG5cbiAgY29uc3QgZmluYWxQYXJhbWV0ZXJWYWx1ZXMgPSB7IC4uLm9wdGlvbnMucGFyYW1ldGVycywgLi4uYXNzZXRQYXJhbXMgfTtcblxuICBjb25zdCB0ZW1wbGF0ZVBhcmFtcyA9IFRlbXBsYXRlUGFyYW1ldGVycy5mcm9tVGVtcGxhdGUoc3RhY2tBcnRpZmFjdC50ZW1wbGF0ZSk7XG4gIGNvbnN0IHN0YWNrUGFyYW1zID0gb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnNcbiAgICA/IHRlbXBsYXRlUGFyYW1zLnVwZGF0ZUV4aXN0aW5nKGZpbmFsUGFyYW1ldGVyVmFsdWVzLCBjbG91ZEZvcm1hdGlvblN0YWNrLnBhcmFtZXRlcnMpXG4gICAgOiB0ZW1wbGF0ZVBhcmFtcy5zdXBwbHlBbGwoZmluYWxQYXJhbWV0ZXJWYWx1ZXMpO1xuXG4gIGlmIChhd2FpdCBjYW5Ta2lwRGVwbG95KG9wdGlvbnMsIGNsb3VkRm9ybWF0aW9uU3RhY2ssIHN0YWNrUGFyYW1zLmhhc0NoYW5nZXMoY2xvdWRGb3JtYXRpb25TdGFjay5wYXJhbWV0ZXJzKSkpIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogc2tpcHBpbmcgZGVwbG95bWVudCAodXNlIC0tZm9yY2UgdG8gb3ZlcnJpZGUpYCk7XG4gICAgLy8gaWYgd2UgY2FuIHNraXAgZGVwbG95bWVudCBhbmQgd2UgYXJlIHBlcmZvcm1pbmcgYSBob3Rzd2FwLCBsZXQgdGhlIHVzZXIga25vd1xuICAgIC8vIHRoYXQgbm8gaG90c3dhcCBkZXBsb3ltZW50IGhhcHBlbmVkXG4gICAgaWYgKG9wdGlvbnMuaG90c3dhcCkge1xuICAgICAgcHJpbnQoYFxcbiAke0lDT059ICVzXFxuYCwgY2hhbGsuYm9sZCgnaG90c3dhcCBkZXBsb3ltZW50IHNraXBwZWQgLSBubyBjaGFuZ2VzIHdlcmUgZGV0ZWN0ZWQgKHVzZSAtLWZvcmNlIHRvIG92ZXJyaWRlKScpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vT3A6IHRydWUsXG4gICAgICBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IGRlcGxveWluZy4uLmApO1xuICB9XG5cbiAgY29uc3QgYm9keVBhcmFtZXRlciA9IGF3YWl0IG1ha2VCb2R5UGFyYW1ldGVyKHN0YWNrQXJ0aWZhY3QsIG9wdGlvbnMucmVzb2x2ZWRFbnZpcm9ubWVudCwgbGVnYWN5QXNzZXRzLCBvcHRpb25zLnRvb2xraXRJbmZvLCBvcHRpb25zLnNkayk7XG4gIGF3YWl0IHB1Ymxpc2hBc3NldHMobGVnYWN5QXNzZXRzLnRvTWFuaWZlc3Qoc3RhY2tBcnRpZmFjdC5hc3NlbWJseS5kaXJlY3RvcnkpLCBvcHRpb25zLnNka1Byb3ZpZGVyLCBzdGFja0Vudik7XG5cbiAgaWYgKG9wdGlvbnMuaG90c3dhcCkge1xuICAgIC8vIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCB0aGUgZGVwbG95bWVudCBpZiBwb3NzaWJsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3Rzd2FwRGVwbG95bWVudFJlc3VsdCA9IGF3YWl0IHRyeUhvdHN3YXBEZXBsb3ltZW50KG9wdGlvbnMuc2RrUHJvdmlkZXIsIGFzc2V0UGFyYW1zLCBjbG91ZEZvcm1hdGlvblN0YWNrLCBzdGFja0FydGlmYWN0KTtcbiAgICAgIGlmIChob3Rzd2FwRGVwbG95bWVudFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gaG90c3dhcERlcGxveW1lbnRSZXN1bHQ7XG4gICAgICB9XG4gICAgICBwcmludCgnQ291bGQgbm90IHBlcmZvcm0gYSBob3Rzd2FwIGRlcGxveW1lbnQsIGFzIHRoZSBzdGFjayAlcyBjb250YWlucyBub24tQXNzZXQgY2hhbmdlcycsIHN0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBwZXJmb3JtIGEgaG90c3dhcCBkZXBsb3ltZW50LCBiZWNhdXNlIHRoZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQ6ICVzJywgZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgcHJpbnQoJ0ZhbGxpbmcgYmFjayB0byBkb2luZyBhIGZ1bGwgZGVwbG95bWVudCcpO1xuICB9XG5cbiAgLy8gY291bGQgbm90IHNob3J0LWNpcmN1aXQgdGhlIGRlcGxveW1lbnQsIHBlcmZvcm0gYSBmdWxsIENGTiBkZXBsb3kgaW5zdGVhZFxuICByZXR1cm4gcHJlcGFyZUFuZEV4ZWN1dGVDaGFuZ2VTZXQob3B0aW9ucywgY2xvdWRGb3JtYXRpb25TdGFjaywgc3RhY2tBcnRpZmFjdCwgc3RhY2tQYXJhbXMsIGJvZHlQYXJhbWV0ZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlQW5kRXhlY3V0ZUNoYW5nZVNldChcbiAgb3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zLCBjbG91ZEZvcm1hdGlvblN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIHN0YWNrUGFyYW1zOiBQYXJhbWV0ZXJWYWx1ZXMsIGJvZHlQYXJhbWV0ZXI6IFRlbXBsYXRlQm9keVBhcmFtZXRlcixcbik6IFByb21pc2U8RGVwbG95U3RhY2tSZXN1bHQ+IHtcbiAgLy8gaWYgd2UgZ290IGhlcmUsIGFuZCBob3Rzd2FwIGlzIGVuYWJsZWQsIHRoYXQgbWVhbnMgY2hhbmdlcyBjb3VsZG4ndCBiZSBob3Rzd2FwcGVkLFxuICAvLyBhbmQgd2UgaGFkIHRvIGZhbGwgYmFjayBvbiBhIGZ1bGwgZGVwbG95bWVudC4gTm90ZSB0aGF0IGZhY3QgaW4gb3VyIFVzZXItQWdlbnRcbiAgaWYgKG9wdGlvbnMuaG90c3dhcCkge1xuICAgIG9wdGlvbnMuc2RrLmFwcGVuZEN1c3RvbVVzZXJBZ2VudCgnY2RrLWhvdHN3YXAvZmFsbGJhY2snKTtcbiAgfVxuXG4gIGNvbnN0IGNmbiA9IG9wdGlvbnMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBvcHRpb25zLmRlcGxveU5hbWUgPz8gc3RhY2tBcnRpZmFjdC5zdGFja05hbWU7XG5cbiAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IG9wdGlvbnMuY2hhbmdlU2V0TmFtZSA/PyAnY2RrLWRlcGxveS1jaGFuZ2Utc2V0JztcbiAgaWYgKGNsb3VkRm9ybWF0aW9uU3RhY2suZXhpc3RzKSB7XG4gICAgLy9EZWxldGUgYW55IGV4aXN0aW5nIGNoYW5nZSBzZXRzIGdlbmVyYXRlZCBieSBDREsgc2luY2UgY2hhbmdlIHNldCBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cbiAgICAvL1RoZSBkZWxldGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsIGFzIGxvbmcgYXMgdGhlIHN0YWNrIGV4aXN0cyAoZXZlbiBpZiB0aGUgY2hhbmdlIHNldCBkb2VzIG5vdCBleGlzdCkuXG4gICAgZGVidWcoYFJlbW92aW5nIGV4aXN0aW5nIGNoYW5nZSBzZXQgd2l0aCBuYW1lICR7Y2hhbmdlU2V0TmFtZX0gaWYgaXQgZXhpc3RzYCk7XG4gICAgYXdhaXQgY2ZuLmRlbGV0ZUNoYW5nZVNldCh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSwgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSB9KS5wcm9taXNlKCk7XG4gIH1cblxuICBjb25zdCB1cGRhdGUgPSBjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cyAmJiBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdSRVZJRVdfSU5fUFJPR1JFU1MnO1xuXG4gIGRlYnVnKGBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBDaGFuZ2VTZXQgd2l0aCBuYW1lICR7Y2hhbmdlU2V0TmFtZX0gdG8gJHt1cGRhdGUgPyAndXBkYXRlJyA6ICdjcmVhdGUnfSBzdGFjayAke2RlcGxveU5hbWV9YCk7XG4gIHByaW50KCclczogY3JlYXRpbmcgQ2xvdWRGb3JtYXRpb24gY2hhbmdlc2V0Li4uJywgY2hhbGsuYm9sZChkZXBsb3lOYW1lKSk7XG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gdXVpZC52NCgpO1xuICBjb25zdCBjaGFuZ2VTZXQgPSBhd2FpdCBjZm4uY3JlYXRlQ2hhbmdlU2V0KHtcbiAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICBDaGFuZ2VTZXRUeXBlOiB1cGRhdGUgPyAnVVBEQVRFJyA6ICdDUkVBVEUnLFxuICAgIERlc2NyaXB0aW9uOiBgQ0RLIENoYW5nZXNldCBmb3IgZXhlY3V0aW9uICR7ZXhlY3V0aW9uSWR9YCxcbiAgICBUZW1wbGF0ZUJvZHk6IGJvZHlQYXJhbWV0ZXIuVGVtcGxhdGVCb2R5LFxuICAgIFRlbXBsYXRlVVJMOiBib2R5UGFyYW1ldGVyLlRlbXBsYXRlVVJMLFxuICAgIFBhcmFtZXRlcnM6IHN0YWNrUGFyYW1zLmFwaVBhcmFtZXRlcnMsXG4gICAgUm9sZUFSTjogb3B0aW9ucy5yb2xlQXJuLFxuICAgIE5vdGlmaWNhdGlvbkFSTnM6IG9wdGlvbnMubm90aWZpY2F0aW9uQXJucyxcbiAgICBDYXBhYmlsaXRpZXM6IFsnQ0FQQUJJTElUWV9JQU0nLCAnQ0FQQUJJTElUWV9OQU1FRF9JQU0nLCAnQ0FQQUJJTElUWV9BVVRPX0VYUEFORCddLFxuICAgIFRhZ3M6IG9wdGlvbnMudGFncyxcbiAgfSkucHJvbWlzZSgpO1xuICBkZWJ1ZygnSW5pdGlhdGVkIGNyZWF0aW9uIG9mIGNoYW5nZXNldDogJXM7IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaCBjcmVhdGluZy4uLicsIGNoYW5nZVNldC5JZCk7XG4gIGNvbnN0IGNoYW5nZVNldERlc2NyaXB0aW9uID0gYXdhaXQgd2FpdEZvckNoYW5nZVNldChjZm4sIGRlcGxveU5hbWUsIGNoYW5nZVNldE5hbWUpO1xuXG4gIC8vIFVwZGF0ZSB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIG9ubHkgaWYgaXQgaGFzIGNoYW5nZWQuXG4gIGNvbnN0IHRlcm1pbmF0aW9uUHJvdGVjdGlvbiA9IHN0YWNrQXJ0aWZhY3QudGVybWluYXRpb25Qcm90ZWN0aW9uID8/IGZhbHNlO1xuICBpZiAoISFjbG91ZEZvcm1hdGlvblN0YWNrLnRlcm1pbmF0aW9uUHJvdGVjdGlvbiAhPT0gdGVybWluYXRpb25Qcm90ZWN0aW9uKSB7XG4gICAgZGVidWcoJ1VwZGF0aW5nIHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gZnJvbSAlcyB0byAlcyBmb3Igc3RhY2sgJXMnLCBjbG91ZEZvcm1hdGlvblN0YWNrLnRlcm1pbmF0aW9uUHJvdGVjdGlvbiwgdGVybWluYXRpb25Qcm90ZWN0aW9uLCBkZXBsb3lOYW1lKTtcbiAgICBhd2FpdCBjZm4udXBkYXRlVGVybWluYXRpb25Qcm90ZWN0aW9uKHtcbiAgICAgIFN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgIEVuYWJsZVRlcm1pbmF0aW9uUHJvdGVjdGlvbjogdGVybWluYXRpb25Qcm90ZWN0aW9uLFxuICAgIH0pLnByb21pc2UoKTtcbiAgICBkZWJ1ZygnVGVybWluYXRpb24gcHJvdGVjdGlvbiB1cGRhdGVkIHRvICVzIGZvciBzdGFjayAlcycsIHRlcm1pbmF0aW9uUHJvdGVjdGlvbiwgZGVwbG95TmFtZSk7XG4gIH1cblxuICBpZiAoY2hhbmdlU2V0SGFzTm9DaGFuZ2VzKGNoYW5nZVNldERlc2NyaXB0aW9uKSkge1xuICAgIGRlYnVnKCdObyBjaGFuZ2VzIGFyZSB0byBiZSBwZXJmb3JtZWQgb24gJXMuJywgZGVwbG95TmFtZSk7XG4gICAgaWYgKG9wdGlvbnMuZXhlY3V0ZSkge1xuICAgICAgZGVidWcoJ0RlbGV0aW5nIGVtcHR5IGNoYW5nZSBzZXQgJXMnLCBjaGFuZ2VTZXQuSWQpO1xuICAgICAgYXdhaXQgY2ZuLmRlbGV0ZUNoYW5nZVNldCh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSwgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSB9KS5wcm9taXNlKCk7XG4gICAgfVxuICAgIHJldHVybiB7IG5vT3A6IHRydWUsIG91dHB1dHM6IGNsb3VkRm9ybWF0aW9uU3RhY2sub3V0cHV0cywgc3RhY2tBcm46IGNoYW5nZVNldC5TdGFja0lkISB9O1xuICB9XG5cbiAgY29uc3QgZXhlY3V0ZSA9IG9wdGlvbnMuZXhlY3V0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuZXhlY3V0ZTtcbiAgaWYgKGV4ZWN1dGUpIHtcbiAgICBkZWJ1ZygnSW5pdGlhdGluZyBleGVjdXRpb24gb2YgY2hhbmdlc2V0ICVzIG9uIHN0YWNrICVzJywgY2hhbmdlU2V0LklkLCBkZXBsb3lOYW1lKTtcblxuICAgIGNvbnN0IHNob3VsZERpc2FibGVSb2xsYmFjayA9IG9wdGlvbnMucm9sbGJhY2sgPT09IGZhbHNlO1xuICAgIC8vIERvIGEgYml0IG9mIGNvbnRvcnRpb25zIHRvIG9ubHkgcGFzcyB0aGUgYERpc2FibGVSb2xsYmFja2AgZmxhZyBpZiBpdCdzIHRydWUuIFRoYXQgd2F5LFxuICAgIC8vIENsb3VkRm9ybWF0aW9uIHdvbid0IGJhbGsgYXQgdGhlIHVucmVjb2duaXplZCBvcHRpb24gaW4gcmVnaW9ucyB3aGVyZSB0aGUgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIHlldC5cbiAgICBjb25zdCBkaXNhYmxlUm9sbGJhY2sgPSBzaG91bGREaXNhYmxlUm9sbGJhY2sgPyB7IERpc2FibGVSb2xsYmFjazogdHJ1ZSB9IDogdW5kZWZpbmVkO1xuXG4gICAgYXdhaXQgY2ZuLmV4ZWN1dGVDaGFuZ2VTZXQoeyBTdGFja05hbWU6IGRlcGxveU5hbWUsIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsIC4uLmRpc2FibGVSb2xsYmFjayB9KS5wcm9taXNlKCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGNvbnN0IGNoYW5nZVNldExlbmd0aDogbnVtYmVyID0gKGNoYW5nZVNldERlc2NyaXB0aW9uLkNoYW5nZXMgPz8gW10pLmxlbmd0aDtcbiAgICBjb25zdCBtb25pdG9yID0gb3B0aW9ucy5xdWlldCA/IHVuZGVmaW5lZCA6IFN0YWNrQWN0aXZpdHlNb25pdG9yLndpdGhEZWZhdWx0UHJpbnRlcihjZm4sIGRlcGxveU5hbWUsIHN0YWNrQXJ0aWZhY3QsIHtcbiAgICAgIC8vICsxIGZvciB0aGUgZXh0cmEgZXZlbnQgZW1pdHRlZCBmcm9tIHVwZGF0ZXMuXG4gICAgICByZXNvdXJjZXNUb3RhbDogY2xvdWRGb3JtYXRpb25TdGFjay5leGlzdHMgPyBjaGFuZ2VTZXRMZW5ndGggKyAxIDogY2hhbmdlU2V0TGVuZ3RoLFxuICAgICAgcHJvZ3Jlc3M6IG9wdGlvbnMucHJvZ3Jlc3MsXG4gICAgICBjaGFuZ2VTZXRDcmVhdGlvblRpbWU6IGNoYW5nZVNldERlc2NyaXB0aW9uLkNyZWF0aW9uVGltZSxcbiAgICB9KS5zdGFydCgpO1xuICAgIGRlYnVnKCdFeGVjdXRpb24gb2YgY2hhbmdlc2V0ICVzIG9uIHN0YWNrICVzIGhhcyBzdGFydGVkOyB3YWl0aW5nIGZvciB0aGUgdXBkYXRlIHRvIGNvbXBsZXRlLi4uJywgY2hhbmdlU2V0LklkLCBkZXBsb3lOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmluYWxTdGFjayA9IGF3YWl0IHdhaXRGb3JTdGFja0RlcGxveShjZm4sIGRlcGxveU5hbWUpO1xuXG4gICAgICAvLyBUaGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuLCBidXQgY2F0Y2ggaXQgYW55d2F5LiBZb3UgbmV2ZXIga25vdy5cbiAgICAgIGlmICghZmluYWxTdGFjaykgeyB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIGRlcGxveSBmYWlsZWQgKHRoZSBzdGFjayBkaXNhcHBlYXJlZCB3aGlsZSB3ZSB3ZXJlIGRlcGxveWluZyBpdCknKTsgfVxuICAgICAgY2xvdWRGb3JtYXRpb25TdGFjayA9IGZpbmFsU3RhY2s7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IG1vbml0b3I/LnN0b3AoKTtcbiAgICB9XG4gICAgZGVidWcoJ1N0YWNrICVzIGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcnLCBkZXBsb3lOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBwcmludCgnQ2hhbmdlc2V0ICVzIGNyZWF0ZWQgYW5kIHdhaXRpbmcgaW4gcmV2aWV3IGZvciBtYW51YWwgZXhlY3V0aW9uICgtLW5vLWV4ZWN1dGUpJywgY2hhbmdlU2V0LklkKTtcbiAgfVxuXG4gIHJldHVybiB7IG5vT3A6IGZhbHNlLCBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsIHN0YWNrQXJuOiBjaGFuZ2VTZXQuU3RhY2tJZCEgfTtcbn1cblxuLyoqXG4gKiBQcmVwYXJlcyB0aGUgYm9keSBwYXJhbWV0ZXIgZm9yICtDcmVhdGVDaGFuZ2VTZXQrLlxuICpcbiAqIElmIHRoZSB0ZW1wbGF0ZSBpcyBzbWFsbCBlbm91Z2ggdG8gYmUgaW5saW5lZCBpbnRvIHRoZSBBUEkgY2FsbCwganVzdCByZXR1cm5cbiAqIGl0IGltbWVkaWF0ZWx5LlxuICpcbiAqIE90aGVyd2lzZSwgYWRkIGl0IHRvIHRoZSBhc3NldCBtYW5pZmVzdCB0byBnZXQgdXBsb2FkZWQgdG8gdGhlIHN0YWdpbmdcbiAqIGJ1Y2tldCBhbmQgcmV0dXJuIGl0cyBjb29yZGluYXRlcy4gSWYgdGhlcmUgaXMgbm8gc3RhZ2luZyBidWNrZXQsIGFuIGVycm9yXG4gKiBpcyB0aHJvd24uXG4gKlxuICogQHBhcmFtIHN0YWNrICAgICB0aGUgc3ludGhlc2l6ZWQgc3RhY2sgdGhhdCBwcm92aWRlcyB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAqIEBwYXJhbSB0b29sa2l0SW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9vbGtpdCBzdGFja1xuICovXG5hc3luYyBmdW5jdGlvbiBtYWtlQm9keVBhcmFtZXRlcihcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgcmVzb2x2ZWRFbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQsXG4gIGFzc2V0TWFuaWZlc3Q6IEFzc2V0TWFuaWZlc3RCdWlsZGVyLFxuICB0b29sa2l0SW5mbzogVG9vbGtpdEluZm8sXG4gIHNkazogSVNESyk6IFByb21pc2U8VGVtcGxhdGVCb2R5UGFyYW1ldGVyPiB7XG5cbiAgLy8gSWYgdGhlIHRlbXBsYXRlIGhhcyBhbHJlYWR5IGJlZW4gdXBsb2FkZWQgdG8gUzMsIGp1c3QgdXNlIGl0IGZyb20gdGhlcmUuXG4gIGlmIChzdGFjay5zdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmwpIHtcbiAgICByZXR1cm4geyBUZW1wbGF0ZVVSTDogcmVzdFVybEZyb21NYW5pZmVzdChzdGFjay5zdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmwsIHJlc29sdmVkRW52aXJvbm1lbnQsIHNkaykgfTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgcGFzcyB2aWEgQVBJIGNhbGwgKGlmIHNtYWxsKSBvciB1cGxvYWQgaGVyZSAoaWYgbGFyZ2UpXG4gIGNvbnN0IHRlbXBsYXRlSnNvbiA9IHRvWUFNTChzdGFjay50ZW1wbGF0ZSk7XG5cbiAgaWYgKHRlbXBsYXRlSnNvbi5sZW5ndGggPD0gTEFSR0VfVEVNUExBVEVfU0laRV9LQiAqIDEwMjQpIHtcbiAgICByZXR1cm4geyBUZW1wbGF0ZUJvZHk6IHRlbXBsYXRlSnNvbiB9O1xuICB9XG5cbiAgaWYgKCF0b29sa2l0SW5mby5mb3VuZCkge1xuICAgIGVycm9yKFxuICAgICAgYFRoZSB0ZW1wbGF0ZSBmb3Igc3RhY2sgXCIke3N0YWNrLmRpc3BsYXlOYW1lfVwiIGlzICR7TWF0aC5yb3VuZCh0ZW1wbGF0ZUpzb24ubGVuZ3RoIC8gMTAyNCl9S2lCLiBgICtcbiAgICAgIGBUZW1wbGF0ZXMgbGFyZ2VyIHRoYW4gJHtMQVJHRV9URU1QTEFURV9TSVpFX0tCfUtpQiBtdXN0IGJlIHVwbG9hZGVkIHRvIFMzLlxcbmAgK1xuICAgICAgJ1J1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gb3JkZXIgdG8gc2V0dXAgYW4gUzMgYnVja2V0IGluIHRoaXMgZW52aXJvbm1lbnQsIGFuZCB0aGVuIHJlLWRlcGxveTpcXG5cXG4nLFxuICAgICAgY2hhbGsuYmx1ZShgXFx0JCBjZGsgYm9vdHN0cmFwICR7cmVzb2x2ZWRFbnZpcm9ubWVudC5uYW1lfVxcbmApKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignVGVtcGxhdGUgdG9vIGxhcmdlIHRvIGRlcGxveSAoXCJjZGsgYm9vdHN0cmFwXCIgaXMgcmVxdWlyZWQpJyk7XG4gIH1cblxuICBjb25zdCB0ZW1wbGF0ZUhhc2ggPSBjb250ZW50SGFzaCh0ZW1wbGF0ZUpzb24pO1xuICBjb25zdCBrZXkgPSBgY2RrLyR7c3RhY2suaWR9LyR7dGVtcGxhdGVIYXNofS55bWxgO1xuXG4gIGFzc2V0TWFuaWZlc3QuYWRkRmlsZUFzc2V0KHRlbXBsYXRlSGFzaCwge1xuICAgIHBhdGg6IHN0YWNrLnRlbXBsYXRlRmlsZSxcbiAgfSwge1xuICAgIGJ1Y2tldE5hbWU6IHRvb2xraXRJbmZvLmJ1Y2tldE5hbWUsXG4gICAgb2JqZWN0S2V5OiBrZXksXG4gIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlVVJMID0gYCR7dG9vbGtpdEluZm8uYnVja2V0VXJsfS8ke2tleX1gO1xuICBkZWJ1ZygnU3RvcmluZyB0ZW1wbGF0ZSBpbiBTMyBhdDonLCB0ZW1wbGF0ZVVSTCk7XG4gIHJldHVybiB7IFRlbXBsYXRlVVJMOiB0ZW1wbGF0ZVVSTCB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0YWNrIHRvIGJlIGRlc3Ryb3llZFxuICAgKi9cbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICBzZGs6IElTREs7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHF1aWV0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3Ryb3lTdGFjayhvcHRpb25zOiBEZXN0cm95U3RhY2tPcHRpb25zKSB7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBvcHRpb25zLmRlcGxveU5hbWUgfHwgb3B0aW9ucy5zdGFjay5zdGFja05hbWU7XG4gIGNvbnN0IGNmbiA9IG9wdGlvbnMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG5cbiAgY29uc3QgY3VycmVudFN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgaWYgKCFjdXJyZW50U3RhY2suZXhpc3RzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG1vbml0b3IgPSBvcHRpb25zLnF1aWV0ID8gdW5kZWZpbmVkIDogU3RhY2tBY3Rpdml0eU1vbml0b3Iud2l0aERlZmF1bHRQcmludGVyKGNmbiwgZGVwbG95TmFtZSwgb3B0aW9ucy5zdGFjaykuc3RhcnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGNmbi5kZWxldGVTdGFjayh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSwgUm9sZUFSTjogb3B0aW9ucy5yb2xlQXJuIH0pLnByb21pc2UoKTtcbiAgICBjb25zdCBkZXN0cm95ZWRTdGFjayA9IGF3YWl0IHdhaXRGb3JTdGFja0RlbGV0ZShjZm4sIGRlcGxveU5hbWUpO1xuICAgIGlmIChkZXN0cm95ZWRTdGFjayAmJiBkZXN0cm95ZWRTdGFjay5zdGFja1N0YXR1cy5uYW1lICE9PSAnREVMRVRFX0NPTVBMRVRFJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzdHJveSAke2RlcGxveU5hbWV9OiAke2Rlc3Ryb3llZFN0YWNrLnN0YWNrU3RhdHVzfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAobW9uaXRvcikgeyBhd2FpdCBtb25pdG9yLnN0b3AoKTsgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgd2UgY2FuIHNraXAgZGVwbG95bWVudFxuICpcbiAqIFdlIGRvIHRoaXMgaW4gYSBjb21wbGljYXRlZCB3YXkgYnkgcHJlcHJvY2Vzc2luZyAoaW5zdGVhZCBvZiBqdXN0XG4gKiBsb29raW5nIGF0IHRoZSBjaGFuZ2VzZXQpLCBiZWNhdXNlIGlmIHRoZXJlIGFyZSBuZXN0ZWQgc3RhY2tzIGludm9sdmVkXG4gKiB0aGUgY2hhbmdlc2V0IHdpbGwgYWx3YXlzIHNob3cgdGhlIG5lc3RlZCBzdGFja3MgYXMgbmVlZGluZyB0byBiZVxuICogdXBkYXRlZCwgYW5kIHRoZSBkZXBsb3ltZW50IHdpbGwgdGFrZSBhIGxvbmcgdGltZSB0byBpbiBlZmZlY3Qgbm90XG4gKiBkbyBhbnl0aGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FuU2tpcERlcGxveShcbiAgZGVwbG95U3RhY2tPcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMsXG4gIGNsb3VkRm9ybWF0aW9uU3RhY2s6IENsb3VkRm9ybWF0aW9uU3RhY2ssXG4gIHBhcmFtZXRlckNoYW5nZXM6IFBhcmFtZXRlckNoYW5nZXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICBjb25zdCBkZXBsb3lOYW1lID0gZGVwbG95U3RhY2tPcHRpb25zLmRlcGxveU5hbWUgfHwgZGVwbG95U3RhY2tPcHRpb25zLnN0YWNrLnN0YWNrTmFtZTtcbiAgZGVidWcoYCR7ZGVwbG95TmFtZX06IGNoZWNraW5nIGlmIHdlIGNhbiBza2lwIGRlcGxveWApO1xuXG4gIC8vIEZvcmNlZCBkZXBsb3lcbiAgaWYgKGRlcGxveVN0YWNrT3B0aW9ucy5mb3JjZSkge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiBmb3JjZWQgZGVwbG95bWVudGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENyZWF0aW5nIGNoYW5nZXNldCBvbmx5IChkZWZhdWx0IHRydWUpLCBuZXZlciBza2lwXG4gIGlmIChkZXBsb3lTdGFja09wdGlvbnMuZXhlY3V0ZSA9PT0gZmFsc2UpIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogLS1uby1leGVjdXRlLCBhbHdheXMgY3JlYXRpbmcgY2hhbmdlIHNldGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vIGV4aXN0aW5nIHN0YWNrXG4gIGlmICghY2xvdWRGb3JtYXRpb25TdGFjay5leGlzdHMpIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogbm8gZXhpc3Rpbmcgc3RhY2tgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUZW1wbGF0ZSBoYXMgY2hhbmdlZCAoYXNzZXRzIHRha2VuIGludG8gYWNjb3VudCBoZXJlKVxuICBpZiAoSlNPTi5zdHJpbmdpZnkoZGVwbG95U3RhY2tPcHRpb25zLnN0YWNrLnRlbXBsYXRlKSAhPT0gSlNPTi5zdHJpbmdpZnkoYXdhaXQgY2xvdWRGb3JtYXRpb25TdGFjay50ZW1wbGF0ZSgpKSkge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiB0ZW1wbGF0ZSBoYXMgY2hhbmdlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRhZ3MgaGF2ZSBjaGFuZ2VkXG4gIGlmICghY29tcGFyZVRhZ3MoY2xvdWRGb3JtYXRpb25TdGFjay50YWdzLCBkZXBsb3lTdGFja09wdGlvbnMudGFncyA/PyBbXSkpIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogdGFncyBoYXZlIGNoYW5nZWRgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUZXJtaW5hdGlvbiBwcm90ZWN0aW9uIGhhcyBiZWVuIHVwZGF0ZWRcbiAgaWYgKCEhZGVwbG95U3RhY2tPcHRpb25zLnN0YWNrLnRlcm1pbmF0aW9uUHJvdGVjdGlvbiAhPT0gISFjbG91ZEZvcm1hdGlvblN0YWNrLnRlcm1pbmF0aW9uUHJvdGVjdGlvbikge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIGhhcyBiZWVuIHVwZGF0ZWRgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBQYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZFxuICBpZiAocGFyYW1ldGVyQ2hhbmdlcykge1xuICAgIGlmIChwYXJhbWV0ZXJDaGFuZ2VzID09PSAnc3NtJykge1xuICAgICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHNvbWUgcGFyYW1ldGVycyBjb21lIGZyb20gU1NNIHNvIHdlIGhhdmUgdG8gYXNzdW1lIHRoZXkgbWF5IGhhdmUgY2hhbmdlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogcGFyYW1ldGVycyBoYXZlIGNoYW5nZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXhpc3Rpbmcgc3RhY2sgaXMgaW4gYSBmYWlsZWQgc3RhdGVcbiAgaWYgKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMuaXNGYWlsdXJlKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHN0YWNrIGlzIGluIGEgZmFpbHVyZSBzdGF0ZWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFdlIGNhbiBza2lwIGRlcGxveVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gbGlzdCBvZiB0YWdzLCByZXR1cm5zIHRydWUgaWYgaWRlbnRpY2FsLlxuICovXG5mdW5jdGlvbiBjb21wYXJlVGFncyhhOiBUYWdbXSwgYjogVGFnW10pOiBib29sZWFuIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgYVRhZyBvZiBhKSB7XG4gICAgY29uc3QgYlRhZyA9IGIuZmluZCh0YWcgPT4gdGFnLktleSA9PT0gYVRhZy5LZXkpO1xuXG4gICAgaWYgKCFiVGFnIHx8IGJUYWcuVmFsdWUgIT09IGFUYWcuVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYW4gUzMgVVJMIGluIHRoZSBtYW5pZmVzdCBmb3IgdXNlIHdpdGggQ2xvdWRGb3JtYXRpb25cbiAqXG4gKiBSZXBsYWNlcyBlbnZpcm9ubWVudCBwbGFjZWhvbGRlcnMgKHdoaWNoIHRoaXMgZmllbGQgbWF5IGNvbnRhaW4pLFxuICogYW5kIHJlZm9ybWF0cyBzMzovLy4uLi8uLi4gdXJscyBpbnRvIFMzIFJFU1QgVVJMcyAod2hpY2ggQ2xvdWRGb3JtYXRpb25cbiAqIGV4cGVjdHMpXG4gKi9cbmZ1bmN0aW9uIHJlc3RVcmxGcm9tTWFuaWZlc3QodXJsOiBzdHJpbmcsIGVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudCwgc2RrOiBJU0RLKTogc3RyaW5nIHtcbiAgY29uc3QgZG9Ob3RVc2VNYXJrZXIgPSAnKipET05PVFVTRSoqJztcbiAgLy8gVGhpcyBVUkwgbWF5IGNvbnRhaW4gcGxhY2Vob2xkZXJzLCBzbyBzdGlsbCBzdWJzdGl0dXRlIHRob3NlLlxuICB1cmwgPSBjeGFwaS5FbnZpcm9ubWVudFBsYWNlaG9sZGVycy5yZXBsYWNlKHVybCwge1xuICAgIGFjY291bnRJZDogZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICByZWdpb246IGVudmlyb25tZW50LnJlZ2lvbixcbiAgICBwYXJ0aXRpb246IGRvTm90VXNlTWFya2VyLFxuICB9KTtcblxuICAvLyBZZXMsIHRoaXMgaXMgZXh0cmVtZWx5IGNydWRlLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0aGlzIHNvIEknbSBub3QgaW5jbGluZWQgdG8gc3BlbmRcbiAgLy8gYSBsb3Qgb2YgZWZmb3J0IHRyeWluZyB0byB0aHJlYWQgdGhlIHJpZ2h0IHZhbHVlIHRvIHRoaXMgbG9jYXRpb24uXG4gIGlmICh1cmwuaW5kZXhPZihkb05vdFVzZU1hcmtlcikgPiAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSBcXCcke0FXUzo6UGFydGl0aW9ufVxcJyBpbiB0aGUgXFwnc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsXFwnIGZpZWxkJyk7XG4gIH1cblxuICBjb25zdCBzM1VybCA9IHVybC5tYXRjaCgvczM6XFwvXFwvKFteL10rKVxcLyguKikkLyk7XG4gIGlmICghczNVcmwpIHsgcmV0dXJuIHVybDsgfVxuXG4gIC8vIFdlIG5lZWQgdG8gcGFzcyBhbiAnaHR0cHM6Ly9zMy5SRUdJT04uYW1hem9uYXdzLmNvbVsuY25dL2J1Y2tldC9vYmplY3QnIFVSTCB0byBDbG91ZEZvcm1hdGlvbiwgYnV0IHdlXG4gIC8vIGdvdCBhbiAnczM6Ly9idWNrZXQvb2JqZWN0JyBVUkwgaW5zdGVhZC4gQ29uc3RydWN0IHRoZSByZXN0IEFQSSBVUkwgaGVyZS5cbiAgY29uc3QgYnVja2V0TmFtZSA9IHMzVXJsWzFdO1xuICBjb25zdCBvYmplY3RLZXkgPSBzM1VybFsyXTtcblxuICBjb25zdCB1cmxTdWZmaXg6IHN0cmluZyA9IHNkay5nZXRFbmRwb2ludFN1ZmZpeChlbnZpcm9ubWVudC5yZWdpb24pO1xuICByZXR1cm4gYGh0dHBzOi8vczMuJHtlbnZpcm9ubWVudC5yZWdpb259LiR7dXJsU3VmZml4fS8ke2J1Y2tldE5hbWV9LyR7b2JqZWN0S2V5fWA7XG59XG4iXX0=
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF5QztBQUN6QywrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QixzQ0FBd0Q7QUFFeEQsd0NBQWlEO0FBQ2pELDRDQUFzQztBQUN0QywyRUFBc0U7QUFDdEUsK0RBQXlEO0FBQ3pELHVEQUFtRDtBQUVuRCx5RkFBNEU7QUFDNUUsK0RBQTZEO0FBQzdELDZDQUF3QztBQUV4QywwREFHK0I7QUFDL0IseUZBQTJHO0FBMkwzRyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUUzQixLQUFLLFVBQVUsV0FBVyxDQUFDLE9BQTJCO0lBQzNELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFFcEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0lBRTdDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ2pFLElBQUksbUJBQW1CLEdBQUcsTUFBTSxvQ0FBbUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRTVFLElBQUksbUJBQW1CLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFO1FBQ3JELGVBQUssQ0FBQyx3QkFBd0IsVUFBVSxzRkFBc0YsQ0FBQyxDQUFDO1FBQ2hJLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFH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RSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0tBQ2xHO0lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxLQUFLLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztLQUFFO0lBRTNCLHdHQUF3RztJQUN4Ryw0RUFBNEU7SUFDNUUsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUzQixNQUFNLFNBQVMsR0FBVyxHQUFHLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sY0FBYyxXQUFXLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxVQUFVLElBQUksU0FBUyxFQUFFLENBQUM7QUFDcEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0IH0gZnJvbSAnLi4vYXNzZXRzJztcbmltcG9ydCB7IFRhZyB9IGZyb20gJy4uL2Nkay10b29sa2l0JztcbmltcG9ydCB7IGRlYnVnLCBlcnJvciwgcHJpbnQgfSBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IHRvWUFNTCB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBBc3NldE1hbmlmZXN0QnVpbGRlciB9IGZyb20gJy4uL3V0aWwvYXNzZXQtbWFuaWZlc3QtYnVpbGRlcic7XG5pbXBvcnQgeyBwdWJsaXNoQXNzZXRzIH0gZnJvbSAnLi4vdXRpbC9hc3NldC1wdWJsaXNoaW5nJztcbmltcG9ydCB7IGNvbnRlbnRIYXNoIH0gZnJvbSAnLi4vdXRpbC9jb250ZW50LWhhc2gnO1xuaW1wb3J0IHsgSVNESywgU2RrUHJvdmlkZXIgfSBmcm9tICcuL2F3cy1hdXRoJztcbmltcG9ydCB7IENmbkV2YWx1YXRpb25FeGNlcHRpb24gfSBmcm9tICcuL2V2YWx1YXRlLWNsb3VkZm9ybWF0aW9uLXRlbXBsYXRlJztcbmltcG9ydCB7IHRyeUhvdHN3YXBEZXBsb3ltZW50IH0gZnJvbSAnLi9ob3Rzd2FwLWRlcGxveW1lbnRzJztcbmltcG9ydCB7IElDT04gfSBmcm9tICcuL2hvdHN3YXAvY29tbW9uJztcbmltcG9ydCB7IFRvb2xraXRJbmZvIH0gZnJvbSAnLi90b29sa2l0LWluZm8nO1xuaW1wb3J0IHtcbiAgY2hhbmdlU2V0SGFzTm9DaGFuZ2VzLCBDbG91ZEZvcm1hdGlvblN0YWNrLCBUZW1wbGF0ZVBhcmFtZXRlcnMsIHdhaXRGb3JDaGFuZ2VTZXQsXG4gIHdhaXRGb3JTdGFja0RlcGxveSwgd2FpdEZvclN0YWNrRGVsZXRlLCBQYXJhbWV0ZXJWYWx1ZXMsIFBhcmFtZXRlckNoYW5nZXMsIFJlc291cmNlc1RvSW1wb3J0LFxufSBmcm9tICcuL3V0aWwvY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eU1vbml0b3IsIFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJy4vdXRpbC9jbG91ZGZvcm1hdGlvbi9zdGFjay1hY3Rpdml0eS1tb25pdG9yJztcblxudHlwZSBUZW1wbGF0ZUJvZHlQYXJhbWV0ZXIgPSB7XG4gIFRlbXBsYXRlQm9keT86IHN0cmluZ1xuICBUZW1wbGF0ZVVSTD86IHN0cmluZ1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFja1Jlc3VsdCB7XG4gIHJlYWRvbmx5IG5vT3A6IGJvb2xlYW47XG4gIHJlYWRvbmx5IG91dHB1dHM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSBzdGFja0Fybjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gYmUgZGVwbG95ZWRcbiAgICovXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCB0byBkZXBsb3kgdGhpcyBzdGFjayBpblxuICAgKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgb24gdGhlIHN0YWNrIGFydGlmYWN0IG1heSBiZSB1bnJlc29sdmVkLCB0aGlzIG9uZVxuICAgKiBtdXN0IGJlIHJlc29sdmVkLlxuICAgKi9cbiAgcmVzb2x2ZWRFbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBTREsgdG8gdXNlIGZvciBkZXBsb3lpbmcgdGhlIHN0YWNrXG4gICAqXG4gICAqIFNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY29ycmVjdCByb2xlIHdpdGggd2hpY2hcbiAgICogc3RhY2sgb3BlcmF0aW9ucyBzaG91bGQgYmUgcGVyZm9ybWVkLlxuICAgKi9cbiAgc2RrOiBJU0RLO1xuXG4gIC8qKlxuICAgKiBTREsgcHJvdmlkZXIgKHNlZWRlZCB3aXRoIGRlZmF1bHQgY3JlZGVudGlhbHMpXG4gICAqXG4gICAqIFdpbGwgZXhjbHVzaXZlbHkgYmUgdXNlZCB0byBhc3N1bWUgcHVibGlzaGluZyBjcmVkZW50aWFscyAod2hpY2ggbXVzdFxuICAgKiBzdGFydCBvdXQgZnJvbSBjdXJyZW50IGNyZWRlbnRpYWxzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSd2ZSBhc3N1bWVkIGFuXG4gICAqIGFjdGlvbiByb2xlIHRvIHRvdWNoIHRoZSBzdGFjayBvciBub3QpLlxuICAgKlxuICAgKiBVc2VkIGZvciB0aGUgZm9sbG93aW5nIHB1cnBvc2VzOlxuICAgKlxuICAgKiAtIFB1Ymxpc2ggbGVnYWN5IGFzc2V0cy5cbiAgICogLSBVcGxvYWQgbGFyZ2UgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzIHRvIHRoZSBzdGFnaW5nIGJ1Y2tldC5cbiAgICovXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJvb3RzdHJhcCBzdGFjayBmb3VuZCBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50XG4gICAqL1xuICB0b29sa2l0SW5mbzogVG9vbGtpdEluZm87XG5cbiAgLyoqXG4gICAqIFJvbGUgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiB0byBleGVjdXRlIHRoZSBjaGFuZ2Ugc2V0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUm9sZSBzcGVjaWZpZWQgb24gc3RhY2ssIG90aGVyd2lzZSBjdXJyZW50XG4gICAqL1xuICByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOb3RpZmljYXRpb24gQVJOcyB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIG5vdGlmeSB3aGVuIHRoZSBjaGFuZ2Ugc2V0IGhhcyBjb21wbGV0ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBub3RpZmljYXRpb25zXG4gICAqL1xuICBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE5hbWUgdG8gZGVwbG95IHRoZSBzdGFjayB1bmRlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5hbWUgZnJvbSBhc3NlbWJseVxuICAgKi9cbiAgZGVwbG95TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUXVpZXQgb3IgdmVyYm9zZSBkZXBsb3ltZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXNzZXQgSURzIHdoaWNoIHNob3VsZG4ndCBiZSBidWlsdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJ1aWxkIGFsbCBhc3NldHNcbiAgICovXG4gIHJldXNlQXNzZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRhZ3MgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiB0byBhZGQgdG8gc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzXG4gICAqL1xuICB0YWdzPzogVGFnW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXhlY3V0ZSB0aGUgY2hhbmdlc2V0IG9yIGxlYXZlIGl0IGluIHJldmlldy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZXhlY3V0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIG5hbWUgdG8gdXNlIGZvciB0aGUgQ2xvdWRGb3JtYXRpb24gY2hhbmdlIHNldC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIGNoYW5nZVNldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4dHJhIHBhcmFtZXRlcnNcbiAgICogKGluIGFkZGl0aW9uIHRvIHRob3NlIHVzZWQgZm9yIGFzc2V0cylcbiAgICogdG8gcGFzcyB0byB0aGUgZGVwbG95ZWQgdGVtcGxhdGUuXG4gICAqIE5vdGUgdGhhdCBwYXJhbWV0ZXJzIHdpdGggYHVuZGVmaW5lZGAgb3IgZW1wdHkgdmFsdWVzIHdpbGwgYmUgaWdub3JlZCxcbiAgICogYW5kIG5vdCBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgbW9kZSBmb3Igc3RhY2sgZGVwbG95bWVudCBwcm9ncmVzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJhciBzdGFjayBldmVudHMgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yXG4gICAqICAgdGhlIHJlc291cmNlIGN1cnJlbnRseSBiZWluZyBkZXBsb3llZC5cbiAgICovXG4gIHByb2dyZXNzPzogU3RhY2tBY3Rpdml0eVByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBEZXBsb3kgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgb24gYSBDSSBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNpPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKlxuICAgKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSAnaG90c3dhcCcgZGVwbG95bWVudC5cbiAgICogQSAnaG90c3dhcCcgZGVwbG95bWVudCB3aWxsIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCBDbG91ZEZvcm1hdGlvblxuICAgKiBhbmQgdXBkYXRlIHRoZSBhZmZlY3RlZCByZXNvdXJjZXMgbGlrZSBMYW1iZGEgZnVuY3Rpb25zIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlIGZvciByZWd1bGFyIGRlcGxveW1lbnRzLCB0cnVlIGZvciAnd2F0Y2gnIGRlcGxveW1lbnRzXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGV4dHJhIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyIHdoZW4gcGVyZm9ybWluZyBBV1MgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgZXh0cmEgaXMgYXBwZW5kZWQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBleHRyYVVzZXJBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc2V0LCBjaGFuZ2Ugc2V0IG9mIHR5cGUgSU1QT1JUIHdpbGwgYmUgY3JlYXRlZCwgYW5kIHJlc291cmNlc1RvSW1wb3J0XG4gICAqIHBhc3NlZCB0byBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvSW1wb3J0PzogUmVzb3VyY2VzVG9JbXBvcnQ7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHVzZSB0aGlzIGdpdmVuIHRlbXBsYXRlIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgdGhlIHN0b3JlZCB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVUZW1wbGF0ZT86IGFueTtcbn1cblxuY29uc3QgTEFSR0VfVEVNUExBVEVfU0laRV9LQiA9IDUwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICBjb25zdCBzdGFja0FydGlmYWN0ID0gb3B0aW9ucy5zdGFjaztcblxuICBjb25zdCBzdGFja0VudiA9IG9wdGlvbnMucmVzb2x2ZWRFbnZpcm9ubWVudDtcblxuICBvcHRpb25zLnNkay5hcHBlbmRDdXN0b21Vc2VyQWdlbnQob3B0aW9ucy5leHRyYVVzZXJBZ2VudCk7XG4gIGNvbnN0IGNmbiA9IG9wdGlvbnMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBvcHRpb25zLmRlcGxveU5hbWUgfHwgc3RhY2tBcnRpZmFjdC5zdGFja05hbWU7XG4gIGxldCBjbG91ZEZvcm1hdGlvblN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcblxuICBpZiAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5pc0NyZWF0aW9uRmFpbHVyZSkge1xuICAgIGRlYnVnKGBGb3VuZCBleGlzdGluZyBzdGFjayAke2RlcGxveU5hbWV9IHRoYXQgaGFkIHByZXZpb3VzbHkgZmFpbGVkIGNyZWF0aW9uLiBEZWxldGluZyBpdCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZS1jcmVhdGUgaXQuYCk7XG4gICAgYXdhaXQgY2ZuLmRlbGV0ZVN0YWNrKHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lIH0pLnByb21pc2UoKTtcbiAgICBjb25zdCBkZWxldGVkU3RhY2sgPSBhd2FpdCB3YWl0Rm9yU3RhY2tEZWxldGUoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgICBpZiAoZGVsZXRlZFN0YWNrICYmIGRlbGV0ZWRTdGFjay5zdGFja1N0YXR1cy5uYW1lICE9PSAnREVMRVRFX0NPTVBMRVRFJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgZGVsZXRpbmcgc3RhY2sgJHtkZXBsb3lOYW1lfSB0aGF0IGhhZCBwcmV2aW91c2x5IGZhaWxlZCBjcmVhdGlvbiAoY3VycmVudCBzdGF0ZTogJHtkZWxldGVkU3RhY2suc3RhY2tTdGF0dXN9KWApO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdG8gbWFyayB0aGF0IHRoZSBzdGFjayBkb2VzIG5vdCBleGlzdCBhbnltb3JlLCBidXQgYXZvaWRcbiAgICAvLyBkb2luZyBhbiBhY3R1YWwgbG9va3VwIGluIENsb3VkRm9ybWF0aW9uICh3aGljaCB3b3VsZCBiZSBzaWxseSB0byBkbyBpZlxuICAgIC8vIHdlIGp1c3QgZGVsZXRlZCBpdCkuXG4gICAgY2xvdWRGb3JtYXRpb25TdGFjayA9IENsb3VkRm9ybWF0aW9uU3RhY2suZG9lc05vdEV4aXN0KGNmbiwgZGVwbG95TmFtZSk7XG4gIH1cblxuICAvLyBEZXRlY3QgXCJsZWdhY3lcIiBhc3NldHMgKHdoaWNoIHJlbWFpbiBpbiB0aGUgbWV0YWRhdGEpIGFuZCBwdWJsaXNoIHRoZW0gdmlhXG4gIC8vIGFuIGFkLWhvYyBhc3NldCBtYW5pZmVzdCwgd2hpbGUgcGFzc2luZyB0aGVpciBsb2NhdGlvbnMgdmlhIHRlbXBsYXRlXG4gIC8vIHBhcmFtZXRlcnMuXG4gIGNvbnN0IGxlZ2FjeUFzc2V0cyA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICBjb25zdCBhc3NldFBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFja0FydGlmYWN0LCBsZWdhY3lBc3NldHMsIG9wdGlvbnMudG9vbGtpdEluZm8sIG9wdGlvbnMucmV1c2VBc3NldHMpO1xuXG4gIGNvbnN0IGZpbmFsUGFyYW1ldGVyVmFsdWVzID0geyAuLi5vcHRpb25zLnBhcmFtZXRlcnMsIC4uLmFzc2V0UGFyYW1zIH07XG5cbiAgY29uc3QgdGVtcGxhdGVQYXJhbXMgPSBUZW1wbGF0ZVBhcmFtZXRlcnMuZnJvbVRlbXBsYXRlKHN0YWNrQXJ0aWZhY3QudGVtcGxhdGUpO1xuICBjb25zdCBzdGFja1BhcmFtcyA9IG9wdGlvbnMudXNlUHJldmlvdXNQYXJhbWV0ZXJzXG4gICAgPyB0ZW1wbGF0ZVBhcmFtcy51cGRhdGVFeGlzdGluZyhmaW5hbFBhcmFtZXRlclZhbHVlcywgY2xvdWRGb3JtYXRpb25TdGFjay5wYXJhbWV0ZXJzKVxuICAgIDogdGVtcGxhdGVQYXJhbXMuc3VwcGx5QWxsKGZpbmFsUGFyYW1ldGVyVmFsdWVzKTtcblxuICBpZiAoYXdhaXQgY2FuU2tpcERlcGxveShvcHRpb25zLCBjbG91ZEZvcm1hdGlvblN0YWNrLCBzdGFja1BhcmFtcy5oYXNDaGFuZ2VzKGNsb3VkRm9ybWF0aW9uU3RhY2sucGFyYW1ldGVycykpKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHNraXBwaW5nIGRlcGxveW1lbnQgKHVzZSAtLWZvcmNlIHRvIG92ZXJyaWRlKWApO1xuICAgIC8vIGlmIHdlIGNhbiBza2lwIGRlcGxveW1lbnQgYW5kIHdlIGFyZSBwZXJmb3JtaW5nIGEgaG90c3dhcCwgbGV0IHRoZSB1c2VyIGtub3dcbiAgICAvLyB0aGF0IG5vIGhvdHN3YXAgZGVwbG95bWVudCBoYXBwZW5lZFxuICAgIGlmIChvcHRpb25zLmhvdHN3YXApIHtcbiAgICAgIHByaW50KGBcXG4gJHtJQ09OfSAlc1xcbmAsIGNoYWxrLmJvbGQoJ2hvdHN3YXAgZGVwbG95bWVudCBza2lwcGVkIC0gbm8gY2hhbmdlcyB3ZXJlIGRldGVjdGVkICh1c2UgLS1mb3JjZSB0byBvdmVycmlkZSknKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBub09wOiB0cnVlLFxuICAgICAgb3V0cHV0czogY2xvdWRGb3JtYXRpb25TdGFjay5vdXRwdXRzLFxuICAgICAgc3RhY2tBcm46IGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tJZCxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiBkZXBsb3lpbmcuLi5gKTtcbiAgfVxuXG4gIGNvbnN0IGJvZHlQYXJhbWV0ZXIgPSBhd2FpdCBtYWtlQm9keVBhcmFtZXRlcihcbiAgICBzdGFja0FydGlmYWN0LFxuICAgIG9wdGlvbnMucmVzb2x2ZWRFbnZpcm9ubWVudCxcbiAgICBsZWdhY3lBc3NldHMsXG4gICAgb3B0aW9ucy50b29sa2l0SW5mbyxcbiAgICBvcHRpb25zLnNkayxcbiAgICBvcHRpb25zLm92ZXJyaWRlVGVtcGxhdGUpO1xuICBhd2FpdCBwdWJsaXNoQXNzZXRzKGxlZ2FjeUFzc2V0cy50b01hbmlmZXN0KHN0YWNrQXJ0aWZhY3QuYXNzZW1ibHkuZGlyZWN0b3J5KSwgb3B0aW9ucy5zZGtQcm92aWRlciwgc3RhY2tFbnYpO1xuXG4gIGlmIChvcHRpb25zLmhvdHN3YXApIHtcbiAgICAvLyBhdHRlbXB0IHRvIHNob3J0LWNpcmN1aXQgdGhlIGRlcGxveW1lbnQgaWYgcG9zc2libGVcbiAgICB0cnkge1xuICAgICAgY29uc3QgaG90c3dhcERlcGxveW1lbnRSZXN1bHQgPSBhd2FpdCB0cnlIb3Rzd2FwRGVwbG95bWVudChvcHRpb25zLnNka1Byb3ZpZGVyLCBhc3NldFBhcmFtcywgY2xvdWRGb3JtYXRpb25TdGFjaywgc3RhY2tBcnRpZmFjdCk7XG4gICAgICBpZiAoaG90c3dhcERlcGxveW1lbnRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGhvdHN3YXBEZXBsb3ltZW50UmVzdWx0O1xuICAgICAgfVxuICAgICAgcHJpbnQoJ0NvdWxkIG5vdCBwZXJmb3JtIGEgaG90c3dhcCBkZXBsb3ltZW50LCBhcyB0aGUgc3RhY2sgJXMgY29udGFpbnMgbm9uLUFzc2V0IGNoYW5nZXMnLCBzdGFja0FydGlmYWN0LmRpc3BsYXlOYW1lKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHByaW50KCdDb3VsZCBub3QgcGVyZm9ybSBhIGhvdHN3YXAgZGVwbG95bWVudCwgYmVjYXVzZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgY291bGQgbm90IGJlIHJlc29sdmVkOiAlcycsIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHByaW50KCdGYWxsaW5nIGJhY2sgdG8gZG9pbmcgYSBmdWxsIGRlcGxveW1lbnQnKTtcbiAgfVxuXG4gIC8vIGNvdWxkIG5vdCBzaG9ydC1jaXJjdWl0IHRoZSBkZXBsb3ltZW50LCBwZXJmb3JtIGEgZnVsbCBDRk4gZGVwbG95IGluc3RlYWRcbiAgcmV0dXJuIHByZXBhcmVBbmRFeGVjdXRlQ2hhbmdlU2V0KG9wdGlvbnMsIGNsb3VkRm9ybWF0aW9uU3RhY2ssIHN0YWNrQXJ0aWZhY3QsIHN0YWNrUGFyYW1zLCBib2R5UGFyYW1ldGVyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUFuZEV4ZWN1dGVDaGFuZ2VTZXQoXG4gIG9wdGlvbnM6IERlcGxveVN0YWNrT3B0aW9ucywgY2xvdWRGb3JtYXRpb25TdGFjazogQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBzdGFja1BhcmFtczogUGFyYW1ldGVyVmFsdWVzLCBib2R5UGFyYW1ldGVyOiBUZW1wbGF0ZUJvZHlQYXJhbWV0ZXIsXG4pOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gIC8vIGlmIHdlIGdvdCBoZXJlLCBhbmQgaG90c3dhcCBpcyBlbmFibGVkLCB0aGF0IG1lYW5zIGNoYW5nZXMgY291bGRuJ3QgYmUgaG90c3dhcHBlZCxcbiAgLy8gYW5kIHdlIGhhZCB0byBmYWxsIGJhY2sgb24gYSBmdWxsIGRlcGxveW1lbnQuIE5vdGUgdGhhdCBmYWN0IGluIG91ciBVc2VyLUFnZW50XG4gIGlmIChvcHRpb25zLmhvdHN3YXApIHtcbiAgICBvcHRpb25zLnNkay5hcHBlbmRDdXN0b21Vc2VyQWdlbnQoJ2Nkay1ob3Rzd2FwL2ZhbGxiYWNrJyk7XG4gIH1cblxuICBjb25zdCBjZm4gPSBvcHRpb25zLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICBjb25zdCBkZXBsb3lOYW1lID0gb3B0aW9ucy5kZXBsb3lOYW1lID8/IHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lO1xuXG4gIGNvbnN0IGNoYW5nZVNldE5hbWUgPSBvcHRpb25zLmNoYW5nZVNldE5hbWUgPz8gJ2Nkay1kZXBsb3ktY2hhbmdlLXNldCc7XG4gIGlmIChjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgIC8vRGVsZXRlIGFueSBleGlzdGluZyBjaGFuZ2Ugc2V0cyBnZW5lcmF0ZWQgYnkgQ0RLIHNpbmNlIGNoYW5nZSBzZXQgbmFtZXMgbXVzdCBiZSB1bmlxdWUuXG4gICAgLy9UaGUgZGVsZXRlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCBhcyBsb25nIGFzIHRoZSBzdGFjayBleGlzdHMgKGV2ZW4gaWYgdGhlIGNoYW5nZSBzZXQgZG9lcyBub3QgZXhpc3QpLlxuICAgIGRlYnVnKGBSZW1vdmluZyBleGlzdGluZyBjaGFuZ2Ugc2V0IHdpdGggbmFtZSAke2NoYW5nZVNldE5hbWV9IGlmIGl0IGV4aXN0c2ApO1xuICAgIGF3YWl0IGNmbi5kZWxldGVDaGFuZ2VTZXQoeyBTdGFja05hbWU6IGRlcGxveU5hbWUsIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUgfSkucHJvbWlzZSgpO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlID0gY2xvdWRGb3JtYXRpb25TdGFjay5leGlzdHMgJiYgY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5uYW1lICE9PSAnUkVWSUVXX0lOX1BST0dSRVNTJztcblxuICBkZWJ1ZyhgQXR0ZW1wdGluZyB0byBjcmVhdGUgQ2hhbmdlU2V0IHdpdGggbmFtZSAke2NoYW5nZVNldE5hbWV9IHRvICR7dXBkYXRlID8gJ3VwZGF0ZScgOiAnY3JlYXRlJ30gc3RhY2sgJHtkZXBsb3lOYW1lfWApO1xuICBwcmludCgnJXM6IGNyZWF0aW5nIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldC4uLicsIGNoYWxrLmJvbGQoZGVwbG95TmFtZSkpO1xuICBjb25zdCBleGVjdXRpb25JZCA9IHV1aWQudjQoKTtcbiAgY29uc3QgY2hhbmdlU2V0ID0gYXdhaXQgY2ZuLmNyZWF0ZUNoYW5nZVNldCh7XG4gICAgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsXG4gICAgQ2hhbmdlU2V0VHlwZTogb3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCA/ICdJTVBPUlQnIDogdXBkYXRlID8gJ1VQREFURScgOiAnQ1JFQVRFJyxcbiAgICBSZXNvdXJjZXNUb0ltcG9ydDogb3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCxcbiAgICBEZXNjcmlwdGlvbjogYENESyBDaGFuZ2VzZXQgZm9yIGV4ZWN1dGlvbiAke2V4ZWN1dGlvbklkfWAsXG4gICAgVGVtcGxhdGVCb2R5OiBib2R5UGFyYW1ldGVyLlRlbXBsYXRlQm9keSxcbiAgICBUZW1wbGF0ZVVSTDogYm9keVBhcmFtZXRlci5UZW1wbGF0ZVVSTCxcbiAgICBQYXJhbWV0ZXJzOiBzdGFja1BhcmFtcy5hcGlQYXJhbWV0ZXJzLFxuICAgIFJvbGVBUk46IG9wdGlvbnMucm9sZUFybixcbiAgICBOb3RpZmljYXRpb25BUk5zOiBvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMsXG4gICAgQ2FwYWJpbGl0aWVzOiBbJ0NBUEFCSUxJVFlfSUFNJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJywgJ0NBUEFCSUxJVFlfQVVUT19FWFBBTkQnXSxcbiAgICBUYWdzOiBvcHRpb25zLnRhZ3MsXG4gIH0pLnByb21pc2UoKTtcbiAgZGVidWcoJ0luaXRpYXRlZCBjcmVhdGlvbiBvZiBjaGFuZ2VzZXQ6ICVzOyB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2ggY3JlYXRpbmcuLi4nLCBjaGFuZ2VTZXQuSWQpO1xuICBjb25zdCBjaGFuZ2VTZXREZXNjcmlwdGlvbiA9IGF3YWl0IHdhaXRGb3JDaGFuZ2VTZXQoY2ZuLCBkZXBsb3lOYW1lLCBjaGFuZ2VTZXROYW1lKTtcblxuICAvLyBVcGRhdGUgdGVybWluYXRpb24gcHJvdGVjdGlvbiBvbmx5IGlmIGl0IGhhcyBjaGFuZ2VkLlxuICBjb25zdCB0ZXJtaW5hdGlvblByb3RlY3Rpb24gPSBzdGFja0FydGlmYWN0LnRlcm1pbmF0aW9uUHJvdGVjdGlvbiA/PyBmYWxzZTtcbiAgaWYgKCEhY2xvdWRGb3JtYXRpb25TdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24gIT09IHRlcm1pbmF0aW9uUHJvdGVjdGlvbikge1xuICAgIGRlYnVnKCdVcGRhdGluZyB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIGZyb20gJXMgdG8gJXMgZm9yIHN0YWNrICVzJywgY2xvdWRGb3JtYXRpb25TdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24sIHRlcm1pbmF0aW9uUHJvdGVjdGlvbiwgZGVwbG95TmFtZSk7XG4gICAgYXdhaXQgY2ZuLnVwZGF0ZVRlcm1pbmF0aW9uUHJvdGVjdGlvbih7XG4gICAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICBFbmFibGVUZXJtaW5hdGlvblByb3RlY3Rpb246IHRlcm1pbmF0aW9uUHJvdGVjdGlvbixcbiAgICB9KS5wcm9taXNlKCk7XG4gICAgZGVidWcoJ1Rlcm1pbmF0aW9uIHByb3RlY3Rpb24gdXBkYXRlZCB0byAlcyBmb3Igc3RhY2sgJXMnLCB0ZXJtaW5hdGlvblByb3RlY3Rpb24sIGRlcGxveU5hbWUpO1xuICB9XG5cbiAgaWYgKGNoYW5nZVNldEhhc05vQ2hhbmdlcyhjaGFuZ2VTZXREZXNjcmlwdGlvbikpIHtcbiAgICBkZWJ1ZygnTm8gY2hhbmdlcyBhcmUgdG8gYmUgcGVyZm9ybWVkIG9uICVzLicsIGRlcGxveU5hbWUpO1xuICAgIGlmIChvcHRpb25zLmV4ZWN1dGUpIHtcbiAgICAgIGRlYnVnKCdEZWxldGluZyBlbXB0eSBjaGFuZ2Ugc2V0ICVzJywgY2hhbmdlU2V0LklkKTtcbiAgICAgIGF3YWl0IGNmbi5kZWxldGVDaGFuZ2VTZXQoeyBTdGFja05hbWU6IGRlcGxveU5hbWUsIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUgfSkucHJvbWlzZSgpO1xuICAgIH1cbiAgICByZXR1cm4geyBub09wOiB0cnVlLCBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsIHN0YWNrQXJuOiBjaGFuZ2VTZXQuU3RhY2tJZCEgfTtcbiAgfVxuXG4gIGNvbnN0IGV4ZWN1dGUgPSBvcHRpb25zLmV4ZWN1dGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLmV4ZWN1dGU7XG4gIGlmIChleGVjdXRlKSB7XG4gICAgZGVidWcoJ0luaXRpYXRpbmcgZXhlY3V0aW9uIG9mIGNoYW5nZXNldCAlcyBvbiBzdGFjayAlcycsIGNoYW5nZVNldC5JZCwgZGVwbG95TmFtZSk7XG5cbiAgICBjb25zdCBzaG91bGREaXNhYmxlUm9sbGJhY2sgPSBvcHRpb25zLnJvbGxiYWNrID09PSBmYWxzZTtcbiAgICAvLyBEbyBhIGJpdCBvZiBjb250b3J0aW9ucyB0byBvbmx5IHBhc3MgdGhlIGBEaXNhYmxlUm9sbGJhY2tgIGZsYWcgaWYgaXQncyB0cnVlLiBUaGF0IHdheSxcbiAgICAvLyBDbG91ZEZvcm1hdGlvbiB3b24ndCBiYWxrIGF0IHRoZSB1bnJlY29nbml6ZWQgb3B0aW9uIGluIHJlZ2lvbnMgd2hlcmUgdGhlIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSB5ZXQuXG4gICAgY29uc3QgZGlzYWJsZVJvbGxiYWNrID0gc2hvdWxkRGlzYWJsZVJvbGxiYWNrID8geyBEaXNhYmxlUm9sbGJhY2s6IHRydWUgfSA6IHVuZGVmaW5lZDtcblxuICAgIGF3YWl0IGNmbi5leGVjdXRlQ2hhbmdlU2V0KHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLCBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXROYW1lLCAuLi5kaXNhYmxlUm9sbGJhY2sgfSkucHJvbWlzZSgpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICBjb25zdCBjaGFuZ2VTZXRMZW5ndGg6IG51bWJlciA9IChjaGFuZ2VTZXREZXNjcmlwdGlvbi5DaGFuZ2VzID8/IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgbW9uaXRvciA9IG9wdGlvbnMucXVpZXQgPyB1bmRlZmluZWQgOiBTdGFja0FjdGl2aXR5TW9uaXRvci53aXRoRGVmYXVsdFByaW50ZXIoY2ZuLCBkZXBsb3lOYW1lLCBzdGFja0FydGlmYWN0LCB7XG4gICAgICAvLyArMSBmb3IgdGhlIGV4dHJhIGV2ZW50IGVtaXR0ZWQgZnJvbSB1cGRhdGVzLlxuICAgICAgcmVzb3VyY2VzVG90YWw6IGNsb3VkRm9ybWF0aW9uU3RhY2suZXhpc3RzID8gY2hhbmdlU2V0TGVuZ3RoICsgMSA6IGNoYW5nZVNldExlbmd0aCxcbiAgICAgIHByb2dyZXNzOiBvcHRpb25zLnByb2dyZXNzLFxuICAgICAgY2hhbmdlU2V0Q3JlYXRpb25UaW1lOiBjaGFuZ2VTZXREZXNjcmlwdGlvbi5DcmVhdGlvblRpbWUsXG4gICAgfSkuc3RhcnQoKTtcbiAgICBkZWJ1ZygnRXhlY3V0aW9uIG9mIGNoYW5nZXNldCAlcyBvbiBzdGFjayAlcyBoYXMgc3RhcnRlZDsgd2FpdGluZyBmb3IgdGhlIHVwZGF0ZSB0byBjb21wbGV0ZS4uLicsIGNoYW5nZVNldC5JZCwgZGVwbG95TmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbmFsU3RhY2sgPSBhd2FpdCB3YWl0Rm9yU3RhY2tEZXBsb3koY2ZuLCBkZXBsb3lOYW1lKTtcblxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiwgYnV0IGNhdGNoIGl0IGFueXdheS4gWW91IG5ldmVyIGtub3cuXG4gICAgICBpZiAoIWZpbmFsU3RhY2spIHsgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBkZXBsb3kgZmFpbGVkICh0aGUgc3RhY2sgZGlzYXBwZWFyZWQgd2hpbGUgd2Ugd2VyZSBkZXBsb3lpbmcgaXQpJyk7IH1cbiAgICAgIGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBmaW5hbFN0YWNrO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBtb25pdG9yPy5zdG9wKCk7XG4gICAgfVxuICAgIGRlYnVnKCdTdGFjayAlcyBoYXMgY29tcGxldGVkIHVwZGF0aW5nJywgZGVwbG95TmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbnQoJ0NoYW5nZXNldCAlcyBjcmVhdGVkIGFuZCB3YWl0aW5nIGluIHJldmlldyBmb3IgbWFudWFsIGV4ZWN1dGlvbiAoLS1uby1leGVjdXRlKScsIGNoYW5nZVNldC5JZCk7XG4gIH1cblxuICByZXR1cm4geyBub09wOiBmYWxzZSwgb3V0cHV0czogY2xvdWRGb3JtYXRpb25TdGFjay5vdXRwdXRzLCBzdGFja0FybjogY2hhbmdlU2V0LlN0YWNrSWQhIH07XG59XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIGJvZHkgcGFyYW1ldGVyIGZvciArQ3JlYXRlQ2hhbmdlU2V0Ky5cbiAqXG4gKiBJZiB0aGUgdGVtcGxhdGUgaXMgc21hbGwgZW5vdWdoIHRvIGJlIGlubGluZWQgaW50byB0aGUgQVBJIGNhbGwsIGp1c3QgcmV0dXJuXG4gKiBpdCBpbW1lZGlhdGVseS5cbiAqXG4gKiBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgYXNzZXQgbWFuaWZlc3QgdG8gZ2V0IHVwbG9hZGVkIHRvIHRoZSBzdGFnaW5nXG4gKiBidWNrZXQgYW5kIHJldHVybiBpdHMgY29vcmRpbmF0ZXMuIElmIHRoZXJlIGlzIG5vIHN0YWdpbmcgYnVja2V0LCBhbiBlcnJvclxuICogaXMgdGhyb3duLlxuICpcbiAqIEBwYXJhbSBzdGFjayAgICAgdGhlIHN5bnRoZXNpemVkIHN0YWNrIHRoYXQgcHJvdmlkZXMgdGhlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gKiBAcGFyYW0gdG9vbGtpdEluZm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRvb2xraXQgc3RhY2tcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFrZUJvZHlQYXJhbWV0ZXIoXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gIHJlc29sdmVkRW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LFxuICBhc3NldE1hbmlmZXN0OiBBc3NldE1hbmlmZXN0QnVpbGRlcixcbiAgdG9vbGtpdEluZm86IFRvb2xraXRJbmZvLFxuICBzZGs6IElTREssXG4gIG92ZXJyaWRlVGVtcGxhdGU/OiBhbnksXG4pOiBQcm9taXNlPFRlbXBsYXRlQm9keVBhcmFtZXRlcj4ge1xuXG4gIC8vIElmIHRoZSB0ZW1wbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHVwbG9hZGVkIHRvIFMzLCBqdXN0IHVzZSBpdCBmcm9tIHRoZXJlLlxuICBpZiAoc3RhY2suc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsICYmICFvdmVycmlkZVRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHsgVGVtcGxhdGVVUkw6IHJlc3RVcmxGcm9tTWFuaWZlc3Qoc3RhY2suc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsLCByZXNvbHZlZEVudmlyb25tZW50LCBzZGspIH07XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIHBhc3MgdmlhIEFQSSBjYWxsIChpZiBzbWFsbCkgb3IgdXBsb2FkIGhlcmUgKGlmIGxhcmdlKVxuICBjb25zdCB0ZW1wbGF0ZUpzb24gPSB0b1lBTUwob3ZlcnJpZGVUZW1wbGF0ZSA/PyBzdGFjay50ZW1wbGF0ZSk7XG5cbiAgaWYgKHRlbXBsYXRlSnNvbi5sZW5ndGggPD0gTEFSR0VfVEVNUExBVEVfU0laRV9LQiAqIDEwMjQpIHtcbiAgICByZXR1cm4geyBUZW1wbGF0ZUJvZHk6IHRlbXBsYXRlSnNvbiB9O1xuICB9XG5cbiAgaWYgKCF0b29sa2l0SW5mby5mb3VuZCkge1xuICAgIGVycm9yKFxuICAgICAgYFRoZSB0ZW1wbGF0ZSBmb3Igc3RhY2sgXCIke3N0YWNrLmRpc3BsYXlOYW1lfVwiIGlzICR7TWF0aC5yb3VuZCh0ZW1wbGF0ZUpzb24ubGVuZ3RoIC8gMTAyNCl9S2lCLiBgICtcbiAgICAgIGBUZW1wbGF0ZXMgbGFyZ2VyIHRoYW4gJHtMQVJHRV9URU1QTEFURV9TSVpFX0tCfUtpQiBtdXN0IGJlIHVwbG9hZGVkIHRvIFMzLlxcbmAgK1xuICAgICAgJ1J1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gb3JkZXIgdG8gc2V0dXAgYW4gUzMgYnVja2V0IGluIHRoaXMgZW52aXJvbm1lbnQsIGFuZCB0aGVuIHJlLWRlcGxveTpcXG5cXG4nLFxuICAgICAgY2hhbGsuYmx1ZShgXFx0JCBjZGsgYm9vdHN0cmFwICR7cmVzb2x2ZWRFbnZpcm9ubWVudC5uYW1lfVxcbmApKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignVGVtcGxhdGUgdG9vIGxhcmdlIHRvIGRlcGxveSAoXCJjZGsgYm9vdHN0cmFwXCIgaXMgcmVxdWlyZWQpJyk7XG4gIH1cblxuICBjb25zdCB0ZW1wbGF0ZUhhc2ggPSBjb250ZW50SGFzaCh0ZW1wbGF0ZUpzb24pO1xuICBjb25zdCBrZXkgPSBgY2RrLyR7c3RhY2suaWR9LyR7dGVtcGxhdGVIYXNofS55bWxgO1xuXG4gIGxldCB0ZW1wbGF0ZUZpbGUgPSBzdGFjay50ZW1wbGF0ZUZpbGU7XG4gIGlmIChvdmVycmlkZVRlbXBsYXRlKSB7XG4gICAgLy8gQWRkIGEgdmFyaWFudCBvZiB0aGlzIHRlbXBsYXRlXG4gICAgdGVtcGxhdGVGaWxlID0gYCR7c3RhY2sudGVtcGxhdGVGaWxlfS0ke3RlbXBsYXRlSGFzaH0ueWFtbGA7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBsYXRlRmlsZSwgdGVtcGxhdGVKc29uLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICB9XG5cbiAgYXNzZXRNYW5pZmVzdC5hZGRGaWxlQXNzZXQodGVtcGxhdGVIYXNoLCB7XG4gICAgcGF0aDogdGVtcGxhdGVGaWxlLFxuICB9LCB7XG4gICAgYnVja2V0TmFtZTogdG9vbGtpdEluZm8uYnVja2V0TmFtZSxcbiAgICBvYmplY3RLZXk6IGtleSxcbiAgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGVVUkwgPSBgJHt0b29sa2l0SW5mby5idWNrZXRVcmx9LyR7a2V5fWA7XG4gIGRlYnVnKCdTdG9yaW5nIHRlbXBsYXRlIGluIFMzIGF0OicsIHRlbXBsYXRlVVJMKTtcbiAgcmV0dXJuIHsgVGVtcGxhdGVVUkw6IHRlbXBsYXRlVVJMIH07XG59XG5cbi8qKlxuICogUHJlcGFyZSBhIGJvZHkgcGFyYW1ldGVyIGZvciBDRk4sIHBlcmZvcm1pbmcgdGhlIHVwbG9hZFxuICpcbiAqIFJldHVybiBpdCBhcy1pcyBpZiBpdCBpcyBzbWFsbCBlbm91Z2ggdG8gcGFzcyBpbiB0aGUgQVBJIGNhbGwsXG4gKiB1cGxvYWQgdG8gUzMgYW5kIHJldHVybiB0aGUgY29vcmRpbmF0ZXMgaWYgaXQgaXMgbm90LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFrZUJvZHlQYXJhbWV0ZXJBbmRVcGxvYWQoXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gIHJlc29sdmVkRW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LFxuICB0b29sa2l0SW5mbzogVG9vbGtpdEluZm8sXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcixcbiAgc2RrOiBJU0RLLFxuICBvdmVycmlkZVRlbXBsYXRlPzogYW55KTogUHJvbWlzZTxUZW1wbGF0ZUJvZHlQYXJhbWV0ZXI+IHtcblxuICAvLyBXZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYWN0dWFsIGFzc2V0IG1hbmlmZXN0IGhlcmUsIHNvIHByZXRlbmQgdGhhdCB0aGVcbiAgLy8gc3RhY2sgZG9lc24ndCBoYXZlIGEgcHJlLXB1Ymxpc2hlZCBVUkwuXG4gIGNvbnN0IGZvcmNlVXBsb2FkU3RhY2sgPSBPYmplY3QuY3JlYXRlKHN0YWNrLCB7XG4gICAgc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsOiB7IHZhbHVlOiB1bmRlZmluZWQgfSxcbiAgfSk7XG5cbiAgY29uc3QgYnVpbGRlciA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICBjb25zdCBib2R5cGFyYW0gPSBhd2FpdCBtYWtlQm9keVBhcmFtZXRlcihmb3JjZVVwbG9hZFN0YWNrLCByZXNvbHZlZEVudmlyb25tZW50LCBidWlsZGVyLCB0b29sa2l0SW5mbywgc2RrLCBvdmVycmlkZVRlbXBsYXRlKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBidWlsZGVyLnRvTWFuaWZlc3Qoc3RhY2suYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgYXdhaXQgcHVibGlzaEFzc2V0cyhtYW5pZmVzdCwgc2RrUHJvdmlkZXIsIHJlc29sdmVkRW52aXJvbm1lbnQsIHsgcXVpZXQ6IHRydWUgfSk7XG4gIHJldHVybiBib2R5cGFyYW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJveVN0YWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gYmUgZGVzdHJveWVkXG4gICAqL1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIHNkazogSVNESztcbiAgcm9sZUFybj86IHN0cmluZztcbiAgZGVwbG95TmFtZT86IHN0cmluZztcbiAgcXVpZXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzdHJveVN0YWNrKG9wdGlvbnM6IERlc3Ryb3lTdGFja09wdGlvbnMpIHtcbiAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuZGVwbG95TmFtZSB8fCBvcHRpb25zLnN0YWNrLnN0YWNrTmFtZTtcbiAgY29uc3QgY2ZuID0gb3B0aW9ucy5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICBjb25zdCBjdXJyZW50U3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICBpZiAoIWN1cnJlbnRTdGFjay5leGlzdHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbW9uaXRvciA9IG9wdGlvbnMucXVpZXQgPyB1bmRlZmluZWQgOiBTdGFja0FjdGl2aXR5TW9uaXRvci53aXRoRGVmYXVsdFByaW50ZXIoY2ZuLCBkZXBsb3lOYW1lLCBvcHRpb25zLnN0YWNrKS5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2ZuLmRlbGV0ZVN0YWNrKHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLCBSb2xlQVJOOiBvcHRpb25zLnJvbGVBcm4gfSkucHJvbWlzZSgpO1xuICAgIGNvbnN0IGRlc3Ryb3llZFN0YWNrID0gYXdhaXQgd2FpdEZvclN0YWNrRGVsZXRlKGNmbiwgZGVwbG95TmFtZSk7XG4gICAgaWYgKGRlc3Ryb3llZFN0YWNrICYmIGRlc3Ryb3llZFN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdERUxFVEVfQ09NUExFVEUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXN0cm95ICR7ZGVwbG95TmFtZX06ICR7ZGVzdHJveWVkU3RhY2suc3RhY2tTdGF0dXN9YCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChtb25pdG9yKSB7IGF3YWl0IG1vbml0b3Iuc3RvcCgpOyB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB3ZSBjYW4gc2tpcCBkZXBsb3ltZW50XG4gKlxuICogV2UgZG8gdGhpcyBpbiBhIGNvbXBsaWNhdGVkIHdheSBieSBwcmVwcm9jZXNzaW5nIChpbnN0ZWFkIG9mIGp1c3RcbiAqIGxvb2tpbmcgYXQgdGhlIGNoYW5nZXNldCksIGJlY2F1c2UgaWYgdGhlcmUgYXJlIG5lc3RlZCBzdGFja3MgaW52b2x2ZWRcbiAqIHRoZSBjaGFuZ2VzZXQgd2lsbCBhbHdheXMgc2hvdyB0aGUgbmVzdGVkIHN0YWNrcyBhcyBuZWVkaW5nIHRvIGJlXG4gKiB1cGRhdGVkLCBhbmQgdGhlIGRlcGxveW1lbnQgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIHRvIGluIGVmZmVjdCBub3RcbiAqIGRvIGFueXRoaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBjYW5Ta2lwRGVwbG95KFxuICBkZXBsb3lTdGFja09wdGlvbnM6IERlcGxveVN0YWNrT3B0aW9ucyxcbiAgY2xvdWRGb3JtYXRpb25TdGFjazogQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgcGFyYW1ldGVyQ2hhbmdlczogUGFyYW1ldGVyQ2hhbmdlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gIGNvbnN0IGRlcGxveU5hbWUgPSBkZXBsb3lTdGFja09wdGlvbnMuZGVwbG95TmFtZSB8fCBkZXBsb3lTdGFja09wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogY2hlY2tpbmcgaWYgd2UgY2FuIHNraXAgZGVwbG95YCk7XG5cbiAgLy8gRm9yY2VkIGRlcGxveVxuICBpZiAoZGVwbG95U3RhY2tPcHRpb25zLmZvcmNlKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IGZvcmNlZCBkZXBsb3ltZW50YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ3JlYXRpbmcgY2hhbmdlc2V0IG9ubHkgKGRlZmF1bHQgdHJ1ZSksIG5ldmVyIHNraXBcbiAgaWYgKGRlcGxveVN0YWNrT3B0aW9ucy5leGVjdXRlID09PSBmYWxzZSkge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiAtLW5vLWV4ZWN1dGUsIGFsd2F5cyBjcmVhdGluZyBjaGFuZ2Ugc2V0YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTm8gZXhpc3Rpbmcgc3RhY2tcbiAgaWYgKCFjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiBubyBleGlzdGluZyBzdGFja2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlbXBsYXRlIGhhcyBjaGFuZ2VkIChhc3NldHMgdGFrZW4gaW50byBhY2NvdW50IGhlcmUpXG4gIGlmIChKU09OLnN0cmluZ2lmeShkZXBsb3lTdGFja09wdGlvbnMuc3RhY2sudGVtcGxhdGUpICE9PSBKU09OLnN0cmluZ2lmeShhd2FpdCBjbG91ZEZvcm1hdGlvblN0YWNrLnRlbXBsYXRlKCkpKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHRlbXBsYXRlIGhhcyBjaGFuZ2VkYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGFncyBoYXZlIGNoYW5nZWRcbiAgaWYgKCFjb21wYXJlVGFncyhjbG91ZEZvcm1hdGlvblN0YWNrLnRhZ3MsIGRlcGxveVN0YWNrT3B0aW9ucy50YWdzID8/IFtdKSkge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiB0YWdzIGhhdmUgY2hhbmdlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZFxuICBpZiAoISFkZXBsb3lTdGFja09wdGlvbnMuc3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSAhIWNsb3VkRm9ybWF0aW9uU3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkXG4gIGlmIChwYXJhbWV0ZXJDaGFuZ2VzKSB7XG4gICAgaWYgKHBhcmFtZXRlckNoYW5nZXMgPT09ICdzc20nKSB7XG4gICAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogc29tZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSBTU00gc28gd2UgaGF2ZSB0byBhc3N1bWUgdGhleSBtYXkgaGF2ZSBjaGFuZ2VkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZGApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFeGlzdGluZyBzdGFjayBpcyBpbiBhIGZhaWxlZCBzdGF0ZVxuICBpZiAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5pc0ZhaWx1cmUpIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogc3RhY2sgaXMgaW4gYSBmYWlsdXJlIHN0YXRlYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2UgY2FuIHNraXAgZGVwbG95XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBsaXN0IG9mIHRhZ3MsIHJldHVybnMgdHJ1ZSBpZiBpZGVudGljYWwuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVUYWdzKGE6IFRhZ1tdLCBiOiBUYWdbXSk6IGJvb2xlYW4ge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBhVGFnIG9mIGEpIHtcbiAgICBjb25zdCBiVGFnID0gYi5maW5kKHRhZyA9PiB0YWcuS2V5ID09PSBhVGFnLktleSk7XG5cbiAgICBpZiAoIWJUYWcgfHwgYlRhZy5WYWx1ZSAhPT0gYVRhZy5WYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEZvcm1hdCBhbiBTMyBVUkwgaW4gdGhlIG1hbmlmZXN0IGZvciB1c2Ugd2l0aCBDbG91ZEZvcm1hdGlvblxuICpcbiAqIFJlcGxhY2VzIGVudmlyb25tZW50IHBsYWNlaG9sZGVycyAod2hpY2ggdGhpcyBmaWVsZCBtYXkgY29udGFpbiksXG4gKiBhbmQgcmVmb3JtYXRzIHMzOi8vLi4uLy4uLiB1cmxzIGludG8gUzMgUkVTVCBVUkxzICh3aGljaCBDbG91ZEZvcm1hdGlvblxuICogZXhwZWN0cylcbiAqL1xuZnVuY3Rpb24gcmVzdFVybEZyb21NYW5pZmVzdCh1cmw6IHN0cmluZywgZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LCBzZGs6IElTREspOiBzdHJpbmcge1xuICBjb25zdCBkb05vdFVzZU1hcmtlciA9ICcqKkRPTk9UVVNFKionO1xuICAvLyBUaGlzIFVSTCBtYXkgY29udGFpbiBwbGFjZWhvbGRlcnMsIHNvIHN0aWxsIHN1YnN0aXR1dGUgdGhvc2UuXG4gIHVybCA9IGN4YXBpLkVudmlyb25tZW50UGxhY2Vob2xkZXJzLnJlcGxhY2UodXJsLCB7XG4gICAgYWNjb3VudElkOiBlbnZpcm9ubWVudC5hY2NvdW50LFxuICAgIHJlZ2lvbjogZW52aXJvbm1lbnQucmVnaW9uLFxuICAgIHBhcnRpdGlvbjogZG9Ob3RVc2VNYXJrZXIsXG4gIH0pO1xuXG4gIC8vIFllcywgdGhpcyBpcyBleHRyZW1lbHkgY3J1ZGUsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRoaXMgc28gSSdtIG5vdCBpbmNsaW5lZCB0byBzcGVuZFxuICAvLyBhIGxvdCBvZiBlZmZvcnQgdHJ5aW5nIHRvIHRocmVhZCB0aGUgcmlnaHQgdmFsdWUgdG8gdGhpcyBsb2NhdGlvbi5cbiAgaWYgKHVybC5pbmRleE9mKGRvTm90VXNlTWFya2VyKSA+IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIFxcJyR7QVdTOjpQYXJ0aXRpb259XFwnIGluIHRoZSBcXCdzdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmxcXCcgZmllbGQnKTtcbiAgfVxuXG4gIGNvbnN0IHMzVXJsID0gdXJsLm1hdGNoKC9zMzpcXC9cXC8oW14vXSspXFwvKC4qKSQvKTtcbiAgaWYgKCFzM1VybCkgeyByZXR1cm4gdXJsOyB9XG5cbiAgLy8gV2UgbmVlZCB0byBwYXNzIGFuICdodHRwczovL3MzLlJFR0lPTi5hbWF6b25hd3MuY29tWy5jbl0vYnVja2V0L29iamVjdCcgVVJMIHRvIENsb3VkRm9ybWF0aW9uLCBidXQgd2VcbiAgLy8gZ290IGFuICdzMzovL2J1Y2tldC9vYmplY3QnIFVSTCBpbnN0ZWFkLiBDb25zdHJ1Y3QgdGhlIHJlc3QgQVBJIFVSTCBoZXJlLlxuICBjb25zdCBidWNrZXROYW1lID0gczNVcmxbMV07XG4gIGNvbnN0IG9iamVjdEtleSA9IHMzVXJsWzJdO1xuXG4gIGNvbnN0IHVybFN1ZmZpeDogc3RyaW5nID0gc2RrLmdldEVuZHBvaW50U3VmZml4KGVudmlyb25tZW50LnJlZ2lvbik7XG4gIHJldHVybiBgaHR0cHM6Ly9zMy4ke2Vudmlyb25tZW50LnJlZ2lvbn0uJHt1cmxTdWZmaXh9LyR7YnVja2V0TmFtZX0vJHtvYmplY3RLZXl9YDtcbn1cbiJdfQ==
@@ -290,6 +290,7 @@ const RESOURCE_TYPE_ATTRIBUTES_FORMATS = {
290
290
  // the name attribute of the EventBus is the same as the Ref
291
291
  Name: parts => parts.resourceName,
292
292
  },
293
+ 'AWS::DynamoDB::Table': { Arn: stdSlashResourceArnFmt },
293
294
  'AWS::AppSync::GraphQLApi': { ApiId: appsyncGraphQlApiApiIdFmt },
294
295
  };
295
296
  function iamArnFmt(parts) {
@@ -327,7 +328,7 @@ async function asyncGlobalReplace(str, regex, cb) {
327
328
  ret.push(await cb(match[1]));
328
329
  start = regex.lastIndex;
329
330
  }
330
- ret.push(str.substr(start));
331
+ ret.push(str.slice(start));
331
332
  return ret.join('');
332
333
  }
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxNQUFhLHNCQUFzQjtJQUdqQyxZQUE2QixHQUFTLEVBQW1CLFNBQWlCO1FBQTdDLFFBQUcsR0FBSCxHQUFHLENBQU07UUFBbUIsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUMxRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQjtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBNkI7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQTJDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO1lBQ2xELFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBQyxzQkFBc0IsRUFBQyxFQUFFOztZQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsbUNBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLHNCQUFzQixDQUFDLFNBQVMsRUFBRTtnQkFDcEMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDN0U7WUFD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SSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztLQUFFO0lBRTdFLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDaEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxJQUFJLEVBQUU7UUFDWCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFBRSxNQUFNO1NBQUU7UUFFdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7S0FDekI7SUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUU1QixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IElTREsgfSBmcm9tICcuL2F3cy1hdXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0U3RhY2tSZXNvdXJjZXMge1xuICBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxBV1MuQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnlbXT47XG59XG5cbmV4cG9ydCBjbGFzcyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzIGltcGxlbWVudHMgTGlzdFN0YWNrUmVzb3VyY2VzIHtcbiAgcHJpdmF0ZSBzdGFja1Jlc291cmNlczogUHJvbWlzZTxBV1MuQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzZGs6IElTREssIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmcpIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxBV1MuQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4ge1xuICAgIGlmICh0aGlzLnN0YWNrUmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSB0aGlzLmdldFN0YWNrUmVzb3VyY2VzKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YWNrUmVzb3VyY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRTdGFja1Jlc291cmNlcyhuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8QVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+IHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8QVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5PigpO1xuICAgIHJldHVybiB0aGlzLnNkay5jbG91ZEZvcm1hdGlvbigpLmxpc3RTdGFja1Jlc291cmNlcyh7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgfSkucHJvbWlzZSgpLnRoZW4oYXN5bmMgc3RhY2tSZXNvdXJjZXNSZXNwb25zZSA9PiB7XG4gICAgICByZXQucHVzaCguLi4oc3RhY2tSZXNvdXJjZXNSZXNwb25zZS5TdGFja1Jlc291cmNlU3VtbWFyaWVzID8/IFtdKSk7XG4gICAgICBpZiAoc3RhY2tSZXNvdXJjZXNSZXNwb25zZS5OZXh0VG9rZW4pIHtcbiAgICAgICAgcmV0LnB1c2goLi4uYXdhaXQgdGhpcy5nZXRTdGFja1Jlc291cmNlcyhzdGFja1Jlc291cmNlc1Jlc3BvbnNlLk5leHRUb2tlbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VEZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgTG9naWNhbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgUHJvcGVydGllczogeyBbcDogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlUHJvcHMge1xuICByZWFkb25seSB0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsU3VmZml4OiAocmVnaW9uOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcmVhZG9ubHkgbGlzdFN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IHsgW2s6IHN0cmluZ106IGFueSB9O1xuICBwcml2YXRlIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxTdWZmaXg6IChyZWdpb246IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcml2YXRlIGNhY2hlZFVybFN1ZmZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGVQcm9wcykge1xuICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSBwcm9wcy5saXN0U3RhY2tSZXNvdXJjZXM7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHByb3BzLnRlbXBsYXRlO1xuICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgICdBV1M6OkFjY291bnRJZCc6IHByb3BzLmFjY291bnQsXG4gICAgICAnQVdTOjpSZWdpb24nOiBwcm9wcy5yZWdpb24sXG4gICAgICAnQVdTOjpQYXJ0aXRpb24nOiBwcm9wcy5wYXJ0aXRpb24sXG4gICAgICAuLi5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgIH07XG4gICAgdGhpcy5hY2NvdW50ID0gcHJvcHMuYWNjb3VudDtcbiAgICB0aGlzLnJlZ2lvbiA9IHByb3BzLnJlZ2lvbjtcbiAgICB0aGlzLnBhcnRpdGlvbiA9IHByb3BzLnBhcnRpdGlvbjtcbiAgICB0aGlzLnVybFN1ZmZpeCA9IHByb3BzLnVybFN1ZmZpeDtcbiAgfVxuXG4gIC8vIGNsb25lcyBjdXJyZW50IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSBvYmplY3QsIGJ1dCB1cGRhdGVzIHRoZSBzdGFjayBuYW1lXG4gIHB1YmxpYyBjcmVhdGVOZXN0ZWRFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoXG4gICAgbGlzdE5lc3RlZFN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXMsXG4gICAgbmVzdGVkVGVtcGxhdGU6IFRlbXBsYXRlLFxuICAgIG5lc3RlZFN0YWNrUGFyYW1ldGVyczogeyBbcGFyYW1ldGVyTmFtZTogc3RyaW5nXTogYW55IH0sXG4gICkge1xuICAgIHJldHVybiBuZXcgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICAgIHRlbXBsYXRlOiBuZXN0ZWRUZW1wbGF0ZSxcbiAgICAgIHBhcmFtZXRlcnM6IG5lc3RlZFN0YWNrUGFyYW1ldGVycyxcbiAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgdXJsU3VmZml4OiB0aGlzLnVybFN1ZmZpeCxcbiAgICAgIGxpc3RTdGFja1Jlc291cmNlczogbGlzdE5lc3RlZFN0YWNrUmVzb3VyY2VzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGFibGlzaFJlc291cmNlUGh5c2ljYWxOYW1lKGxvZ2ljYWxJZDogc3RyaW5nLCBwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlOiBhbnkpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmIChwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZhbHVhdGUgdGhlIHJlc291cmNlJ3MgbmFtZSBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uLFxuICAgICAgICAvLyBqdXN0IGxvb2sgaXQgdXAgaW4gdGhlIGN1cnJlbnRseSBkZXBsb3llZCBTdGFja1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRQaHlzaWNhbE5hbWVGb3IobG9naWNhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kUGh5c2ljYWxOYW1lRm9yKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoc3IgPT4gc3IuTG9naWNhbFJlc291cmNlSWQgPT09IGxvZ2ljYWxJZCk/LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kTG9naWNhbElkRm9yUGh5c2ljYWxOYW1lKHBoeXNpY2FsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoc3IgPT4gc3IuUGh5c2ljYWxSZXNvdXJjZUlkID09PSBwaHlzaWNhbE5hbWUpPy5Mb2dpY2FsUmVzb3VyY2VJZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZDogc3RyaW5nKTogQXJyYXk8UmVzb3VyY2VEZWZpbml0aW9uPiB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFJlc291cmNlRGVmaW5pdGlvbj4oKTtcbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZUxvZ2ljYWxJZCwgcmVzb3VyY2VEZWZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudGVtcGxhdGU/LlJlc291cmNlcyA/PyB7fSkpIHtcbiAgICAgIGlmIChsb2dpY2FsSWQgIT09IHJlc291cmNlTG9naWNhbElkICYmIHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIHJlc291cmNlRGVmKSkge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgLi4uKHJlc291cmNlRGVmIGFzIGFueSksXG4gICAgICAgICAgTG9naWNhbElkOiByZXNvdXJjZUxvZ2ljYWxJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGVDZm5FeHByZXNzaW9uKGNmbkV4cHJlc3Npb246IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY2xhc3MgQ2ZuSW50cmluc2ljcyB7XG4gICAgICBwdWJsaWMgZXZhbHVhdGVJbnRyaW5zaWMoaW50cmluc2ljOiBJbnRyaW5zaWMpOiBhbnkge1xuICAgICAgICBjb25zdCBpbnRyaW5zaWNGdW5jID0gKHRoaXMgYXMgYW55KVtpbnRyaW5zaWMubmFtZV07XG4gICAgICAgIGlmICghaW50cmluc2ljRnVuYykge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBDbG91ZEZvcm1hdGlvbiBmdW5jdGlvbiAke2ludHJpbnNpYy5uYW1lfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzQXNBcnJheSA9IEFycmF5LmlzQXJyYXkoaW50cmluc2ljLmFyZ3MpID8gaW50cmluc2ljLmFyZ3MgOiBbaW50cmluc2ljLmFyZ3NdO1xuXG4gICAgICAgIHJldHVybiBpbnRyaW5zaWNGdW5jLmFwcGx5KHRoaXMsIGFyZ3NBc0FycmF5KTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpKb2luJyhzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRBcmdzID0gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZWRBcmdzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTcGxpdCcoc2VwYXJhdG9yOiBzdHJpbmcsIGFyZ3M6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZEFyZ3Muc3BsaXQoc2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTZWxlY3QnKGluZGV4OiBudW1iZXIsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkQXJncyA9IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVkQXJnc1tpbmRleF07XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdSZWYnKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVmVGFyZ2V0ID0gYXdhaXQgc2VsZi5maW5kUmVmVGFyZ2V0KGxvZ2ljYWxJZCk7XG4gICAgICAgIGlmIChyZWZUYXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmVmVGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBQYXJhbWV0ZXIgb3IgcmVzb3VyY2UgJyR7bG9naWNhbElkfScgY291bGQgbm90IGJlIGZvdW5kIGZvciBldmFsdWF0aW9uYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpHZXRBdHQnKGxvZ2ljYWxJZDogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBUb0RvIGhhbmRsZSB0aGUgJ2xvZ2ljYWxJZC5hdHRyaWJ1dGVOYW1lJyBmb3JtIG9mIEZuOjpHZXRBdHRcbiAgICAgICAgY29uc3QgYXR0clZhbHVlID0gYXdhaXQgc2VsZi5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYXR0clZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBBdHRyaWJ1dGUgJyR7YXR0cmlidXRlTmFtZX0nIG9mIHJlc291cmNlICcke2xvZ2ljYWxJZH0nIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgZXZhbHVhdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U3ViJyh0ZW1wbGF0ZTogc3RyaW5nLCBleHBsaWNpdFBsYWNlaG9sZGVycz86IHsgW3ZhcmlhYmxlOiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGV4cGxpY2l0UGxhY2Vob2xkZXJzXG4gICAgICAgICAgPyBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihleHBsaWNpdFBsYWNlaG9sZGVycylcbiAgICAgICAgICA6IHt9O1xuXG4gICAgICAgIHJldHVybiBhc3luY0dsb2JhbFJlcGxhY2UodGVtcGxhdGUsIC9cXCR7KFtefV0qKX0vZywga2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIHBsYWNlaG9sZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0S2V5Lmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICA/IHRoaXMuUmVmKGtleSlcbiAgICAgICAgICAgICAgOiB0aGlzWydGbjo6R2V0QXR0J10oc3BsaXRLZXlbMF0sIHNwbGl0S2V5LnNsaWNlKDEpLmpvaW4oJy4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ZuRXhwcmVzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2ZuRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjZm5FeHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNmbkV4cHJlc3Npb24ubWFwKGV4cHIgPT4gdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oZXhwcikpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNmbkV4cHJlc3Npb24gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBpbnRyaW5zaWMgPSB0aGlzLnBhcnNlSW50cmluc2ljKGNmbkV4cHJlc3Npb24pO1xuICAgICAgaWYgKGludHJpbnNpYykge1xuICAgICAgICByZXR1cm4gbmV3IENmbkludHJpbnNpY3MoKS5ldmFsdWF0ZUludHJpbnNpYyhpbnRyaW5zaWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhjZm5FeHByZXNzaW9uKSkge1xuICAgICAgICAgIHJldFtrZXldID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjZm5FeHByZXNzaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2VzKGxvZ2ljYWxJZDogc3RyaW5nLCB0ZW1wbGF0ZUVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxJZCA9PT0gdGVtcGxhdGVFbGVtZW50O1xuICAgIH1cblxuICAgIGlmICh0ZW1wbGF0ZUVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXBsYXRlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZUVsZW1lbnQuc29tZShlbCA9PiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCBlbCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGVtcGxhdGVFbGVtZW50KS5zb21lKGVsID0+IHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIGVsKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUludHJpbnNpYyh4OiBhbnkpOiBJbnRyaW5zaWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh4KTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYgKGtleXNbMF0uc3RhcnRzV2l0aCgnRm46OicpIHx8IGtleXNbMF0gPT09ICdSZWYnKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5c1swXSxcbiAgICAgICAgYXJnczogeFtrZXlzWzBdXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRSZWZUYXJnZXQobG9naWNhbElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIGZpcnN0LCBjaGVjayB0byBzZWUgaWYgdGhlIFJlZiBpcyBhIFBhcmFtZXRlciB3aG8ncyB2YWx1ZSB3ZSBoYXZlXG4gICAgaWYgKGxvZ2ljYWxJZCA9PT0gJ0FXUzo6VVJMU3VmZml4Jykge1xuICAgICAgaWYgKCF0aGlzLmNhY2hlZFVybFN1ZmZpeCkge1xuICAgICAgICB0aGlzLmNhY2hlZFVybFN1ZmZpeCA9IHRoaXMudXJsU3VmZml4KHRoaXMucmVnaW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkVXJsU3VmZml4O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlclRhcmdldCA9IHRoaXMuY29udGV4dFtsb2dpY2FsSWRdO1xuICAgIGlmIChwYXJhbWV0ZXJUYXJnZXQpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXJUYXJnZXQ7XG4gICAgfVxuICAgIC8vIGlmIGl0J3Mgbm90IGEgUGFyYW1ldGVyLCB3ZSBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgY3VycmVudCBTdGFjayByZXNvdXJjZXNcbiAgICByZXR1cm4gdGhpcy5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCB0aGlzLnN0YWNrUmVzb3VyY2VzLmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgIGNvbnN0IGZvdW5kUmVzb3VyY2UgPSBzdGFja1Jlc291cmNlcy5maW5kKHNyID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBsb2dpY2FsSWQpO1xuICAgIGlmICghZm91bmRSZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gbm93LCB3ZSBuZWVkIHRvIGZvcm1hdCB0aGUgYXBwcm9wcmlhdGUgaWRlbnRpZmllciBkZXBlbmRpbmcgb24gdGhlIHJlc291cmNlIHR5cGUsXG4gICAgLy8gYW5kIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlIG5hbWVcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShmb3VuZFJlc291cmNlLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShyZXNvdXJjZTogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5LCBhdHRyaWJ1dGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGh5c2ljYWxJZCA9IHJlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZDtcblxuICAgIC8vIG5vIGF0dHJpYnV0ZSBtZWFucyBSZWYgZXhwcmVzc2lvbiwgZm9yIHdoaWNoIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgZGlyZWN0bHlcbiAgICBpZiAoIWF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuIHBoeXNpY2FsSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlRm9ybWF0cyA9IFJFU09VUkNFX1RZUEVfQVRUUklCVVRFU19GT1JNQVRTW3Jlc291cmNlLlJlc291cmNlVHlwZV07XG4gICAgaWYgKCFyZXNvdXJjZVR5cGVGb3JtYXRzKSB7XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgV2UgZG9uJ3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZS4gVGhpcyBpcyBhIENESyBsaW1pdGF0aW9uLiBgICtcbiAgICAgICAgJ1BsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZUZtdEZ1bmMgPSByZXNvdXJjZVR5cGVGb3JtYXRzW2F0dHJpYnV0ZV07XG4gICAgaWYgKCFhdHRyaWJ1dGVGbXRGdW5jKSB7XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgV2UgZG9uJ3Qgc3VwcG9ydCB0aGUgJyR7YXR0cmlidXRlfScgYXR0cmlidXRlIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZS4gVGhpcyBpcyBhIENESyBsaW1pdGF0aW9uLiBgICtcbiAgICAgICAgJ1BsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2VPZlJlc291cmNlKHJlc291cmNlKTtcbiAgICBjb25zdCByZXNvdXJjZVR5cGVBcm5QYXJ0ID0gdGhpcy5nZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZUZtdEZ1bmMoe1xuICAgICAgcGFydGl0aW9uOiB0aGlzLnBhcnRpdGlvbixcbiAgICAgIHNlcnZpY2UsXG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGVBcm5QYXJ0LFxuICAgICAgcmVzb3VyY2VOYW1lOiBwaHlzaWNhbElkISxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmljZU9mUmVzb3VyY2UocmVzb3VyY2U6IEFXUy5DbG91ZEZvcm1hdGlvbi5TdGFja1Jlc291cmNlU3VtbWFyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc291cmNlLlJlc291cmNlVHlwZS5zcGxpdCgnOjonKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZTogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSByZXNvdXJjZS5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3Qgc3BlY2lhbENhc2VSZXNvdXJjZVR5cGUgPSBSRVNPVVJDRV9UWVBFX1NQRUNJQUxfTkFNRVNbcmVzb3VyY2VUeXBlXT8ucmVzb3VyY2VUeXBlO1xuICAgIHJldHVybiBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgPyBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgLy8gdGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlXG4gICAgICA6IHJlc291cmNlVHlwZS5zcGxpdCgnOjonKVsyXS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlID0geyBbc2VjdGlvbjogc3RyaW5nXTogeyBbaGVhZGluZ3M6IHN0cmluZ106IGFueSB9IH07XG5cbmludGVyZmFjZSBBcm5QYXJ0cyB7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBVc3VhbGx5LCB3ZSBkZWR1Y2UgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcmVzb3VyY2UgdHlwZSB1c2VkIHRvIGZvcm1hdCB0aGUgQVJOIGZyb20gdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGUuXG4gKiBGb3IgYSBDRk4gdHlwZSBsaWtlIEFXUzo6U2VydmljZTo6UmVzb3VyY2VUeXBlLCB0aGUgc2Vjb25kIHNlZ21lbnQgYmVjb21lcyB0aGUgc2VydmljZSBuYW1lLCBhbmQgdGhlIHRoaXJkIHRoZSByZXNvdXJjZSB0eXBlXG4gKiAoYWZ0ZXIgY29udmVydGluZyBib3RoIG9mIHRoZW0gdG8gbG93ZXJjYXNlKS5cbiAqIEhvd2V2ZXIsIHNvbWUgcmVzb3VyY2UgdHlwZXMgYnJlYWsgdGhpcyBzaW1wbGUgY29udmVudGlvbiwgYW5kIHdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIHRoZW0uXG4gKiBUaGlzIG1hcCBpcyBmb3Igc3RvcmluZyB0aG9zZSBjYXNlcy5cbiAqL1xuY29uc3QgUkVTT1VSQ0VfVFlQRV9TUEVDSUFMX05BTUVTOiB7IFt0eXBlOiBzdHJpbmddOiB7IHJlc291cmNlVHlwZTogc3RyaW5nIH0gfSA9IHtcbiAgJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cyc6IHtcbiAgICByZXNvdXJjZVR5cGU6ICdldmVudC1idXMnLFxuICB9LFxufTtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRV9BVFRSSUJVVEVTX0ZPUk1BVFM6IHsgW3R5cGU6IHN0cmluZ106IHsgW2F0dHJpYnV0ZTogc3RyaW5nXTogKHBhcnRzOiBBcm5QYXJ0cykgPT4gc3RyaW5nIH0gfSA9IHtcbiAgJ0FXUzo6SUFNOjpSb2xlJzogeyBBcm46IGlhbUFybkZtdCB9LFxuICAnQVdTOjpJQU06OlVzZXInOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OklBTTo6R3JvdXAnOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OlMzOjpCdWNrZXQnOiB7IEFybjogczNBcm5GbXQgfSxcbiAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6IHsgQXJuOiBzdGRDb2xvblJlc291cmNlQXJuRm10IH0sXG4gICdBV1M6OkV2ZW50czo6RXZlbnRCdXMnOiB7XG4gICAgQXJuOiBzdGRTbGFzaFJlc291cmNlQXJuRm10LFxuICAgIC8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgRXZlbnRCdXMgaXMgdGhlIHNhbWUgYXMgdGhlIFJlZlxuICAgIE5hbWU6IHBhcnRzID0+IHBhcnRzLnJlc291cmNlTmFtZSxcbiAgfSxcbiAgJ0FXUzo6QXBwU3luYzo6R3JhcGhRTEFwaSc6IHsgQXBpSWQ6IGFwcHN5bmNHcmFwaFFsQXBpQXBpSWRGbXQgfSxcbn07XG5cbmZ1bmN0aW9uIGlhbUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB3ZSBza2lwIHJlZ2lvbiBmb3IgSUFNIHJlc291cmNlc1xuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfTo6JHtwYXJ0cy5hY2NvdW50fToke3BhcnRzLnJlc291cmNlVHlwZX0vJHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gczNBcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gd2Ugc2tpcCBhY2NvdW50LCByZWdpb24gYW5kIHJlc291cmNlVHlwZSBmb3IgUzMgcmVzb3VyY2VzXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9Ojo6JHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gc3RkQ29sb25SZXNvdXJjZUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB0aGlzIGlzIGEgc3RhbmRhcmQgZm9ybWF0IGZvciBBUk5zIGxpa2U6IGFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZVR5cGU6cmVzb3VyY2VOYW1lXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9OiR7cGFydHMucmVnaW9ufToke3BhcnRzLmFjY291bnR9OiR7cGFydHMucmVzb3VyY2VUeXBlfToke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzdGRTbGFzaFJlc291cmNlQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHRoaXMgaXMgYSBzdGFuZGFyZCBmb3JtYXQgZm9yIEFSTnMgbGlrZTogYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlVHlwZS9yZXNvdXJjZU5hbWVcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06JHtwYXJ0cy5yZWdpb259OiR7cGFydHMuYWNjb3VudH06JHtwYXJ0cy5yZXNvdXJjZVR5cGV9LyR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGFwcHN5bmNHcmFwaFFsQXBpQXBpSWRGbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gYXJuOmF3czphcHBzeW5jOnVzLWVhc3QtMToxMTExMTExMTExMTE6YXBpcy88YXBpSWQ+XG4gIHJldHVybiBwYXJ0cy5yZXNvdXJjZU5hbWUuc3BsaXQoJy8nKVsxXTtcbn1cblxuaW50ZXJmYWNlIEludHJpbnNpYyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogYW55O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3luY0dsb2JhbFJlcGxhY2Uoc3RyOiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHAsIGNiOiAoeDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIXJlZ2V4Lmdsb2JhbCkgeyB0aHJvdyBuZXcgRXJyb3IoJ1JlZ2V4IG11c3QgYmUgY3JlYXRlZCB3aXRoIC9nIGZsYWcnKTsgfVxuXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGxldCBzdGFydCA9IDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkgeyBicmVhazsgfVxuXG4gICAgcmV0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgbWF0Y2guaW5kZXgpKTtcbiAgICByZXQucHVzaChhd2FpdCBjYihtYXRjaFsxXSkpO1xuXG4gICAgc3RhcnQgPSByZWdleC5sYXN0SW5kZXg7XG4gIH1cbiAgcmV0LnB1c2goc3RyLnN1YnN0cihzdGFydCkpO1xuXG4gIHJldHVybiByZXQuam9pbignJyk7XG59XG4iXX0=
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxNQUFhLHNCQUFzQjtJQUdqQyxZQUE2QixHQUFTLEVBQW1CLFNBQWlCO1FBQTdDLFFBQUcsR0FBSCxHQUFHLENBQU07UUFBbUIsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUMxRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQjtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBNkI7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQTJDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO1lBQ2xELFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBQyxzQkFBc0IsRUFBQyxFQUFFOztZQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsbUNBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLHNCQUFzQixDQUFDLFNBQVMsRUFBRTtnQkFDcEMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDN0U7WUFD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RixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztLQUFFO0lBRTdFLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDaEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxJQUFJLEVBQUU7UUFDWCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFBRSxNQUFNO1NBQUU7UUFFdEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7S0FDekI7SUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUUzQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IElTREsgfSBmcm9tICcuL2F3cy1hdXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0U3RhY2tSZXNvdXJjZXMge1xuICBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxBV1MuQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnlbXT47XG59XG5cbmV4cG9ydCBjbGFzcyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzIGltcGxlbWVudHMgTGlzdFN0YWNrUmVzb3VyY2VzIHtcbiAgcHJpdmF0ZSBzdGFja1Jlc291cmNlczogUHJvbWlzZTxBV1MuQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzZGs6IElTREssIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmcpIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxBV1MuQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4ge1xuICAgIGlmICh0aGlzLnN0YWNrUmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSB0aGlzLmdldFN0YWNrUmVzb3VyY2VzKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YWNrUmVzb3VyY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRTdGFja1Jlc291cmNlcyhuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8QVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+IHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8QVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5PigpO1xuICAgIHJldHVybiB0aGlzLnNkay5jbG91ZEZvcm1hdGlvbigpLmxpc3RTdGFja1Jlc291cmNlcyh7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgfSkucHJvbWlzZSgpLnRoZW4oYXN5bmMgc3RhY2tSZXNvdXJjZXNSZXNwb25zZSA9PiB7XG4gICAgICByZXQucHVzaCguLi4oc3RhY2tSZXNvdXJjZXNSZXNwb25zZS5TdGFja1Jlc291cmNlU3VtbWFyaWVzID8/IFtdKSk7XG4gICAgICBpZiAoc3RhY2tSZXNvdXJjZXNSZXNwb25zZS5OZXh0VG9rZW4pIHtcbiAgICAgICAgcmV0LnB1c2goLi4uYXdhaXQgdGhpcy5nZXRTdGFja1Jlc291cmNlcyhzdGFja1Jlc291cmNlc1Jlc3BvbnNlLk5leHRUb2tlbikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VEZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgTG9naWNhbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgUHJvcGVydGllczogeyBbcDogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlUHJvcHMge1xuICByZWFkb25seSB0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsU3VmZml4OiAocmVnaW9uOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcmVhZG9ubHkgbGlzdFN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IHsgW2s6IHN0cmluZ106IGFueSB9O1xuICBwcml2YXRlIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxTdWZmaXg6IChyZWdpb246IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcml2YXRlIGNhY2hlZFVybFN1ZmZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGVQcm9wcykge1xuICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSBwcm9wcy5saXN0U3RhY2tSZXNvdXJjZXM7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHByb3BzLnRlbXBsYXRlO1xuICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgICdBV1M6OkFjY291bnRJZCc6IHByb3BzLmFjY291bnQsXG4gICAgICAnQVdTOjpSZWdpb24nOiBwcm9wcy5yZWdpb24sXG4gICAgICAnQVdTOjpQYXJ0aXRpb24nOiBwcm9wcy5wYXJ0aXRpb24sXG4gICAgICAuLi5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgIH07XG4gICAgdGhpcy5hY2NvdW50ID0gcHJvcHMuYWNjb3VudDtcbiAgICB0aGlzLnJlZ2lvbiA9IHByb3BzLnJlZ2lvbjtcbiAgICB0aGlzLnBhcnRpdGlvbiA9IHByb3BzLnBhcnRpdGlvbjtcbiAgICB0aGlzLnVybFN1ZmZpeCA9IHByb3BzLnVybFN1ZmZpeDtcbiAgfVxuXG4gIC8vIGNsb25lcyBjdXJyZW50IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSBvYmplY3QsIGJ1dCB1cGRhdGVzIHRoZSBzdGFjayBuYW1lXG4gIHB1YmxpYyBjcmVhdGVOZXN0ZWRFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoXG4gICAgbGlzdE5lc3RlZFN0YWNrUmVzb3VyY2VzOiBMaXN0U3RhY2tSZXNvdXJjZXMsXG4gICAgbmVzdGVkVGVtcGxhdGU6IFRlbXBsYXRlLFxuICAgIG5lc3RlZFN0YWNrUGFyYW1ldGVyczogeyBbcGFyYW1ldGVyTmFtZTogc3RyaW5nXTogYW55IH0sXG4gICkge1xuICAgIHJldHVybiBuZXcgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICAgIHRlbXBsYXRlOiBuZXN0ZWRUZW1wbGF0ZSxcbiAgICAgIHBhcmFtZXRlcnM6IG5lc3RlZFN0YWNrUGFyYW1ldGVycyxcbiAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgdXJsU3VmZml4OiB0aGlzLnVybFN1ZmZpeCxcbiAgICAgIGxpc3RTdGFja1Jlc291cmNlczogbGlzdE5lc3RlZFN0YWNrUmVzb3VyY2VzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGFibGlzaFJlc291cmNlUGh5c2ljYWxOYW1lKGxvZ2ljYWxJZDogc3RyaW5nLCBwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlOiBhbnkpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmIChwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZhbHVhdGUgdGhlIHJlc291cmNlJ3MgbmFtZSBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uLFxuICAgICAgICAvLyBqdXN0IGxvb2sgaXQgdXAgaW4gdGhlIGN1cnJlbnRseSBkZXBsb3llZCBTdGFja1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRQaHlzaWNhbE5hbWVGb3IobG9naWNhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kUGh5c2ljYWxOYW1lRm9yKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoc3IgPT4gc3IuTG9naWNhbFJlc291cmNlSWQgPT09IGxvZ2ljYWxJZCk/LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kTG9naWNhbElkRm9yUGh5c2ljYWxOYW1lKHBoeXNpY2FsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoc3IgPT4gc3IuUGh5c2ljYWxSZXNvdXJjZUlkID09PSBwaHlzaWNhbE5hbWUpPy5Mb2dpY2FsUmVzb3VyY2VJZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZDogc3RyaW5nKTogQXJyYXk8UmVzb3VyY2VEZWZpbml0aW9uPiB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFJlc291cmNlRGVmaW5pdGlvbj4oKTtcbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZUxvZ2ljYWxJZCwgcmVzb3VyY2VEZWZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudGVtcGxhdGU/LlJlc291cmNlcyA/PyB7fSkpIHtcbiAgICAgIGlmIChsb2dpY2FsSWQgIT09IHJlc291cmNlTG9naWNhbElkICYmIHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIHJlc291cmNlRGVmKSkge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgLi4uKHJlc291cmNlRGVmIGFzIGFueSksXG4gICAgICAgICAgTG9naWNhbElkOiByZXNvdXJjZUxvZ2ljYWxJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGVDZm5FeHByZXNzaW9uKGNmbkV4cHJlc3Npb246IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY2xhc3MgQ2ZuSW50cmluc2ljcyB7XG4gICAgICBwdWJsaWMgZXZhbHVhdGVJbnRyaW5zaWMoaW50cmluc2ljOiBJbnRyaW5zaWMpOiBhbnkge1xuICAgICAgICBjb25zdCBpbnRyaW5zaWNGdW5jID0gKHRoaXMgYXMgYW55KVtpbnRyaW5zaWMubmFtZV07XG4gICAgICAgIGlmICghaW50cmluc2ljRnVuYykge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBDbG91ZEZvcm1hdGlvbiBmdW5jdGlvbiAke2ludHJpbnNpYy5uYW1lfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzQXNBcnJheSA9IEFycmF5LmlzQXJyYXkoaW50cmluc2ljLmFyZ3MpID8gaW50cmluc2ljLmFyZ3MgOiBbaW50cmluc2ljLmFyZ3NdO1xuXG4gICAgICAgIHJldHVybiBpbnRyaW5zaWNGdW5jLmFwcGx5KHRoaXMsIGFyZ3NBc0FycmF5KTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpKb2luJyhzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRBcmdzID0gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZWRBcmdzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTcGxpdCcoc2VwYXJhdG9yOiBzdHJpbmcsIGFyZ3M6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZEFyZ3Muc3BsaXQoc2VwYXJhdG9yKTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTZWxlY3QnKGluZGV4OiBudW1iZXIsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkQXJncyA9IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVkQXJnc1tpbmRleF07XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdSZWYnKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVmVGFyZ2V0ID0gYXdhaXQgc2VsZi5maW5kUmVmVGFyZ2V0KGxvZ2ljYWxJZCk7XG4gICAgICAgIGlmIChyZWZUYXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmVmVGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBQYXJhbWV0ZXIgb3IgcmVzb3VyY2UgJyR7bG9naWNhbElkfScgY291bGQgbm90IGJlIGZvdW5kIGZvciBldmFsdWF0aW9uYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpHZXRBdHQnKGxvZ2ljYWxJZDogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBUb0RvIGhhbmRsZSB0aGUgJ2xvZ2ljYWxJZC5hdHRyaWJ1dGVOYW1lJyBmb3JtIG9mIEZuOjpHZXRBdHRcbiAgICAgICAgY29uc3QgYXR0clZhbHVlID0gYXdhaXQgc2VsZi5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYXR0clZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBBdHRyaWJ1dGUgJyR7YXR0cmlidXRlTmFtZX0nIG9mIHJlc291cmNlICcke2xvZ2ljYWxJZH0nIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgZXZhbHVhdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U3ViJyh0ZW1wbGF0ZTogc3RyaW5nLCBleHBsaWNpdFBsYWNlaG9sZGVycz86IHsgW3ZhcmlhYmxlOiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGV4cGxpY2l0UGxhY2Vob2xkZXJzXG4gICAgICAgICAgPyBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihleHBsaWNpdFBsYWNlaG9sZGVycylcbiAgICAgICAgICA6IHt9O1xuXG4gICAgICAgIHJldHVybiBhc3luY0dsb2JhbFJlcGxhY2UodGVtcGxhdGUsIC9cXCR7KFtefV0qKX0vZywga2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIHBsYWNlaG9sZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0S2V5Lmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICA/IHRoaXMuUmVmKGtleSlcbiAgICAgICAgICAgICAgOiB0aGlzWydGbjo6R2V0QXR0J10oc3BsaXRLZXlbMF0sIHNwbGl0S2V5LnNsaWNlKDEpLmpvaW4oJy4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ZuRXhwcmVzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2ZuRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjZm5FeHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNmbkV4cHJlc3Npb24ubWFwKGV4cHIgPT4gdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oZXhwcikpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNmbkV4cHJlc3Npb24gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBpbnRyaW5zaWMgPSB0aGlzLnBhcnNlSW50cmluc2ljKGNmbkV4cHJlc3Npb24pO1xuICAgICAgaWYgKGludHJpbnNpYykge1xuICAgICAgICByZXR1cm4gbmV3IENmbkludHJpbnNpY3MoKS5ldmFsdWF0ZUludHJpbnNpYyhpbnRyaW5zaWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhjZm5FeHByZXNzaW9uKSkge1xuICAgICAgICAgIHJldFtrZXldID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjZm5FeHByZXNzaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2VzKGxvZ2ljYWxJZDogc3RyaW5nLCB0ZW1wbGF0ZUVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxJZCA9PT0gdGVtcGxhdGVFbGVtZW50O1xuICAgIH1cblxuICAgIGlmICh0ZW1wbGF0ZUVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXBsYXRlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZUVsZW1lbnQuc29tZShlbCA9PiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCBlbCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGVtcGxhdGVFbGVtZW50KS5zb21lKGVsID0+IHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIGVsKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUludHJpbnNpYyh4OiBhbnkpOiBJbnRyaW5zaWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh4KTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYgKGtleXNbMF0uc3RhcnRzV2l0aCgnRm46OicpIHx8IGtleXNbMF0gPT09ICdSZWYnKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5c1swXSxcbiAgICAgICAgYXJnczogeFtrZXlzWzBdXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRSZWZUYXJnZXQobG9naWNhbElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIGZpcnN0LCBjaGVjayB0byBzZWUgaWYgdGhlIFJlZiBpcyBhIFBhcmFtZXRlciB3aG8ncyB2YWx1ZSB3ZSBoYXZlXG4gICAgaWYgKGxvZ2ljYWxJZCA9PT0gJ0FXUzo6VVJMU3VmZml4Jykge1xuICAgICAgaWYgKCF0aGlzLmNhY2hlZFVybFN1ZmZpeCkge1xuICAgICAgICB0aGlzLmNhY2hlZFVybFN1ZmZpeCA9IHRoaXMudXJsU3VmZml4KHRoaXMucmVnaW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkVXJsU3VmZml4O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlclRhcmdldCA9IHRoaXMuY29udGV4dFtsb2dpY2FsSWRdO1xuICAgIGlmIChwYXJhbWV0ZXJUYXJnZXQpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXJUYXJnZXQ7XG4gICAgfVxuICAgIC8vIGlmIGl0J3Mgbm90IGEgUGFyYW1ldGVyLCB3ZSBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgY3VycmVudCBTdGFjayByZXNvdXJjZXNcbiAgICByZXR1cm4gdGhpcy5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCB0aGlzLnN0YWNrUmVzb3VyY2VzLmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgIGNvbnN0IGZvdW5kUmVzb3VyY2UgPSBzdGFja1Jlc291cmNlcy5maW5kKHNyID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBsb2dpY2FsSWQpO1xuICAgIGlmICghZm91bmRSZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gbm93LCB3ZSBuZWVkIHRvIGZvcm1hdCB0aGUgYXBwcm9wcmlhdGUgaWRlbnRpZmllciBkZXBlbmRpbmcgb24gdGhlIHJlc291cmNlIHR5cGUsXG4gICAgLy8gYW5kIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlIG5hbWVcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShmb3VuZFJlc291cmNlLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRSZXNvdXJjZUF0dHJpYnV0ZShyZXNvdXJjZTogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5LCBhdHRyaWJ1dGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGh5c2ljYWxJZCA9IHJlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZDtcblxuICAgIC8vIG5vIGF0dHJpYnV0ZSBtZWFucyBSZWYgZXhwcmVzc2lvbiwgZm9yIHdoaWNoIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgZGlyZWN0bHlcbiAgICBpZiAoIWF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuIHBoeXNpY2FsSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlRm9ybWF0cyA9IFJFU09VUkNFX1RZUEVfQVRUUklCVVRFU19GT1JNQVRTW3Jlc291cmNlLlJlc291cmNlVHlwZV07XG4gICAgaWYgKCFyZXNvdXJjZVR5cGVGb3JtYXRzKSB7XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgV2UgZG9uJ3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZS4gVGhpcyBpcyBhIENESyBsaW1pdGF0aW9uLiBgICtcbiAgICAgICAgJ1BsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZUZtdEZ1bmMgPSByZXNvdXJjZVR5cGVGb3JtYXRzW2F0dHJpYnV0ZV07XG4gICAgaWYgKCFhdHRyaWJ1dGVGbXRGdW5jKSB7XG4gICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgV2UgZG9uJ3Qgc3VwcG9ydCB0aGUgJyR7YXR0cmlidXRlfScgYXR0cmlidXRlIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZS4gVGhpcyBpcyBhIENESyBsaW1pdGF0aW9uLiBgICtcbiAgICAgICAgJ1BsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2VPZlJlc291cmNlKHJlc291cmNlKTtcbiAgICBjb25zdCByZXNvdXJjZVR5cGVBcm5QYXJ0ID0gdGhpcy5nZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZUZtdEZ1bmMoe1xuICAgICAgcGFydGl0aW9uOiB0aGlzLnBhcnRpdGlvbixcbiAgICAgIHNlcnZpY2UsXG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGVBcm5QYXJ0LFxuICAgICAgcmVzb3VyY2VOYW1lOiBwaHlzaWNhbElkISxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmljZU9mUmVzb3VyY2UocmVzb3VyY2U6IEFXUy5DbG91ZEZvcm1hdGlvbi5TdGFja1Jlc291cmNlU3VtbWFyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc291cmNlLlJlc291cmNlVHlwZS5zcGxpdCgnOjonKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXNvdXJjZVR5cGVBcm5QYXJ0T2ZSZXNvdXJjZShyZXNvdXJjZTogQVdTLkNsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSByZXNvdXJjZS5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3Qgc3BlY2lhbENhc2VSZXNvdXJjZVR5cGUgPSBSRVNPVVJDRV9UWVBFX1NQRUNJQUxfTkFNRVNbcmVzb3VyY2VUeXBlXT8ucmVzb3VyY2VUeXBlO1xuICAgIHJldHVybiBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgPyBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZVxuICAgICAgLy8gdGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlXG4gICAgICA6IHJlc291cmNlVHlwZS5zcGxpdCgnOjonKVsyXS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlID0geyBbc2VjdGlvbjogc3RyaW5nXTogeyBbaGVhZGluZ3M6IHN0cmluZ106IGFueSB9IH07XG5cbmludGVyZmFjZSBBcm5QYXJ0cyB7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBVc3VhbGx5LCB3ZSBkZWR1Y2UgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcmVzb3VyY2UgdHlwZSB1c2VkIHRvIGZvcm1hdCB0aGUgQVJOIGZyb20gdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGUuXG4gKiBGb3IgYSBDRk4gdHlwZSBsaWtlIEFXUzo6U2VydmljZTo6UmVzb3VyY2VUeXBlLCB0aGUgc2Vjb25kIHNlZ21lbnQgYmVjb21lcyB0aGUgc2VydmljZSBuYW1lLCBhbmQgdGhlIHRoaXJkIHRoZSByZXNvdXJjZSB0eXBlXG4gKiAoYWZ0ZXIgY29udmVydGluZyBib3RoIG9mIHRoZW0gdG8gbG93ZXJjYXNlKS5cbiAqIEhvd2V2ZXIsIHNvbWUgcmVzb3VyY2UgdHlwZXMgYnJlYWsgdGhpcyBzaW1wbGUgY29udmVudGlvbiwgYW5kIHdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIHRoZW0uXG4gKiBUaGlzIG1hcCBpcyBmb3Igc3RvcmluZyB0aG9zZSBjYXNlcy5cbiAqL1xuY29uc3QgUkVTT1VSQ0VfVFlQRV9TUEVDSUFMX05BTUVTOiB7IFt0eXBlOiBzdHJpbmddOiB7IHJlc291cmNlVHlwZTogc3RyaW5nIH0gfSA9IHtcbiAgJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cyc6IHtcbiAgICByZXNvdXJjZVR5cGU6ICdldmVudC1idXMnLFxuICB9LFxufTtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRV9BVFRSSUJVVEVTX0ZPUk1BVFM6IHsgW3R5cGU6IHN0cmluZ106IHsgW2F0dHJpYnV0ZTogc3RyaW5nXTogKHBhcnRzOiBBcm5QYXJ0cykgPT4gc3RyaW5nIH0gfSA9IHtcbiAgJ0FXUzo6SUFNOjpSb2xlJzogeyBBcm46IGlhbUFybkZtdCB9LFxuICAnQVdTOjpJQU06OlVzZXInOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OklBTTo6R3JvdXAnOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OlMzOjpCdWNrZXQnOiB7IEFybjogczNBcm5GbXQgfSxcbiAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6IHsgQXJuOiBzdGRDb2xvblJlc291cmNlQXJuRm10IH0sXG4gICdBV1M6OkV2ZW50czo6RXZlbnRCdXMnOiB7XG4gICAgQXJuOiBzdGRTbGFzaFJlc291cmNlQXJuRm10LFxuICAgIC8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgRXZlbnRCdXMgaXMgdGhlIHNhbWUgYXMgdGhlIFJlZlxuICAgIE5hbWU6IHBhcnRzID0+IHBhcnRzLnJlc291cmNlTmFtZSxcbiAgfSxcbiAgJ0FXUzo6RHluYW1vREI6OlRhYmxlJzogeyBBcm46IHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQgfSxcbiAgJ0FXUzo6QXBwU3luYzo6R3JhcGhRTEFwaSc6IHsgQXBpSWQ6IGFwcHN5bmNHcmFwaFFsQXBpQXBpSWRGbXQgfSxcbn07XG5cbmZ1bmN0aW9uIGlhbUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB3ZSBza2lwIHJlZ2lvbiBmb3IgSUFNIHJlc291cmNlc1xuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfTo6JHtwYXJ0cy5hY2NvdW50fToke3BhcnRzLnJlc291cmNlVHlwZX0vJHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gczNBcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gd2Ugc2tpcCBhY2NvdW50LCByZWdpb24gYW5kIHJlc291cmNlVHlwZSBmb3IgUzMgcmVzb3VyY2VzXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9Ojo6JHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gc3RkQ29sb25SZXNvdXJjZUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB0aGlzIGlzIGEgc3RhbmRhcmQgZm9ybWF0IGZvciBBUk5zIGxpa2U6IGFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZVR5cGU6cmVzb3VyY2VOYW1lXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9OiR7cGFydHMucmVnaW9ufToke3BhcnRzLmFjY291bnR9OiR7cGFydHMucmVzb3VyY2VUeXBlfToke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzdGRTbGFzaFJlc291cmNlQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHRoaXMgaXMgYSBzdGFuZGFyZCBmb3JtYXQgZm9yIEFSTnMgbGlrZTogYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlVHlwZS9yZXNvdXJjZU5hbWVcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06JHtwYXJ0cy5yZWdpb259OiR7cGFydHMuYWNjb3VudH06JHtwYXJ0cy5yZXNvdXJjZVR5cGV9LyR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGFwcHN5bmNHcmFwaFFsQXBpQXBpSWRGbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gYXJuOmF3czphcHBzeW5jOnVzLWVhc3QtMToxMTExMTExMTExMTE6YXBpcy88YXBpSWQ+XG4gIHJldHVybiBwYXJ0cy5yZXNvdXJjZU5hbWUuc3BsaXQoJy8nKVsxXTtcbn1cblxuaW50ZXJmYWNlIEludHJpbnNpYyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogYW55O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3luY0dsb2JhbFJlcGxhY2Uoc3RyOiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHAsIGNiOiAoeDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIXJlZ2V4Lmdsb2JhbCkgeyB0aHJvdyBuZXcgRXJyb3IoJ1JlZ2V4IG11c3QgYmUgY3JlYXRlZCB3aXRoIC9nIGZsYWcnKTsgfVxuXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGxldCBzdGFydCA9IDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkgeyBicmVhazsgfVxuXG4gICAgcmV0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgbWF0Y2guaW5kZXgpKTtcbiAgICByZXQucHVzaChhd2FpdCBjYihtYXRjaFsxXSkpO1xuXG4gICAgc3RhcnQgPSByZWdleC5sYXN0SW5kZXg7XG4gIH1cbiAgcmV0LnB1c2goc3RyLnNsaWNlKHN0YXJ0KSk7XG5cbiAgcmV0dXJuIHJldC5qb2luKCcnKTtcbn1cbiJdfQ==
@@ -54,7 +54,7 @@ exports.transformObjectKeys = transformObjectKeys;
54
54
  * This function lower cases the first character of the string provided.
55
55
  */
56
56
  function lowerCaseFirstCharacter(str) {
57
- return str.length > 0 ? `${str[0].toLowerCase()}${str.substr(1)}` : str;
57
+ return str.length > 0 ? `${str[0].toLowerCase()}${str.slice(1)}` : str;
58
58
  }
59
59
  exports.lowerCaseFirstCharacter = lowerCaseFirstCharacter;
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdhLFFBQUEsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQW9CeEI7O0dBRUc7QUFDSCxJQUFZLG1CQWFYO0FBYkQsV0FBWSxtQkFBbUI7SUFDN0I7OztPQUdHO0lBQ0gsNEVBQXFELENBQUE7SUFFckQ7Ozs7T0FJRztJQUNILGdEQUF5QixDQUFBO0FBQzNCLENBQUMsRUFiVyxtQkFBbUIsR0FBbkIsMkJBQW1CLEtBQW5CLDJCQUFtQixRQWE5QjtBQUlEOztHQUVHO0FBQ0gsTUFBYSwyQkFBMkI7SUFXdEMsWUFBbUIsUUFBMkIsRUFBRSxlQUFvRTtRQUNsSCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFmRCxrRUFlQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEdBQVEsRUFBRSxTQUFrQztJQUM5RSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1FBQzFDLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUN2RTtJQUNELE1BQU0sR0FBRyxHQUEwQixFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDeEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN2RDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVpELGtEQVlDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxHQUFXO0lBQ2pELE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFFLENBQUM7QUFGRCwwREFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbl9kaWZmIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHsgSVNESyB9IGZyb20gJy4uL2F3cy1hdXRoJztcblxuZXhwb3J0IGNvbnN0IElDT04gPSAn4pyoJztcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIGEgY2hhbmdlIHRoYXQgY2FuIGJlIGRlcGxveWVkIGluIGEgc2hvcnQtY2lyY3VpdCBtYW5uZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90c3dhcE9wZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBiZWluZyBob3Rzd2FwcGVkLlxuICAgKiBVc2VkIHRvIHNldCBhIGN1c3RvbSBVc2VyLUFnZW50IGZvciBTREsgY2FsbHMuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lcyBvZiB0aGUgcmVzb3VyY2VzIGJlaW5nIGhvdHN3YXBwZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU5hbWVzOiBzdHJpbmdbXTtcblxuICBhcHBseShzZGs6IElTREspOiBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogQW4gZW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBkZXRlY3Rpb24gd2hldGhlciBhIGdpdmVuIGNoYW5nZSBjYW4gYmUgaG90c3dhcHBlZC5cbiAqL1xuZXhwb3J0IGVudW0gQ2hhbmdlSG90c3dhcEltcGFjdCB7XG4gIC8qKlxuICAgKiBUaGlzIHJlc3VsdCBtZWFucyB0aGF0IHRoZSBnaXZlbiBjaGFuZ2UgY2Fubm90IGJlIGhvdHN3YXBwZWQsXG4gICAqIGFuZCByZXF1aXJlcyBhIGZ1bGwgZGVwbG95bWVudC5cbiAgICovXG4gIFJFUVVJUkVTX0ZVTExfREVQTE9ZTUVOVCA9ICdyZXF1aXJlcy1mdWxsLWRlcGxveW1lbnQnLFxuXG4gIC8qKlxuICAgKiBUaGlzIHJlc3VsdCBtZWFucyB0aGF0IHRoZSBnaXZlbiBjaGFuZ2UgY2FuIGJlIHNhZmVseSBiZSBpZ25vcmVkIHdoZW4gZGV0ZXJtaW5pbmdcbiAgICogd2hldGhlciB0aGUgZ2l2ZW4gU3RhY2sgY2FuIGJlIGhvdHN3YXBwZWQgb3Igbm90XG4gICAqIChmb3IgZXhhbXBsZSwgaXQncyBhIGNoYW5nZSB0byB0aGUgQ0RLTWV0YWRhdGEgcmVzb3VyY2UpLlxuICAgKi9cbiAgSVJSRUxFVkFOVCA9ICdpcnJlbGV2YW50Jyxcbn1cblxuZXhwb3J0IHR5cGUgQ2hhbmdlSG90c3dhcFJlc3VsdCA9IEhvdHN3YXBPcGVyYXRpb24gfCBDaGFuZ2VIb3Rzd2FwSW1wYWN0O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjaGFuZ2UgdGhhdCBjYW4gYmUgaG90c3dhcHBlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdHN3YXBwYWJsZUNoYW5nZUNhbmRpZGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHJlc291cmNlIGlzIGJlaW5nIHVwZGF0ZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV3VmFsdWU6IGNmbl9kaWZmLlJlc291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhbmdlcyBtYWRlIHRvIHRoZSByZXNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnR5VXBkYXRlczogeyBba2V5OiBzdHJpbmddOiBjZm5fZGlmZi5Qcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogY2ZuX2RpZmYuUmVzb3VyY2UsIHByb3BlcnR5VXBkYXRlczogeyBba2V5OiBzdHJpbmddOiBjZm5fZGlmZi5Qcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9KSB7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMucHJvcGVydHlVcGRhdGVzID0gcHJvcGVydHlVcGRhdGVzO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIGFsbCBrZXlzIChyZWN1cnNpdmVseSkgaW4gdGhlIHByb3ZpZGVkIGB2YWxgIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdmFsIFRoZSBvYmplY3Qgd2hvc2Uga2V5cyBuZWVkIHRvIGJlIHRyYW5zZm9ybWVkLlxuICogQHBhcmFtIHRyYW5zZm9ybSBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBrZXkuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgYHZhbGAsIGJ1dCB3aXRoIGFsbCBrZXlzIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byBgdHJhbnNmb3JtYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdEtleXModmFsOiBhbnksIHRyYW5zZm9ybTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpOiBhbnkge1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gdmFsLm1hcCgoaW5wdXQ6IGFueSkgPT4gdHJhbnNmb3JtT2JqZWN0S2V5cyhpbnB1dCwgdHJhbnNmb3JtKSk7XG4gIH1cbiAgY29uc3QgcmV0OiB7IFtrOiBzdHJpbmddOiBhbnk7IH0gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgIHJldFt0cmFuc2Zvcm0oayldID0gdHJhbnNmb3JtT2JqZWN0S2V5cyh2LCB0cmFuc2Zvcm0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb3dlciBjYXNlcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlckNhc2VGaXJzdENoYXJhY3RlcihzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHIubGVuZ3RoID4gMCA/IGAke3N0clswXS50b0xvd2VyQ2FzZSgpfSR7c3RyLnN1YnN0cigxKX1gIDogc3RyO1xufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdhLFFBQUEsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQW9CeEI7O0dBRUc7QUFDSCxJQUFZLG1CQWFYO0FBYkQsV0FBWSxtQkFBbUI7SUFDN0I7OztPQUdHO0lBQ0gsNEVBQXFELENBQUE7SUFFckQ7Ozs7T0FJRztJQUNILGdEQUF5QixDQUFBO0FBQzNCLENBQUMsRUFiVyxtQkFBbUIsR0FBbkIsMkJBQW1CLEtBQW5CLDJCQUFtQixRQWE5QjtBQUlEOztHQUVHO0FBQ0gsTUFBYSwyQkFBMkI7SUFXdEMsWUFBbUIsUUFBMkIsRUFBRSxlQUFvRTtRQUNsSCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFmRCxrRUFlQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEdBQVEsRUFBRSxTQUFrQztJQUM5RSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO1FBQzFDLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUN2RTtJQUNELE1BQU0sR0FBRyxHQUEwQixFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDeEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN2RDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVpELGtEQVlDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxHQUFXO0lBQ2pELE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3pFLENBQUM7QUFGRCwwREFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbl9kaWZmIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHsgSVNESyB9IGZyb20gJy4uL2F3cy1hdXRoJztcblxuZXhwb3J0IGNvbnN0IElDT04gPSAn4pyoJztcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIGEgY2hhbmdlIHRoYXQgY2FuIGJlIGRlcGxveWVkIGluIGEgc2hvcnQtY2lyY3VpdCBtYW5uZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG90c3dhcE9wZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBiZWluZyBob3Rzd2FwcGVkLlxuICAgKiBVc2VkIHRvIHNldCBhIGN1c3RvbSBVc2VyLUFnZW50IGZvciBTREsgY2FsbHMuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lcyBvZiB0aGUgcmVzb3VyY2VzIGJlaW5nIGhvdHN3YXBwZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU5hbWVzOiBzdHJpbmdbXTtcblxuICBhcHBseShzZGs6IElTREspOiBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogQW4gZW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBkZXRlY3Rpb24gd2hldGhlciBhIGdpdmVuIGNoYW5nZSBjYW4gYmUgaG90c3dhcHBlZC5cbiAqL1xuZXhwb3J0IGVudW0gQ2hhbmdlSG90c3dhcEltcGFjdCB7XG4gIC8qKlxuICAgKiBUaGlzIHJlc3VsdCBtZWFucyB0aGF0IHRoZSBnaXZlbiBjaGFuZ2UgY2Fubm90IGJlIGhvdHN3YXBwZWQsXG4gICAqIGFuZCByZXF1aXJlcyBhIGZ1bGwgZGVwbG95bWVudC5cbiAgICovXG4gIFJFUVVJUkVTX0ZVTExfREVQTE9ZTUVOVCA9ICdyZXF1aXJlcy1mdWxsLWRlcGxveW1lbnQnLFxuXG4gIC8qKlxuICAgKiBUaGlzIHJlc3VsdCBtZWFucyB0aGF0IHRoZSBnaXZlbiBjaGFuZ2UgY2FuIGJlIHNhZmVseSBiZSBpZ25vcmVkIHdoZW4gZGV0ZXJtaW5pbmdcbiAgICogd2hldGhlciB0aGUgZ2l2ZW4gU3RhY2sgY2FuIGJlIGhvdHN3YXBwZWQgb3Igbm90XG4gICAqIChmb3IgZXhhbXBsZSwgaXQncyBhIGNoYW5nZSB0byB0aGUgQ0RLTWV0YWRhdGEgcmVzb3VyY2UpLlxuICAgKi9cbiAgSVJSRUxFVkFOVCA9ICdpcnJlbGV2YW50Jyxcbn1cblxuZXhwb3J0IHR5cGUgQ2hhbmdlSG90c3dhcFJlc3VsdCA9IEhvdHN3YXBPcGVyYXRpb24gfCBDaGFuZ2VIb3Rzd2FwSW1wYWN0O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjaGFuZ2UgdGhhdCBjYW4gYmUgaG90c3dhcHBlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvdHN3YXBwYWJsZUNoYW5nZUNhbmRpZGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHJlc291cmNlIGlzIGJlaW5nIHVwZGF0ZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV3VmFsdWU6IGNmbl9kaWZmLlJlc291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhbmdlcyBtYWRlIHRvIHRoZSByZXNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnR5VXBkYXRlczogeyBba2V5OiBzdHJpbmddOiBjZm5fZGlmZi5Qcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogY2ZuX2RpZmYuUmVzb3VyY2UsIHByb3BlcnR5VXBkYXRlczogeyBba2V5OiBzdHJpbmddOiBjZm5fZGlmZi5Qcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9KSB7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMucHJvcGVydHlVcGRhdGVzID0gcHJvcGVydHlVcGRhdGVzO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIGFsbCBrZXlzIChyZWN1cnNpdmVseSkgaW4gdGhlIHByb3ZpZGVkIGB2YWxgIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdmFsIFRoZSBvYmplY3Qgd2hvc2Uga2V5cyBuZWVkIHRvIGJlIHRyYW5zZm9ybWVkLlxuICogQHBhcmFtIHRyYW5zZm9ybSBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBrZXkuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgYHZhbGAsIGJ1dCB3aXRoIGFsbCBrZXlzIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byBgdHJhbnNmb3JtYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdEtleXModmFsOiBhbnksIHRyYW5zZm9ybTogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpOiBhbnkge1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gdmFsLm1hcCgoaW5wdXQ6IGFueSkgPT4gdHJhbnNmb3JtT2JqZWN0S2V5cyhpbnB1dCwgdHJhbnNmb3JtKSk7XG4gIH1cbiAgY29uc3QgcmV0OiB7IFtrOiBzdHJpbmddOiBhbnk7IH0gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgIHJldFt0cmFuc2Zvcm0oayldID0gdHJhbnNmb3JtT2JqZWN0S2V5cyh2LCB0cmFuc2Zvcm0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb3dlciBjYXNlcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlckNhc2VGaXJzdENoYXJhY3RlcihzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHIubGVuZ3RoID4gMCA/IGAke3N0clswXS50b0xvd2VyQ2FzZSgpfSR7c3RyLnNsaWNlKDEpfWAgOiBzdHI7XG59XG4iXX0=