
    Vhp                        d Z dZdZddlmZ ddlmZ 	 ddlZddlm	Z	 ddl
mZ dd	lmZ dd
lmZ ddlmZ ddlmZ d Z G d de      Zd Zd ZddZddZej4                  fdZd Zedk(  r e        yy# e$ r Y gw xY w)a  
---
module: efs
version_added: 1.0.0
short_description: create and maintain EFS file systems
description:
    - Module allows create, search and destroy Amazon EFS file systems.
author:
    - "Ryan Sydnor (@ryansydnor)"
    - "Artem Kazakov (@akazakov)"
options:
    encrypt:
        description:
            - If I(encrypt=true) creates an encrypted file system. This can not be modified after the file system is created.
        type: bool
        default: false
    kms_key_id:
        description:
            - The id of the AWS KMS CMK that will be used to protect the encrypted file system. This parameter is only
              required if you want to use a non-default CMK. If this parameter is not specified, the default CMK for
              Amazon EFS is used. The key id can be Key ID, Key ID ARN, Key Alias or Key Alias ARN.
        type: str
    state:
        description:
            - Allows to create, search and destroy Amazon EFS file system.
        default: 'present'
        choices: ['present', 'absent']
        type: str
    name:
        description:
            - Creation Token of Amazon EFS file system. Required for create and update. Either name or ID required for delete.
        type: str
    id:
        description:
            - ID of Amazon EFS. Either name or ID required for delete.
        type: str
    performance_mode:
        description:
            - File system's performance mode to use. Only takes effect during creation.
        default: 'general_purpose'
        choices: ['general_purpose', 'max_io']
        type: str
    tags:
        description:
            - "List of tags of Amazon EFS. Should be defined as dictionary
              In case of 'present' state with list of tags and existing EFS (matched by 'name'), tags of EFS will be replaced with provided data."
        type: dict
    targets:
        description:
            - "List of mounted targets. It should be a list of dictionaries, every dictionary should include next attributes:
               This data may be modified for existing EFS using state 'present' and new list of mount targets."
        type: list
        elements: dict
        default: []
        suboptions:
            subnet_id:
                required: true
                description: The ID of the subnet to add the mount target in.
            ip_address:
                type: str
                description: A valid IPv4 address within the address range of the specified subnet.
            security_groups:
                type: list
                elements: str
                description: List of security group IDs, of the form 'sg-xxxxxxxx'. These must be for the same VPC as subnet specified
    throughput_mode:
        description:
            - The throughput_mode for the file system to be created.
        choices: ['bursting', 'provisioned']
        type: str
    provisioned_throughput_in_mibps:
        description:
            - If the throughput_mode is provisioned, select the amount of throughput to provisioned in Mibps.
        type: float
    wait:
        description:
            - "In case of 'present' state should wait for EFS 'available' life cycle state (of course, if current state not 'deleting' or 'deleted')
               In case of 'absent' state should wait for EFS 'deleted' life cycle state"
        type: bool
        default: false
    wait_timeout:
        description:
            - How long the module should wait (in seconds) for desired state before returning. Zero means wait as long as necessary.
        default: 0
        type: int
    transition_to_ia:
        description:
            - How many days before objects transition to the lower-cost EFS Infrequent Access (IA) storage class.
            - If set to the string C(None), any existing lifecyle policy will be removed, and objects will not transition
              to an IA storage class.
            - If this parameter is absent, any existing lifecycle policy will not be affected.
        choices: ['None', '7', '14', '30', '60', '90']
        type: str
        version_added: 2.1.0

extends_documentation_fragment:
    - amazon.aws.common.modules
    - amazon.aws.region.modules
    - amazon.aws.tags
    - amazon.aws.boto3
a  
- name: EFS provisioning
  community.aws.efs:
    state: present
    name: myTestEFS
    tags:
      Name: myTestNameTag
      purpose: file-storage
    targets:
      - subnet_id: subnet-748c5d03
        security_groups: ["sg-1a2b3c4d"]

- name: Modifying EFS data
  community.aws.efs:
    state: present
    name: myTestEFS
    tags:
      name: myAnotherTestTag
    targets:
      - subnet_id: subnet-7654fdca
        security_groups: ["sg-4c5d6f7a"]

- name: Set a lifecycle policy
  community.aws.efs:
    state: present
    name: myTestEFS
    transition_to_ia: 7
    targets:
      - subnet_id: subnet-7654fdca
        security_groups: ["sg-4c5d6f7a"]

- name: Remove a lifecycle policy
  community.aws.efs:
    state: present
    name: myTestEFS
    transition_to_ia: None
    targets:
      - subnet_id: subnet-7654fdca
        security_groups: ["sg-4c5d6f7a"]

- name: Deleting EFS
  community.aws.efs:
    state: absent
    name: myTestEFS
a	  
creation_time:
    description: timestamp of creation date
    returned: always
    type: str
    sample: "2015-11-16 07:30:57-05:00"
creation_token:
    description: EFS creation token
    returned: always
    type: str
    sample: "console-88609e04-9a0e-4a2e-912c-feaa99509961"
file_system_id:
    description: ID of the file system
    returned: always
    type: str
    sample: "fs-xxxxxxxx"
life_cycle_state:
    description: state of the EFS file system
    returned: always
    type: str
    sample: "creating, available, deleting, deleted"
mount_point:
    description: url of file system with leading dot from the time when AWS EFS required to add a region suffix to the address
    returned: always
    type: str
    sample: ".fs-xxxxxxxx.efs.us-west-2.amazonaws.com:/"
filesystem_address:
    description: url of file system valid for use with mount
    returned: always
    type: str
    sample: "fs-xxxxxxxx.efs.us-west-2.amazonaws.com:/"
mount_targets:
    description: list of mount targets
    returned: always
    type: list
    sample:
        [
            {
                "file_system_id": "fs-a7ad440e",
                "ip_address": "172.31.17.173",
                "life_cycle_state": "available",
                "mount_target_id": "fsmt-d8907871",
                "network_interface_id": "eni-6e387e26",
                "owner_id": "123456789012",
                "security_groups": [
                    "sg-a30b22c6"
                ],
                "subnet_id": "subnet-e265c895"
            },
            ...
        ]
name:
    description: name of the file system
    returned: always
    type: str
    sample: "my-efs"
number_of_mount_targets:
    description: the number of targets mounted
    returned: always
    type: int
    sample: 3
owner_id:
    description: AWS account ID of EFS owner
    returned: always
    type: str
    sample: "XXXXXXXXXXXX"
size_in_bytes:
    description: size of the file system in bytes as of a timestamp
    returned: always
    type: dict
    sample:
        {
            "timestamp": "2015-12-21 13:59:59-05:00",
            "value": 12288
        }
performance_mode:
    description: performance mode of the file system
    returned: always
    type: str
    sample: "generalPurpose"
tags:
    description: tags on the efs instance
    returned: always
    type: dict
    sample:
        {
            "name": "my-efs",
            "key": "Value"
        }
    )sleep)timeN)camel_dict_to_snake_dict)is_boto3_error_code)ansible_dict_to_boto3_tag_list)boto3_tag_list_to_ansible_dict)compare_aws_tags)AnsibleCommunityAWSModulec                 ,     t         fd|D              S )Nc              3   ,   K   | ]  }|   |f  y wN ).0itemkeys     e/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/aws/plugins/modules/efs.py	<genexpr>z _index_by_key.<locals>.<genexpr>	  s     4dcD!4s   )dict)r   itemss   ` r   _index_by_keyr     s    4e444    c                       e Zd ZdZdZdZdZdZd Zd Z	d Z
d	 Zd
 Zd ZddZddZd Zd Zd Zd Zd Zd ZddZd Zy)EFSConnectionr   creating	availabledeletingdeletedc                     |j                  d      | _        |j                  }|| _        || _        |j                  j                  d      | _        |j                  j                  d      | _        y )Nefswaitwait_timeout)client
connectionregionmoduleparamsgetr    r!   )selfr%   r$   s      r   __init__zEFSConnection.__init__  sV     --.MM%%f-	"MM--n=r   c              +     K   t        d| j                  j                  fi |}|D ]  }|d   |d<   t        |d         |d<   d|d    d| j                   d|d	<   |d    d| j                   d|d
<   d|d   v rt        |d   d         |d   d<   |d   | j
                  k(  r:| j                  |d         |d<   t        | j                  |d               |d<   n
i |d<   g |d<   |  yw)zR
        Returns generator of file systems including all attributes of FS
        FileSystemsCreationTokenNameCreationTime.FileSystemIdz.efs.z.amazonaws.com:/
MountPointFilesystemAddress	TimestampSizeInBytesLifeCycleStater0   TagsMountTargetsN)	iterate_allr#   describe_file_systemsstrr$   STATE_AVAILABLEget_tagslistget_mount_targets)r(   kwargsr   r   s       r   get_file_systemszEFSConnection.get_file_systems  s<     OO11
 

  	D0DL#&tN';#<D  $%T.%9$:%}L\!]D+/+?*@dkk]Rb(cD$%d=1136tM7J;7W3X]#K0$%)=)==#}}$~:N}OV'+D,B,BPTUcPd,B,e'f^$!V')^$J)	s   C,C.c                 D     | j                   j                  di |d   }|S )z?
        Returns tag list for selected instance of EFS
        r7   r   )r#   describe_tags)r(   r@   tagss      r   r=   zEFSConnection.get_tags<  s'     -t,,6v6v>r   c              +      K   t        d| j                  j                  fi |}|D ]?  }|d   | j                  k(  r"t	        | j                  |d               |d<   ng |d<   | A yw)zD
        Returns mount targets for selected instance of EFS
        r8   r5   MountTargetIdrF   SecurityGroupsN)r9   r#   describe_mount_targetsr<   r>   get_security_groups)r(   r@   targetstargets       r   r?   zEFSConnection.get_mount_targetsC  s      OO22
 

  	F&'4+?+??+/0H0HW]^mWn0H0o+p'(+-'(L	s   A'A)c                 D    t        d| j                  j                  fi |S )zF
        Returns security groups for selected instance of EFS
        rH   )r9   r#   %describe_mount_target_security_groups)r(   r@   s     r   rJ   z!EFSConnection.get_security_groupsS  s+     OOAA
 
 	
r   c                 r    t        t        d| j                  j                  |            }|xr |d   xs dS )z9
        Returns ID of instance by instance name
        r+   r,   r0   Nfirst_or_defaultr9   r#   r:   )r(   nameinfos      r   get_file_system_idz EFSConnection.get_file_system_id]  s@      55"
 ,^,44r   Nc                     t        t        d| j                  j                  ||            }|xr |d   xs | j                  S )z<
        Returns state of filesystem by EFS id/name
        r+   )r,   r0   r5   )rR   r9   r#   r:   STATE_DELETED)r(   rS   file_system_idrT   s       r   get_file_system_statez#EFSConnection.get_file_system_statej  sJ      55"+	
 .-.D$2D2DDr   c                     t        d| j                  j                  |      }r"t        t              sgt        fd|      }t	        |      S )zc
        Returns states of mount targets of selected EFS with selected state(s) (optional)
        r8   r6   c                     | d   v S )Nr5   r   )rL   statess    r   <lambda>z:EFSConnection.get_mount_targets_in_state.<locals>.<lambda>  s    F3C,D,N r   )r9   r#   rI   
isinstancer>   filter)r(   rX   r\   rK   s     ` r   get_mount_targets_in_statez(EFSConnection.get_mount_targets_in_statex  sP     OO22'
 fd+ NPWXGG}r   c                 p    t        t        d| j                  j                  fi |      }|xr |d   xs dS )C
        Returns throughput mode for selected EFS instance
        r+   ThroughputModeNrQ   r(   r@   rT   s      r   get_throughput_modez!EFSConnection.get_throughput_mode  sH      55 
 .-.6$6r   c                 z    t        t        d| j                  j                  fi |      }|j	                  dd      S )rb   r+   ProvisionedThroughputInMibpsN)rR   r9   r#   r:   r'   rd   s      r   #get_provisioned_throughput_in_mibpsz1EFSConnection.get_provisioned_throughput_in_mibps  sD      55 
 xx6==r   c                 2    d} j                        }i }	|	d<   ||	d<   |r||	d<   |||	d<   |r||	d<   |r||	d<   | j                   j                  fv r9t         fd	 j                         	   j                  j
                  di |	 d
}t         fd j                   j                         |S # t        j                  j                  t        j                  j                  f$ r'}
 j                  j                  |
d       Y d}
~
d}
~
ww xY w)z;
        Creates new filesystem with selected name
        Fr,   PerformanceMode	EncryptedNKmsKeyIdrc   rg   c                  &    j                         S r   rY   rS   r(   s   r   r]   z2EFSConnection.create_file_system.<locals>.<lambda>      2248 r   TzUnable to create file system.msgc                  &    j                         S r   rn   ro   s   r   r]   z2EFSConnection.create_file_system.<locals>.<lambda>  s    D..t4 r   r   )rY   STATE_DELETINGrW   wait_forr#   create_file_systembotocore
exceptionsClientErrorBotoCoreErrorr%   fail_json_awsr<   r!   )r(   rS   performance_modeencrypt
kms_key_idthroughput_modeprovisioned_throughput_in_mibpschangedstater&   es   ``         r   rv   z EFSConnection.create_file_system  s.    **40"&$4 !")F;!!+F:'6F#$*5TF12T(($*<*<==8""R222<V< 	4  	
  ''33X5H5H5V5VW R))!1P)QQRs   3B8 87D/DDc                     d} j                        }| j                   j                  fv r j                        } j	                  |      } j                  |      }t               }	|r
||k7  r||	d<   |r
||k7  r||	d<   t        |	      dkD  rHt         fd j                   j                         	   j                  j                  dd|i|	 d}|S |S # t        j                  j                  t        j                  j                  f$ r(}
 j                   j#                  |
d	
       Y d}
~
|S d}
~
ww xY w)z@
        Update filesystem with new throughput settings
        Fr6   rc   rg   r   c                  &    j                         S r   rn   ro   s   r   r]   z2EFSConnection.update_file_system.<locals>.<lambda>  s    D66t< r   r0   TzUnable to update file system.rq   Nr   )rY   r<   STATE_CREATINGrU   re   rh   r   lenru   r!   r#   update_file_systemrw   rx   ry   rz   r%   r{   )r(   rS   r   r   r   r   fs_idcurrent_modecurrent_throughputr&   r   s   ``         r   r   z EFSConnection.update_file_system  sI    **40T))4+>+>??++D1E333GL!%!I!IW\!I!]VF?l#B+:'(.3RVh3h9X566{Q<((%%
V6DOO66TETVT"G w !++779L9L9Z9Z[ VKK--a5T-UUVs   ; C 7D>D99D>c                 F   d}| j                  |      }|| j                  | j                  fv rs| j                  |      }| j                  j                  |      }|dk(  rg }ndd|z   dz   ig}|j                  d      |k7  r| j                  j                  ||       d	}|S )
z>
        Update filesystem with new lifecycle policy.
        Fr6   NoneTransitionToIAAFTER__DAYSLifecyclePolicies)r0   r   T)rY   r<   r   rU   r#    describe_lifecycle_configurationr'   put_lifecycle_configuration)r(   rS   transition_to_iar   r   r   current_policiesr   s           r   update_lifecycle_policyz%EFSConnection.update_lifecycle_policy  s     **40T))4+>+>??++D1E#OO]bOc6)$&!&6CS8SV]8]%^$_!##$78<MM;;!&&7 <  r   c           	          d} j                  |      |vt        t         j                              ||      \  }}	|	r 	  j                  j                  |	       d}|r)	  j                  j                  t        |             d}| j                   j                  gt!         fd
d       t#        d j%                              }t#        d|      }t'        ||d      \  }}}|D cg c]  }t)        g d||   ||         s| }}t+        |      |z   }t+        |      |z   }|r<|D ]$  } j                  j-                  ||   d          & t!         fdd       d}|rF|D ]#  }  j                  j.                  ddi||    % t!         fdd j0                         d}|D cg c]  }d||   v r||   d   ||   d   k7  r| }}|r?|D ]8  } j                  j3                  ||   d   ||   j5                  dd             : d}|S # t        j                  j                  t        j                  j                  f$ r(}
 j                  j                  |
d       Y d}
~
d}
~
ww xY w# t        j                  j                  t        j                  j                  f$ r(}
 j                  j                  |
d	       Y d}
~
Sd}
~
ww xY wc c}w c c}w )zR
        Change attributes (mount targets and tags) of filesystem by name
        FNr6   )r0   TagKeyszUnable to delete tags.rq   T)r0   r7   zUnable to create tags.c                  :    t        j                               S r   r   r`   r   incomplete_statesr(   s   r   r]   z4EFSConnection.converge_file_system.<locals>.<lambda>   s    D;;ECTUV r   r   SubnetId)r   	IpAddressNetworkInterfaceIdrF   rG   c                  :    t        j                               S r   r   r   s   r   r]   z4EFSConnection.converge_file_system.<locals>.<lambda>7      C ? ?GX YZ r   r0   c                  :    t        j                               S r   r   r   s   r   r]   z4EFSConnection.converge_file_system.<locals>.<lambda>@  r   r   rH   )rF   rH   r   )rU   r	   r   r=   r#   delete_tagsrw   rx   ry   rz   r%   r{   create_tagsr   r   rt   ru   r   r?   	dict_difftargets_equalr>   delete_mount_targetcreate_mount_targetr!   #modify_mount_target_security_groupsr'   )r(   rS   rD   
purge_tagsrK   r   r   resulttags_need_modifytags_to_deleter   current_targetstargets_to_createintersectiontargets_to_deletesidr   security_groups_to_updater   r   s   `                 @@r   converge_file_systemz"EFSConnection.converge_file_system  sR    ''-/?.t}}%}/PQSWYc0,n OOO//UN/[ OOO//%*1OP`1a 0  !%!4!4d6I6I JV ,J8N8N\a8N8bcO#J8GAJ?\ceiAj>|->
 ($C_UXEY[bcf[g G  !%%6 7' A $%6 7' A , mCOO77oVYFZ[jFk7lmZ  , \C7DOO77[U[gVYl[\Z%%
 
 ()#ws|3#C()9:gclK[>\\ )% ) )4 COOGG&5c&:?&K'.s|'7'78H$'O H 
 Q !++779L9L9Z9Z[ OKK--a5M-NNO !++779L9L9Z9Z[ OKK--a5M-NNO"<)s<   H$ '&J 8K(>!K-$7JI>>J7K%=K  K%c                     d} j                  |      }| j                   j                  fv r\t         fd j                         |s j	                        } j                  |        j                  j                  |       d} j                  r%t         fd j                   j                         |S )z1
        Removes EFS instance by id/name
        Fc                  &    j                         S r   rn   ro   s   r   r]   z2EFSConnection.delete_file_system.<locals>.<lambda>`  rp   r   r6   Tc                  &    j                         S r   rn   ro   s   r   r]   z2EFSConnection.delete_file_system.<locals>.<lambda>k  rp   r   )rY   r   r<   ru   rU   delete_mount_targetsr#   delete_file_systemr    rW   r!   )r(   rS   rX   r   r   s   ``   r   r   z EFSConnection.delete_file_systemX  s     **4@T(($*>*>??8$$ "!%!8!8!>%%n5OO..N.KF998""!! r   c                      t         fdd        j                   j                        }|D ]!  } j                  j	                  |d          # t         fdd       t        |      dkD  S )z1
        Removes mount targets by EFS id
        c                  N    t        j                   j                              S r   )r   r`   r   rX   r(   s   r   r]   z4EFSConnection.delete_mount_targets.<locals>.<lambda>w      C77H[H[\] r   r   rF   rG   c                  N    t        j                   j                              S r   )r   r`   rt   r   s   r   r]   z4EFSConnection.delete_mount_targets.<locals>.<lambda>  r   r   )ru   r`   r<   r#   r   r   )r(   rX   rK   rL   s   ``  r   r   z"EFSConnection.delete_mount_targetsr  sy     	]	

 11.$BVBVW 	WFOO//f_>U/V	W 	]	

 7|ar   r   )__name__
__module____qualname__DEFAULT_WAIT_TIMEOUT_SECONDSr   r<   rt   rW   r)   rA   r=   r?   rJ   rU   rY   r`   re   rh   rv   r   r   r   r   r   r   r   r   r   r     sp    #$ N!ONM>> 
5E"7>(T8*Wr4 r   r   c              +      K   t        d |j                         D              }d}	 	  |d
i |}||    E d{    d|v r	|d   |d<   $y7 # t        d      $ r |dk  rt        |       |d	z  }Y L w xY ww)z1
    Method creates iterator from result set
    c              3   0   K   | ]  \  }}|	||f  y wr   r   )r   r   values      r   r   ziterate_all.<locals>.<genexpr>  s     U#u5CTeUs   
	   N
NextMarker
NextmarkerMarkerThrottlingExceptioniX     r   )r   r   r   r   )attr
map_methodr@   argsr    datas         r   r9   r9     s      UUUDD
	%%DDz!!t#!%l!3X	 "
 ##89 	czdax	s8   $A6A A
A A6
A #A3/A61A33A6c                 6    | D ]  }||v s||   ||   k7  s y y)zB
    Method compare two mount targets by specified attributes
    FTr   )keysabr   s       r   r   r     s1      !8#!C&( r   c                     t        |r| j                         n| j                               }t        |r|j                         n|j                               }||z  }||z  |||z  fS )zC
    Helper method to calculate difference of two dictionaries
    )setr   r   )dict1dict2by_keykeys1keys2r   s         r   r   r     sX     

EKKM:E

EKKM:E5=L<u|/CCCr   c                     | D ]  }|c S  |S )zB
    Helper method to fetch first element of list (if exists)
    r   )r   defaultr   s      r   rR   rR     s      Nr   c                     t               }	  |        |k7  r;|dk7  r*t               |z
  |kD  rt        dt        |      z   dz         t        d       Fy)zM
    Helper method to wait for desired value returned by callback method
    r   zWait timeout exceeded (z sec)   N)	timestampRuntimeErrorr;   r   )callbackr   timeout
wait_starts       r   ru   ru     sT     J
:!|z!9G!C"#<s7|#Kg#UVVar   c                     t        t        ddd      t        ddddgd      t        ddd      t        d	d
      t        ddd      t        ddd      t        dddg      t        ddg d      t        ddddgd      t        ddg dd      t        ddddgd      t        dd      t        ddd      t        ddd            } t        |       }t        |      }|j                  j	                  d      }|j                  j	                  d      }|j                  j	                  d      }ddd d!|j                  j	                  d"      D cg c]$  }t        fd#|j                         D              & }}d$d%d&}|j                  j	                  d'      }	|j                  j	                  d(      }
||j                  j	                  d)         }|j                  j	                  d*      }|j                  j	                  d+      }|j                  j	                  d,      }|j                  j	                  d-      }t        |j                  j	                  d.            j                         }d}|dk(  r|s|j                  d/0       |j                  |||	|
||      }|j                  |||      xs |}|j                  ||||||1      xs |}|r||j                  ||      z  }t        |j                  |2            }n/|dk(  r*|s|s|j                  d30       |j                  ||      }d}rt!        |      }|j#                  ||4       yc c}w )5z
    Module action handler
    Fbool)requiredtyper   r;   presentabsent)r   r   choicesr   NT)r   r   r   resource_tags)r   r   aliasesr>   )r   r   r   elementsgeneral_purposemax_io)r   714306090burstingprovisionedfloat)r   r   intr   )r}   r   r~   r   idrS   rD   rK   r|   r   r   r   r    r!   )argument_specrS   r   rD   r   rH   r   )
ip_addresssecurity_groups	subnet_idrK   c              3   2   K   | ]  \  }}|   |f  y wr   r   )r   r   r   target_translationss      r   r   zmain.<locals>.<genexpr>  s      M<C!#&.Ms   generalPurposemaxIO)r   r   r}   r~   r|   r   r   r   r   r   z%Name parameter is required for createrq   )rS   rD   r   rK   r   r   rP   z2Either name or id parameter is required for delete)r   r   )r   AnsibleAWSModuler   r&   r'   r   r;   lower	fail_jsonrv   r   r   r   rR   rA   r   r   	exit_json)r   r%   r#   rS   r   rD   xrK   performance_mode_translationsr}   r~   r|   r   r   r   r   r   r   r   r   s                      @r   mainr    sm    e&%@E	87LV_`UDA62UD95ud;5v7HIe&"vN1BH0MWh
 u5Bgquve%*mA\fjk(,e'(J5vu=5ua@!M& M:Fv&J==V$DMMd#E==V$D!+ X^WdWdWhWhirWsRSM1779MMG  ,%! mm	*G""<0J4V]]5F5FGY5Z[""<0J}}(();<mm''(9:O&,mm&7&78Y&Z#!!'*+113EG	!HI//"GZJi
 //oGfgrkr++% /0O ,    	 z99$@PQQG!*"="=D"="QR	(	E!UV//e<)&1
W&1as   )M"__main__)Fr   )DOCUMENTATIONEXAMPLESRETURNr   r   r   rw   ImportError0ansible.module_utils.common.dict_transformationsr   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   ;ansible_collections.amazon.aws.plugins.module_utils.taggingr   r   r	   >ansible_collections.community.aws.plugins.module_utils.modulesr
   r  r   objectr   r9   r   r   rR   r   ru   r  r   r   r   r   <module>r     s   dL,\Y
v  "	 V \ f f X x5x F x v,	D '4&P&P S2l zF O  		s   A8 8B ?B 