cdk-nuxt 2.21.0 → 2.23.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.
@@ -60,55 +60,78 @@ exports.handler = async (event, context) => {
60
60
  const currentRevision = await getCurrentRevision(client, bucketName);
61
61
  const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);
62
62
  console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);
63
+ console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);
63
64
  let assetKeysToDelete = [];
64
65
  let lastToken = undefined;
66
+ let totalAssetsScanned = 0;
67
+ let totalBatches = 0;
68
+ const assetsDeleteResults = [];
65
69
  do {
66
70
  const curAssetsResult = await client.send(new client_s3_1.ListObjectsV2Command({
67
71
  Bucket: bucketName,
68
- MaxKeys: 250,
72
+ Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored
73
+ MaxKeys: 1000,
69
74
  ContinuationToken: lastToken,
70
75
  }));
71
- // Read object metadata in blocks of 10
76
+ if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {
77
+ console.log('No assets found in current batch');
78
+ lastToken = curAssetsResult.NextContinuationToken;
79
+ continue;
80
+ }
81
+ totalAssetsScanned += curAssetsResult.Contents.length;
82
+ console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);
83
+ // Read object metadata in blocks of 50 for better performance
72
84
  let processableAssets = [...curAssetsResult.Contents];
73
85
  while (processableAssets.length > 0) {
74
- const assetsBatch = processableAssets.slice(0, 10);
75
- processableAssets = processableAssets.slice(10);
86
+ const assetsBatch = processableAssets.slice(0, 50);
87
+ processableAssets = processableAssets.slice(50);
76
88
  const pendingMetadataRequests = assetsBatch.map(asset => client.send(new client_s3_1.HeadObjectCommand({
77
89
  Bucket: bucketName,
78
90
  Key: asset.Key,
79
- })));
91
+ })).catch(error => {
92
+ console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);
93
+ return { Metadata: {} }; // Return empty metadata on error
94
+ }));
80
95
  const metadataResults = await Promise.all(pendingMetadataRequests);
81
96
  // Assign metadata to assets
82
97
  const metadataByAsset = metadataResults.map((metadataResult, index) => ({
83
98
  key: assetsBatch[index].Key,
84
- metadata: metadataResult.Metadata,
99
+ metadata: metadataResult.Metadata || {},
85
100
  }));
86
101
  const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);
87
102
  assetKeysToDelete.push(...outdatedAssetKeys);
103
+ // Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts
104
+ if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {
105
+ console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);
106
+ const results = await deleteAssets(assetKeysToDelete, client, bucketName);
107
+ assetsDeleteResults.push(...results);
108
+ assetKeysToDelete = []; // Clear the array
109
+ }
88
110
  }
89
111
  lastToken = curAssetsResult.NextContinuationToken;
90
112
  } while (lastToken !== undefined);
91
- if (assetKeysToDelete.length === 0) {
92
- console.log('No outdated assets to delete found');
93
- return;
113
+ // Delete remaining assets
114
+ if (assetKeysToDelete.length > 0) {
115
+ console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);
116
+ const results = await deleteAssets(assetKeysToDelete, client, bucketName);
117
+ assetsDeleteResults.push(...results);
94
118
  }
95
- console.log('Deleting ' + assetKeysToDelete.length + ' assets...');
96
- // Delete outdated assets (max. 1000 allowed per request)
97
- const results = await deleteAssets(assetKeysToDelete, client, bucketName);
98
- const failed = results.reduce((previousResult, currentResult) => {
99
- const currentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
100
- if (currentError) {
119
+ // Check for deletion errors and report
120
+ const failed = assetsDeleteResults.reduce((previousResult, currentResult) => {
121
+ const hasCurrentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
122
+ if (hasCurrentError) {
101
123
  console.error('Failed to delete outdated static assets', currentResult.Errors);
102
124
  }
103
- return previousResult || currentError;
125
+ return previousResult || hasCurrentError;
104
126
  }, false);
105
127
  if (failed) {
106
128
  throw new Error('Failed to delete outdated static assets');
107
129
  }
108
- console.log('Cleanup of old static assets finished');
130
+ console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);
109
131
  }
110
132
  catch (error) {
111
133
  console.error('### unexpected runtime error ###', error);
134
+ throw error; // Re-throw to mark Lambda as failed
112
135
  }
113
136
  };
114
137
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DeleteObjectsCommand,\n DeleteObjectsCommandOutput,\n GetObjectCommand, HeadObjectCommand,\n ListObjectsV2Command,\n S3Client\n} from \"@aws-sdk/client-s3\";\nimport type {ListObjectsV2CommandOutput} from \"@aws-sdk/client-s3\";\nimport {text} from 'stream/consumers';\nimport {Readable} from \"stream\";\n\ninterface AssetMetadata {\n readonly key: string;\n readonly metadata: {[key: string]: string};\n}\n\nconst MAX_DELETE_OBJECT_KEYS = 1000;\nconst ONE_DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;\n\n/**\n * Returns the current deployment revision (build timestamp).\n */\nconst getCurrentRevision = async (s3Client: S3Client, bucketName: string): Promise<Date> => {\n const revisionFile = await s3Client.send(\n new GetObjectCommand({\n Bucket: bucketName,\n Key: 'app-revision',\n })\n );\n\n return new Date(await text(revisionFile.Body as Readable));\n};\n\n/**\n * Filters the given assets by inspecting their revision and returns those, that are older than the specified cutoff date.\n */\nconst filterOutdatedAssetKeys = (metadataResults: AssetMetadata[], returnOlderThan: Date): string[] => {\n return metadataResults\n .filter(assetMetadata =>\n assetMetadata.metadata.revision\n ? new Date(assetMetadata.metadata.revision).getTime() <= returnOlderThan.getTime()\n : false\n )\n .map(filteredAssets => filteredAssets.key);\n};\n\n/**\n * Deletes the given assets.\n */\nconst deleteAssets = async (\n assetKeys: string[],\n s3Client: S3Client,\n bucketName: string\n): Promise<DeleteObjectsCommandOutput[]> => {\n let remainingAssetKeysToDelete = [...assetKeys];\n const pendingDeletes = [];\n\n while (remainingAssetKeysToDelete.length > 0) {\n const curDeleteBatch = remainingAssetKeysToDelete.slice(0, MAX_DELETE_OBJECT_KEYS);\n remainingAssetKeysToDelete = remainingAssetKeysToDelete.slice(MAX_DELETE_OBJECT_KEYS);\n\n console.log('Deleting assets:', curDeleteBatch);\n\n const pendingDelete = s3Client.send(\n new DeleteObjectsCommand({\n Bucket: bucketName,\n Delete: {\n Objects: curDeleteBatch.map(outdatedKey => {\n return {Key: outdatedKey};\n }),\n },\n })\n );\n pendingDeletes.push(pendingDelete);\n }\n\n return await Promise.all(pendingDeletes);\n};\n\nexports.handler = async (event: any, context: any) => {\n try {\n const client = new S3Client({region: process.env.AWS_REGION});\n const bucketName = process.env.STATIC_ASSETS_BUCKET;\n if (!bucketName) {\n throw new Error(\"Static asset's bucket name not specified in environment!\");\n }\n\n if (!process.env.OUTDATED_ASSETS_RETENTION_DAYS) {\n throw new Error('Retain duration of static assets not specified!');\n }\n const retainAssetsInDays = Number.parseInt(process.env.OUTDATED_ASSETS_RETENTION_DAYS);\n const currentRevision = await getCurrentRevision(client, bucketName);\n const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);\n\n console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);\n\n let assetKeysToDelete: string[] = [];\n let lastToken = undefined;\n\n do {\n const curAssetsResult: ListObjectsV2CommandOutput = await client.send(\n new ListObjectsV2Command({\n Bucket: bucketName,\n MaxKeys: 250,\n ContinuationToken: lastToken,\n })\n );\n\n // Read object metadata in blocks of 10\n let processableAssets = [...curAssetsResult.Contents!];\n\n while (processableAssets.length > 0) {\n const assetsBatch = processableAssets.slice(0, 10);\n processableAssets = processableAssets.slice(10);\n\n const pendingMetadataRequests = assetsBatch.map(asset =>\n client.send(\n new HeadObjectCommand({\n Bucket: bucketName,\n Key: asset.Key,\n })\n )\n );\n\n const metadataResults = await Promise.all(pendingMetadataRequests);\n\n // Assign metadata to assets\n const metadataByAsset: AssetMetadata[] = (metadataResults.map((metadataResult, index) => ({\n key: assetsBatch[index].Key,\n metadata: metadataResult.Metadata,\n })) as AssetMetadata[]);\n\n const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);\n assetKeysToDelete.push(...outdatedAssetKeys);\n }\n lastToken = curAssetsResult.NextContinuationToken;\n } while (lastToken !== undefined);\n\n if (assetKeysToDelete.length === 0) {\n console.log('No outdated assets to delete found');\n return;\n }\n\n console.log('Deleting ' + assetKeysToDelete.length + ' assets...');\n\n // Delete outdated assets (max. 1000 allowed per request)\n const results = await deleteAssets(assetKeysToDelete, client, bucketName);\n const failed = results.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {\n const currentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);\n if (currentError) {\n console.error('Failed to delete outdated static assets', currentResult.Errors);\n }\n return previousResult || currentError;\n }, false);\n\n if (failed) {\n throw new Error('Failed to delete outdated static assets');\n }\n\n console.log('Cleanup of old static assets finished');\n } catch (error) {\n console.error('### unexpected runtime error ###', error);\n }\n};"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DeleteObjectsCommand,\n DeleteObjectsCommandOutput,\n GetObjectCommand, HeadObjectCommand,\n ListObjectsV2Command,\n S3Client\n} from \"@aws-sdk/client-s3\";\nimport type {ListObjectsV2CommandOutput} from \"@aws-sdk/client-s3\";\nimport {text} from 'stream/consumers';\nimport {Readable} from \"stream\";\n\ninterface AssetMetadata {\n readonly key: string;\n readonly metadata: {[key: string]: string};\n}\n\nconst MAX_DELETE_OBJECT_KEYS = 1000;\nconst ONE_DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;\n\n/**\n * Returns the current deployment revision (build timestamp).\n */\nconst getCurrentRevision = async (s3Client: S3Client, bucketName: string): Promise<Date> => {\n const revisionFile = await s3Client.send(\n new GetObjectCommand({\n Bucket: bucketName,\n Key: 'app-revision',\n })\n );\n\n return new Date(await text(revisionFile.Body as Readable));\n};\n\n/**\n * Filters the given assets by inspecting their revision and returns those, that are older than the specified cutoff date.\n */\nconst filterOutdatedAssetKeys = (metadataResults: AssetMetadata[], returnOlderThan: Date): string[] => {\n return metadataResults\n .filter(assetMetadata =>\n assetMetadata.metadata.revision\n ? new Date(assetMetadata.metadata.revision).getTime() <= returnOlderThan.getTime()\n : false\n )\n .map(filteredAssets => filteredAssets.key);\n};\n\n/**\n * Deletes the given assets.\n */\nconst deleteAssets = async (\n assetKeys: string[],\n s3Client: S3Client,\n bucketName: string\n): Promise<DeleteObjectsCommandOutput[]> => {\n let remainingAssetKeysToDelete = [...assetKeys];\n const pendingDeletes = [];\n\n while (remainingAssetKeysToDelete.length > 0) {\n const curDeleteBatch = remainingAssetKeysToDelete.slice(0, MAX_DELETE_OBJECT_KEYS);\n remainingAssetKeysToDelete = remainingAssetKeysToDelete.slice(MAX_DELETE_OBJECT_KEYS);\n\n console.log('Deleting assets:', curDeleteBatch);\n\n const pendingDelete = s3Client.send(\n new DeleteObjectsCommand({\n Bucket: bucketName,\n Delete: {\n Objects: curDeleteBatch.map(outdatedKey => {\n return {Key: outdatedKey};\n }),\n },\n })\n );\n pendingDeletes.push(pendingDelete);\n }\n\n return await Promise.all(pendingDeletes);\n};\n\nexports.handler = async (event: any, context: any) => {\n try {\n const client = new S3Client({region: process.env.AWS_REGION});\n const bucketName = process.env.STATIC_ASSETS_BUCKET;\n if (!bucketName) {\n throw new Error(\"Static asset's bucket name not specified in environment!\");\n }\n\n if (!process.env.OUTDATED_ASSETS_RETENTION_DAYS) {\n throw new Error('Retain duration of static assets not specified!');\n }\n const retainAssetsInDays = Number.parseInt(process.env.OUTDATED_ASSETS_RETENTION_DAYS);\n const currentRevision = await getCurrentRevision(client, bucketName);\n const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);\n\n console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);\n console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);\n\n let assetKeysToDelete: string[] = [];\n let lastToken = undefined;\n let totalAssetsScanned = 0;\n let totalBatches = 0;\n const assetsDeleteResults: DeleteObjectsCommandOutput[] = [];\n\n do {\n const curAssetsResult: ListObjectsV2CommandOutput = await client.send(\n new ListObjectsV2Command({\n Bucket: bucketName,\n Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored\n MaxKeys: 1000,\n ContinuationToken: lastToken,\n })\n );\n\n if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {\n console.log('No assets found in current batch');\n lastToken = curAssetsResult.NextContinuationToken;\n continue;\n }\n\n totalAssetsScanned += curAssetsResult.Contents.length;\n console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);\n\n // Read object metadata in blocks of 50 for better performance\n let processableAssets = [...curAssetsResult.Contents];\n\n while (processableAssets.length > 0) {\n const assetsBatch = processableAssets.slice(0, 50);\n processableAssets = processableAssets.slice(50);\n\n const pendingMetadataRequests = assetsBatch.map(asset =>\n client.send(\n new HeadObjectCommand({\n Bucket: bucketName,\n Key: asset.Key,\n })\n ).catch(error => {\n console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);\n return { Metadata: {} }; // Return empty metadata on error\n })\n );\n\n const metadataResults = await Promise.all(pendingMetadataRequests);\n\n // Assign metadata to assets\n const metadataByAsset: AssetMetadata[] = metadataResults.map((metadataResult, index) => ({\n key: assetsBatch[index].Key!,\n metadata: metadataResult.Metadata || {},\n }));\n\n const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);\n assetKeysToDelete.push(...outdatedAssetKeys);\n\n // Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts\n if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {\n console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);\n const results = await deleteAssets(assetKeysToDelete, client, bucketName);\n assetsDeleteResults.push(...results);\n assetKeysToDelete = []; // Clear the array\n }\n }\n lastToken = curAssetsResult.NextContinuationToken;\n } while (lastToken !== undefined);\n\n // Delete remaining assets\n if (assetKeysToDelete.length > 0) {\n console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);\n const results = await deleteAssets(assetKeysToDelete, client, bucketName);\n assetsDeleteResults.push(...results);\n }\n\n // Check for deletion errors and report\n const failed = assetsDeleteResults.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {\n const hasCurrentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);\n if (hasCurrentError) {\n console.error('Failed to delete outdated static assets', currentResult.Errors);\n }\n return previousResult || hasCurrentError;\n }, false);\n\n if (failed) {\n throw new Error('Failed to delete outdated static assets');\n }\n\n console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);\n } catch (error) {\n console.error('### unexpected runtime error ###', error);\n throw error; // Re-throw to mark Lambda as failed\n }\n};"]}
@@ -60,55 +60,78 @@ exports.handler = async (event, context) => {
60
60
  const currentRevision = await getCurrentRevision(client, bucketName);
61
61
  const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);
62
62
  console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);
63
+ console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);
63
64
  let assetKeysToDelete = [];
64
65
  let lastToken = undefined;
66
+ let totalAssetsScanned = 0;
67
+ let totalBatches = 0;
68
+ const assetsDeleteResults = [];
65
69
  do {
66
70
  const curAssetsResult = await client.send(new client_s3_1.ListObjectsV2Command({
67
71
  Bucket: bucketName,
68
- MaxKeys: 250,
72
+ Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored
73
+ MaxKeys: 1000,
69
74
  ContinuationToken: lastToken,
70
75
  }));
71
- // Read object metadata in blocks of 10
76
+ if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {
77
+ console.log('No assets found in current batch');
78
+ lastToken = curAssetsResult.NextContinuationToken;
79
+ continue;
80
+ }
81
+ totalAssetsScanned += curAssetsResult.Contents.length;
82
+ console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);
83
+ // Read object metadata in blocks of 50 for better performance
72
84
  let processableAssets = [...curAssetsResult.Contents];
73
85
  while (processableAssets.length > 0) {
74
- const assetsBatch = processableAssets.slice(0, 10);
75
- processableAssets = processableAssets.slice(10);
86
+ const assetsBatch = processableAssets.slice(0, 50);
87
+ processableAssets = processableAssets.slice(50);
76
88
  const pendingMetadataRequests = assetsBatch.map(asset => client.send(new client_s3_1.HeadObjectCommand({
77
89
  Bucket: bucketName,
78
90
  Key: asset.Key,
79
- })));
91
+ })).catch(error => {
92
+ console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);
93
+ return { Metadata: {} }; // Return empty metadata on error
94
+ }));
80
95
  const metadataResults = await Promise.all(pendingMetadataRequests);
81
96
  // Assign metadata to assets
82
97
  const metadataByAsset = metadataResults.map((metadataResult, index) => ({
83
98
  key: assetsBatch[index].Key,
84
- metadata: metadataResult.Metadata,
99
+ metadata: metadataResult.Metadata || {},
85
100
  }));
86
101
  const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);
87
102
  assetKeysToDelete.push(...outdatedAssetKeys);
103
+ // Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts
104
+ if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {
105
+ console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);
106
+ const results = await deleteAssets(assetKeysToDelete, client, bucketName);
107
+ assetsDeleteResults.push(...results);
108
+ assetKeysToDelete = []; // Clear the array
109
+ }
88
110
  }
89
111
  lastToken = curAssetsResult.NextContinuationToken;
90
112
  } while (lastToken !== undefined);
91
- if (assetKeysToDelete.length === 0) {
92
- console.log('No outdated assets to delete found');
93
- return;
113
+ // Delete remaining assets
114
+ if (assetKeysToDelete.length > 0) {
115
+ console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);
116
+ const results = await deleteAssets(assetKeysToDelete, client, bucketName);
117
+ assetsDeleteResults.push(...results);
94
118
  }
95
- console.log('Deleting ' + assetKeysToDelete.length + ' assets...');
96
- // Delete outdated assets (max. 1000 allowed per request)
97
- const results = await deleteAssets(assetKeysToDelete, client, bucketName);
98
- const failed = results.reduce((previousResult, currentResult) => {
99
- const currentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
100
- if (currentError) {
119
+ // Check for deletion errors and report
120
+ const failed = assetsDeleteResults.reduce((previousResult, currentResult) => {
121
+ const hasCurrentError = !!(currentResult.Errors && currentResult.Errors.length > 0);
122
+ if (hasCurrentError) {
101
123
  console.error('Failed to delete outdated static assets', currentResult.Errors);
102
124
  }
103
- return previousResult || currentError;
125
+ return previousResult || hasCurrentError;
104
126
  }, false);
105
127
  if (failed) {
106
128
  throw new Error('Failed to delete outdated static assets');
107
129
  }
108
- console.log('Cleanup of old static assets finished');
130
+ console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);
109
131
  }
110
132
  catch (error) {
111
133
  console.error('### unexpected runtime error ###', error);
134
+ throw error; // Re-throw to mark Lambda as failed
112
135
  }
113
136
  };
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQU00QjtBQUU1QixnREFBc0M7QUFRdEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxRQUFrQixFQUFFLFVBQWtCLEVBQWlCLEVBQUU7SUFDdkYsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUNwQyxJQUFJLDRCQUFnQixDQUFDO1FBQ2pCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLEdBQUcsRUFBRSxjQUFjO0tBQ3RCLENBQUMsQ0FDTCxDQUFDO0lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUEsZ0JBQUksRUFBQyxZQUFZLENBQUMsSUFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsZUFBZ0MsRUFBRSxlQUFxQixFQUFZLEVBQUU7SUFDbEcsT0FBTyxlQUFlO1NBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUNwQixhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRTtRQUNsRixDQUFDLENBQUMsS0FBSyxDQUNkO1NBQ0EsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUN0QixTQUFt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QztRQUVuRSx5REFBeUQ7UUFDekQsTUFBTSxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUF1QixFQUFFLGFBQXlDLEVBQVcsRUFBRTtZQUMxRyxNQUFNLFlBQVksR0FBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELE9BQU8sY0FBYyxJQUFJLFlBQVksQ0FBQztRQUMxQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFVixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERlbGV0ZU9iamVjdHNDb21tYW5kLFxuICAgIERlbGV0ZU9iamVjdHNDb21tYW5kT3V0cHV0LFxuICAgIEdldE9iamVjdENvbW1hbmQsIEhlYWRPYmplY3RDb21tYW5kLFxuICAgIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICAgIFMzQ2xpZW50XG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB0eXBlIHtMaXN0T2JqZWN0c1YyQ29tbWFuZE91dHB1dH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHt0ZXh0fSBmcm9tICdzdHJlYW0vY29uc3VtZXJzJztcbmltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcblxuaW50ZXJmYWNlIEFzc2V0TWV0YWRhdGEge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG1ldGFkYXRhOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbn1cblxuY29uc3QgTUFYX0RFTEVURV9PQkpFQ1RfS0VZUyA9IDEwMDA7XG5jb25zdCBPTkVfREFZX0lOX01JTExJU0VDT05EUyA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIChidWlsZCB0aW1lc3RhbXApLlxuICovXG5jb25zdCBnZXRDdXJyZW50UmV2aXNpb24gPSBhc3luYyAoczNDbGllbnQ6IFMzQ2xpZW50LCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPERhdGU+ID0+IHtcbiAgICBjb25zdCByZXZpc2lvbkZpbGUgPSBhd2FpdCBzM0NsaWVudC5zZW5kKFxuICAgICAgICBuZXcgR2V0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBLZXk6ICdhcHAtcmV2aXNpb24nLFxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IERhdGUoYXdhaXQgdGV4dChyZXZpc2lvbkZpbGUuQm9keSBhcyBSZWFkYWJsZSkpO1xufTtcblxuLyoqXG4gKiBGaWx0ZXJzIHRoZSBnaXZlbiBhc3NldHMgYnkgaW5zcGVjdGluZyB0aGVpciByZXZpc2lvbiBhbmQgcmV0dXJucyB0aG9zZSwgdGhhdCBhcmUgb2xkZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGN1dG9mZiBkYXRlLlxuICovXG5jb25zdCBmaWx0ZXJPdXRkYXRlZEFzc2V0S2V5cyA9IChtZXRhZGF0YVJlc3VsdHM6IEFzc2V0TWV0YWRhdGFbXSwgcmV0dXJuT2xkZXJUaGFuOiBEYXRlKTogc3RyaW5nW10gPT4ge1xuICAgIHJldHVybiBtZXRhZGF0YVJlc3VsdHNcbiAgICAgICAgLmZpbHRlcihhc3NldE1ldGFkYXRhID0+XG4gICAgICAgICAgICBhc3NldE1ldGFkYXRhLm1ldGFkYXRhLnJldmlzaW9uXG4gICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShhc3NldE1ldGFkYXRhLm1ldGFkYXRhLnJldmlzaW9uKS5nZXRUaW1lKCkgPD0gcmV0dXJuT2xkZXJUaGFuLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgKVxuICAgICAgICAubWFwKGZpbHRlcmVkQXNzZXRzID0+IGZpbHRlcmVkQXNzZXRzLmtleSk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgdGhlIGdpdmVuIGFzc2V0cy5cbiAqL1xuY29uc3QgZGVsZXRlQXNzZXRzID0gYXN5bmMgKFxuICAgIGFzc2V0S2V5czogc3RyaW5nW10sXG4gICAgczNDbGllbnQ6IFMzQ2xpZW50LFxuICAgIGJ1Y2tldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxEZWxldGVPYmplY3RzQ29tbWFuZE91dHB1dFtdPiA9PiB7XG4gICAgbGV0IHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlID0gWy4uLmFzc2V0S2V5c107XG4gICAgY29uc3QgcGVuZGluZ0RlbGV0ZXMgPSBbXTtcblxuICAgIHdoaWxlIChyZW1haW5pbmdBc3NldEtleXNUb0RlbGV0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1ckRlbGV0ZUJhdGNoID0gcmVtYWluaW5nQXNzZXRLZXlzVG9EZWxldGUuc2xpY2UoMCwgTUFYX0RFTEVURV9PQkpFQ1RfS0VZUyk7XG4gICAgICAgIHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlID0gcmVtYWluaW5nQXNzZXRLZXlzVG9EZWxldGUuc2xpY2UoTUFYX0RFTEVURV9PQkpFQ1RfS0VZUyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIGFzc2V0czonLCBjdXJEZWxldGVCYXRjaCk7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0RlbGV0ZSA9IHMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgICBuZXcgRGVsZXRlT2JqZWN0c0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBEZWxldGU6IHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0czogY3VyRGVsZXRlQmF0Y2gubWFwKG91dGRhdGVkS2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7S2V5OiBvdXRkYXRlZEtleX07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBwZW5kaW5nRGVsZXRlcy5wdXNoKHBlbmRpbmdEZWxldGUpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nRGVsZXRlcyk7XG59O1xuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFMzQ2xpZW50KHtyZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT059KTtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IHByb2Nlc3MuZW52LlNUQVRJQ19BU1NFVFNfQlVDS0VUO1xuICAgICAgICBpZiAoIWJ1Y2tldE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRpYyBhc3NldCdzIGJ1Y2tldCBuYW1lIG5vdCBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQhXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudi5PVVREQVRFRF9BU1NFVFNfUkVURU5USU9OX0RBWVMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmV0YWluIGR1cmF0aW9uIG9mIHN0YXRpYyBhc3NldHMgbm90IHNwZWNpZmllZCEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXRhaW5Bc3NldHNJbkRheXMgPSBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy5lbnYuT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTKTtcbiAgICAgICAgY29uc3QgY3VycmVudFJldmlzaW9uID0gYXdhaXQgZ2V0Q3VycmVudFJldmlzaW9uKGNsaWVudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGNvbnN0IGRlbGV0ZU9sZGVyVGhhbiA9IG5ldyBEYXRlKGN1cnJlbnRSZXZpc2lvbi5nZXRUaW1lKCkgLSByZXRhaW5Bc3NldHNJbkRheXMgKiBPTkVfREFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGNsZWFudXAgb2Ygc3RhdGljIGFzc2V0cyBvbGRlciB0aGFuICR7ZGVsZXRlT2xkZXJUaGFuLnRvSVNPU3RyaW5nKCl9Li4uYCk7XG5cbiAgICAgICAgbGV0IGFzc2V0S2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgbGFzdFRva2VuID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IGN1ckFzc2V0c1Jlc3VsdDogTGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIE1heEtleXM6IDI1MCxcbiAgICAgICAgICAgICAgICAgICAgQ29udGludWF0aW9uVG9rZW46IGxhc3RUb2tlbixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVhZCBvYmplY3QgbWV0YWRhdGEgaW4gYmxvY2tzIG9mIDEwXG4gICAgICAgICAgICBsZXQgcHJvY2Vzc2FibGVBc3NldHMgPSBbLi4uY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzIV07XG5cbiAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzYWJsZUFzc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXNzZXRzQmF0Y2ggPSBwcm9jZXNzYWJsZUFzc2V0cy5zbGljZSgwLCAxMCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2FibGVBc3NldHMgPSBwcm9jZXNzYWJsZUFzc2V0cy5zbGljZSgxMCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nTWV0YWRhdGFSZXF1ZXN0cyA9IGFzc2V0c0JhdGNoLm1hcChhc3NldCA9PlxuICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIZWFkT2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTogYXNzZXQuS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nTWV0YWRhdGFSZXF1ZXN0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gbWV0YWRhdGEgdG8gYXNzZXRzXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFCeUFzc2V0OiBBc3NldE1ldGFkYXRhW10gPSAobWV0YWRhdGFSZXN1bHRzLm1hcCgobWV0YWRhdGFSZXN1bHQsIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGFzc2V0c0JhdGNoW2luZGV4XS5LZXksXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YVJlc3VsdC5NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICB9KSkgYXMgQXNzZXRNZXRhZGF0YVtdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dGRhdGVkQXNzZXRLZXlzID0gZmlsdGVyT3V0ZGF0ZWRBc3NldEtleXMobWV0YWRhdGFCeUFzc2V0LCBkZWxldGVPbGRlclRoYW4pO1xuICAgICAgICAgICAgICAgIGFzc2V0S2V5c1RvRGVsZXRlLnB1c2goLi4ub3V0ZGF0ZWRBc3NldEtleXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFRva2VuID0gY3VyQXNzZXRzUmVzdWx0Lk5leHRDb250aW51YXRpb25Ub2tlbjtcbiAgICAgICAgfSB3aGlsZSAobGFzdFRva2VuICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGlmIChhc3NldEtleXNUb0RlbGV0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBvdXRkYXRlZCBhc3NldHMgdG8gZGVsZXRlIGZvdW5kJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgJyArIGFzc2V0S2V5c1RvRGVsZXRlLmxlbmd0aCArICcgYXNzZXRzLi4uJyk7XG5cbiAgICAgICAgLy8gRGVsZXRlIG91dGRhdGVkIGFzc2V0cyAobWF4LiAxMDAwIGFsbG93ZWQgcGVyIHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBkZWxldGVBc3NldHMoYXNzZXRLZXlzVG9EZWxldGUsIGNsaWVudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMucmVkdWNlKChwcmV2aW91c1Jlc3VsdDogYm9vbGVhbiwgY3VycmVudFJlc3VsdDogRGVsZXRlT2JqZWN0c0NvbW1hbmRPdXRwdXQpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFcnJvcjogYm9vbGVhbiA9ICEhKGN1cnJlbnRSZXN1bHQuRXJyb3JzICYmIGN1cnJlbnRSZXN1bHQuRXJyb3JzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cycsIGN1cnJlbnRSZXN1bHQuRXJyb3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1Jlc3VsdCB8fCBjdXJyZW50RXJyb3I7XG4gICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0NsZWFudXAgb2Ygb2xkIHN0YXRpYyBhc3NldHMgZmluaXNoZWQnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCcjIyMgdW5leHBlY3RlZCBydW50aW1lIGVycm9yICMjIycsIGVycm9yKTtcbiAgICB9XG59OyJdfQ==
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQU00QjtBQUU1QixnREFBc0M7QUFRdEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxRQUFrQixFQUFFLFVBQWtCLEVBQWlCLEVBQUU7SUFDdkYsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUNwQyxJQUFJLDRCQUFnQixDQUFDO1FBQ2pCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLEdBQUcsRUFBRSxjQUFjO0tBQ3RCLENBQUMsQ0FDTCxDQUFDO0lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUEsZ0JBQUksRUFBQyxZQUFZLENBQUMsSUFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsZUFBZ0MsRUFBRSxlQUFxQixFQUFZLEVBQUU7SUFDbEcsT0FBTyxlQUFlO1NBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUNwQixhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRTtRQUNsRixDQUFDLENBQUMsS0FBSyxDQUNkO1NBQ0EsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUN0QixTQUFt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bWFuZCxcbiAgICBEZWxldGVPYmplY3RzQ29tbWFuZE91dHB1dCxcbiAgICBHZXRPYmplY3RDb21tYW5kLCBIZWFkT2JqZWN0Q29tbWFuZCxcbiAgICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgICBTM0NsaWVudFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgdHlwZSB7TGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXR9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7dGV4dH0gZnJvbSAnc3RyZWFtL2NvbnN1bWVycyc7XG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tIFwic3RyZWFtXCI7XG5cbmludGVyZmFjZSBBc3NldE1ldGFkYXRhIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSBtZXRhZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG59XG5cbmNvbnN0IE1BWF9ERUxFVEVfT0JKRUNUX0tFWVMgPSAxMDAwO1xuY29uc3QgT05FX0RBWV9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGVwbG95bWVudCByZXZpc2lvbiAoYnVpbGQgdGltZXN0YW1wKS5cbiAqL1xuY29uc3QgZ2V0Q3VycmVudFJldmlzaW9uID0gYXN5bmMgKHMzQ2xpZW50OiBTM0NsaWVudCwgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxEYXRlPiA9PiB7XG4gICAgY29uc3QgcmV2aXNpb25GaWxlID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgICAgbmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgS2V5OiAnYXBwLXJldmlzaW9uJyxcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBEYXRlKGF3YWl0IHRleHQocmV2aXNpb25GaWxlLkJvZHkgYXMgUmVhZGFibGUpKTtcbn07XG5cbi8qKlxuICogRmlsdGVycyB0aGUgZ2l2ZW4gYXNzZXRzIGJ5IGluc3BlY3RpbmcgdGhlaXIgcmV2aXNpb24gYW5kIHJldHVybnMgdGhvc2UsIHRoYXQgYXJlIG9sZGVyIHRoYW4gdGhlIHNwZWNpZmllZCBjdXRvZmYgZGF0ZS5cbiAqL1xuY29uc3QgZmlsdGVyT3V0ZGF0ZWRBc3NldEtleXMgPSAobWV0YWRhdGFSZXN1bHRzOiBBc3NldE1ldGFkYXRhW10sIHJldHVybk9sZGVyVGhhbjogRGF0ZSk6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gbWV0YWRhdGFSZXN1bHRzXG4gICAgICAgIC5maWx0ZXIoYXNzZXRNZXRhZGF0YSA9PlxuICAgICAgICAgICAgYXNzZXRNZXRhZGF0YS5tZXRhZGF0YS5yZXZpc2lvblxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUoYXNzZXRNZXRhZGF0YS5tZXRhZGF0YS5yZXZpc2lvbikuZ2V0VGltZSgpIDw9IHJldHVybk9sZGVyVGhhbi5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgIClcbiAgICAgICAgLm1hcChmaWx0ZXJlZEFzc2V0cyA9PiBmaWx0ZXJlZEFzc2V0cy5rZXkpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBhc3NldHMuXG4gKi9cbmNvbnN0IGRlbGV0ZUFzc2V0cyA9IGFzeW5jIChcbiAgICBhc3NldEtleXM6IHN0cmluZ1tdLFxuICAgIHMzQ2xpZW50OiBTM0NsaWVudCxcbiAgICBidWNrZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8RGVsZXRlT2JqZWN0c0NvbW1hbmRPdXRwdXRbXT4gPT4ge1xuICAgIGxldCByZW1haW5pbmdBc3NldEtleXNUb0RlbGV0ZSA9IFsuLi5hc3NldEtleXNdO1xuICAgIGNvbnN0IHBlbmRpbmdEZWxldGVzID0gW107XG5cbiAgICB3aGlsZSAocmVtYWluaW5nQXNzZXRLZXlzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJEZWxldGVCYXRjaCA9IHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlLnNsaWNlKDAsIE1BWF9ERUxFVEVfT0JKRUNUX0tFWVMpO1xuICAgICAgICByZW1haW5pbmdBc3NldEtleXNUb0RlbGV0ZSA9IHJlbWFpbmluZ0Fzc2V0S2V5c1RvRGVsZXRlLnNsaWNlKE1BWF9ERUxFVEVfT0JKRUNUX0tFWVMpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGluZyBhc3NldHM6JywgY3VyRGVsZXRlQmF0Y2gpO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdEZWxldGUgPSBzM0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRGVsZXRlOiB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdHM6IGN1ckRlbGV0ZUJhdGNoLm1hcChvdXRkYXRlZEtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge0tleTogb3V0ZGF0ZWRLZXl9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcGVuZGluZ0RlbGV0ZXMucHVzaChwZW5kaW5nRGVsZXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwocGVuZGluZ0RlbGV0ZXMpO1xufTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTM0NsaWVudCh7cmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OfSk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBwcm9jZXNzLmVudi5TVEFUSUNfQVNTRVRTX0JVQ0tFVDtcbiAgICAgICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0aWMgYXNzZXQncyBidWNrZXQgbmFtZSBub3Qgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnYuT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JldGFpbiBkdXJhdGlvbiBvZiBzdGF0aWMgYXNzZXRzIG5vdCBzcGVjaWZpZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0YWluQXNzZXRzSW5EYXlzID0gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52Lk9VVERBVEVEX0FTU0VUU19SRVRFTlRJT05fREFZUyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbiA9IGF3YWl0IGdldEN1cnJlbnRSZXZpc2lvbihjbGllbnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICBjb25zdCBkZWxldGVPbGRlclRoYW4gPSBuZXcgRGF0ZShjdXJyZW50UmV2aXNpb24uZ2V0VGltZSgpIC0gcmV0YWluQXNzZXRzSW5EYXlzICogT05FX0RBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdGFydGluZyBjbGVhbnVwIG9mIHN0YXRpYyBhc3NldHMgb2xkZXIgdGhhbiAke2RlbGV0ZU9sZGVyVGhhbi50b0lTT1N0cmluZygpfS4uLmApO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3VycmVudCByZXZpc2lvbjogJHtjdXJyZW50UmV2aXNpb24udG9JU09TdHJpbmcoKX0sIFJldGVudGlvbiBkYXlzOiAke3JldGFpbkFzc2V0c0luRGF5c31gKTtcblxuICAgICAgICBsZXQgYXNzZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBsYXN0VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB0b3RhbEFzc2V0c1NjYW5uZWQgPSAwO1xuICAgICAgICBsZXQgdG90YWxCYXRjaGVzID0gMDtcbiAgICAgICAgY29uc3QgYXNzZXRzRGVsZXRlUmVzdWx0czogRGVsZXRlT2JqZWN0c0NvbW1hbmRPdXRwdXRbXSA9IFtdO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IGN1ckFzc2V0c1Jlc3VsdDogTGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIFByZWZpeDogJ19udXh0LycsIC8vIE9ubHkgc2NhbiBfbnV4dC8gZGlyZWN0b3J5IHdoZXJlIGJ1aWxkIGFzc2V0cyBhcmUgc3RvcmVkXG4gICAgICAgICAgICAgICAgICAgIE1heEtleXM6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBsYXN0VG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzIHx8IGN1ckFzc2V0c1Jlc3VsdC5Db250ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gYXNzZXRzIGZvdW5kIGluIGN1cnJlbnQgYmF0Y2gnKTtcbiAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSBjdXJBc3NldHNSZXN1bHQuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b3RhbEFzc2V0c1NjYW5uZWQgKz0gY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCYXRjaCAkeysrdG90YWxCYXRjaGVzfTogU2Nhbm5pbmcgJHtjdXJBc3NldHNSZXN1bHQuQ29udGVudHMubGVuZ3RofSBhc3NldHMgKFRvdGFsOiAke3RvdGFsQXNzZXRzU2Nhbm5lZH0pYCk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgb2JqZWN0IG1ldGFkYXRhIGluIGJsb2NrcyBvZiA1MCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgICAgICAgICBsZXQgcHJvY2Vzc2FibGVBc3NldHMgPSBbLi4uY3VyQXNzZXRzUmVzdWx0LkNvbnRlbnRzXTtcblxuICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3NhYmxlQXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NldHNCYXRjaCA9IHByb2Nlc3NhYmxlQXNzZXRzLnNsaWNlKDAsIDUwKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzYWJsZUFzc2V0cyA9IHByb2Nlc3NhYmxlQXNzZXRzLnNsaWNlKDUwKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdNZXRhZGF0YVJlcXVlc3RzID0gYXNzZXRzQmF0Y2gubWFwKGFzc2V0ID0+XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhlYWRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5OiBhc3NldC5LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgJHthc3NldC5LZXl9OmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgTWV0YWRhdGE6IHt9IH07IC8vIFJldHVybiBlbXB0eSBtZXRhZGF0YSBvbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nTWV0YWRhdGFSZXF1ZXN0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gbWV0YWRhdGEgdG8gYXNzZXRzXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFCeUFzc2V0OiBBc3NldE1ldGFkYXRhW10gPSBtZXRhZGF0YVJlc3VsdHMubWFwKChtZXRhZGF0YVJlc3VsdCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYXNzZXRzQmF0Y2hbaW5kZXhdLktleSEsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YVJlc3VsdC5NZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRkYXRlZEFzc2V0S2V5cyA9IGZpbHRlck91dGRhdGVkQXNzZXRLZXlzKG1ldGFkYXRhQnlBc3NldCwgZGVsZXRlT2xkZXJUaGFuKTtcbiAgICAgICAgICAgICAgICBhc3NldEtleXNUb0RlbGV0ZS5wdXNoKC4uLm91dGRhdGVkQXNzZXRLZXlzKTtcblxuICAgICAgICAgICAgICAgIC8vIFN0cmVhbSBkZWxldGlvbjogRGVsZXRlIGluIGJhdGNoZXMgb2YgMTAwMCB0byBhdm9pZCBtZW1vcnkgaXNzdWVzIGFuZCB0aW1lb3V0c1xuICAgICAgICAgICAgICAgIGlmIChhc3NldEtleXNUb0RlbGV0ZS5sZW5ndGggPj0gTUFYX0RFTEVURV9PQkpFQ1RfS0VZUykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgYmF0Y2ggb2YgJHthc3NldEtleXNUb0RlbGV0ZS5sZW5ndGh9IGFzc2V0cy4uLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZGVsZXRlQXNzZXRzKGFzc2V0S2V5c1RvRGVsZXRlLCBjbGllbnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBhc3NldHNEZWxldGVSZXN1bHRzLnB1c2goLi4ucmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2V0S2V5c1RvRGVsZXRlID0gW107IC8vIENsZWFyIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RUb2tlbiA9IGN1ckFzc2V0c1Jlc3VsdC5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gICAgICAgIH0gd2hpbGUgKGxhc3RUb2tlbiAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICAvLyBEZWxldGUgcmVtYWluaW5nIGFzc2V0c1xuICAgICAgICBpZiAoYXNzZXRLZXlzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIGZpbmFsIGJhdGNoIG9mICR7YXNzZXRLZXlzVG9EZWxldGUubGVuZ3RofSBhc3NldHMuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBkZWxldGVBc3NldHMoYXNzZXRLZXlzVG9EZWxldGUsIGNsaWVudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICBhc3NldHNEZWxldGVSZXN1bHRzLnB1c2goLi4ucmVzdWx0cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZGVsZXRpb24gZXJyb3JzIGFuZCByZXBvcnRcbiAgICAgICAgY29uc3QgZmFpbGVkID0gYXNzZXRzRGVsZXRlUmVzdWx0cy5yZWR1Y2UoKHByZXZpb3VzUmVzdWx0OiBib29sZWFuLCBjdXJyZW50UmVzdWx0OiBEZWxldGVPYmplY3RzQ29tbWFuZE91dHB1dCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFzQ3VycmVudEVycm9yOiBib29sZWFuID0gISEoY3VycmVudFJlc3VsdC5FcnJvcnMgJiYgY3VycmVudFJlc3VsdC5FcnJvcnMubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBpZiAoaGFzQ3VycmVudEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlbGV0ZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzJywgY3VycmVudFJlc3VsdC5FcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzUmVzdWx0IHx8IGhhc0N1cnJlbnRFcnJvcjtcbiAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlbGV0ZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgQ2xlYW51cCBvZiBvbGQgc3RhdGljIGFzc2V0cyBmaW5pc2hlZC4gVG90YWwgYXNzZXRzIHNjYW5uZWQ6ICR7dG90YWxBc3NldHNTY2FubmVkfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyMjIyB1bmV4cGVjdGVkIHJ1bnRpbWUgZXJyb3IgIyMjJywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdG8gbWFyayBMYW1iZGEgYXMgZmFpbGVkXG4gICAgfVxufTsiXX0=
@@ -93,25 +93,39 @@ exports.handler = async (event: any, context: any) => {
93
93
  const deleteOlderThan = new Date(currentRevision.getTime() - retainAssetsInDays * ONE_DAY_IN_MILLISECONDS);
94
94
 
95
95
  console.log(`Starting cleanup of static assets older than ${deleteOlderThan.toISOString()}...`);
96
+ console.log(`Current revision: ${currentRevision.toISOString()}, Retention days: ${retainAssetsInDays}`);
96
97
 
97
98
  let assetKeysToDelete: string[] = [];
98
99
  let lastToken = undefined;
100
+ let totalAssetsScanned = 0;
101
+ let totalBatches = 0;
102
+ const assetsDeleteResults: DeleteObjectsCommandOutput[] = [];
99
103
 
100
104
  do {
101
105
  const curAssetsResult: ListObjectsV2CommandOutput = await client.send(
102
106
  new ListObjectsV2Command({
103
107
  Bucket: bucketName,
104
- MaxKeys: 250,
108
+ Prefix: '_nuxt/', // Only scan _nuxt/ directory where build assets are stored
109
+ MaxKeys: 1000,
105
110
  ContinuationToken: lastToken,
106
111
  })
107
112
  );
108
113
 
109
- // Read object metadata in blocks of 10
110
- let processableAssets = [...curAssetsResult.Contents!];
114
+ if (!curAssetsResult.Contents || curAssetsResult.Contents.length === 0) {
115
+ console.log('No assets found in current batch');
116
+ lastToken = curAssetsResult.NextContinuationToken;
117
+ continue;
118
+ }
119
+
120
+ totalAssetsScanned += curAssetsResult.Contents.length;
121
+ console.log(`Batch ${++totalBatches}: Scanning ${curAssetsResult.Contents.length} assets (Total: ${totalAssetsScanned})`);
122
+
123
+ // Read object metadata in blocks of 50 for better performance
124
+ let processableAssets = [...curAssetsResult.Contents];
111
125
 
112
126
  while (processableAssets.length > 0) {
113
- const assetsBatch = processableAssets.slice(0, 10);
114
- processableAssets = processableAssets.slice(10);
127
+ const assetsBatch = processableAssets.slice(0, 50);
128
+ processableAssets = processableAssets.slice(50);
115
129
 
116
130
  const pendingMetadataRequests = assetsBatch.map(asset =>
117
131
  client.send(
@@ -119,46 +133,57 @@ exports.handler = async (event: any, context: any) => {
119
133
  Bucket: bucketName,
120
134
  Key: asset.Key,
121
135
  })
122
- )
136
+ ).catch(error => {
137
+ console.warn(`Failed to get metadata for ${asset.Key}:`, error.message);
138
+ return { Metadata: {} }; // Return empty metadata on error
139
+ })
123
140
  );
124
141
 
125
142
  const metadataResults = await Promise.all(pendingMetadataRequests);
126
143
 
127
144
  // Assign metadata to assets
128
- const metadataByAsset: AssetMetadata[] = (metadataResults.map((metadataResult, index) => ({
129
- key: assetsBatch[index].Key,
130
- metadata: metadataResult.Metadata,
131
- })) as AssetMetadata[]);
145
+ const metadataByAsset: AssetMetadata[] = metadataResults.map((metadataResult, index) => ({
146
+ key: assetsBatch[index].Key!,
147
+ metadata: metadataResult.Metadata || {},
148
+ }));
132
149
 
133
150
  const outdatedAssetKeys = filterOutdatedAssetKeys(metadataByAsset, deleteOlderThan);
134
151
  assetKeysToDelete.push(...outdatedAssetKeys);
152
+
153
+ // Stream deletion: Delete in batches of 1000 to avoid memory issues and timeouts
154
+ if (assetKeysToDelete.length >= MAX_DELETE_OBJECT_KEYS) {
155
+ console.log(`Deleting batch of ${assetKeysToDelete.length} assets...`);
156
+ const results = await deleteAssets(assetKeysToDelete, client, bucketName);
157
+ assetsDeleteResults.push(...results);
158
+ assetKeysToDelete = []; // Clear the array
159
+ }
135
160
  }
136
161
  lastToken = curAssetsResult.NextContinuationToken;
137
162
  } while (lastToken !== undefined);
138
163
 
139
- if (assetKeysToDelete.length === 0) {
140
- console.log('No outdated assets to delete found');
141
- return;
164
+ // Delete remaining assets
165
+ if (assetKeysToDelete.length > 0) {
166
+ console.log(`Deleting final batch of ${assetKeysToDelete.length} assets...`);
167
+ const results = await deleteAssets(assetKeysToDelete, client, bucketName);
168
+ assetsDeleteResults.push(...results);
142
169
  }
143
170
 
144
- console.log('Deleting ' + assetKeysToDelete.length + ' assets...');
145
-
146
- // Delete outdated assets (max. 1000 allowed per request)
147
- const results = await deleteAssets(assetKeysToDelete, client, bucketName);
148
- const failed = results.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {
149
- const currentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);
150
- if (currentError) {
171
+ // Check for deletion errors and report
172
+ const failed = assetsDeleteResults.reduce((previousResult: boolean, currentResult: DeleteObjectsCommandOutput): boolean => {
173
+ const hasCurrentError: boolean = !!(currentResult.Errors && currentResult.Errors.length > 0);
174
+ if (hasCurrentError) {
151
175
  console.error('Failed to delete outdated static assets', currentResult.Errors);
152
176
  }
153
- return previousResult || currentError;
177
+ return previousResult || hasCurrentError;
154
178
  }, false);
155
179
 
156
180
  if (failed) {
157
181
  throw new Error('Failed to delete outdated static assets');
158
182
  }
159
183
 
160
- console.log('Cleanup of old static assets finished');
184
+ console.log(`Cleanup of old static assets finished. Total assets scanned: ${totalAssetsScanned}`);
161
185
  } catch (error) {
162
186
  console.error('### unexpected runtime error ###', error);
187
+ throw error; // Re-throw to mark Lambda as failed
163
188
  }
164
189
  };
@@ -18,4 +18,16 @@ export interface AccessLogsAnalysisProps {
18
18
  * Logs in the transformed table will be deleted after this period. Default: 180 days.
19
19
  */
20
20
  readonly expireTransformedLogsAfter?: Duration;
21
+ /**
22
+ * Whether to anonymize the client IP address in the access logs by replacing the last octet (IPv4)
23
+ * or the last group (IPv6) with 'xxx'.
24
+ *
25
+ * **GDPR/Legal note:** IP addresses are considered personal data under the GDPR (cf. CJEU judgment C‑582/14).
26
+ * If you disable anonymization, you must ensure a legal basis under Art. 6 GDPR (e.g. legitimate interest),
27
+ * document it in your privacy policy, and limit the retention period to what is strictly necessary.
28
+ * When in doubt, consult a data protection officer or legal counsel before disabling this option.
29
+ *
30
+ * Defaults to `true`.
31
+ */
32
+ readonly anonymizeClientIp?: boolean;
21
33
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBFeHByZXNzaW9uIHRvIHByZXBlbmQgdG8gYW55IGNyZWF0ZWQgcmVzb3VyY2VzXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVzb3VyY2VQcmVmaXg6IHN0cmluZztcblxuICAgIHJlYWRvbmx5IGJ1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogTG9ncyBpbiB0aGUgcmF3IHRhYmxlIHdpbGwgYmUgZGVsZXRlZCBhZnRlciB0aGlzIHBlcmlvZC4gRGVmYXVsdDogNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4cGlyZVJhd0xvZ3NBZnRlcj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogTG9ncyBpbiB0aGUgaW50ZXJtZWRpYXRlIGRhdGUgZ3JvdXAgdGFibGUgd2lsbCBiZSBkZWxldGVkIGFmdGVyIHRoaXMgcGVyaW9kLiBEZWZhdWx0OiA3IGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhwaXJlSW50ZXJtZWRpYXRlTG9nc0FmdGVyPzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIGluIHRoZSB0cmFuc2Zvcm1lZCB0YWJsZSB3aWxsIGJlIGRlbGV0ZWQgYWZ0ZXIgdGhpcyBwZXJpb2QuIERlZmF1bHQ6IDE4MCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyPzogRHVyYXRpb247XG59Il19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBFeHByZXNzaW9uIHRvIHByZXBlbmQgdG8gYW55IGNyZWF0ZWQgcmVzb3VyY2VzXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVzb3VyY2VQcmVmaXg6IHN0cmluZztcblxuICAgIHJlYWRvbmx5IGJ1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogTG9ncyBpbiB0aGUgcmF3IHRhYmxlIHdpbGwgYmUgZGVsZXRlZCBhZnRlciB0aGlzIHBlcmlvZC4gRGVmYXVsdDogNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4cGlyZVJhd0xvZ3NBZnRlcj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogTG9ncyBpbiB0aGUgaW50ZXJtZWRpYXRlIGRhdGUgZ3JvdXAgdGFibGUgd2lsbCBiZSBkZWxldGVkIGFmdGVyIHRoaXMgcGVyaW9kLiBEZWZhdWx0OiA3IGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhwaXJlSW50ZXJtZWRpYXRlTG9nc0FmdGVyPzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIGluIHRoZSB0cmFuc2Zvcm1lZCB0YWJsZSB3aWxsIGJlIGRlbGV0ZWQgYWZ0ZXIgdGhpcyBwZXJpb2QuIERlZmF1bHQ6IDE4MCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyPzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGFub255bWl6ZSB0aGUgY2xpZW50IElQIGFkZHJlc3MgaW4gdGhlIGFjY2VzcyBsb2dzIGJ5IHJlcGxhY2luZyB0aGUgbGFzdCBvY3RldCAoSVB2NClcbiAgICAgKiBvciB0aGUgbGFzdCBncm91cCAoSVB2Nikgd2l0aCAneHh4Jy5cbiAgICAgKlxuICAgICAqICoqR0RQUi9MZWdhbCBub3RlOioqIElQIGFkZHJlc3NlcyBhcmUgY29uc2lkZXJlZCBwZXJzb25hbCBkYXRhIHVuZGVyIHRoZSBHRFBSIChjZi4gQ0pFVSBqdWRnbWVudCBD4oCRNTgyLzE0KS5cbiAgICAgKiBJZiB5b3UgZGlzYWJsZSBhbm9ueW1pemF0aW9uLCB5b3UgbXVzdCBlbnN1cmUgYSBsZWdhbCBiYXNpcyB1bmRlciBBcnQuIDYgR0RQUiAoZS5nLiBsZWdpdGltYXRlIGludGVyZXN0KSxcbiAgICAgKiBkb2N1bWVudCBpdCBpbiB5b3VyIHByaXZhY3kgcG9saWN5LCBhbmQgbGltaXQgdGhlIHJldGVudGlvbiBwZXJpb2QgdG8gd2hhdCBpcyBzdHJpY3RseSBuZWNlc3NhcnkuXG4gICAgICogV2hlbiBpbiBkb3VidCwgY29uc3VsdCBhIGRhdGEgcHJvdGVjdGlvbiBvZmZpY2VyIG9yIGxlZ2FsIGNvdW5zZWwgYmVmb3JlIGRpc2FibGluZyB0aGlzIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbm9ueW1pemVDbGllbnRJcD86IGJvb2xlYW47XG59Il19
@@ -23,4 +23,17 @@ export interface AccessLogsAnalysisProps {
23
23
  * Logs in the transformed table will be deleted after this period. Default: 180 days.
24
24
  */
25
25
  readonly expireTransformedLogsAfter?: Duration;
26
+
27
+ /**
28
+ * Whether to anonymize the client IP address in the access logs by replacing the last octet (IPv4)
29
+ * or the last group (IPv6) with 'xxx'.
30
+ *
31
+ * **GDPR/Legal note:** IP addresses are considered personal data under the GDPR (cf. CJEU judgment C‑582/14).
32
+ * If you disable anonymization, you must ensure a legal basis under Art. 6 GDPR (e.g. legitimate interest),
33
+ * document it in your privacy policy, and limit the retention period to what is strictly necessary.
34
+ * When in doubt, consult a data protection officer or legal counsel before disabling this option.
35
+ *
36
+ * Defaults to `true`.
37
+ */
38
+ readonly anonymizeClientIp?: boolean;
26
39
  }
@@ -162,10 +162,10 @@ class AccessLogsTableConfig {
162
162
  },
163
163
  {
164
164
  name: 'sc_status',
165
- type: aws_glue_alpha_1.Schema.INTEGER,
165
+ type: aws_glue_alpha_1.Schema.STRING,
166
166
  }
167
167
  ];
168
168
  }
169
169
  }
170
170
  exports.AccessLogsTableConfig = AccessLogsTableConfig;
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsNERBQTREO0FBRTVELE1BQWEscUJBQXFCO0lBQ3pCLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlO1FBQzNCLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxJQUFJO2FBQ2xCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLHVCQUFNLENBQUMsT0FBTzthQUNyQjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNE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SSxFQUFFLHVCQUFNLENBQUMsT0FBTzthQUNyQjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsS0Qsc0RBa0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyB0aGUgY29sdW1uIGRlc2NyaXB0aW9ucyBmb3IgYm90aCBvZiB0aGUgYWNjZXNzIGxvZyB0YWJsZXMuXG4gKi9cbmltcG9ydCB7dHlwZSBDb2x1bW4sIFNjaGVtYX0gZnJvbSAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGEnO1xuXG5leHBvcnQgY2xhc3MgQWNjZXNzTG9nc1RhYmxlQ29uZmlnIHtcbiAgcHVibGljIHN0YXRpYyBnZXRQYXJ0aXRpb25LZXlzKCk6IENvbHVtbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAneWVhcicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbW9udGgnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RheScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG91cicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFRhYmxlQ29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RhdGUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuREFURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdsb2NhdGlvbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYnl0ZXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1ZXN0X2lwJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdtZXRob2QnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hvc3QnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VyaScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc3RhdHVzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVmZXJyZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VzZXJfYWdlbnQnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3F1ZXJ5X3N0cmluZycsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29va2llJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXN1bHRfdHlwZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVxdWVzdF9pZCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG9zdF9oZWFkZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfcHJvdG9jb2wnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfYnl0ZXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lX3Rha2VuJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkZMT0FULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3hmb3J3YXJkZWRfZm9yJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzc2xfcHJvdG9jb2wnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NzbF9jaXBoZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Jlc3BvbnNlX3Jlc3VsdF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdodHRwX3ZlcnNpb24nLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsZV9zdGF0dXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsZV9lbmNyeXB0ZWRfZmllbGRzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY19wb3J0JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndGltZV90b19maXJzdF9ieXRlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkZMT0FULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3hfZWRnZV9kZXRhaWxlZF9yZXN1bHRfdHlwZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfY29udGVudF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY19jb250ZW50X2xlbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5CSUdfSU5ULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NjX3JhbmdlX3N0YXJ0JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfcmFuZ2VfZW5kJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2Nfc3RhdHVzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9XG4gICAgXTtcbiAgfVxufVxuIl19
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsNERBQTREO0FBRTVELE1BQWEscUJBQXFCO0lBQ3pCLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlO1FBQzNCLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxJQUFJO2FBQ2xCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLHVCQUFNLENBQUMsT0FBTzthQUNyQjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNE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SSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsS0Qsc0RBa0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyB0aGUgY29sdW1uIGRlc2NyaXB0aW9ucyBmb3IgYm90aCBvZiB0aGUgYWNjZXNzIGxvZyB0YWJsZXMuXG4gKi9cbmltcG9ydCB7dHlwZSBDb2x1bW4sIFNjaGVtYX0gZnJvbSAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGEnO1xuXG5leHBvcnQgY2xhc3MgQWNjZXNzTG9nc1RhYmxlQ29uZmlnIHtcbiAgcHVibGljIHN0YXRpYyBnZXRQYXJ0aXRpb25LZXlzKCk6IENvbHVtbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAneWVhcicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbW9udGgnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RheScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG91cicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFRhYmxlQ29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RhdGUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuREFURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdsb2NhdGlvbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYnl0ZXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1ZXN0X2lwJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdtZXRob2QnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2hvc3QnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VyaScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc3RhdHVzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVmZXJyZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VzZXJfYWdlbnQnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3F1ZXJ5X3N0cmluZycsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29va2llJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXN1bHRfdHlwZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVxdWVzdF9pZCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG9zdF9oZWFkZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfcHJvdG9jb2wnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfYnl0ZXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lX3Rha2VuJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkZMT0FULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3hmb3J3YXJkZWRfZm9yJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzc2xfcHJvdG9jb2wnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NzbF9jaXBoZXInLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Jlc3BvbnNlX3Jlc3VsdF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdodHRwX3ZlcnNpb24nLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsZV9zdGF0dXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2ZsZV9lbmNyeXB0ZWRfZmllbGRzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY19wb3J0JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLklOVEVHRVIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndGltZV90b19maXJzdF9ieXRlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkZMT0FULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3hfZWRnZV9kZXRhaWxlZF9yZXN1bHRfdHlwZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfY29udGVudF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY19jb250ZW50X2xlbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5CSUdfSU5ULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NjX3JhbmdlX3N0YXJ0JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfcmFuZ2VfZW5kJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2Nfc3RhdHVzJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH1cbiAgICBdO1xuICB9XG59XG4iXX0=
@@ -161,7 +161,7 @@ export class AccessLogsTableConfig {
161
161
  },
162
162
  {
163
163
  name: 'sc_status',
164
- type: Schema.INTEGER,
164
+ type: Schema.STRING,
165
165
  }
166
166
  ];
167
167
  }
@@ -27,7 +27,7 @@ export declare class CloudFrontAccessLogsAnalysis extends AccessLogsAnalysis {
27
27
  protected createAccessLogsParquetTable(): AccessLogsParquetTable;
28
28
  /**
29
29
  * Returns rules to
30
- * <ul>replaces the last part of an IP address (IPv4 and IPv6)</ul>
30
+ * <ul>optionally replace the last part of an IP address (IPv4 and IPv6) when {@link CloudFrontAccessLogsAnalysisProps.anonymizeClientIp} is true (default)</ul>
31
31
  * <ul>optionally remove all cookies, that are not whitelisted</ul>
32
32
  * <ul>optionally decode quotes in cookies</ul>
33
33
  */
@@ -43,13 +43,16 @@ class CloudFrontAccessLogsAnalysis extends AccessLogsAnalysis_1.AccessLogsAnalys
43
43
  }
44
44
  /**
45
45
  * Returns rules to
46
- * <ul>replaces the last part of an IP address (IPv4 and IPv6)</ul>
46
+ * <ul>optionally replace the last part of an IP address (IPv4 and IPv6) when {@link CloudFrontAccessLogsAnalysisProps.anonymizeClientIp} is true (default)</ul>
47
47
  * <ul>optionally remove all cookies, that are not whitelisted</ul>
48
48
  * <ul>optionally decode quotes in cookies</ul>
49
49
  */
50
50
  getColumnTransformationRules(props) {
51
+ var _a;
51
52
  return {
52
- request_ip: "regexp_replace(request_ip, '(.*\\.|:).*', '$1xxx')",
53
+ request_ip: ((_a = props.anonymizeClientIp) !== null && _a !== void 0 ? _a : true)
54
+ ? "regexp_replace(request_ip, '(.*\\.|:).*', '$1xxx')"
55
+ : undefined,
53
56
  cookie: props.accessLogCookies
54
57
  ? `replace( array_join( regexp_extract_all( cookie, '(${props.accessLogCookies.join('|')})=[^;]+' ), ';' ), '%2522', '"' )`
55
58
  : undefined,
@@ -57,4 +60,4 @@ class CloudFrontAccessLogsAnalysis extends AccessLogsAnalysis_1.AccessLogsAnalys
57
60
  }
58
61
  }
59
62
  exports.CloudFrontAccessLogsAnalysis = CloudFrontAccessLogsAnalysis;
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsNkRBQXdEO0FBRXhELHVGQUFrRjtBQUNsRixxRUFBZ0U7QUFNaEU7O0dBRUc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHVDQUFrQjtJQUVoRSxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQzlFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDMUIsT0FBTyx1Q0FBa0IsQ0FBQyw4QkFBOEIsQ0FBQztJQUM3RCxDQUFDO0lBRVMsMkJBQTJCO1FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQzFGLENBQUM7SUFFRDs7O09BR0c7SUFDTywwQkFBMEI7UUFDaEMsT0FBTywrRUFBK0UsQ0FBQztJQUMzRixDQUFDO0lBRVMsMkJBQTJCO1FBQ2pDLE9BQU8sSUFBSSxpRUFBK0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGdCQUFnQixFQUFFO1lBQ3ZGLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixVQUFVLEVBQUUsdUNBQWtCLENBQUMsa0NBQWtDO1NBQ3BFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUyw0QkFBNEI7UUFDbEMsT0FBTyxJQUFJLCtDQUFzQixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0Isb0JBQW9CLEVBQUU7WUFDbEYsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFVBQVUsRUFBRSx1Q0FBa0IsQ0FBQyw4QkFBOEI7U0FDaEUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sNEJBQTRCLENBQUMsS0FBd0M7UUFDM0UsT0FBTztZQUNILFVBQVUsRUFBRSxvREFBb0Q7WUFDaEUsTUFBTSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQzFCLENBQUMsQ0FBQyxzREFBc0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDL0UsR0FBRyxDQUNOLG1DQUFtQztnQkFDcEMsQ0FBQyxDQUFDLFNBQVM7U0FDbEIsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQXpERCxvRUF5REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge3R5cGUgQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHN9IGZyb20gXCIuL0FjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzXCI7XG5pbXBvcnQge3R5cGUgQ29sdW1uVHJhbnNmb3JtYXRpb25SdWxlc30gZnJvbSBcIi4uLy4uL2Z1bmN0aW9ucy9hY2Nlc3MtbG9ncy1hbmFseXNpcy9wYXJ0aXRpb25pbmcvdHlwZXNcIjtcbmltcG9ydCB7QWNjZXNzTG9nc0FuYWx5c2lzfSBmcm9tIFwiLi9BY2Nlc3NMb2dzQW5hbHlzaXNcIjtcbmltcG9ydCB7dHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXJ9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZX0gZnJvbSBcIi4vQ2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZVwiO1xuaW1wb3J0IHtBY2Nlc3NMb2dzUGFycXVldFRhYmxlfSBmcm9tIFwiLi9BY2Nlc3NMb2dzUGFycXVldFRhYmxlXCI7XG5cbmludGVyZmFjZSBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMgZXh0ZW5kcyBBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcyB7XG4gICAgcmVhZG9ubHkgYWNjZXNzTG9nQ29va2llcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBBV1MgcmVzb3VyY2VzIHRvIGFuYWx5emUgQ2xvdWRGcm9udCBhY2Nlc3MgbG9ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMgZXh0ZW5kcyBBY2Nlc3NMb2dzQW5hbHlzaXMge1xuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhaWxpbmcgc2xhc2ggaXMgYXV0b21hdGljYWxseSBhZGRlZCBieSBDbG91ZEZyb250XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2dGaWxlUHJlZml4KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1VOUFJPQ0VTU0VEO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRVbnByb2Nlc3NlZE9iamVjdHNGaWx0ZXIoKTogTm90aWZpY2F0aW9uS2V5RmlsdGVyIHtcbiAgICAgICAgcmV0dXJuIHtwcmVmaXg6IGAke0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMuZ2V0TG9nRmlsZVByZWZpeCgpfS9gLCBzdWZmaXg6ICcuZ3onfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8cD5Gb3JtYXQ6ICd7cHJlZml4L317Y2RuX2lkfS57eWVhcn0te21vbnRofS17ZGF5fS17aG91cn0ue3JhbmRvbV9pZH0uZ3onIChzbGFzaCBhZnRlciBwcmVmaXggYXV0by1hcHBlbmRlZCk8L3A+XG4gICAgICogPHA+RXhhbXBsZTogJ3VucHJvY2Vzc2VkL0UyNERONDFDRFpSTE04LjIwMjItMDctMjAtMTMuZDk0NTQzZDAuZ3onPC9wPlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRSYXdBY2Nlc3NMb2dGaWxlUGF0dGVybigpOiBSZWdFeHAge1xuICAgICAgICByZXR1cm4gL1tcXHdcXC9dK1xcLig/PHllYXI+XFxkezR9KS0oPzxtb250aD5cXGR7Mn0pLSg/PGRheT5cXGR7Mn0pLSg/PGhvdXI+XFxkezJ9KVxcLlxcdytcXC5nei87XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUFjY2Vzc0xvZ3NCeURhdGVUYWJsZSgpOiBDbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tdGFibGUtYnktZGF0ZWAsIHtcbiAgICAgICAgICAgIGFjY2Vzc0xvZ3NCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuZGF0YWJhc2UsXG4gICAgICAgICAgICBmb2xkZXJOYW1lOiBBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX0dST1VQRURfQllfREFURSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUoKTogQWNjZXNzTG9nc1BhcnF1ZXRUYWJsZSB7XG4gICAgICAgIHJldHVybiBuZXcgQWNjZXNzTG9nc1BhcnF1ZXRUYWJsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXRhYmxlLXRyYW5zZm9ybWVkYCwge1xuICAgICAgICAgICAgYWNjZXNzTG9nc0J1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kYXRhYmFzZSxcbiAgICAgICAgICAgIGZvbGRlck5hbWU6IEFjY2Vzc0xvZ3NBbmFseXNpcy5BQ0NFU1NfTE9HU19GT0xERVJfVFJBTlNGT1JNRUQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcnVsZXMgdG9cbiAgICAgKiA8dWw+cmVwbGFjZXMgdGhlIGxhc3QgcGFydCBvZiBhbiBJUCBhZGRyZXNzIChJUHY0IGFuZCBJUHY2KTwvdWw+XG4gICAgICogPHVsPm9wdGlvbmFsbHkgcmVtb3ZlIGFsbCBjb29raWVzLCB0aGF0IGFyZSBub3Qgd2hpdGVsaXN0ZWQ8L3VsPlxuICAgICAqIDx1bD5vcHRpb25hbGx5IGRlY29kZSBxdW90ZXMgaW4gY29va2llczwvdWw+XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldENvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXMocHJvcHM6IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcyk6IENvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVxdWVzdF9pcDogXCJyZWdleHBfcmVwbGFjZShyZXF1ZXN0X2lwLCAnKC4qXFxcXC58OikuKicsICckMXh4eCcpXCIsXG4gICAgICAgICAgICBjb29raWU6IHByb3BzLmFjY2Vzc0xvZ0Nvb2tpZXNcbiAgICAgICAgICAgICAgICA/IGByZXBsYWNlKCBhcnJheV9qb2luKCByZWdleHBfZXh0cmFjdF9hbGwoIGNvb2tpZSwgJygke3Byb3BzLmFjY2Vzc0xvZ0Nvb2tpZXMuam9pbihcbiAgICAgICAgICAgICAgICAgICAgJ3wnXG4gICAgICAgICAgICAgICAgKX0pPVteO10rJyApLCAnOycgKSwgJyUyNTIyJywgJ1wiJyApYFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsNkRBQXdEO0FBRXhELHVGQUFrRjtBQUNsRixxRUFBZ0U7QUFNaEU7O0dBRUc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHVDQUFrQjtJQUVoRSxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQzlFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDMUIsT0FBTyx1Q0FBa0IsQ0FBQyw4QkFBOEIsQ0FBQztJQUM3RCxDQUFDO0lBRVMsMkJBQTJCO1FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQzFGLENBQUM7SUFFRDs7O09BR0c7SUFDTywwQkFBMEI7UUFDaEMsT0FBTywrRUFBK0UsQ0FBQztJQUMzRixDQUFDO0lBRVMsMkJBQTJCO1FBQ2pDLE9BQU8sSUFBSSxpRUFBK0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGdCQUFnQixFQUFFO1lBQ3ZGLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixVQUFVLEVBQUUsdUNBQWtCLENBQUMsa0NBQWtDO1NBQ3BFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUyw0QkFBNEI7UUFDbEMsT0FBTyxJQUFJLCtDQUFzQixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0Isb0JBQW9CLEVBQUU7WUFDbEYsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFVBQVUsRUFBRSx1Q0FBa0IsQ0FBQyw4QkFBOEI7U0FDaEUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sNEJBQTRCLENBQUMsS0FBd0M7O1FBQzNFLE9BQU87WUFDSCxVQUFVLEVBQUUsQ0FBQyxNQUFBLEtBQUssQ0FBQyxpQkFBaUIsbUNBQUksSUFBSSxDQUFDO2dCQUN6QyxDQUFDLENBQUMsb0RBQW9EO2dCQUN0RCxDQUFDLENBQUMsU0FBUztZQUNmLE1BQU0sRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2dCQUMxQixDQUFDLENBQUMsc0RBQXNELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQy9FLEdBQUcsQ0FDTixtQ0FBbUM7Z0JBQ3BDLENBQUMsQ0FBQyxTQUFTO1NBQ2xCLENBQUM7SUFDTixDQUFDO0NBQ0o7QUEzREQsb0VBMkRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHt0eXBlIEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzfSBmcm9tIFwiLi9BY2Nlc3NMb2dzQW5hbHlzaXNQcm9wc1wiO1xuaW1wb3J0IHt0eXBlIENvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXN9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvcGFydGl0aW9uaW5nL3R5cGVzXCI7XG5pbXBvcnQge0FjY2Vzc0xvZ3NBbmFseXNpc30gZnJvbSBcIi4vQWNjZXNzTG9nc0FuYWx5c2lzXCI7XG5pbXBvcnQge3R5cGUgTm90aWZpY2F0aW9uS2V5RmlsdGVyfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQge0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQnlEYXRlVGFibGV9IGZyb20gXCIuL0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQnlEYXRlVGFibGVcIjtcbmltcG9ydCB7QWNjZXNzTG9nc1BhcnF1ZXRUYWJsZX0gZnJvbSBcIi4vQWNjZXNzTG9nc1BhcnF1ZXRUYWJsZVwiO1xuXG5pbnRlcmZhY2UgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzIGV4dGVuZHMgQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMge1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ0Nvb2tpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgQVdTIHJlc291cmNlcyB0byBhbmFseXplIENsb3VkRnJvbnQgYWNjZXNzIGxvZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzIGV4dGVuZHMgQWNjZXNzTG9nc0FuYWx5c2lzIHtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYWlsaW5nIHNsYXNoIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgQ2xvdWRGcm9udFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TG9nRmlsZVByZWZpeCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQWNjZXNzTG9nc0FuYWx5c2lzLkFDQ0VTU19MT0dTX0ZPTERFUl9VTlBST0NFU1NFRDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0VW5wcm9jZXNzZWRPYmplY3RzRmlsdGVyKCk6IE5vdGlmaWNhdGlvbktleUZpbHRlciB7XG4gICAgICAgIHJldHVybiB7cHJlZml4OiBgJHtDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzLmdldExvZ0ZpbGVQcmVmaXgoKX0vYCwgc3VmZml4OiAnLmd6J307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPHA+Rm9ybWF0OiAne3ByZWZpeC99e2Nkbl9pZH0ue3llYXJ9LXttb250aH0te2RheX0te2hvdXJ9LntyYW5kb21faWR9Lmd6JyAoc2xhc2ggYWZ0ZXIgcHJlZml4IGF1dG8tYXBwZW5kZWQpPC9wPlxuICAgICAqIDxwPkV4YW1wbGU6ICd1bnByb2Nlc3NlZC9FMjRETjQxQ0RaUkxNOC4yMDIyLTA3LTIwLTEzLmQ5NDU0M2QwLmd6JzwvcD5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UmF3QWNjZXNzTG9nRmlsZVBhdHRlcm4oKTogUmVnRXhwIHtcbiAgICAgICAgcmV0dXJuIC9bXFx3XFwvXStcXC4oPzx5ZWFyPlxcZHs0fSktKD88bW9udGg+XFxkezJ9KS0oPzxkYXk+XFxkezJ9KS0oPzxob3VyPlxcZHsyfSlcXC5cXHcrXFwuZ3ovO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVBY2Nlc3NMb2dzQnlEYXRlVGFibGUoKTogQ2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXRhYmxlLWJ5LWRhdGVgLCB7XG4gICAgICAgICAgICBhY2Nlc3NMb2dzQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRhdGFiYXNlLFxuICAgICAgICAgICAgZm9sZGVyTmFtZTogQWNjZXNzTG9nc0FuYWx5c2lzLkFDQ0VTU19MT0dTX0ZPTERFUl9HUk9VUEVEX0JZX0RBVEUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVBY2Nlc3NMb2dzUGFycXVldFRhYmxlKCk6IEFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUge1xuICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS10YWJsZS10cmFuc2Zvcm1lZGAsIHtcbiAgICAgICAgICAgIGFjY2Vzc0xvZ3NCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuZGF0YWJhc2UsXG4gICAgICAgICAgICBmb2xkZXJOYW1lOiBBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1RSQU5TRk9STUVELFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJ1bGVzIHRvXG4gICAgICogPHVsPm9wdGlvbmFsbHkgcmVwbGFjZSB0aGUgbGFzdCBwYXJ0IG9mIGFuIElQIGFkZHJlc3MgKElQdjQgYW5kIElQdjYpIHdoZW4ge0BsaW5rIENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcy5hbm9ueW1pemVDbGllbnRJcH0gaXMgdHJ1ZSAoZGVmYXVsdCk8L3VsPlxuICAgICAqIDx1bD5vcHRpb25hbGx5IHJlbW92ZSBhbGwgY29va2llcywgdGhhdCBhcmUgbm90IHdoaXRlbGlzdGVkPC91bD5cbiAgICAgKiA8dWw+b3B0aW9uYWxseSBkZWNvZGUgcXVvdGVzIGluIGNvb2tpZXM8L3VsPlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb2x1bW5UcmFuc2Zvcm1hdGlvblJ1bGVzKHByb3BzOiBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpOiBDb2x1bW5UcmFuc2Zvcm1hdGlvblJ1bGVzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlcXVlc3RfaXA6IChwcm9wcy5hbm9ueW1pemVDbGllbnRJcCA/PyB0cnVlKVxuICAgICAgICAgICAgICAgID8gXCJyZWdleHBfcmVwbGFjZShyZXF1ZXN0X2lwLCAnKC4qXFxcXC58OikuKicsICckMXh4eCcpXCJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvb2tpZTogcHJvcHMuYWNjZXNzTG9nQ29va2llc1xuICAgICAgICAgICAgICAgID8gYHJlcGxhY2UoIGFycmF5X2pvaW4oIHJlZ2V4cF9leHRyYWN0X2FsbCggY29va2llLCAnKCR7cHJvcHMuYWNjZXNzTG9nQ29va2llcy5qb2luKFxuICAgICAgICAgICAgICAgICAgICAnfCdcbiAgICAgICAgICAgICAgICApfSk9W147XSsnICksICc7JyApLCAnJTI1MjInLCAnXCInIClgXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
@@ -56,13 +56,15 @@ export class CloudFrontAccessLogsAnalysis extends AccessLogsAnalysis {
56
56
 
57
57
  /**
58
58
  * Returns rules to
59
- * <ul>replaces the last part of an IP address (IPv4 and IPv6)</ul>
59
+ * <ul>optionally replace the last part of an IP address (IPv4 and IPv6) when {@link CloudFrontAccessLogsAnalysisProps.anonymizeClientIp} is true (default)</ul>
60
60
  * <ul>optionally remove all cookies, that are not whitelisted</ul>
61
61
  * <ul>optionally decode quotes in cookies</ul>
62
62
  */
63
63
  protected getColumnTransformationRules(props: CloudFrontAccessLogsAnalysisProps): ColumnTransformationRules {
64
64
  return {
65
- request_ip: "regexp_replace(request_ip, '(.*\\.|:).*', '$1xxx')",
65
+ request_ip: (props.anonymizeClientIp ?? true)
66
+ ? "regexp_replace(request_ip, '(.*\\.|:).*', '$1xxx')"
67
+ : undefined,
66
68
  cookie: props.accessLogCookies
67
69
  ? `replace( array_join( regexp_extract_all( cookie, '(${props.accessLogCookies.join(
68
70
  '|'
@@ -171,8 +171,8 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
171
171
  code: aws_lambda_1.Code.fromAsset(`${functionDirPath}/build/app`, {
172
172
  exclude: ['*.d.ts']
173
173
  }),
174
- timeout: aws_cdk_lib_1.Duration.minutes(5),
175
- memorySize: 128,
174
+ timeout: aws_cdk_lib_1.Duration.minutes(15),
175
+ memorySize: 512,
176
176
  environment: {
177
177
  STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
178
178
  OUTDATED_ASSETS_RETENTION_DAYS: `${(_a = props.outdatedAssetsRetentionDays) !== null && _a !== void 0 ? _a : 30}`,
@@ -556,6 +556,7 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
556
556
  return bucket;
557
557
  }
558
558
  createAccessLogsAnalysis(props) {
559
+ var _a;
559
560
  if (!this.accessLogsBucket) {
560
561
  throw new Error('Access bucket not set');
561
562
  }
@@ -564,8 +565,12 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
564
565
  bucket: this.accessLogsBucket,
565
566
  resourcePrefix: `${this.resourceIdPrefix}-access-logs`,
566
567
  accessLogCookies: props.accessLogCookies,
568
+ anonymizeClientIp: (_a = props.anonymizeAccessLogClientIp) !== null && _a !== void 0 ? _a : true,
569
+ expireRawLogsAfter: props.accessLogsRawRetention,
570
+ expireIntermediateLogsAfter: props.accessLogsIntermediateRetention,
571
+ expireTransformedLogsAfter: props.accessLogsTransformedRetention,
567
572
  });
568
573
  }
569
574
  }
570
575
  exports.NuxtServerAppStack = NuxtServerAppStack;
571
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFzRjtBQUN0RiwrQ0FNNEI7QUFDNUIseURBQXdHO0FBQ3hHLHFFQUFxRjtBQUNyRiwrRUFBOEU7QUFDOUUseUVBQWlFO0FBQ2pFLG1EQUErRDtBQUMvRCxnRUFBNEY7QUFDNUYsdURBQXVFO0FBQ3ZFLHVFQUE4RDtBQUM5RCw2QkFBNkI7QUFDN0IsMkJBQXdEO0FBRXhELDZGQUFnRjtBQUNoRixtRUFBMkc7QUFFM0c7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBa0d6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCOztRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNiLEdBQUcsS0FBSztZQUVSLHVFQUF1RTtZQUN2RSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLEdBQUcsMENBQUUsTUFBTSxNQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCO1NBQ2pJLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUEsa0RBQTRCLEVBQUMsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFHLENB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QWtFO1lBQ2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxLQUE4QjtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxPQUFPLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUV6RyxJQUFJLDRCQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUJBQXVCLEVBQUU7WUFDcEYsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjO1lBQ3RELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBMXNCRCxnREEwc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2t9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2VydGlmaWNhdGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICAgIEFsbG93ZWRNZXRob2RzLFxuICAgIHR5cGUgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIHR5cGUgSU9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpblByb3RvY29sUG9saWN5LCBPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgIFByaWNlQ2xhc3MsXG4gICAgU2VjdXJpdHlQb2xpY3lQcm90b2NvbCxcbiAgICBWaWV3ZXJQcm90b2NvbFBvbGljeSxPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IsIE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvciwgT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3Jcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgT2JqZWN0T3duZXJzaGlwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QWFhYVJlY29yZCwgQVJlY29yZCwgSG9zdGVkWm9uZSwgdHlwZSBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge2dldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MsIHR5cGUgU3RhdGljQXNzZXRDb25maWd9IGZyb20gXCIuLi9OdXh0QXBwU3RhdGljQXNzZXRzXCI7XG5pbXBvcnQge1J1bGUsIFJ1bGVUYXJnZXRJbnB1dCwgU2NoZWR1bGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge3dyaXRlRmlsZVN5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQge3R5cGUgTnV4dFNlcnZlckFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzXCI7XG5pbXBvcnQge0h0dHBMYW1iZGFJbnRlZ3JhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCI7XG5pbXBvcnQge0RvbWFpbk5hbWUsIEVuZHBvaW50VHlwZSwgSHR0cEFwaSwgSHR0cE1ldGhvZCwgU2VjdXJpdHlQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyXCI7XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRvIGRlcGxveSBhIGR5bmFtaWMgTnV4dCBhcHAgKHRhcmdldD1zZXJ2ZXIpIG9uIEFXUyB3aXRoIExhbWJkYSwgQXBpR2F0ZXdheSwgUzMgYW5kIENsb3VkRnJvbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0U2VydmVyQXBwU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcmVmaXggb2YgdGhlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUlkUHJlZml4OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCB0aGF0IGlzIHVzZWQgdG8gdGFnIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBkZXBsb3ltZW50XG4gICAgICogdG8gbGF0ZXIgYmUgYWJsZSB0byBjbGVhbiB1cCBvdXRkYXRlZCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudFJldmlzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpdHkgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIGRlcGxveW1lbnQgYXNzZXRzIG9uIFMzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbkFjY2Vzc0lkZW50aXR5OiBJT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIGFjY2Vzc0xvZ3NCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzaXRlbWFwIGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2l0ZW1hcEJ1Y2tldDogQnVja2V0fHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGVhbnVwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcGlHYXRld2F5OiBIdHRwQXBpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3MgZm9yIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCB0aGF0IHNoYWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWNBc3NldENvbmZpZ3M6IFN0YXRpY0Fzc2V0Q29uZmlnW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gb3JpZ2luIGZvciB0aGUgQVBJIGdhdGV3YXkgdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaHR0cE9yaWdpbjogSHR0cE9yaWdpbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZSBwb2xpY3kgdGhhdCBzcGVjaWZpZXMgd2hpY2ggSFRUUCBoZWFkZXJzLCBjb29raWVzLCBhbmQgcXVlcnkgc3RyaW5nc1xuICAgICAqIENsb3VkRnJvbnQgZm9yd2FyZHMgdG8gdGhlIE51eHQgYXBwIGFuZCB1c2VzIHRvIGdlbmVyYXRlIGEgY2FjaGUga2V5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbiByZXF1ZXN0IHBvbGljeSB0aGF0IHNwZWNpZmllcyB3aGljaCBIVFRQIGhlYWRlcnMsIGNvb2tpZXMsIGFuZCBxdWVyeSBzdHJpbmdzXG4gICAgICogQ2xvdWRGcm9udCBmb3J3YXJkcyB0byB0aGUgTnV4dCBhcHAgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcFJlcXVlc3RQb2xpY3k6IE9yaWdpblJlcXVlc3RQb2xpY3kgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBudXh0U2VydmVyUm91dGVCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG46IERpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuXG4gICAgICAgICAgICAvLyBGb3JjZSBjcm9zcy1yZWdpb24gcmVmZXJlbmNlcyBpZiBhIFdBRiBBQ0wgaXMgdXNlZCBvdXRzaWRlIHVzLWVhc3QtMVxuICAgICAgICAgICAgY3Jvc3NSZWdpb25SZWZlcmVuY2VzOiBwcm9wcy53ZWJBY2xBcm4gIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5lbnY/LnJlZ2lvbiAhPT0gJ3VzLWVhc3QtMScgPyB0cnVlIDogcHJvcHMuY3Jvc3NSZWdpb25SZWZlcmVuY2VzLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc291cmNlSWRQcmVmaXggPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLnNlcnZpY2V9LSR7cHJvcHMuZW52aXJvbm1lbnR9YDtcblxuICAgICAgICAvLyBOdXh0IGFwcCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5kZXBsb3ltZW50UmV2aXNpb24gPSB0aGlzLmNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzID0gZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncyhwcm9wcy5yb290RGlyID8/ICcuJyk7XG4gICAgICAgIHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkgPSB0aGlzLmNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0ID0gdGhpcy5jcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTtcblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQgPSB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICB0aGlzLnNpdGVtYXBCdWNrZXQgPSB0aGlzLmNyZWF0ZVNpdGVtYXBCdWNrZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5hcGlHYXRld2F5ID0gdGhpcy5jcmVhdGVBcGlHYXRld2F5KHByb3BzKTtcbiAgICAgICAgdGhpcy5odHRwT3JpZ2luID0gdGhpcy5jcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpO1xuICAgICAgICB0aGlzLmFwcENhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMuYXBwUmVxdWVzdFBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcFJlcXVlc3RQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IgPSB0aGlzLmNyZWF0ZU51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yKClcblxuICAgICAgICB0aGlzLmNkbiA9IHRoaXMuY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlRGVwbG95bWVudHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEbnNSZWNvcmRzKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVBcHBQaW5nUnVsZShwcm9wcyk7XG5cbiAgICAgICAgLy8gU3RhdGljIGFzc2V0cyBjbGVhbnVwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgcmV2aXNpb24gZmlsZSBpbiB0aGUgcHVibGljIGZvbGRlciBvZiB0aGUgTnV4dCBhcHAgdG8gYmUgYWNjZXNzaWJsZVxuICAgICAqIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHJldmlzaW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudFJldmlzaW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGFwcFJldmlzaW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguam9pbihwcm9wcy5yb290RGlyID8/ICcuJywgJy5vdXRwdXQnLCAncHVibGljJyk7XG4gICAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHBhdGguam9pbihkaXIsICdhcHAtcmV2aXNpb24nKSwgYXBwUmV2aXNpb24sIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwcFJldmlzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGlkZW50aXR5IHRvIGFjY2VzcyB0aGUgUzMgZGVwbG95bWVudCBhc3NldCBmaWxlcyB2aWEgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXMzLWFjY2Vzc2A7XG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHN0YXRpYyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VELFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHNpdGVtYXAgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNpdGVtYXBgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBhY2Nlc3NDb250cm9sOiBCdWNrZXRBY2Nlc3NDb250cm9sLlBSSVZBVEUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmNOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1udXh0YDtcblxuICAgICAgICBjb25zdCBhcHBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jTmFtZX0tbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7ZnVuY05hbWV9YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgIH0pO1xuICAgICAgICBhcHBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmNOYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmNOYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBSZW5kZXJzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gTnV4dCBhcHAuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiBgJHtwcm9wcy5lbnRyeXBvaW50ID8/ICdpbmRleCd9LmhhbmRsZXJgLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoYCR7cHJvcHMucm9vdERpciA/PyAnLicgfS8ub3V0cHV0L3NlcnZlcmAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyoqLnN2ZycsICcqKi5pY28nLCAnKioucG5nJywgJyoqLmpwZycsICcqKi5qcy5tYXAnXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IDE3OTIsXG4gICAgICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2UsXG4gICAgICAgICAgICB0cmFjaW5nOiBwcm9wcy5lbmFibGVUcmFjaW5nID8gVHJhY2luZy5BQ1RJVkUgOiBUcmFjaW5nLkRJU0FCTEVELFxuICAgICAgICAgICAgbG9nR3JvdXA6IGFwcExvZ0dyb3VwLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgLi4uSlNPTi5wYXJzZShwcm9wcy5lbnRyeXBvaW50RW52ID8/ICd7fScpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGJ1bmRsZWQgQVdTIFNESyBmb3IgTm9kZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYSBjdXN0b20gbGF5ZXJcbiAgICAgKiB3aGljaCByZXN0cmljdHMgdGhlIGNvbnN1bWVyIHRvIGEgc3BlY2lmaWMgeWFybiBvciBucG0gdmVyc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jbGVhbnVwYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jdGlvbk5hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFudXBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEF1dG8tZGVsZXRlcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBpbiB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtmdW5jdGlvbkRpclBhdGh9L2J1aWxkL2FwcGAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyouZC50cyddXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIFNUQVRJQ19BU1NFVFNfQlVDS0VUOiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgIE9VVERBVEVEX0FTU0VUU19SRVRFTlRJT05fREFZUzogYCR7cHJvcHMub3V0ZGF0ZWRBc3NldHNSZXRlbnRpb25EYXlzID8/IDMwfWAsXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0dyb3VwOiBjbGVhbnVwTG9nR3JvdXAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGdyYW50IGZ1bmN0aW9uIGFjY2VzcyB0byBTMyBidWNrZXRcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkKHJlc3VsdCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50RGVsZXRlKHJlc3VsdCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBOdXh0IGFwcCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlHYXRld2F5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEh0dHBBcGkge1xuICAgICAgICBjb25zdCBhcGlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGlgO1xuICAgICAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBIdHRwTGFtYmRhSW50ZWdyYXRpb24oYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYW1iZGEtaW50ZWdyYXRpb25gLCB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uKTtcblxuICAgICAgICAvLyBXZSB3YW50IHRoZSBBUEkgZ2F0ZXdheSB0byBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFjY2VzcyB0aGUgZ2F0ZXdheSB2aWEgQ2xvdWRGcm9udCAoZm9yIGF1dG8gaHR0cCB0byBodHRwcyByZWRpcmVjdHMpLCB0aGlzIGlzIHJlcXVpcmVkXG4gICAgICAgIC8vIHRvIGJlIGFibGUgdG8gcmVkaXJlY3QgdGhlIG9yaWdpbmFsICdIb3N0JyBoZWFkZXIgdG8gdGhlIE51eHQgYXBwbGljYXRpb24sIGlmIHJlcXVlc3RlZC5cbiAgICAgICAgY29uc3QgZG9tYWluTmFtZSA9IG5ldyBEb21haW5OYW1lKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpLWRvbWFpbmAsIHtcbiAgICAgICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1yZWdpb25hbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLnJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm4pLFxuICAgICAgICAgICAgZW5kcG9pbnRUeXBlOiBFbmRwb2ludFR5cGUuUkVHSU9OQUwsXG4gICAgICAgICAgICBzZWN1cml0eVBvbGljeTogU2VjdXJpdHlQb2xpY3kuVExTXzFfMlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhcGlHYXRld2F5ID0gbmV3IEh0dHBBcGkodGhpcywgYXBpTmFtZSwge1xuICAgICAgICAgICAgYXBpTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ29ubmVjdHMgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gTGFtYmRhIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcHVibGljbHkgYXZhaWxhYmxlLmAsXG4gICAgICAgICAgICAvLyBUaGUgYXBwIGRvZXMgbm90IGFsbG93IGFueSBjcm9zcy1vcmlnaW4gYWNjZXNzIGJ5IHB1cnBvc2U6IHRoZSBhcHAgc2hvdWxkIG5vdCBiZSBlbWJlZGRhYmxlIGFueXdoZXJlXG4gICAgICAgICAgICBjb3JzUHJlZmxpZ2h0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0SW50ZWdyYXRpb246IGxhbWJkYUludGVncmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwaUdhdGV3YXkuYWRkUm91dGVzKHtcbiAgICAgICAgICAgIGludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIHBhdGg6ICcve3Byb3h5K30nLFxuICAgICAgICAgICAgbWV0aG9kczogW1xuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUFVULFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYXBpR2F0ZXdheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0aGF0IHJvdXRlcyBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBEaXN0cmlidXRpb24ge1xuICAgICAgICBjb25zdCBjZG5OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG5gO1xuXG4gICAgICAgIHJldHVybiBuZXcgRGlzdHJpYnV0aW9uKHRoaXMsIGNkbk5hbWUsIHtcbiAgICAgICAgICAgIGRvbWFpbk5hbWVzOiBbcHJvcHMuZG9tYWluXSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGNkbk5hbWUsXG4gICAgICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMTgsXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZ2xvYmFsLWNlcnRpZmljYXRlYCwgcHJvcHMuZ2xvYmFsVGxzQ2VydGlmaWNhdGVBcm4pLFxuICAgICAgICAgICAgaHR0cFZlcnNpb246IEh0dHBWZXJzaW9uLkhUVFAyX0FORF8zLFxuICAgICAgICAgICAgZGVmYXVsdEJlaGF2aW9yOiB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgICAgIGxvZ0J1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgbG9nRmlsZVByZWZpeDogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzID8gJ3VucHJvY2Vzc2VkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxvZ0luY2x1ZGVzQ29va2llczogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzLFxuICAgICAgICAgICAgd2ViQWNsSWQ6IHByb3BzLndlYkFjbEFybixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gYmVoYXZpb3Igb3JpZ2luIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpOiBIdHRwT3JpZ2luIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwT3JpZ2luKGAke3RoaXMuYXBpR2F0ZXdheS5odHRwQXBpSWR9LmV4ZWN1dGUtYXBpLiR7dGhpcy5yZWdpb259LmFtYXpvbmF3cy5jb21gLCB7XG4gICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgICAgIHJlYWRUaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgICAgIHByb3RvY29sUG9saWN5OiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqIEFkZGl0aW9uYWxseSwgdGhpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0cyBIVFRQIHJlcXVlc3RzIHRvIEhUVFBTLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dFNlcnZlclJvdXRlQmVoYXZpb3IoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5odHRwT3JpZ2luLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFELFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB0aGlzLmFwcFJlcXVlc3RQb2xpY3ksXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgbGV0IHJvdXRpbmdCZWhhdmlvdXJzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge1xuXG4gICAgICAgICAgICAvLyBOdXh0IEkxOG4gZmlsZXMgYXJlIHNlcnZlZCB2aWEgYSBzZXJ2ZXIgcm91dGVcbiAgICAgICAgICAgICcvX2kxOG4vKic6IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU3BlY2lmaWMgb25lcyBmaXJzdFxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQXBpKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gc2VydmVyIHJvdXRlcyBiZWZvcmUgc3RhdGljIGFzc2V0cyB0byBlbnN1cmUgdGhleSB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKHByb3BzLnNlcnZlclJvdXRlcyAmJiBwcm9wcy5zZXJ2ZXJSb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihwcm9wcy5zZXJ2ZXJSb3V0ZXMpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKX07XG5cbiAgICAgICAgcmV0dXJuIHJvdXRpbmdCZWhhdmlvdXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjYWNoZSBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvciBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogQ2FjaGVQb2xpY3kge1xuICAgICAgICByZXR1cm4gbmV3IENhY2hlUG9saWN5KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2FjaGUtcG9saWN5YCwge1xuICAgICAgICAgICAgY2FjaGVQb2xpY3lOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1jYWNoZS1wb2xpY3lgLFxuICAgICAgICAgICAgY29tbWVudDogYERlZmluZXMgd2hpY2ggcmVxdWVzdCBkYXRhIHRvIHBhc3MgdG8gdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBvcmlnaW4gYW5kIGhvdyB0aGUgY2FjaGUga2V5IGlzIGNhbGN1bGF0ZWQuYCxcbiAgICAgICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtaW5UdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55Q2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuYWxsb3dRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zKSA6IChwcm9wcy5kZW55UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55UXVlcnlQYXJhbXMpIDogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpKSkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlIZWFkZXJzKSA6IChwcm9wcy5hbGxvd0hlYWRlcnM/Lmxlbmd0aCA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93SGVhZGVycykgOiBDYWNoZUhlYWRlckJlaGF2aW9yLm5vbmUoKSksXG4gICAgICAgICAgICBjb29raWVCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlDb29raWVzPy5sZW5ndGggPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleUNvb2tpZXMpIDogKHByb3BzLmFsbG93Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dDb29raWVzKSA6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpKSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBObyBwb2xpY3kgaXMgY3JlYXRlZCBpZiBubyBleHBsaWNpdCBjb25maWcgaXMgcHJvdmlkZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwUmVxdWVzdFBvbGljeShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBPcmlnaW5SZXF1ZXN0UG9saWN5fHVuZGVmaW5lZCB7XG5cbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgY29uZmlnIGlzIHByb3ZpZGVkLCB3ZSB3YW50IHRvIHVzZSB0aGUgZGVmYXVsdCBmcm9tIENsb3VkZnJvbnRcbiAgICAgICAgY29uc3QgaGFzQW55Q29uZmlnID0gcHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zPy5sZW5ndGggfHwgcHJvcHMuZm9yd2FyZEhlYWRlcnM/Lmxlbmd0aCB8fCBwcm9wcy5mb3J3YXJkQ29va2llcz8ubGVuZ3RoO1xuICAgICAgICBpZiAoIWhhc0FueUNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luUmVxdWVzdFBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlcXVlc3QtcG9saWN5YCwge1xuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXJlcXVlc3QtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuYCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmZvcndhcmRRdWVyeVBhcmFtcz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRRdWVyeVBhcmFtcykgOiBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBwcm9wcy5mb3J3YXJkSGVhZGVycz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkSGVhZGVycykgOiBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmZvcndhcmRDb29raWVzPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRDb29raWVzKSA6IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIE51eHQgYXBwIEFQSSByZXF1ZXN0cyB0byB0aGUgQVBJIGdhdGV3YXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBhcGlCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuYXBwUmVxdWVzdFBvbGljeSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJy9hcGkvKiddID0gYXBpQmVoYXZpb3I7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYmVoYXZpb3JzIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgc3BlY2lmaWVkIHBhdGggcGF0dGVybnMgdG8gdGhlIFNTUiBvcmlnaW4uXG4gICAgICogVGhpcyBhbGxvd3Mgc2VydmVyIGVuZHBvaW50cyB0aGF0IHVzZSBmaWxlLWxpa2UgVVJMcyAoZS5nLiwgL3NpdGVtYXAueG1sIGZyb20gQG51eHRqcy9zaXRlbWFwKSBcbiAgICAgKiB0byBiZSBoYW5kbGVkIGJ5IHRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIGR5bmFtaWMgY29udGVudCBnZW5lcmF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihzZXJ2ZXJSb3V0ZXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIFxuICAgICAgICBzZXJ2ZXJSb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiB7XG4gICAgICAgICAgICBydWxlc1tyb3V0ZV0gPSB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzdGF0aWMgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHN0YXRpYyBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3Qgc3RhdGljQXNzZXRzQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgICAgICAgcnVsZXNbYCR7YXNzZXQudGFyZ2V0fSR7YXNzZXQucGF0dGVybn1gXSA9IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzaXRlbWFwIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzaXRlbWFwIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNpdGVtYXBCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpdGVtYXAgYnVja2V0IG11c3QgZXhpc3QgYmVmb3JlIGNyZWF0aW5nIHNpdGVtYXAgcm91dGUgYmVoYXZpb3IuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l0ZW1hcENhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLnNpdGVtYXBCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFNcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBydWxlc1snKnNpdGVtYXAueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC1nb25lLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snL3NpdGVtYXBzLyonXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgYXMgZGVmaW5lZCBpbiB7QHNlZSBnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzfSB0byB0aGUgc3RhdGljIGFzc2V0cyBTMyBidWNrZXQuXG4gICAgICogSW4gb3JkZXIgdG8gZW5hYmxlIGEgemVyby1kb3dudGltZSBkZXBsb3ltZW50IHdpdGggbWluaW1hbCBzdG9yYWdlIGxvYWQsXG4gICAgICogd2UgZGVwbG95IHRoZSBzdGF0aWMgYXNzZXRzIG9mIGV2ZXJ5IGRlcGxveW1lbnQgaW50byB0aGUgc2FtZSBmb2xkZXIgYnV0IG1hcmsgdGhlbSB3aXRoIGEgZGVwbG95bWVudCByZXZpc2lvbi5cbiAgICAgKiBCeSBkb2luZyBzbywgdGhlIGZpbGVzIG9mIHByZXZpb3VzIGRlcGxveW1lbnRzIGFyZSByZXRhaW5lZCB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBhbiBvbGRlciByZXZpc2lvblxuICAgICAqIGJ1dCBnZXRzIGNsZWFuZWQgdXAgYWZ0ZXIgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUgdmlhIHRoZSBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveW1lbnRzKCk6IEJ1Y2tldERlcGxveW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzLWRlcGxveW1lbnQtbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudGAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBhIGRlcGxveW1lbnQgZm9yIGV2ZXJ5IGNvbmZpZ3VyZWQgc3RhdGljIGFzc2V0IHR5cGUgdG8gcmVzcGVjdCB0aGUgZGlmZmVyZW50IGNhY2hlIHNldHRpbmdzXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5maWx0ZXIoYXNzZXQgPT4gZXhpc3RzU3luYyhhc3NldC5zb3VyY2UpKS5tYXAoKGFzc2V0LCBhc3NldEluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC0ke2Fzc2V0SW5kZXh9YCwge1xuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtTb3VyY2UuYXNzZXQoYXNzZXQuc291cmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IGFzc2V0LmV4Y2x1ZGUsXG4gICAgICAgICAgICAgICAgfSldLFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogYXNzZXQudGFyZ2V0LnJlcGxhY2UoL15cXC8rL2csICcnKSwgLy8gUmVtb3ZlIGxlYWRpbmcgc2xhc2hcbiAgICAgICAgICAgICAgICBwcnVuZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3MuU1RBTkRBUkQsXG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqJ10sXG4gICAgICAgICAgICAgICAgaW5jbHVkZTogW2Fzc2V0LnBhdHRlcm5dLFxuICAgICAgICAgICAgICAgIGNhY2hlQ29udHJvbDogYXNzZXQuY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBhc3NldC5jb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb246IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IHRoaXMuY2RuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvblBhdGhzOiBhc3NldC5pbnZhbGlkYXRlT25DaGFuZ2UgPyBbYC8ke2Fzc2V0LnBhdHRlcm59YF0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgYnVpbGQgcmV2aXNpb24gb24gZXZlcnkgYXNzZXQgdG8gYWxsb3cgY2xlYW51cCBvZiBvdXRkYXRlZCBhc3NldHNcbiAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246IHRoaXMuZGVwbG95bWVudFJldmlzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBTb21lIE51eHQgYXBwbGljYXRpb25zIGhhdmUgYSBsb3Qgb2YgYXNzZXRzIHRvIGRlcGxveSB3aGVyZWJ5IHRoZSBmdW5jdGlvbiBtaWdodCBydW4gb3V0IG9mIG1lbW9yeS5cbiAgICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGEgaGlnaCBtZW1vcnkgbGltaXQgbWlnaHQgc3BlZWQgdXAgZGVwbG95bWVudHMuXG4gICAgICAgICAgICAgICAgbWVtb3J5TGltaXQ6IDE3OTJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBob3N0ZWQgem9uZSBhdCB3aGljaCB0aGUgRE5TIHJlY29yZHMgc2hhbGwgYmUgY3JlYXRlZCB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSG9zdGVkWm9uZShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBJSG9zdGVkWm9uZSB7XG4gICAgICAgIGNvbnN0IGRvbWFpblBhcnRzID0gcHJvcHMuZG9tYWluLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgcmV0dXJuIEhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taG9zdGVkLXpvbmVgLCB7XG4gICAgICAgICAgICBob3N0ZWRab25lSWQ6IHByb3BzLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgICAgIHpvbmVOYW1lOiBkb21haW5QYXJ0c1tkb21haW5QYXJ0cy5sZW5ndGggLSAxXSwgLy8gU3VwcG9ydCBzdWJkb21haW5zXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIEROUyByZWNvcmRzIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0IHZpYSB0aGUgY3VzdG9tIGRvbWFpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEbnNSZWNvcmRzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3N0ZWRab25lID0gdGhpcy5maW5kSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgICAgIGNvbnN0IGRuc1RhcmdldCA9IFJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IENsb3VkRnJvbnRUYXJnZXQodGhpcy5jZG4pKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjRcbiAgICAgICAgbmV3IEFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY0LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY2XG4gICAgICAgIG5ldyBBYWFhUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2Ni1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0byBwaW5nIHRoZSBOdXh0IGFwcCBMYW1iZGEgZnVuY3Rpb24gZXZlcnkgNSBtaW51dGVzIGluIG9yZGVyIHRvIGtlZXAgaXQgd2FybVxuICAgICAqIGFuZCBzcGVlZCB1cCBpbml0aWFsIFNTUiByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBQaW5nUnVsZShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmFrZUFwaUdhdGV3YXlFdmVudERhdGEgPSB7XG4gICAgICAgICAgICBcInZlcnNpb25cIjogXCIyLjBcIixcbiAgICAgICAgICAgIFwicm91dGVLZXlcIjogXCJHRVQgL3twcm94eSt9XCIsXG4gICAgICAgICAgICBcInJhd1BhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICBcInJhd1F1ZXJ5U3RyaW5nXCI6IFwiXCIsXG4gICAgICAgICAgICBcImhlYWRlcnNcIjoge30sXG4gICAgICAgICAgICBcInJlcXVlc3RDb250ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICBcImRvbWFpbk5hbWVcIjogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgICAgIFwiaHR0cFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwibWV0aG9kXCI6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJwcm90b2NvbFwiOiBcIkhUVFAvMS4xXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFBpbmdzIHRoZSBMYW1iZGEgZnVuY3Rpb24gb2YgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBhcHAgZXZlcnkgNSBtaW51dGVzIHRvIGtlZXAgaXQgd2FybS5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5yYXRlKER1cmF0aW9uLm1pbnV0ZXMoNSkpLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmFwcExhbWJkYUZ1bmN0aW9uLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KGZha2VBcGlHYXRld2F5RXZlbnREYXRhKVxuICAgICAgICAgICAgfSldLFxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0aGF0IHJ1bnMgZXZlcnkgVHVlc2RheSBhdCAwMzozMCBBTSBHTVQgdG8gdHJpZ2dlclxuICAgICAqIG91ciBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTogdm9pZCB7XG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUcmlnZ2VycyBhIGNsZWFudXAgb2YgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgYXQgdGhlICR7dGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24oe3dlZWtEYXk6ICcyJywgaG91cjogJzMnLCBtaW51dGU6ICczMCd9KSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFMzIGJ1Y2tldCB0byBzdG9yZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0J1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9nc2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBvYmplY3RPd25lcnNoaXA6IE9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfUFJFRkVSUkVELFxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgc3RhY2sgaXMgZGVzdHJveWVkLCB3ZSBleHBlY3QgZXZlcnl0aGluZyB0byBiZSBkZWxldGVkXG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWNjZXNzIGJ1Y2tldCBub3Qgc2V0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMgfSA9IHJlcXVpcmUoJy4uL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMnKTtcblxuICAgICAgICBuZXcgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzLWFuYWx5c2lzYCwge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQsXG4gICAgICAgICAgICByZXNvdXJjZVByZWZpeDogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9nc2AsXG4gICAgICAgICAgICBhY2Nlc3NMb2dDb29raWVzOiBwcm9wcy5hY2Nlc3NMb2dDb29raWVzLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
576
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFzRjtBQUN0RiwrQ0FNNEI7QUFDNUIseURBQXdHO0FBQ3hHLHFFQUFxRjtBQUNyRiwrRUFBOEU7QUFDOUUseUVBQWlFO0FBQ2pFLG1EQUErRDtBQUMvRCxnRUFBNEY7QUFDNUYsdURBQXVFO0FBQ3ZFLHVFQUE4RDtBQUM5RCw2QkFBNkI7QUFDN0IsMkJBQXdEO0FBRXhELDZGQUFnRjtBQUNoRixtRUFBMkc7QUFFM0c7O0dBRUc7QUFDSCxNQUFhLGtCQUFtQixTQUFRLG1CQUFLO0lBa0d6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCOztRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNiLEdBQUcsS0FBSztZQUVSLHVFQUF1RTtZQUN2RSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLEdBQUcsMENBQUUsTUFBTSxNQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCO1NBQ2pJLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUEsa0RBQTRCLEVBQUMsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FBSSxHQUFHLENB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QWtFO1lBQ2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxLQUE4Qjs7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsTUFBTSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsT0FBTyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFFekcsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHVCQUF1QixFQUFFO1lBQ3BGLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzdCLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsY0FBYztZQUN0RCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLGlCQUFpQixFQUFFLE1BQUEsS0FBSyxDQUFDLDBCQUEwQixtQ0FBSSxJQUFJO1lBQzNELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7WUFDaEQsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLCtCQUErQjtZQUNsRSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsOEJBQThCO1NBQ25FLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTlzQkQsZ0RBOHNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge0NlcnRpZmljYXRlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgICBBbGxvd2VkTWV0aG9kcyxcbiAgICB0eXBlIEJlaGF2aW9yT3B0aW9ucyxcbiAgICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICAgIENhY2hlZE1ldGhvZHMsXG4gICAgQ2FjaGVIZWFkZXJCZWhhdmlvcixcbiAgICBDYWNoZVBvbGljeSxcbiAgICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gICAgRGlzdHJpYnV0aW9uLCBIdHRwVmVyc2lvbixcbiAgICB0eXBlIElPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5Qcm90b2NvbFBvbGljeSwgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICBQcmljZUNsYXNzLFxuICAgIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gICAgVmlld2VyUHJvdG9jb2xQb2xpY3ksT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLCBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IsIE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtBcmNoaXRlY3R1cmUsIENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lLCBUcmFjaW5nfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgICBCbG9ja1B1YmxpY0FjY2VzcyxcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0QWNjZXNzQ29udHJvbCxcbiAgICBCdWNrZXRFbmNyeXB0aW9uLFxuICAgIE9iamVjdE93bmVyc2hpcFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQge0FhYWFSZWNvcmQsIEFSZWNvcmQsIEhvc3RlZFpvbmUsIHR5cGUgSUhvc3RlZFpvbmUsIFJlY29yZFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQge0J1Y2tldERlcGxveW1lbnQsIFNvdXJjZSwgU3RvcmFnZUNsYXNzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7SHR0cE9yaWdpbiwgUzNCdWNrZXRPcmlnaW59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQge0Nsb3VkRnJvbnRUYXJnZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHtnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzLCB0eXBlIFN0YXRpY0Fzc2V0Q29uZmlnfSBmcm9tIFwiLi4vTnV4dEFwcFN0YXRpY0Fzc2V0c1wiO1xuaW1wb3J0IHtSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHtMYW1iZGFGdW5jdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHt3cml0ZUZpbGVTeW5jLCBta2RpclN5bmMsIGV4aXN0c1N5bmN9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHt0eXBlIE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9OdXh0U2VydmVyQXBwU3RhY2tQcm9wc1wiO1xuaW1wb3J0IHtIdHRwTGFtYmRhSW50ZWdyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiO1xuaW1wb3J0IHtEb21haW5OYW1lLCBFbmRwb2ludFR5cGUsIEh0dHBBcGksIEh0dHBNZXRob2QsIFNlY3VyaXR5UG9saWN5fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiO1xuXG4vKipcbiAqIENESyBzdGFjayB0byBkZXBsb3kgYSBkeW5hbWljIE51eHQgYXBwICh0YXJnZXQ9c2VydmVyKSBvbiBBV1Mgd2l0aCBMYW1iZGEsIEFwaUdhdGV3YXksIFMzIGFuZCBDbG91ZEZyb250LlxuICovXG5leHBvcnQgY2xhc3MgTnV4dFNlcnZlckFwcFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGhhdCBpcyB1c2VkIHRvIHRhZyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgZGVwbG95bWVudFxuICAgICAqIHRvIGxhdGVyIGJlIGFibGUgdG8gY2xlYW4gdXAgb3V0ZGF0ZWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveW1lbnRSZXZpc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aXR5IHRvIHVzZSBmb3IgYWNjZXNzaW5nIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBvbiBTMy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG5BY2Nlc3NJZGVudGl0eTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgZGVwbG95bWVudCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhY2Nlc3NMb2dzQnVja2V0OiBCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgc2l0ZW1hcCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHNpdGVtYXBCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgb24gdGhlIHNlcnZlciBzaWRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW51cExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXBpR2F0ZXdheTogSHR0cEFwaTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWdzIGZvciB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgdGhhdCBzaGFsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljQXNzZXRDb25maWdzOiBTdGF0aWNBc3NldENvbmZpZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIG9yaWdpbiBmb3IgdGhlIEFQSSBnYXRld2F5IHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGh0dHBPcmlnaW46IEh0dHBPcmlnaW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FjaGUgcG9saWN5IHRoYXQgc3BlY2lmaWVzIHdoaWNoIEhUVFAgaGVhZGVycywgY29va2llcywgYW5kIHF1ZXJ5IHN0cmluZ3NcbiAgICAgKiBDbG91ZEZyb250IGZvcndhcmRzIHRvIHRoZSBOdXh0IGFwcCBhbmQgdXNlcyB0byBnZW5lcmF0ZSBhIGNhY2hlIGtleS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcENhY2hlUG9saWN5OiBDYWNoZVBvbGljeTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBzcGVjaWZpZXMgd2hpY2ggSFRUUCBoZWFkZXJzLCBjb29raWVzLCBhbmQgcXVlcnkgc3RyaW5nc1xuICAgICAqIENsb3VkRnJvbnQgZm9yd2FyZHMgdG8gdGhlIE51eHQgYXBwIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBSZXF1ZXN0UG9saWN5OiBPcmlnaW5SZXF1ZXN0UG9saWN5IHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgbnV4dFNlcnZlclJvdXRlQmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuOiBEaXN0cmlidXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcblxuICAgICAgICAgICAgLy8gRm9yY2UgY3Jvc3MtcmVnaW9uIHJlZmVyZW5jZXMgaWYgYSBXQUYgQUNMIGlzIHVzZWQgb3V0c2lkZSB1cy1lYXN0LTFcbiAgICAgICAgICAgIGNyb3NzUmVnaW9uUmVmZXJlbmNlczogcHJvcHMud2ViQWNsQXJuICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZW52Py5yZWdpb24gIT09ICd1cy1lYXN0LTEnID8gdHJ1ZSA6IHByb3BzLmNyb3NzUmVnaW9uUmVmZXJlbmNlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG5cbiAgICAgICAgLy8gTnV4dCBhcHAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuZGVwbG95bWVudFJldmlzaW9uID0gdGhpcy5jcmVhdGVEZXBsb3ltZW50UmV2aXNpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncyA9IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MocHJvcHMucm9vdERpciA/PyAnLicpO1xuICAgICAgICB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5ID0gdGhpcy5jcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCA9IHRoaXMuY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk7XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcykge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NMb2dzQnVja2V0ID0gdGhpcy5jcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgdGhpcy5zaXRlbWFwQnVja2V0ID0gdGhpcy5jcmVhdGVTaXRlbWFwQnVja2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuYXBpR2F0ZXdheSA9IHRoaXMuY3JlYXRlQXBpR2F0ZXdheShwcm9wcyk7XG4gICAgICAgIHRoaXMuaHR0cE9yaWdpbiA9IHRoaXMuY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5hcHBDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLmFwcFJlcXVlc3RQb2xpY3kgPSB0aGlzLmNyZWF0ZU51eHRBcHBSZXF1ZXN0UG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yID0gdGhpcy5jcmVhdGVOdXh0U2VydmVyUm91dGVCZWhhdmlvcigpXG5cbiAgICAgICAgdGhpcy5jZG4gPSB0aGlzLmNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZURlcGxveW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRG5zUmVjb3Jkcyhwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUGluZ1J1bGUocHJvcHMpO1xuXG4gICAgICAgIC8vIFN0YXRpYyBhc3NldHMgY2xlYW51cCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIGZpbGUgaW4gdGhlIHB1YmxpYyBmb2xkZXIgb2YgdGhlIE51eHQgYXBwIHRvIGJlIGFjY2Vzc2libGVcbiAgICAgKiBhbmQgcmV0dXJucyB0aGUgY3VycmVudCByZXZpc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhcHBSZXZpc2lvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvcHMucm9vdERpciA/PyAnLicsICcub3V0cHV0JywgJ3B1YmxpYycpO1xuICAgICAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oZGlyLCAnYXBwLXJldmlzaW9uJyksIGFwcFJldmlzaW9uLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAgIHJldHVybiBhcHBSZXZpc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBpZGVudGl0eSB0byBhY2Nlc3MgdGhlIFMzIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgdmlhIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpOiBJT3JpZ2luQWNjZXNzSWRlbnRpdHkge1xuICAgICAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1zMy1hY2Nlc3NgO1xuICAgICAgICByZXR1cm4gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzdGF0aWMgZGVwbG95bWVudCBhc3NldCBmaWxlcyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0c2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9FTkZPUkNFRCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzaXRlbWFwIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcEJ1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zaXRlbWFwYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYWNjZXNzQ29udHJvbDogQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbnV4dGA7XG5cbiAgICAgICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7ZnVuY05hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmNOYW1lfWAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICB9KTtcbiAgICAgICAgYXBwTG9nR3JvdXAuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVuZGVycyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IE51eHQgYXBwLmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogYCR7cHJvcHMuZW50cnlwb2ludCA/PyAnaW5kZXgnfS5oYW5kbGVyYCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGAke3Byb3BzLnJvb3REaXIgPz8gJy4nIH0vLm91dHB1dC9zZXJ2ZXJgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi5zdmcnLCAnKiouaWNvJywgJyoqLnBuZycsICcqKi5qcGcnLCAnKiouanMubWFwJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyAxNzkyLFxuICAgICAgICAgICAgYWxsb3dQdWJsaWNTdWJuZXQ6IGZhbHNlLFxuICAgICAgICAgICAgdHJhY2luZzogcHJvcHMuZW5hYmxlVHJhY2luZyA/IFRyYWNpbmcuQUNUSVZFIDogVHJhY2luZy5ESVNBQkxFRCxcbiAgICAgICAgICAgIGxvZ0dyb3VwOiBhcHBMb2dHcm91cCxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgICAgIC4uLkpTT04ucGFyc2UocHJvcHMuZW50cnlwb2ludEVudiA/PyAne30nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBidW5kbGVkIEFXUyBTREsgZm9yIE5vZGUgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGEgY3VzdG9tIGxheWVyXG4gICAgICogd2hpY2ggcmVzdHJpY3RzIHRoZSBjb25zdW1lciB0byBhIHNwZWNpZmljIHlhcm4gb3IgbnBtIHZlcnNpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWU6IHN0cmluZyA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2xlYW51cGA7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGlyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYXNzZXRzLWNsZWFudXAnKTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7ZnVuY3Rpb25OYW1lfS1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXG4gICAgICAgIH0pO1xuICAgICAgICBjbGVhbnVwTG9nR3JvdXAuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBBdXRvLWRlbGV0ZXMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgaW4gdGhlICR7dGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoYCR7ZnVuY3Rpb25EaXJQYXRofS9idWlsZC9hcHBgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqLmQudHMnXVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgU1RBVElDX0FTU0VUU19CVUNLRVQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTOiBgJHtwcm9wcy5vdXRkYXRlZEFzc2V0c1JldGVudGlvbkRheXMgPz8gMzB9YCxcbiAgICAgICAgICAgICAgICBFTlZJUk9OTUVOVDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nR3JvdXA6IGNsZWFudXBMb2dHcm91cCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudFJlYWQocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnREZWxldGUocmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIE51eHQgYXBwIHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwaUdhdGV3YXkocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSHR0cEFwaSB7XG4gICAgICAgIGNvbnN0IGFwaU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaWA7XG4gICAgICAgIGNvbnN0IGxhbWJkYUludGVncmF0aW9uID0gbmV3IEh0dHBMYW1iZGFJbnRlZ3JhdGlvbihgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxhbWJkYS1pbnRlZ3JhdGlvbmAsIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24pO1xuXG4gICAgICAgIC8vIFdlIHdhbnQgdGhlIEFQSSBnYXRld2F5IHRvIGJlIGFjY2Vzc2libGUgYnkgdGhlIGN1c3RvbSBkb21haW4gbmFtZS5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgYWNjZXNzIHRoZSBnYXRld2F5IHZpYSBDbG91ZEZyb250IChmb3IgYXV0byBodHRwIHRvIGh0dHBzIHJlZGlyZWN0cyksIHRoaXMgaXMgcmVxdWlyZWRcbiAgICAgICAgLy8gdG8gYmUgYWJsZSB0byByZWRpcmVjdCB0aGUgb3JpZ2luYWwgJ0hvc3QnIGhlYWRlciB0byB0aGUgTnV4dCBhcHBsaWNhdGlvbiwgaWYgcmVxdWVzdGVkLlxuICAgICAgICBjb25zdCBkb21haW5OYW1lID0gbmV3IERvbWFpbk5hbWUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGktZG9tYWluYCwge1xuICAgICAgICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlZ2lvbmFsLWNlcnRpZmljYXRlYCwgcHJvcHMucmVnaW9uYWxUbHNDZXJ0aWZpY2F0ZUFybiksXG4gICAgICAgICAgICBlbmRwb2ludFR5cGU6IEVuZHBvaW50VHlwZS5SRUdJT05BTCxcbiAgICAgICAgICAgIHNlY3VyaXR5UG9saWN5OiBTZWN1cml0eVBvbGljeS5UTFNfMV8yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFwaUdhdGV3YXkgPSBuZXcgSHR0cEFwaSh0aGlzLCBhcGlOYW1lLCB7XG4gICAgICAgICAgICBhcGlOYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDb25uZWN0cyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHdpdGggdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBMYW1iZGEgZnVuY3Rpb24gdG8gbWFrZSBpdCBwdWJsaWNseSBhdmFpbGFibGUuYCxcbiAgICAgICAgICAgIC8vIFRoZSBhcHAgZG9lcyBub3QgYWxsb3cgYW55IGNyb3NzLW9yaWdpbiBhY2Nlc3MgYnkgcHVycG9zZTogdGhlIGFwcCBzaG91bGQgbm90IGJlIGVtYmVkZGFibGUgYW55d2hlcmVcbiAgICAgICAgICAgIGNvcnNQcmVmbGlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBkZWZhdWx0RG9tYWluTWFwcGluZzoge1xuICAgICAgICAgICAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBpR2F0ZXdheS5hZGRSb3V0ZXMoe1xuICAgICAgICAgICAgaW50ZWdyYXRpb246IGxhbWJkYUludGVncmF0aW9uLFxuICAgICAgICAgICAgcGF0aDogJy97cHJveHkrfScsXG4gICAgICAgICAgICBtZXRob2RzOiBbXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5IRUFELFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuT1BUSU9OUyxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5QQVRDSCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkRFTEVURSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhcGlHYXRld2F5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRoYXQgcm91dGVzIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbG91ZEZyb250RGlzdHJpYnV0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IERpc3RyaWJ1dGlvbiB7XG4gICAgICAgIGNvbnN0IGNkbk5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbmA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEaXN0cmlidXRpb24odGhpcywgY2RuTmFtZSwge1xuICAgICAgICAgICAgZG9tYWluTmFtZXM6IFtwcm9wcy5kb21haW5dLFxuICAgICAgICAgICAgY29tbWVudDogY2RuTmFtZSxcbiAgICAgICAgICAgIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IFNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAxOCxcbiAgICAgICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1nbG9iYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5nbG9iYWxUbHNDZXJ0aWZpY2F0ZUFybiksXG4gICAgICAgICAgICBodHRwVmVyc2lvbjogSHR0cFZlcnNpb24uSFRUUDJfQU5EXzMsXG4gICAgICAgICAgICBkZWZhdWx0QmVoYXZpb3I6IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IsXG4gICAgICAgICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiB0aGlzLnNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHMpLFxuICAgICAgICAgICAgcHJpY2VDbGFzczogUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAsIC8vIFVzZSBvbmx5IE5vcnRoIEFtZXJpY2EgYW5kIEV1cm9wZVxuICAgICAgICAgICAgbG9nQnVja2V0OiB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQsXG4gICAgICAgICAgICBsb2dGaWxlUHJlZml4OiBwcm9wcy5lbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXMgPyAndW5wcm9jZXNzZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbG9nSW5jbHVkZXNDb29raWVzOiBwcm9wcy5lbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXMsXG4gICAgICAgICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsQXJuLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiZWhhdmlvciBvcmlnaW4gdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBIdHRwT3JpZ2luKCk6IEh0dHBPcmlnaW4ge1xuICAgICAgICByZXR1cm4gbmV3IEh0dHBPcmlnaW4oYCR7dGhpcy5hcGlHYXRld2F5Lmh0dHBBcGlJZH0uZXhlY3V0ZS1hcGkuJHt0aGlzLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgICAgICAgcmVhZFRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICAgICAgcHJvdG9jb2xQb2xpY3k6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHdlYiByZXF1ZXN0c1xuICAgICAqIHRvIHRoZSBOdXh0IHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICogQWRkaXRpb25hbGx5LCB0aGlzIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RzIEhUVFAgcmVxdWVzdHMgdG8gSFRUUFMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0U2VydmVyUm91dGVCZWhhdmlvcigpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQUQsXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuYXBwUmVxdWVzdFBvbGljeSxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiB0aGlzLmFwcENhY2hlUG9saWN5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBsZXQgcm91dGluZ0JlaGF2aW91cnM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7XG5cbiAgICAgICAgICAgIC8vIE51eHQgSTE4biBmaWxlcyBhcmUgc2VydmVkIHZpYSBhIHNlcnZlciByb3V0ZVxuICAgICAgICAgICAgJy9faTE4bi8qJzogdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTcGVjaWZpYyBvbmVzIGZpcnN0XG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVBcGkpIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZUFwaVJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZVNpdGVtYXApIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGN1c3RvbSBzZXJ2ZXIgcm91dGVzIGJlZm9yZSBzdGF0aWMgYXNzZXRzIHRvIGVuc3VyZSB0aGV5IHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBpZiAocHJvcHMuc2VydmVyUm91dGVzICYmIHByb3BzLnNlcnZlclJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTZXJ2ZXJSb3V0ZUJlaGF2aW9yKHByb3BzLnNlcnZlclJvdXRlcyl9O1xuICAgICAgICB9XG5cbiAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpfTtcblxuICAgICAgICByZXR1cm4gcm91dGluZ0JlaGF2aW91cnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNhY2hlIHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBDYWNoZVBvbGljeShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBDYWNoZVBvbGljeSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FjaGVQb2xpY3kodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jYWNoZS1wb2xpY3lgLCB7XG4gICAgICAgICAgICBjYWNoZVBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLWNhY2hlLXBvbGljeWAsXG4gICAgICAgICAgICBjb21tZW50OiBgRGVmaW5lcyB3aGljaCByZXF1ZXN0IGRhdGEgdG8gcGFzcyB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbiBhbmQgaG93IHRoZSBjYWNoZSBrZXkgaXMgY2FsY3VsYXRlZC5gLFxuICAgICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgICAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleVF1ZXJ5UGFyYW1zKSA6IChwcm9wcy5kZW55Q2FjaGVLZXlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zKSA6IChwcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93UXVlcnlQYXJhbXMpIDogKHByb3BzLmRlbnlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlRdWVyeVBhcmFtcykgOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCkpKSksXG4gICAgICAgICAgICBoZWFkZXJCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlIZWFkZXJzPy5sZW5ndGggPyBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleUhlYWRlcnMpIDogKHByb3BzLmFsbG93SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dIZWFkZXJzKSA6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpKSxcbiAgICAgICAgICAgIGNvb2tpZUJlaGF2aW9yOiBwcm9wcy5jYWNoZUtleUNvb2tpZXM/Lmxlbmd0aCA/IENhY2hlQ29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmNhY2hlS2V5Q29va2llcykgOiAocHJvcHMuYWxsb3dDb29raWVzPy5sZW5ndGggPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd0Nvb2tpZXMpIDogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCkpLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb3JpZ2luIHJlcXVlc3QgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqIE5vIHBvbGljeSBpcyBjcmVhdGVkIGlmIG5vIGV4cGxpY2l0IGNvbmZpZyBpcyBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBSZXF1ZXN0UG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IE9yaWdpblJlcXVlc3RQb2xpY3l8dW5kZWZpbmVkIHtcblxuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBjb25maWcgaXMgcHJvdmlkZWQsIHdlIHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IGZyb20gQ2xvdWRmcm9udFxuICAgICAgICBjb25zdCBoYXNBbnlDb25maWcgPSBwcm9wcy5mb3J3YXJkUXVlcnlQYXJhbXM/Lmxlbmd0aCB8fCBwcm9wcy5mb3J3YXJkSGVhZGVycz8ubGVuZ3RoIHx8IHByb3BzLmZvcndhcmRDb29raWVzPy5sZW5ndGg7XG4gICAgICAgIGlmICghaGFzQW55Q29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0UG9saWN5KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVxdWVzdC1wb2xpY3lgLCB7XG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tcmVxdWVzdC1wb2xpY3lgLFxuICAgICAgICAgICAgY29tbWVudDogYERlZmluZXMgd2hpY2ggcmVxdWVzdCBkYXRhIHRvIHBhc3MgdG8gdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBvcmlnaW4gd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleS5gLFxuICAgICAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogcHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zKSA6IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmZvcndhcmRIZWFkZXJzPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRIZWFkZXJzKSA6IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5ub25lKCksXG4gICAgICAgICAgICBjb29raWVCZWhhdmlvcjogcHJvcHMuZm9yd2FyZENvb2tpZXM/Lmxlbmd0aCA/IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuZm9yd2FyZENvb2tpZXMpIDogT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgTnV4dCBhcHAgQVBJIHJlcXVlc3RzIHRvIHRoZSBBUEkgZ2F0ZXdheS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwaVJvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IGFwaUJlaGF2aW9yOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaHR0cE9yaWdpbixcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiB0aGlzLmFwcENhY2hlUG9saWN5LFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5hcHBSZXF1ZXN0UG9saWN5LFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LkhUVFBTX09OTFlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBydWxlc1snL2FwaS8qJ10gPSBhcGlCZWhhdmlvcjtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBiZWhhdmlvcnMgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBzcGVjaWZpZWQgcGF0aCBwYXR0ZXJucyB0byB0aGUgU1NSIG9yaWdpbi5cbiAgICAgKiBUaGlzIGFsbG93cyBzZXJ2ZXIgZW5kcG9pbnRzIHRoYXQgdXNlIGZpbGUtbGlrZSBVUkxzIChlLmcuLCAvc2l0ZW1hcC54bWwgZnJvbSBAbnV4dGpzL3NpdGVtYXApIFxuICAgICAqIHRvIGJlIGhhbmRsZWQgYnkgdGhlIExhbWJkYSBmdW5jdGlvbiBmb3IgZHluYW1pYyBjb250ZW50IGdlbmVyYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTZXJ2ZXJSb3V0ZUJlaGF2aW9yKHNlcnZlclJvdXRlczogc3RyaW5nW10pOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHNlcnZlclJvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHtcbiAgICAgICAgICAgIHJ1bGVzW3JvdXRlXSA9IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3I7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHN0YXRpYyBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc3RhdGljIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICAgICAgICBydWxlc1tgJHthc3NldC50YXJnZXR9JHthc3NldC5wYXR0ZXJufWBdID0gc3RhdGljQXNzZXRzQ2FjaGVDb25maWdcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcnVsZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHNpdGVtYXAgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHNpdGVtYXAgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBpZiAoIXRoaXMuc2l0ZW1hcEJ1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2l0ZW1hcCBidWNrZXQgbXVzdCBleGlzdCBiZWZvcmUgY3JlYXRpbmcgc2l0ZW1hcCByb3V0ZSBiZWhhdmlvci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaXRlbWFwQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc2l0ZW1hcEJ1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQU1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLWdvbmUueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycvc2l0ZW1hcHMvKiddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCBhcyBkZWZpbmVkIGluIHtAc2VlIGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3N9IHRvIHRoZSBzdGF0aWMgYXNzZXRzIFMzIGJ1Y2tldC5cbiAgICAgKiBJbiBvcmRlciB0byBlbmFibGUgYSB6ZXJvLWRvd250aW1lIGRlcGxveW1lbnQgd2l0aCBtaW5pbWFsIHN0b3JhZ2UgbG9hZCxcbiAgICAgKiB3ZSBkZXBsb3kgdGhlIHN0YXRpYyBhc3NldHMgb2YgZXZlcnkgZGVwbG95bWVudCBpbnRvIHRoZSBzYW1lIGZvbGRlciBidXQgbWFyayB0aGVtIHdpdGggYSBkZXBsb3ltZW50IHJldmlzaW9uLlxuICAgICAqIEJ5IGRvaW5nIHNvLCB0aGUgZmlsZXMgb2YgcHJldmlvdXMgZGVwbG95bWVudHMgYXJlIHJldGFpbmVkIHRvIGFsbG93IGNsaWVudHMgdG8gY29udGludWUgdG8gd29yayB3aXRoIGFuIG9sZGVyIHJldmlzaW9uXG4gICAgICogYnV0IGdldHMgY2xlYW5lZCB1cCBhZnRlciBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSB2aWEgdGhlIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uZmlndXJlRGVwbG95bWVudHMoKTogQnVja2V0RGVwbG95bWVudFtdIHtcbiAgICAgICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZpbHRlcihhc3NldCA9PiBleGlzdHNTeW5jKGFzc2V0LnNvdXJjZSkpLm1hcCgoYXNzZXQsIGFzc2V0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogYXNzZXQuZXhjbHVkZSxcbiAgICAgICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBhc3NldC50YXJnZXQucmVwbGFjZSgvXlxcLysvZywgJycpLCAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IFtgLyR7YXNzZXQucGF0dGVybn1gXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXAsXG5cbiAgICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBidWlsZCByZXZpc2lvbiBvbiBldmVyeSBhc3NldCB0byBhbGxvdyBjbGVhbnVwIG9mIG91dGRhdGVkIGFzc2V0c1xuICAgICAgICAgICAgICAgICAgICByZXZpc2lvbjogdGhpcy5kZXBsb3ltZW50UmV2aXNpb24sXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFNvbWUgTnV4dCBhcHBsaWNhdGlvbnMgaGF2ZSBhIGxvdCBvZiBhc3NldHMgdG8gZGVwbG95IHdoZXJlYnkgdGhlIGZ1bmN0aW9uIG1pZ2h0IHJ1biBvdXQgb2YgbWVtb3J5LlxuICAgICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgYSBoaWdoIG1lbW9yeSBsaW1pdCBtaWdodCBzcGVlZCB1cCBkZXBsb3ltZW50cy5cbiAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdDogMTc5MlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGhvc3RlZCB6b25lIGF0IHdoaWNoIHRoZSBETlMgcmVjb3JkcyBzaGFsbCBiZSBjcmVhdGVkIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRIb3N0ZWRab25lKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IElIb3N0ZWRab25lIHtcbiAgICAgICAgY29uc3QgZG9tYWluUGFydHMgPSBwcm9wcy5kb21haW4uc3BsaXQoJy4nKTtcblxuICAgICAgICByZXR1cm4gSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1ob3N0ZWQtem9uZWAsIHtcbiAgICAgICAgICAgIGhvc3RlZFpvbmVJZDogcHJvcHMuaG9zdGVkWm9uZUlkLFxuICAgICAgICAgICAgem9uZU5hbWU6IGRvbWFpblBhcnRzW2RvbWFpblBhcnRzLmxlbmd0aCAtIDFdLCAvLyBTdXBwb3J0IHN1YmRvbWFpbnNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgRE5TIHJlY29yZHMgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQgdmlhIHRoZSBjdXN0b20gZG9tYWluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURuc1JlY29yZHMocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvc3RlZFpvbmUgPSB0aGlzLmZpbmRIb3N0ZWRab25lKHByb3BzKTtcbiAgICAgICAgY29uc3QgZG5zVGFyZ2V0ID0gUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmNkbikpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NFxuICAgICAgICBuZXcgQVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjQtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjZcbiAgICAgICAgbmV3IEFhYWFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY2LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRvIHBpbmcgdGhlIE51eHQgYXBwIExhbWJkYSBmdW5jdGlvbiBldmVyeSA1IG1pbnV0ZXMgaW4gb3JkZXIgdG8ga2VlcCBpdCB3YXJtXG4gICAgICogYW5kIHNwZWVkIHVwIGluaXRpYWwgU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcFBpbmdSdWxlKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSA9IHtcbiAgICAgICAgICAgIFwidmVyc2lvblwiOiBcIjIuMFwiLFxuICAgICAgICAgICAgXCJyb3V0ZUtleVwiOiBcIkdFVCAve3Byb3h5K31cIixcbiAgICAgICAgICAgIFwicmF3UGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgIFwicmF3UXVlcnlTdHJpbmdcIjogXCJcIixcbiAgICAgICAgICAgIFwiaGVhZGVyc1wiOiB7fSxcbiAgICAgICAgICAgIFwicmVxdWVzdENvbnRleHRcIjoge1xuICAgICAgICAgICAgICAgIFwiZG9tYWluTmFtZVwiOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICAgICAgXCJodHRwXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJtZXRob2RcIjogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3RvY29sXCI6IFwiSFRUUC8xLjFcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUGluZ3MgdGhlIExhbWJkYSBmdW5jdGlvbiBvZiB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGFwcCBldmVyeSA1IG1pbnV0ZXMgdG8ga2VlcCBpdCB3YXJtLmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcyg1KSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBldmVudDogUnVsZVRhcmdldElucHV0LmZyb21PYmplY3QoZmFrZUFwaUdhdGV3YXlFdmVudERhdGEpXG4gICAgICAgICAgICB9KV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBydWxlIHRoYXQgcnVucyBldmVyeSBUdWVzZGF5IGF0IDAzOjMwIEFNIEdNVCB0byB0cmlnZ2VyXG4gICAgICogb3VyIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBUcmlnZ2VyUnVsZSgpOiB2b2lkIHtcbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBhdCB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbih7d2Vla0RheTogJzInLCBob3VyOiAnMycsIG1pbnV0ZTogJzMwJ30pLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbildLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUzMgYnVja2V0IHRvIHN0b3JlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9QUkVGRVJSRUQsXG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBzdGFjayBpcyBkZXN0cm95ZWQsIHdlIGV4cGVjdCBldmVyeXRoaW5nIHRvIGJlIGRlbGV0ZWRcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXNzTG9nc0J1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3MgYnVja2V0IG5vdCBzZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcyB9ID0gcmVxdWlyZSgnLi4vYWNjZXNzLWxvZ3MtYW5hbHlzaXMvQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcycpO1xuXG4gICAgICAgIG5ldyBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3MtYW5hbHlzaXNgLCB7XG4gICAgICAgICAgICBidWNrZXQ6IHRoaXMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgICAgICAgIHJlc291cmNlUHJlZml4OiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzYCxcbiAgICAgICAgICAgIGFjY2Vzc0xvZ0Nvb2tpZXM6IHByb3BzLmFjY2Vzc0xvZ0Nvb2tpZXMsXG4gICAgICAgICAgICBhbm9ueW1pemVDbGllbnRJcDogcHJvcHMuYW5vbnltaXplQWNjZXNzTG9nQ2xpZW50SXAgPz8gdHJ1ZSxcbiAgICAgICAgICAgIGV4cGlyZVJhd0xvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc1Jhd1JldGVudGlvbixcbiAgICAgICAgICAgIGV4cGlyZUludGVybWVkaWF0ZUxvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc0ludGVybWVkaWF0ZVJldGVudGlvbixcbiAgICAgICAgICAgIGV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyOiBwcm9wcy5hY2Nlc3NMb2dzVHJhbnNmb3JtZWRSZXRlbnRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -309,8 +309,8 @@ export class NuxtServerAppStack extends Stack {
309
309
  code: Code.fromAsset(`${functionDirPath}/build/app`, {
310
310
  exclude: ['*.d.ts']
311
311
  }),
312
- timeout: Duration.minutes(5),
313
- memorySize: 128,
312
+ timeout: Duration.minutes(15),
313
+ memorySize: 512,
314
314
  environment: {
315
315
  STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
316
316
  OUTDATED_ASSETS_RETENTION_DAYS: `${props.outdatedAssetsRetentionDays ?? 30}`,
@@ -754,6 +754,10 @@ export class NuxtServerAppStack extends Stack {
754
754
  bucket: this.accessLogsBucket,
755
755
  resourcePrefix: `${this.resourceIdPrefix}-access-logs`,
756
756
  accessLogCookies: props.accessLogCookies,
757
+ anonymizeClientIp: props.anonymizeAccessLogClientIp ?? true,
758
+ expireRawLogsAfter: props.accessLogsRawRetention,
759
+ expireIntermediateLogsAfter: props.accessLogsIntermediateRetention,
760
+ expireTransformedLogsAfter: props.accessLogsTransformedRetention,
757
761
  });
758
762
  }
759
763
  }
@@ -1,4 +1,5 @@
1
1
  import { type NuxtAppStackProps } from "../NuxtAppStackProps";
2
+ import { Duration } from "aws-cdk-lib";
2
3
  /**
3
4
  * Defines the props required for the {@see NuxtServerAppStack}.
4
5
  */
@@ -44,6 +45,33 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
44
45
  * Array of cookie names to include in the access logs (whitelist).
45
46
  */
46
47
  readonly accessLogCookies?: string[];
48
+ /**
49
+ * Whether to anonymize the client IP address in the access logs by replacing the last octet (IPv4)
50
+ * or the last group (IPv6) with 'xxx'.
51
+ *
52
+ * **DSGVO/Legal note:** IP addresses are considered personal data under the GDPR (cf. CJEU judgment C‑582/14).
53
+ * If you set this to `false`, you must ensure a legal basis under Art. 6 GDPR (e.g. legitimate interest),
54
+ * document it in your privacy policy, and limit the retention period to what is strictly necessary.
55
+ * When in doubt, consult a data protection officer or legal counsel before disabling this option.
56
+ *
57
+ * Defaults to `true`.
58
+ */
59
+ readonly anonymizeAccessLogClientIp?: boolean;
60
+ /**
61
+ * The duration after which raw (unprocessed) access logs are deleted from S3.
62
+ * Defaults to 7 days.
63
+ */
64
+ readonly accessLogsRawRetention?: Duration;
65
+ /**
66
+ * The duration after which intermediate (grouped-by-date) access logs are deleted from S3.
67
+ * Defaults to 7 days.
68
+ */
69
+ readonly accessLogsIntermediateRetention?: Duration;
70
+ /**
71
+ * The duration after which transformed (Parquet) access logs are deleted from S3.
72
+ * Defaults to 180 days.
73
+ */
74
+ readonly accessLogsTransformedRetention?: Duration;
47
75
  /**
48
76
  * The number of days to retain static assets of outdated deployments in the S3 bucket.
49
77
  * Useful to allow users to still access old assets after a new deployment when they are still browsing on an old version.
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOdXh0U2VydmVyQXBwU3RhY2tQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0eXBlIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi4vTnV4dEFwcFN0YWNrUHJvcHNcIjtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBwcm9wcyByZXF1aXJlZCBmb3IgdGhlIHtAc2VlIE51eHRTZXJ2ZXJBcHBTdGFja30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBOdXh0QXBwU3RhY2tQcm9wcyB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVJOIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byB1c2UgYXQgdGhlIEFwaUdhdGV3YXkgZm9yIHRoZSBOdXh0IGFwcCB0byBtYWtlIGl0IGFjY2Vzc2libGUgdmlhIHRoZSBjdXN0b20gZG9tYWluXG4gICAgICogYW5kIHRvIHByb3ZpZGUgdGhlIGN1c3RvbSBkb21haW4gdG8gdGhlIE51eHQgYXBwIHZpYSB0aGUgJ0hvc3QnIGhlYWRlciBmb3Igc2VydmVyIHNpZGUgcmVuZGVyaW5nIHVzZSBjYXNlcy5cbiAgICAgKiBUaGUgY2VydGlmaWNhdGUgbXVzdCBiZSBpc3N1ZWQgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHNwZWNpZmllZCB2aWEgJ2Vudi5yZWdpb24nIGFzIEFwaUdhdGV3YXkgd29ya3MgcmVnaW9uYWxseS5cbiAgICAgKi9cbiAgICByZWFkb25seSByZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlsZSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgb2YgdGhlIExhbWJkYSBlbnRyeXBvaW50IHdpdGhpbiB0aGUgJ3NlcnZlcicgZGlyZWN0b3J5IGV4cG9ydGluZyBhIGhhbmRsZXIuXG4gICAgICogRGVmYXVsdHMgdG8gXCJpbmRleFwiLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIEpTT04gc2VyaWFsaXplZCBzdHJpbmcgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRyeXBvaW50RW52Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1lbW9yeSBzaXplIHRvIGFwcGx5IHRvIHRoZSBOdXh0IGFwcCdzIExhbWJkYS5cbiAgICAgKiBEZWZhdWx0cyB0byAxNzkyTUIgKG9wdGltaXplZCBmb3IgY29zdHMgYW5kIHBlcmZvcm1hbmNlIGZvciBzdGFuZGFyZCBOdXh0IGFwcHMpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgWC1SYXkgZm9yIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVUcmFjaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIGEgZ2xvYmFsIFNpdGVtYXAgYnVja2V0IHdoaWNoIGlzIHBlcm1hbmVudGx5IGFjY2Vzc2libGUgdGhyb3VnaCBtdWx0aXBsZSBkZXBsb3ltZW50cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVTaXRlbWFwPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIChIVFRQUyBvbmx5KSBBUEkgYWNjZXNzIHRvIHRoZSBOdXh0IGFwcCB2aWEgdGhlIGAvYXBpYCBwYXRoIHdoaWNoIHN1cHBvcnQgYWxsIEhUVFAgbWV0aG9kcy5cbiAgICAgKiBTZWUgaHR0cHM6Ly9udXh0LmNvbS9kb2NzL2d1aWRlL2RpcmVjdG9yeS1zdHJ1Y3R1cmUvc2VydmVyI3JlY2lwZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlQXBpPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIHJlcG9ydGluZyBvZiBDbG91ZEZyb250IGFjY2VzcyBsb2dzIHZpYSBBdGhlbmEuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGNvb2tpZSBuYW1lcyB0byBpbmNsdWRlIGluIHRoZSBhY2Nlc3MgbG9ncyAod2hpdGVsaXN0KS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgdG8gcmV0YWluIHN0YXRpYyBhc3NldHMgb2Ygb3V0ZGF0ZWQgZGVwbG95bWVudHMgaW4gdGhlIFMzIGJ1Y2tldC5cbiAgICAgKiBVc2VmdWwgdG8gYWxsb3cgdXNlcnMgdG8gc3RpbGwgYWNjZXNzIG9sZCBhc3NldHMgYWZ0ZXIgYSBuZXcgZGVwbG95bWVudCB3aGVuIHRoZXkgYXJlIHN0aWxsIGJyb3dzaW5nIG9uIGFuIG9sZCB2ZXJzaW9uLlxuICAgICAqIERlZmF1bHRzIHRvIDMwIGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3V0ZGF0ZWRBc3NldHNSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgSFRUUCBoZWFkZXJzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIG9uIG9yaWdpbiByZXF1ZXN0cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5IGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBoZWFkZXJzIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBPbmx5IHRoZSBDbG91ZGZyb250IGRlZmF1bHQgaGVhZGVycyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBIVFRQIGhlYWRlcnMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgYW5kIHRvIGluY2x1ZGUgaW4gdGhlIGNhY2hlIGtleSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBoZWFkZXJzIHRoYXQgbWlnaHQgYWZmZWN0IHRoZSByZXNwb25zZSwgZS5nLiwgJ0F1dGhvcml6YXRpb24nLlxuICAgICAqXG4gICAgICogT25seSB0aGUgQ2xvdWRmcm9udCBkZWZhdWx0IGhlYWRlcnMgYXJlIGZvcndhcmRlZCxcbiAgICAgKiBidXQgbm8gaGVhZGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBjb29raWVzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIG9uIG9yaWdpbiByZXF1ZXN0cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5IGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjb29raWVzIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBObyBjb29raWVzIGFyZSBmb3J3YXJkZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9yd2FyZENvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgYW5kIHRvIGluY2x1ZGUgaW4gdGhlIGNhY2hlIGtleSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBjb29raWVzIHRoYXQgbWlnaHQgYWZmZWN0IHRoZSByZXNwb25zZSwgZS5nLiwgYXV0aGVudGljYXRpb24gY29va2llcy5cbiAgICAgKlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIGZvcndhcmRlZCBvciBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5IGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBjYWNoZUtleUNvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcXVlcnkgcGFyYW1zIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UgYW5kIGFyZSByZXF1aXJlZCBvbiBTU1IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBmb3J3YXJkZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9yd2FyZFF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgYW5kIHRvIGluY2x1ZGUgaW4gdGhlIGNhY2hlIGtleSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBxdWVyeSBwYXJhbXMgdGhhdCBhZmZlY3QgdGhlIHJlc3BvbnNlIGFuZCBhcmUgcmVxdWlyZWQgb24gU1NSIHJlcXVlc3RzLCBlLmcuLCBmaWx0ZXJzLlxuICAgICAqXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgZm9yd2FyZGVkIGFuZCBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5IGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBjYWNoZUtleVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbXMgdG8gcHJldmVudCBmb3J3YXJkaW5nIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gbm90IGluY2x1ZGUgaW4gdGhlIGNhY2hlIGtleSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBXaGVuIHNldCwgYWxsIHF1ZXJ5IHBhcmFtcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoaXMgYXJyYXkgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIE51eHQgYXBwIGFuZCBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5LlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIHF1ZXJ5IHBhcmFtcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIGFuZCBhcmUgbm90IHJlcXVpcmVkIG9uIFNTUiByZXF1ZXN0cywgZS5nLiwgJ2ZiY2xpZCcgb3IgJ3V0bV9jYW1wYWlnbicuXG4gICAgICpcbiAgICAgKiBJZiBib3RoIHtAc2VlIGNhY2hlS2V5UXVlcnlQYXJhbXN9IGFuZCB7QHNlZSBkZW55Q2FjaGVLZXlRdWVyeVBhcmFtc30gYXJlIHNwZWNpZmllZCwgdGhlIHtAc2VlIGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgZm9yd2FyZGVkIGFuZCBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5IGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBkZW55Q2FjaGVLZXlRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaGVhZGVycyB0byBwYXNzIHRvIHRoZSBOdXh0IGFwcCBvbiBTU1IgcmVxdWVzdHMuXG4gICAgICogVGhlIG1vcmUgaGVhZGVycyBhcmUgcGFzc2VkLCB0aGUgd2Vha2VyIHRoZSBjYWNoZSBwZXJmb3JtYW5jZSB3aWxsIGJlLCBhcyB0aGUgY2FjaGUga2V5XG4gICAgICogaXMgYmFzZWQgb24gdGhlIGhlYWRlcnMuXG4gICAgICogTm8gaGVhZGVycyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgY2FjaGVLZXlIZWFkZXJzfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFsbG93SGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY29va2llcyB0byBwYXNzIHRvIHRoZSBOdXh0IGFwcCBvbiBTU1IgcmVxdWVzdHMuXG4gICAgICogVGhlIG1vcmUgY29va2llcyBhcmUgcGFzc2VkLCB0aGUgd2Vha2VyIHRoZSBjYWNoZSBwZXJmb3JtYW5jZSB3aWxsIGJlLCBhcyB0aGUgY2FjaGUga2V5XG4gICAgICogaXMgYmFzZWQgb24gdGhlIGNvb2tpZXMuXG4gICAgICogTm8gY29va2llcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgY2FjaGVLZXlDb29raWVzfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFsbG93Q29va2llcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW0ga2V5cyB0byBwYXNzIHRvIHRoZSBOdXh0IGFwcCBvbiBTU1IgcmVxdWVzdHMuXG4gICAgICogVGhlIG1vcmUgcXVlcnkgcGFyYW1zIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgcXVlcnkgcGFyYW1zLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbmZpZyBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGgge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfS5cbiAgICAgKiBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB7QHNlZSBkZW55UXVlcnlQYXJhbXN9IHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBjYWNoZUtleVF1ZXJ5UGFyYW1zfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFsbG93UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtIGtleXMgdG8gZGVueSBwYXNzaW5nIHRvIHRoZSBOdXh0IGFwcCBvbiBTU1IgcmVxdWVzdHMuXG4gICAgICogSXQgbWlnaHQgYmUgdXNlZnVsIHRvIHByZXZlbnQgc3BlY2lmaWMgZXh0ZXJuYWwgcXVlcnkgcGFyYW1zLCBlLmcuLCBmYmNsaWQsIHV0bV9jYW1wYWlnbiwgLi4uLFxuICAgICAqIHRvIGltcHJvdmUgY2FjaGUgcGVyZm9ybWFuY2UsIGFzIHRoZSBjYWNoZSBrZXkgaXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbXMuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgY29uZmlnIGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCB7QHNlZSBhbGxvd1F1ZXJ5UGFyYW1zfS5cbiAgICAgKiBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB7QHNlZSBkZW55UXVlcnlQYXJhbXN9IHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBkZW55Q2FjaGVLZXlRdWVyeVBhcmFtc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBkZW55UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBhdGggcGF0dGVybnMgZm9yIHNlcnZlciBlbmRwb2ludHMgdGhhdCBzaG91bGQgYmUgcm91dGVkIHRvIHRoZSBTU1Igb3JpZ2luIChBUEkgR2F0ZXdheSDihpIgTGFtYmRhKVxuICAgICAqIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgUzMgXCJmaWxlXCIgYmVoYXZpb3IuXG4gICAgICogXG4gICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIHNlcnZlciByb3V0ZXMgdGhhdCBnZW5lcmF0ZSBkeW5hbWljIGNvbnRlbnQgYnV0IHVzZSBmaWxlLWxpa2UgVVJMcy5cbiAgICAgKiBGb3IgZXhhbXBsZSwgYEBudXh0anMvc2l0ZW1hcGAgY3JlYXRlcyBhIGAvc2l0ZW1hcC54bWxgIGVuZHBvaW50IHRoYXQgZHluYW1pY2FsbHkgZ2VuZXJhdGVzIFhNTCBjb250ZW50LFxuICAgICAqIGFuZCBgQG51eHQvaW1hZ2VgIHVzZXMgZmlsZS1saWtlIFVSTHMgdG8gc2VydmUgZHluYW1pY2FsbHkgcHJvY2Vzc2VkIGltYWdlcy5cbiAgICAgKiBcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGBlbmFibGVTaXRlbWFwYCB3aGljaCBzZXJ2ZXMgcHJlLWdlbmVyYXRlZCBzdGF0aWMgc2l0ZW1hcCBmaWxlcyBmcm9tIFMzLlxuICAgICAqIFVzZSBgc2VydmVyUm91dGVzYCB3aGVuIHlvdSBuZWVkIHRoZSBMYW1iZGEgdG8gaGFuZGxlIHJlcXVlc3RzIGFuZCBnZW5lcmF0ZSBjb250ZW50IG9uLXRoZS1mbHkuXG4gICAgICogXG4gICAgICogRXhhbXBsZXM6IGBbJy9zaXRlbWFwLnhtbCcsICcvcm9ib3RzLnR4dCcsICcvX19zaXRlbWFwX18vKicsICcvX2lweC8qJ11gXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VydmVyUm91dGVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVJOIG9mIGFuIGV4aXN0aW5nIEFXUyBXQUYgV2ViIEFDTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGEgc2VwYXJhdGUgQ2xvdWRGcm9udFdhZlN0YWNrIGRlcGxveWVkIGluIHVzLWVhc3QtMS5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6ICdhcm46YXdzOndhZnYyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Z2xvYmFsL3dlYmFjbC9teS13ZWItYWNsL2ExYjJjM2Q0LTU2NzgtOTBhYi1jZGVmLUVYQU1QTEUxMTExMSdcbiAgICAgKi9cbiAgICByZWFkb25seSB3ZWJBY2xBcm4/OiBzdHJpbmc7XG59Il19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOdXh0U2VydmVyQXBwU3RhY2tQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0eXBlIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi4vTnV4dEFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIHByb3BzIHJlcXVpcmVkIGZvciB0aGUge0BzZWUgTnV4dFNlcnZlckFwcFN0YWNrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyBleHRlbmRzIE51eHRBcHBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRvIHVzZSBhdCB0aGUgQXBpR2F0ZXdheSBmb3IgdGhlIE51eHQgYXBwIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB2aWEgdGhlIGN1c3RvbSBkb21haW5cbiAgICAgKiBhbmQgdG8gcHJvdmlkZSB0aGUgY3VzdG9tIGRvbWFpbiB0byB0aGUgTnV4dCBhcHAgdmlhIHRoZSAnSG9zdCcgaGVhZGVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcgdXNlIGNhc2VzLlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGlzc3VlZCBpbiB0aGUgc2FtZSByZWdpb24gYXMgc3BlY2lmaWVkIHZpYSAnZW52LnJlZ2lvbicgYXMgQXBpR2F0ZXdheSB3b3JrcyByZWdpb25hbGx5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBvZiB0aGUgTGFtYmRhIGVudHJ5cG9pbnQgd2l0aGluIHRoZSAnc2VydmVyJyBkaXJlY3RvcnkgZXhwb3J0aW5nIGEgaGFuZGxlci5cbiAgICAgKiBEZWZhdWx0cyB0byBcImluZGV4XCIuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgSlNPTiBzZXJpYWxpemVkIHN0cmluZyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnRFbnY/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWVtb3J5IHNpemUgdG8gYXBwbHkgdG8gdGhlIE51eHQgYXBwJ3MgTGFtYmRhLlxuICAgICAqIERlZmF1bHRzIHRvIDE3OTJNQiAob3B0aW1pemVkIGZvciBjb3N0cyBhbmQgcGVyZm9ybWFuY2UgZm9yIHN0YW5kYXJkIE51eHQgYXBwcykuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIEFXUyBYLVJheSBmb3IgdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZVRyYWNpbmc/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgYSBnbG9iYWwgU2l0ZW1hcCBidWNrZXQgd2hpY2ggaXMgcGVybWFuZW50bHkgYWNjZXNzaWJsZSB0aHJvdWdoIG11bHRpcGxlIGRlcGxveW1lbnRzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZVNpdGVtYXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgKEhUVFBTIG9ubHkpIEFQSSBhY2Nlc3MgdG8gdGhlIE51eHQgYXBwIHZpYSB0aGUgYC9hcGlgIHBhdGggd2hpY2ggc3VwcG9ydCBhbGwgSFRUUCBtZXRob2RzLlxuICAgICAqIFNlZSBodHRwczovL251eHQuY29tL2RvY3MvZ3VpZGUvZGlyZWN0b3J5LXN0cnVjdHVyZS9zZXJ2ZXIjcmVjaXBlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBcGk/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgcmVwb3J0aW5nIG9mIENsb3VkRnJvbnQgYWNjZXNzIGxvZ3MgdmlhIEF0aGVuYS5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBY2Nlc3NMb2dzQW5hbHlzaXM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgY29va2llIG5hbWVzIHRvIGluY2x1ZGUgaW4gdGhlIGFjY2VzcyBsb2dzICh3aGl0ZWxpc3QpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ0Nvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gYW5vbnltaXplIHRoZSBjbGllbnQgSVAgYWRkcmVzcyBpbiB0aGUgYWNjZXNzIGxvZ3MgYnkgcmVwbGFjaW5nIHRoZSBsYXN0IG9jdGV0IChJUHY0KVxuICAgICAqIG9yIHRoZSBsYXN0IGdyb3VwIChJUHY2KSB3aXRoICd4eHgnLlxuICAgICAqXG4gICAgICogKipEU0dWTy9MZWdhbCBub3RlOioqIElQIGFkZHJlc3NlcyBhcmUgY29uc2lkZXJlZCBwZXJzb25hbCBkYXRhIHVuZGVyIHRoZSBHRFBSIChjZi4gQ0pFVSBqdWRnbWVudCBD4oCRNTgyLzE0KS5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gYGZhbHNlYCwgeW91IG11c3QgZW5zdXJlIGEgbGVnYWwgYmFzaXMgdW5kZXIgQXJ0LiA2IEdEUFIgKGUuZy4gbGVnaXRpbWF0ZSBpbnRlcmVzdCksXG4gICAgICogZG9jdW1lbnQgaXQgaW4geW91ciBwcml2YWN5IHBvbGljeSwgYW5kIGxpbWl0IHRoZSByZXRlbnRpb24gcGVyaW9kIHRvIHdoYXQgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5LlxuICAgICAqIFdoZW4gaW4gZG91YnQsIGNvbnN1bHQgYSBkYXRhIHByb3RlY3Rpb24gb2ZmaWNlciBvciBsZWdhbCBjb3Vuc2VsIGJlZm9yZSBkaXNhYmxpbmcgdGhpcyBvcHRpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYW5vbnltaXplQWNjZXNzTG9nQ2xpZW50SXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHJhdyAodW5wcm9jZXNzZWQpIGFjY2VzcyBsb2dzIGFyZSBkZWxldGVkIGZyb20gUzMuXG4gICAgICogRGVmYXVsdHMgdG8gNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NSYXdSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCBpbnRlcm1lZGlhdGUgKGdyb3VwZWQtYnktZGF0ZSkgYWNjZXNzIGxvZ3MgYXJlIGRlbGV0ZWQgZnJvbSBTMy5cbiAgICAgKiBEZWZhdWx0cyB0byA3IGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWNjZXNzTG9nc0ludGVybWVkaWF0ZVJldGVudGlvbj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHRyYW5zZm9ybWVkIChQYXJxdWV0KSBhY2Nlc3MgbG9ncyBhcmUgZGVsZXRlZCBmcm9tIFMzLlxuICAgICAqIERlZmF1bHRzIHRvIDE4MCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NUcmFuc2Zvcm1lZFJldGVudGlvbj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHRvIHJldGFpbiBzdGF0aWMgYXNzZXRzIG9mIG91dGRhdGVkIGRlcGxveW1lbnRzIGluIHRoZSBTMyBidWNrZXQuXG4gICAgICogVXNlZnVsIHRvIGFsbG93IHVzZXJzIHRvIHN0aWxsIGFjY2VzcyBvbGQgYXNzZXRzIGFmdGVyIGEgbmV3IGRlcGxveW1lbnQgd2hlbiB0aGV5IGFyZSBzdGlsbCBicm93c2luZyBvbiBhbiBvbGQgdmVyc2lvbi5cbiAgICAgKiBEZWZhdWx0cyB0byAzMCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG91dGRhdGVkQXNzZXRzUmV0ZW50aW9uRGF5cz86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEhUVFAgaGVhZGVycyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgaGVhZGVycyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogT25seSB0aGUgQ2xvdWRmcm9udCBkZWZhdWx0IGhlYWRlcnMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkSGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgSFRUUCBoZWFkZXJzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgaGVhZGVycyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcmVzcG9uc2UsIGUuZy4sICdBdXRob3JpemF0aW9uJy5cbiAgICAgKlxuICAgICAqIE9ubHkgdGhlIENsb3VkZnJvbnQgZGVmYXVsdCBoZWFkZXJzIGFyZSBmb3J3YXJkZWQsXG4gICAgICogYnV0IG5vIGhlYWRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5SGVhZGVycz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY29va2llcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBvbiBvcmlnaW4gcmVxdWVzdHMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhY2hlIGtleSBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY29va2llcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogTm8gY29va2llcyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBjb29raWVzIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgY29va2llcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcmVzcG9uc2UsIGUuZy4sIGF1dGhlbnRpY2F0aW9uIGNvb2tpZXMuXG4gICAgICpcbiAgICAgKiBObyBjb29raWVzIGFyZSBmb3J3YXJkZWQgb3IgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHF1ZXJ5IHBhcmFtcyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIGFuZCBhcmUgcmVxdWlyZWQgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgZm9yd2FyZGVkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLW9yaWdpbi1yZXF1ZXN0cy5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcndhcmRRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgcGFyYW1zIHRoYXQgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIHJlcXVpcmVkIG9uIFNTUiByZXF1ZXN0cywgZS5nLiwgZmlsdGVycy5cbiAgICAgKlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVLZXlRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIHByZXZlbnQgZm9yd2FyZGluZyB0byB0aGUgTnV4dCBhcHAgYW5kIHRvIG5vdCBpbmNsdWRlIGluIHRoZSBjYWNoZSBrZXkgZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkIGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogV2hlbiBzZXQsIGFsbCBxdWVyeSBwYXJhbXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGlzIGFycmF5IHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBOdXh0IGFwcCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleS5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBxdWVyeSBwYXJhbXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIG5vdCByZXF1aXJlZCBvbiBTU1IgcmVxdWVzdHMsIGUuZy4sICdmYmNsaWQnIG9yICd1dG1fY2FtcGFpZ24nLlxuICAgICAqXG4gICAgICogSWYgYm90aCB7QHNlZSBjYWNoZUtleVF1ZXJ5UGFyYW1zfSBhbmQge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IGFyZSBzcGVjaWZpZWQsIHRoZSB7QHNlZSBkZW55Q2FjaGVLZXlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGNhY2hlIGtleSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy10aGUtY2FjaGUta2V5Lmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGhlYWRlcnMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGhlYWRlcnMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBoZWFkZXJzLlxuICAgICAqIE5vIGhlYWRlcnMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5SGVhZGVyc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0hlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIGNvb2tpZXMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBjb29raWVzLlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5Q29va2llc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd0Nvb2tpZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtIGtleXMgdG8gcGFzcyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIFRoZSBtb3JlIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkLCB0aGUgd2Vha2VyIHRoZSBjYWNoZSBwZXJmb3JtYW5jZSB3aWxsIGJlLCBhcyB0aGUgY2FjaGUga2V5XG4gICAgICogaXMgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtcy5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb25maWcgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgY2FjaGVLZXlRdWVyeVBhcmFtc30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGxvd1F1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbSBrZXlzIHRvIGRlbnkgcGFzc2luZyB0byB0aGUgTnV4dCBhcHAgb24gU1NSIHJlcXVlc3RzLlxuICAgICAqIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBwcmV2ZW50IHNwZWNpZmljIGV4dGVybmFsIHF1ZXJ5IHBhcmFtcywgZS5nLiwgZmJjbGlkLCB1dG1fY2FtcGFpZ24sIC4uLixcbiAgICAgKiB0byBpbXByb3ZlIGNhY2hlIHBlcmZvcm1hbmNlLCBhcyB0aGUgY2FjaGUga2V5IGlzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1zLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbmZpZyBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGgge0BzZWUgYWxsb3dRdWVyeVBhcmFtc30uXG4gICAgICogSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueVF1ZXJ5UGFyYW1zfSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICogQWxsIHF1ZXJ5IHBhcmFtcyBhcmUgcGFzc2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVueVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXRoIHBhdHRlcm5zIGZvciBzZXJ2ZXIgZW5kcG9pbnRzIHRoYXQgc2hvdWxkIGJlIHJvdXRlZCB0byB0aGUgU1NSIG9yaWdpbiAoQVBJIEdhdGV3YXkg4oaSIExhbWJkYSlcbiAgICAgKiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFMzIFwiZmlsZVwiIGJlaGF2aW9yLlxuICAgICAqIFxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzZXJ2ZXIgcm91dGVzIHRoYXQgZ2VuZXJhdGUgZHluYW1pYyBjb250ZW50IGJ1dCB1c2UgZmlsZS1saWtlIFVSTHMuXG4gICAgICogRm9yIGV4YW1wbGUsIGBAbnV4dGpzL3NpdGVtYXBgIGNyZWF0ZXMgYSBgL3NpdGVtYXAueG1sYCBlbmRwb2ludCB0aGF0IGR5bmFtaWNhbGx5IGdlbmVyYXRlcyBYTUwgY29udGVudCxcbiAgICAgKiBhbmQgYEBudXh0L2ltYWdlYCB1c2VzIGZpbGUtbGlrZSBVUkxzIHRvIHNlcnZlIGR5bmFtaWNhbGx5IHByb2Nlc3NlZCBpbWFnZXMuXG4gICAgICogXG4gICAgICogTm90ZTogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgZW5hYmxlU2l0ZW1hcGAgd2hpY2ggc2VydmVzIHByZS1nZW5lcmF0ZWQgc3RhdGljIHNpdGVtYXAgZmlsZXMgZnJvbSBTMy5cbiAgICAgKiBVc2UgYHNlcnZlclJvdXRlc2Agd2hlbiB5b3UgbmVlZCB0aGUgTGFtYmRhIHRvIGhhbmRsZSByZXF1ZXN0cyBhbmQgZ2VuZXJhdGUgY29udGVudCBvbi10aGUtZmx5LlxuICAgICAqIFxuICAgICAqIEV4YW1wbGVzOiBgWycvc2l0ZW1hcC54bWwnLCAnL3JvYm90cy50eHQnLCAnL19fc2l0ZW1hcF9fLyonLCAnL19pcHgvKiddYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlcnZlclJvdXRlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFSTiBvZiBhbiBleGlzdGluZyBBV1MgV0FGIFdlYiBBQ0wgdG8gYXNzb2NpYXRlIHdpdGggdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBhIHNlcGFyYXRlIENsb3VkRnJvbnRXYWZTdGFjayBkZXBsb3llZCBpbiB1cy1lYXN0LTEuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlOiAnYXJuOmF3czp3YWZ2Mjp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmdsb2JhbC93ZWJhY2wvbXktd2ViLWFjbC9hMWIyYzNkNC01Njc4LTkwYWItY2RlZi1FWEFNUExFMTExMTEnXG4gICAgICovXG4gICAgcmVhZG9ubHkgd2ViQWNsQXJuPzogc3RyaW5nO1xufSJdfQ==
@@ -1,4 +1,5 @@
1
1
  import {type NuxtAppStackProps} from "../NuxtAppStackProps";
2
+ import {Duration} from "aws-cdk-lib";
2
3
 
3
4
  /**
4
5
  * Defines the props required for the {@see NuxtServerAppStack}.
@@ -55,6 +56,37 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
55
56
  */
56
57
  readonly accessLogCookies?: string[];
57
58
 
59
+ /**
60
+ * Whether to anonymize the client IP address in the access logs by replacing the last octet (IPv4)
61
+ * or the last group (IPv6) with 'xxx'.
62
+ *
63
+ * **DSGVO/Legal note:** IP addresses are considered personal data under the GDPR (cf. CJEU judgment C‑582/14).
64
+ * If you set this to `false`, you must ensure a legal basis under Art. 6 GDPR (e.g. legitimate interest),
65
+ * document it in your privacy policy, and limit the retention period to what is strictly necessary.
66
+ * When in doubt, consult a data protection officer or legal counsel before disabling this option.
67
+ *
68
+ * Defaults to `true`.
69
+ */
70
+ readonly anonymizeAccessLogClientIp?: boolean;
71
+
72
+ /**
73
+ * The duration after which raw (unprocessed) access logs are deleted from S3.
74
+ * Defaults to 7 days.
75
+ */
76
+ readonly accessLogsRawRetention?: Duration;
77
+
78
+ /**
79
+ * The duration after which intermediate (grouped-by-date) access logs are deleted from S3.
80
+ * Defaults to 7 days.
81
+ */
82
+ readonly accessLogsIntermediateRetention?: Duration;
83
+
84
+ /**
85
+ * The duration after which transformed (Parquet) access logs are deleted from S3.
86
+ * Defaults to 180 days.
87
+ */
88
+ readonly accessLogsTransformedRetention?: Duration;
89
+
58
90
  /**
59
91
  * The number of days to retain static assets of outdated deployments in the S3 bucket.
60
92
  * Useful to allow users to still access old assets after a new deployment when they are still browsing on an old version.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdk-nuxt",
3
- "version": "2.21.0",
3
+ "version": "2.23.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",