mirror of
https://github.com/aquasecurity/trivy-action.git
synced 2026-05-14 03:02:40 +00:00
c1824fd6ed
Co-authored-by: simar7 <simar7@users.noreply.github.com>
558 lines
23 KiB
JSON
558 lines
23 KiB
JSON
{
|
|
"SchemaVersion": 2,
|
|
"Trivy": {
|
|
"Version": "0.69.1"
|
|
},
|
|
"ArtifactName": "test/data/config-scan",
|
|
"ArtifactType": "filesystem",
|
|
"Results": [
|
|
{
|
|
"Target": ".",
|
|
"Class": "config",
|
|
"Type": "terraform",
|
|
"MisconfSummary": {
|
|
"Successes": 53,
|
|
"Failures": 0
|
|
}
|
|
},
|
|
{
|
|
"Target": "main.tf",
|
|
"Class": "config",
|
|
"Type": "terraform",
|
|
"MisconfSummary": {
|
|
"Successes": 0,
|
|
"Failures": 8
|
|
},
|
|
"Misconfigurations": [
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0086",
|
|
"Title": "S3 Access block should block public ACL",
|
|
"Description": "S3 buckets should block public ACLs on buckets and any objects they contain. By blocking, PUTs with fail if the object has any public ACL a.\n",
|
|
"Message": "No public access block so not blocking public acls",
|
|
"Namespace": "builtin.aws.s3.aws0086",
|
|
"Query": "data.builtin.aws.s3.aws0086.deny",
|
|
"Resolution": "Enable blocking any PUT calls with a public ACL specified",
|
|
"Severity": "HIGH",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0086",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0086"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0087",
|
|
"Title": "S3 Access block should block public policy",
|
|
"Description": "S3 bucket policy should have block public policy to prevent users from putting a policy that enable public access.\n",
|
|
"Message": "No public access block so not blocking public policies",
|
|
"Namespace": "builtin.aws.s3.aws0087",
|
|
"Query": "data.builtin.aws.s3.aws0087.deny",
|
|
"Resolution": "Prevent policies that allow public access being PUT",
|
|
"Severity": "HIGH",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0087",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/dev-retired/access-control-block-public-access.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0087"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0089",
|
|
"Title": "S3 Bucket Logging",
|
|
"Description": "Ensures S3 bucket logging is enabled for S3 buckets",
|
|
"Message": "Bucket has logging disabled",
|
|
"Namespace": "builtin.aws.s3.aws0089",
|
|
"Query": "data.builtin.aws.s3.aws0089.deny",
|
|
"Resolution": "Add a logging block to the resource to enable access logging",
|
|
"Severity": "LOW",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0089",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html",
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0089"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0090",
|
|
"Title": "S3 Data should be versioned",
|
|
"Description": "Versioning in Amazon S3 is a means of keeping multiple variants of an object in the same bucket.\n\nYou can use the S3 Versioning feature to preserve, retrieve, and restore every version of every object stored in your buckets.\n\nWith versioning you can recover more easily from both unintended user actions and application failures.\n\nWhen you enable versioning, also keep in mind the potential costs of storing noncurrent versions of objects. To help manage those costs, consider setting up an S3 Lifecycle configuration.\n",
|
|
"Message": "Bucket does not have versioning enabled",
|
|
"Namespace": "builtin.aws.s3.aws0090",
|
|
"Query": "data.builtin.aws.s3.aws0090.deny",
|
|
"Resolution": "Enable versioning to protect against accidental/malicious removal or modification",
|
|
"Severity": "MEDIUM",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0090",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html",
|
|
"https://aws.amazon.com/blogs/storage/reduce-storage-costs-with-fewer-noncurrent-versions-using-amazon-s3-lifecycle/",
|
|
"https://avd.aquasec.com/misconfig/aws-0090"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket_versioning.bucket_versioning",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 16,
|
|
"EndLine": 16,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 12,
|
|
"Content": "resource \"aws_s3_bucket_versioning\" \"bucket_versioning\" {",
|
|
"IsCause": false,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket_versioning\"\u001b[0m \u001b[38;5;37m\"bucket_versioning\"\u001b[0m {",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 13,
|
|
"Content": " bucket = aws_s3_bucket.bucket.id",
|
|
"IsCause": false,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = aws_s3_bucket.bucket.id",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 14,
|
|
"Content": "",
|
|
"IsCause": false,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 15,
|
|
"Content": " versioning_configuration {",
|
|
"IsCause": false,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " versioning_configuration {",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 16,
|
|
"Content": " status = var.bucket_versioning_enabled",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mstatus\u001b[0m = \u001b[38;5;33mvar\u001b[0m.bucket_versioning_enabled",
|
|
"FirstCause": true,
|
|
"LastCause": true
|
|
},
|
|
{
|
|
"Number": 17,
|
|
"Content": " }",
|
|
"IsCause": false,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " }",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 18,
|
|
"Content": "}",
|
|
"IsCause": false,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "}",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
}
|
|
]
|
|
},
|
|
"Occurrences": [
|
|
{
|
|
"Resource": "versioning_configuration",
|
|
"Filename": "main.tf",
|
|
"Location": {
|
|
"StartLine": 15,
|
|
"EndLine": 17
|
|
}
|
|
},
|
|
{
|
|
"Resource": "aws_s3_bucket_versioning.bucket_versioning",
|
|
"Filename": "main.tf",
|
|
"Location": {
|
|
"StartLine": 12,
|
|
"EndLine": 18
|
|
}
|
|
}
|
|
],
|
|
"RenderedCause": {
|
|
"Raw": "resource \"aws_s3_bucket_versioning\" \"bucket_versioning\" {\n versioning_configuration {\n status = \"Disabled\"\n }\n}",
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket_versioning\"\u001b[0m \u001b[38;5;37m\"bucket_versioning\"\u001b[0m {\n versioning_configuration {\n \u001b[38;5;245mstatus\u001b[0m = \u001b[38;5;37m\"Disabled\"\n\u001b[0m }\n}"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0091",
|
|
"Title": "S3 Access Block should Ignore Public ACL",
|
|
"Description": "S3 buckets should ignore public ACLs on buckets and any objects they contain. By ignoring rather than blocking, PUT calls with public ACLs will still be applied but the ACL will be ignored.\n",
|
|
"Message": "No public access block so not blocking public acls",
|
|
"Namespace": "builtin.aws.s3.aws0091",
|
|
"Query": "data.builtin.aws.s3.aws0091.deny",
|
|
"Resolution": "Enable ignoring the application of public ACLs in PUT calls",
|
|
"Severity": "HIGH",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0091",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0091"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0093",
|
|
"Title": "S3 Access block should restrict public bucket to limit access",
|
|
"Description": "S3 buckets should restrict public policies for the bucket. By enabling, the restrict_public_buckets, only the bucket owner and AWS Services can access if it has a public policy.\n",
|
|
"Message": "No public access block so not restricting public buckets",
|
|
"Namespace": "builtin.aws.s3.aws0093",
|
|
"Query": "data.builtin.aws.s3.aws0093.deny",
|
|
"Resolution": "Limit the access to public buckets to only the owner or AWS Services (eg; CloudFront)",
|
|
"Severity": "HIGH",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0093",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/dev-retired/access-control-block-public-access.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0093"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0094",
|
|
"Title": "S3 buckets should each define an aws_s3_bucket_public_access_block",
|
|
"Description": "The \"block public access\" settings in S3 override individual policies that apply to a given bucket, meaning that all public access can be controlled in one central types for that bucket. It is therefore good practice to define these settings for each bucket in order to clearly define the public access that can be allowed for it.\n",
|
|
"Message": "Bucket does not have a corresponding public access block.",
|
|
"Namespace": "builtin.aws.s3.aws0094",
|
|
"Query": "data.builtin.aws.s3.aws0094.deny",
|
|
"Resolution": "Define a aws_s3_bucket_public_access_block for the given bucket to control public access policies",
|
|
"Severity": "LOW",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0094",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0094"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"Type": "Terraform Security Check",
|
|
"ID": "AWS-0132",
|
|
"Title": "S3 encryption should use Customer Managed Keys",
|
|
"Description": "Encryption using AWS keys provides protection for your S3 buckets. To gain greater control over encryption, such as key rotation, access policies, and auditability, use customer managed keys (CMKs) with SSE-KMS.\nNote that SSE-KMS is not supported for S3 server access logging destination buckets; in such cases, use SSE-S3 instead.\n",
|
|
"Message": "Bucket does not encrypt data with a customer managed key.",
|
|
"Namespace": "builtin.aws.s3.aws0132",
|
|
"Query": "data.builtin.aws.s3.aws0132.deny",
|
|
"Resolution": "Use SSE-KMS with a customer managed key (CMK)",
|
|
"Severity": "HIGH",
|
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/aws-0132",
|
|
"References": [
|
|
"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html",
|
|
"https://avd.aquasec.com/misconfig/aws-0132"
|
|
],
|
|
"Status": "FAIL",
|
|
"CauseMetadata": {
|
|
"Resource": "aws_s3_bucket.bucket",
|
|
"Provider": "AWS",
|
|
"Service": "s3",
|
|
"StartLine": 8,
|
|
"EndLine": 10,
|
|
"Code": {
|
|
"Lines": [
|
|
{
|
|
"Number": 8,
|
|
"Content": "resource \"aws_s3_bucket\" \"bucket\" {",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[38;5;33mresource\u001b[0m \u001b[38;5;37m\"aws_s3_bucket\"\u001b[0m \u001b[38;5;37m\"bucket\"\u001b[0m {",
|
|
"FirstCause": true,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 9,
|
|
"Content": " bucket = \"trivy-action-bucket\"",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": " \u001b[38;5;245mbucket\u001b[0m = \u001b[38;5;37m\"trivy-action-bucket\"",
|
|
"FirstCause": false,
|
|
"LastCause": false
|
|
},
|
|
{
|
|
"Number": 10,
|
|
"Content": "}",
|
|
"IsCause": true,
|
|
"Annotation": "",
|
|
"Truncated": false,
|
|
"Highlighted": "\u001b[0m}",
|
|
"FirstCause": false,
|
|
"LastCause": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|