§
    ¹³ÙgY<  ã                  óÆ   — d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	Z	ddl
mZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ  G d„ de¦  «        Z G d„ de¦  «        Zd„ Zd„ ZdS )zTwo-pulse single-qubit gate.é    )ÚannotationsN)Úexp)ÚOptionalÚUnion)ÚControlledGate)ÚGate)ÚParameterValueTypeÚParameterExpression)ÚQuantumRegister)ÚStandardGatec                  ór   ‡ — e Zd ZdZej        Z	 ddddœdˆ fd„Zddd„Z	 	 	 	 dd ˆ fd„Z	d„ Z
d!d„Zd„ Zˆ xZS )"ÚU3GateuÙ  Generic single-qubit rotation gate with 3 Euler angles.

    .. warning::

       This gate is deprecated. Instead, the following replacements should be used

       .. math::

           U3(\theta, \phi, \lambda) =  U(\theta, \phi, \lambda)

       .. code-block:: python

          circuit = QuantumCircuit(1)
          circuit.u(theta, phi, lambda)

    **Circuit symbol:**

    .. code-block:: text

             â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
        q_0: â”¤ U3(Ï´,Ï†,Î») â”œ
             â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜

    **Matrix Representation:**

    .. math::

        \newcommand{\rotationangle}{\frac{\theta}{2}}

        U3(\theta, \phi, \lambda) =
            \begin{pmatrix}
                \cos\left(\rotationangle\right) & -e^{i\lambda}\sin\left(\rotationangle\right) \\
                e^{i\phi}\sin\left(\rotationangle\right) &
                e^{i(\phi+\lambda)}\cos\left(\rotationangle\right)
            \end{pmatrix}

    .. note::

        The matrix representation shown here differs from the `OpenQASM 2.0 specification
        <https://doi.org/10.48550/arXiv.1707.03429>`_ by a global phase of
        :math:`e^{i(\phi+\lambda)/2}`.

    **Examples:**

    .. math::

        U3(\theta, \phi, \lambda) = e^{-i \frac{\pi + \theta}{2}} P(\phi + \pi) \sqrt{X}
        P(\theta + \pi) \sqrt{X} P(\lambda)

    .. math::

        U3\left(\theta, -\frac{\pi}{2}, \frac{\pi}{2}\right) = RX(\theta)

    .. math::

        U3(\theta, 0, 0) = RY(\theta)
    NÚdt)ÚdurationÚunitÚthetar	   ÚphiÚlamÚlabelúOptional[str]c               ó\   •— t          ¦   «                              dd|||g|||¬¦  «         dS )zCreate new U3 gate.Úu3é   )r   r   r   N)ÚsuperÚ__init__)Úselfr   r   r   r   r   r   Ú	__class__s          €ú^/granary/edev/quantum/lib/python3.11/site-packages/qiskit/circuit/library/standard_gates/u3.pyr   zU3Gate.__init__Y   s8   ø€ õ 	‰Œ×Ò˜˜q 5¨#¨sÐ"3¸5È8ÐZ^ÐÑ_Ô_Ð_Ð_Ð_ó    FÚ	annotatedÚboolc                ól   — t          | j        d          | j        d          | j        d          ¦  «        S )a  Return inverted U3 gate.

        :math:`U3(\theta,\phi,\lambda)^{\dagger} =U3(-\theta,-\lambda,-\phi))`

        Args:
            annotated: when set to ``True``, this is typically used to return an
                :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
                :class:`.Gate`. However, for this class this argument is ignored as the inverse
                of this gate is always a :class:`.U3Gate` with inverse parameter values.

        Returns:
            U3Gate: inverse gate.
        r   é   r   )r   Úparams©r   r    s     r   ÚinversezU3Gate.inversef   s.   € õ �t”{ 1”~�o¨¬°A¬ ¸¼ÀQ¼¸ÑHÔHÐHr   r   Únum_ctrl_qubitsÚintú
str | NoneÚ
ctrl_stateústr | int | Noneúbool | Nonec                óê   •— |s*|dk    r$t          | j        ||dœŽ}| j        |j        _        nE|€t	          d„ | j        D ¦   «         ¦  «        }t          ¦   «                              ||||¬¦  «        }|S )aä  Return a (multi-)controlled-U3 gate.

        Args:
            num_ctrl_qubits: number of control qubits.
            label: An optional label for the gate [Default: ``None``]
            ctrl_state: control state expressed as integer,
                string (e.g.``'110'``), or ``None``. If ``None``, use all 1s.
            annotated: indicates whether the controlled gate should be implemented
                as an annotated gate. If ``None``, this is set to ``True`` if
                the gate contains free parameters and more than one control qubit, in which
                case it cannot yet be synthesized. Otherwise it is set to ``False``.

        Returns:
            ControlledGate: controlled version of this gate.
        r   )r   r*   Nc              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S ©N)Ú
isinstancer
   )Ú.0Úps     r   ú	<genexpr>z!U3Gate.control.<locals>.<genexpr>“   s-   è è € ÐXÐXÀq¥
¨1Õ.AÑ BÔ BÐXÐXÐXÐXÐXÐXr   )r'   r   r*   r    )ÚCU3Gater$   r   Ú	base_gateÚanyr   Úcontrol)r   r'   r   r*   r    Úgater   s         €r   r7   zU3Gate.controlv   s‘   ø€ ð, ð 	˜_°Ò1Ð1Ý˜DœK¨uÀÐLÐLÐLˆDØ#'¤:ˆDŒNÔ Ð ð Ð ÝÐXÐXÈDÌKÐXÑXÔXÑXÔX�	å‘7”7—?’?Ø /ØØ%Ø#ð	 #ñ ô ˆDð ˆr   c                óÖ   — ddl m} t          dd¦  «        } ||| j        ¬¦  «        }|                     | j        d         | j        d         | j        d         d¦  «         || _        d S )Nr   ©ÚQuantumCircuitr   Úq©Únamer#   )Úqiskit.circuit.quantumcircuitr;   r   r>   Úur$   Ú
definition)r   r;   r<   Úqcs       r   Ú_definezU3Gate._define�   sn   € Ø@Ð@Ð@Ð@Ð@Ð@å˜A˜sÑ#Ô#ˆØˆ^˜A D¤IÐ.Ñ.Ô.ˆØ
�ŠˆTŒ[˜Œ^˜Tœ[¨œ^¨T¬[¸¬^¸QÑ?Ô?Ð?ØˆŒˆˆr   c           	     ó´  — |du rt          d¦  «        ‚| j        \  }}}t          |¦  «        t          |¦  «        t          |¦  «        }}}t          j        |dz  ¦  «        }t          j        |dz  ¦  «        }t          j        |t          d|z  ¦  «         |z  gt          d|z  ¦  «        |z  t          d||z   z  ¦  «        |z  gg|pt          ¬¦  «        S )z%Return a Numpy.array for the U3 gate.Fú9unable to avoid copy while creating an array as requestedr#   ù              ð?©Údtype)
Ú
ValueErrorr$   ÚfloatÚmathÚcosÚsinÚnumpyÚarrayr   Úcomplex©r   rH   Úcopyr   r   r   rL   rM   s           r   Ú	__array__zU3Gate.__array__¥   sÚ   € à�5ˆ=ˆ=ÝÐXÑYÔYÐYØœ+‰ˆˆs�CÝ ™,œ,­¨c©
¬
µE¸#±J´J�CˆsˆÝŒh�u˜q‘yÑ!Ô!ˆÝŒh�u˜q‘yÑ!Ô!ˆÝŒ{à•s˜2 ™8‘}”}�n sÑ*Ð+Ý�R˜#‘X‘” Ñ$¥c¨"°°c±	Ñ*:Ñ&;Ô&;¸cÑ&AÐBðð Ð"�7ð
ñ 
ô 
ð 	
r   c                óV   — t          |t          ¦  «        o|                      |¦  «        S r/   )r0   r   Ú_compare_parameters©r   Úothers     r   Ú__eq__zU3Gate.__eq__µ   s%   € Ý˜%¥Ñ(Ô(ÐL¨T×-EÒ-EÀeÑ-LÔ-LÐLr   r/   )r   r	   r   r	   r   r	   r   r   ©F©r    r!   )r   NNN)r'   r(   r   r)   r*   r+   r    r,   ©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú_standard_gater   r&   r7   rC   rS   rX   Ú__classcell__©r   s   @r   r   r      s   ø€ € € € € ð8ð 8ðt "Ô(€Nð  $ð`ð Øð`ð `ð `ð `ð `ð `ð `ð `ðIð Ið Ið Ið Ið$  !Ø Ø'+Ø!%ð%ð %ð %ð %ð %ð %ð %ðNð ð ð
ð 
ð 
ð 
ð Mð Mð Mð Mð Mð Mð Mr   r   c                  ó`   ‡ — e Zd ZdZej        Z	 	 dddddœdˆ fd„Zd„ Zddd„Z	dd„Z
d„ Zˆ xZS )r4   u9
  Controlled-U3 gate (3-parameter two-qubit gate).

    This is a controlled version of the U3 gate (generic single qubit rotation).
    It is restricted to 3 parameters, and so cannot cover generic two-qubit
    controlled gates).

    .. warning::

       This gate is deprecated. Instead, the :class:`.CUGate` should be used

       .. math::

           CU3(\theta, \phi, \lambda) = CU(\theta, \phi, \lambda, 0)

       .. code-block:: python

          circuit = QuantumCircuit(2)
          gamma = 0
          circuit.cu(theta, phi, lambda, gamma, 0, 1)




    **Circuit symbol:**

    .. code-block:: text

        q_0: â”€â”€â”€â”€â”€â”€â– â”€â”€â”€â”€â”€â”€
             â”Œâ”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”�
        q_1: â”¤ U3(Ï´,Ï†,Î») â”œ
             â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜

    **Matrix representation:**

    .. math::

        \newcommand{\rotationangle}{\frac{\theta}{2}}

        CU3(\theta, \phi, \lambda)\ q_0, q_1 =
            I \otimes |0\rangle\langle 0| +
            U3(\theta,\phi,\lambda) \otimes |1\rangle\langle 1| =
            \begin{pmatrix}
                1 & 0                   & 0 & 0 \\
                0 & \cos(\rotationangle)           & 0 & -e^{i\lambda}\sin(\rotationangle) \\
                0 & 0                   & 1 & 0 \\
                0 & e^{i\phi}\sin(\rotationangle)  & 0 & e^{i(\phi+\lambda)}\cos(\rotationangle)
            \end{pmatrix}

    .. note::

        In Qiskit's convention, higher qubit indices are more significant
        (little endian convention). In many textbooks, controlled gates are
        presented with the assumption of more significant qubits as control,
        which in our case would be q_1. Thus a textbook matrix for this
        gate will be:

        .. code-block:: text

                 â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            q_0: â”¤ U3(Ï´,Ï†,Î») â”œ
                 â””â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”˜
            q_1: â”€â”€â”€â”€â”€â”€â– â”€â”€â”€â”€â”€â”€

        .. math::

            \newcommand{\rotationangle}{\frac{\theta}{2}}

            CU3(\theta, \phi, \lambda)\ q_1, q_0 =
                |0\rangle\langle 0| \otimes I +
                |1\rangle\langle 1| \otimes U3(\theta,\phi,\lambda) =
                \begin{pmatrix}
                    1 & 0   & 0                  & 0 \\
                    0 & 1   & 0                  & 0 \\
                    0 & 0   & \cos(\rotationangle)          & -e^{i\lambda}\sin(\rotationangle) \\
                    0 & 0   & e^{i\phi}\sin(\rotationangle) & e^{i(\phi+\lambda)}\cos(\rotationangle)
                \end{pmatrix}
    Nr   )r   r   Ú_base_labelr   r	   r   r   r   r   r*   úOptional[Union[str, int]]c               ó„   •— t          ¦   «                              dd|||gd||t          ||||¬¦  «        ||¬¦	  «	         dS )zCreate new CU3 gate.Úcu3r#   r   )r   )r'   r   r*   r5   r   r   N)r   r   r   )
r   r   r   r   r   r*   r   r   rd   r   s
            €r   r   zCU3Gate.__init__
  sc   ø€ õ 	‰Œ×ÒØØØ�C˜ÐØØØ!Ý˜U C¨°KÐ@Ñ@Ô@ØØð 	ñ 
	
ô 
	
ð 
	
ð 
	
ð 
	
r   c           
     óÚ  — ddl m} ddlm} ddlm} t          dd¦  «        } ||| j        ¬¦  «        } || j        d         | j        d         z   dz  ¦  «        |d         gg f || j        d         | j        d         z
  dz  ¦  «        |d         gg f |¦   «         |d         |d         gg ft          | j        d          dz  d| j        d         | j        d         z    dz  ¦  «        |d         gg f |¦   «         |d         |d         gg ft          | j        d         dz  | j        d         d¦  «        |d         gg fg}|D ]\  }}}	| 
                    |||	¦  «         Œ|| _        d	S )
zê
        gate cu3(theta,phi,lambda) c, t
        { u1((lambda+phi)/2) c;
          u1((lambda-phi)/2) t;
          cx c,t;
          u3(-theta/2,0,-(phi+lambda)/2) t;
          cx c,t;
          u3(theta/2,phi,0) t;
        }
        r   r:   r   )ÚU1Gate©ÚCXGater#   r<   r=   N)r?   r;   Úu1ri   Úxrk   r   r>   r$   r   Ú_appendrA   )
r   r;   ri   rk   r<   rB   ÚrulesÚinstrÚqargsÚcargss
             r   rC   zCU3Gate._define#  s²  € ð 	AÐ@Ð@Ð@Ð@Ð@ØÐÐÐÐÐØÐÐÐÐÐõ ˜A˜sÑ#Ô#ˆØˆ^˜A D¤IÐ.Ñ.Ô.ˆàˆV�T”[ ”^ d¤k°!¤nÑ4¸Ñ9Ñ:Ô:¸Q¸q¼T¸FÀBÐGØˆV�T”[ ”^ d¤k°!¤nÑ4¸Ñ9Ñ:Ô:¸Q¸q¼T¸FÀBÐGØˆV‰XŒX˜˜!œ˜a œd�| RÐ(Ý�T”[ ”^�O aÑ'¨¨d¬k¸!¬n¸t¼{È1¼~Ñ.MÐ,NÐQRÑ,RÑSÔSÐVWÐXYÔVZÐU[Ð]_Ð`ØˆV‰XŒX˜˜!œ˜a œd�| RÐ(Ý�D”K ”N QÑ&¨¬°A¬¸Ñ:Ô:¸Q¸q¼T¸FÀBÐGð
ˆð $)ð 	,ð 	,ÑˆE�5˜%Ø�JŠJ�u˜e UÑ+Ô+Ð+Ð+àˆŒˆˆr   Fr    r!   c                óz   — t          | j        d          | j        d          | j        d          | j        ¬¦  «        S )a3  Return inverted CU3 gate.

        :math:`CU3(\theta,\phi,\lambda)^{\dagger} =CU3(-\theta,-\phi,-\lambda))`

        Args:
            annotated: when set to ``True``, this is typically used to return an
                :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
                :class:`.Gate`. However, for this class this argument is ignored as the inverse
                of this gate is always a :class:`.CU3Gate` with inverse
                parameter values.

        Returns:
            CU3Gate: inverse gate.
        r   r#   r   )r*   )r4   r$   r*   r%   s     r   r&   zCU3Gate.inverseG  s>   € õ ØŒ[˜Œ^ˆO˜dœk¨!œn˜_¨t¬{¸1¬~¨oÈ$Ì/ð
ñ 
ô 
ð 	
r   c                óª  — |du rt          d¦  «        ‚| j        \  }}}t          |¦  «        t          |¦  «        t          |¦  «        }}}t          j        |dz  ¦  «        }t          j        |dz  ¦  «        }| j        rjt          j        g d¢d|dt          d|z  ¦  «         |z  gg d¢dt          d|z  ¦  «        |z  dt          d||z   z  ¦  «        |z  gg|pt          ¬¦  «        S t          j        |dt          d|z  ¦  «         |z  dgg d	¢t          d|z  ¦  «        |z  dt          d||z   z  ¦  «        |z  dgg d
¢g|pt          ¬¦  «        S )z&Return a numpy.array for the CU3 gate.FrE   r#   )r   r   r   r   r   rF   )r   r   r   r   rG   )r   r   r   r   )r   r   r   r   )rI   r$   rJ   rK   rL   rM   r*   rN   rO   r   rP   rQ   s           r   rS   zCU3Gate.__array__Z  s€  € à�5ˆ=ˆ=ÝÐXÑYÔYÐYØœ+‰ˆˆs�CÝ ™,œ,­¨c©
¬
µE¸#±J´J�CˆsˆÝŒh�u˜q‘yÑ!Ô!ˆÝŒh�u˜q‘yÑ!Ô!ˆØŒ?ð 	Ý”;à �L�LØ˜˜Q¥ R¨#¡X¡¤ °Ñ 4Ð5Ø �L�LØ�˜B ™H™œ¨Ñ+¨Qµ°B¸#À¹)Ñ4DÑ0EÔ0EÈÑ0KÐLð	ð Ð&�wðñ ô ð õ ”;à˜!�c " s¡(™mœm˜^¨cÑ1°1Ð5Ø �L�LÝ˜˜c™‘]”] SÑ(¨!­S°°s¸S±yÑ1AÑ-BÔ-BÀSÑ-HÈ!ÐLØ �L�Lð	ð Ð&�wðñ ô ð r   c                óv   — t          |t          ¦  «        o$| j        |j        k    o|                      |¦  «        S r/   )r0   r4   r*   rU   rV   s     r   rX   zCU3Gate.__eq__w  s<   € å�u�gÑ&Ô&ð 0Ø” 5Ô#3Ò3ð0à×(Ò(¨Ñ/Ô/ð	
r   r[   )
r   r	   r   r	   r   r	   r   r   r*   re   rY   rZ   )r\   r]   r^   r_   r   r4   r`   r   rC   r&   rS   rX   ra   rb   s   @r   r4   r4   ¹   sÂ   ø€ € € € € ðLð Lð\ "Ô)€Nð  $Ø04ð
ð ØØð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð2"ð "ð "ðH
ð 
ð 
ð 
ð 
ð&ð ð ð ð:
ð 
ð 
ð 
ð 
ð 
ð 
r   r4   c                ó²   ‡ ‡— ‰ dk    rt          d¦  «        ‚dg}t          ‰ ¦  «        D ] Š|ˆfd„t          |¦  «        D ¦   «         z  }Œ!ˆ fd„|D ¦   «         S )z-Generate the gray code for ``num_bits`` bits.r   z2Cannot generate the gray code for less than 1 bit.c                ó    •— g | ]
}|d ‰z  z   ‘ŒS )r#   © )r1   rm   Úis     €r   ú
<listcomp>z'_generate_gray_code.<locals>.<listcomp>…  s!   ø€ Ð6Ð6Ð6 �1�q˜!‘t‘8Ð6Ð6Ð6r   c                ó8   •— g | ]}t          |d ‰› d�¦  «        ‘ŒS )Ú0Úb)Úformat)r1   rm   Únum_bitss     €r   rz   z'_generate_gray_code.<locals>.<listcomp>†  s+   ø€ Ð7Ð7Ð7¨1�F�1�o˜(�o�o�oÑ&Ô&Ð7Ð7Ð7r   )rI   ÚrangeÚreversed)r   Úresultry   s   ` @r   Ú_generate_gray_coderƒ     s{   øø€ à�1‚}€}ÝÐMÑNÔNÐNØˆS€FÝ�8‰_Œ_ð 7ð 7ˆØÐ6Ð6Ð6Ð6¥X¨fÑ%5Ô%5Ð6Ñ6Ô6Ñ6ˆˆØ7Ð7Ð7Ð7°Ð7Ñ7Ô7Ð7r   c                ó$  — ddl m} g }| d|…         | |         }}t          |¦  «        }d}|D �]`}	d|	vrŒ|€|	}t          |	¦  «                             d¦  «        }
d„ t          |	|¦  «        D ¦   «         }d|v r|                     d¦  «        }nd}|�‰||
k    r/|                      |¦   «         ||         ||
         gg f¦  «         nTd„ t          |	¦  «        D ¦   «         }|dd…         D ]0}|                      |¦   «         ||         ||
         gg f¦  «         Œ1|	                     d¦  «        dz  d	k    r3|                     | 	                    ¦   «         ||
         |gg f¦  «         n |                     |||
         |gg f¦  «         |	}�Œb|S )
a;  Apply the gate to the last qubit in the register ``q``, controlled on all
    preceding qubits. This function uses the gray code to propagate down to the last qubit.

    Ported and adapted from Aqua (github.com/Qiskit/qiskit-aqua),
    commit 769ca8d, file qiskit/aqua/circuits/gates/multi_control_u1_gate.py.
    r   rj   NÚ1c                ó    — g | ]\  }}||k    ‘ŒS rx   rx   )r1   ry   Újs      r   rz   z$_gray_code_chain.<locals>.<listcomp>   s    € Ð>Ð>Ð>™4˜1˜a��Q’Ð>Ð>Ð>r   Tc                ó$   — g | ]\  }}|d k    ¯|‘ŒS )r…   rx   )r1   ry   rm   s      r   rz   z$_gray_code_chain.<locals>.<listcomp>©  s!   € ÐHÐHÐH¡  A¸qÀCºx¸x˜1¸x¸x¸xr   r#   r   )
rm   rk   rƒ   ÚlistÚindexÚzipÚappendÚ	enumerateÚcountr&   )r<   r'   r8   rk   ÚruleÚ
q_controlsÚq_targetÚ	gray_codeÚlast_patternÚpatternÚlm_posÚcompÚposÚindicesÚidxs                  r   Ú_gray_code_chainrš   ‰  sã  € ð ÐÐÐÐÐà€DØÐ-˜oÐ-Ô.°°/Ô0B�€JÝ# OÑ4Ô4€IØ€Làð ñ ˆØ�gÐÐØØÐØ"ˆLå�g‘”×$Ò$ SÑ)Ô)ˆð ?Ð>¥3 w°Ñ#=Ô#=Ð>Ñ>Ô>ˆØ�4ˆ<ˆ<Ø—*’*˜TÑ"Ô"ˆCˆCàˆCØˆ?Ø�fŠ}ˆ}Ø—’˜V˜V™XœX¨
°3¬¸ÀFÔ9KÐ'LÈbÐQÑRÔRÐRÐRàHÐH­°7Ñ);Ô);ÐHÑHÔH�Ø" 1 2 2œ;ð Wð W�CØ—K’K  ¡¤¨J°s¬O¸ZÈÔ=OÐ+PÐRTÐ UÑVÔVÐVÐVà�=Š=˜ÑÔ Ñ! QÒ&Ð&à�KŠK˜Ÿš™œ¨*°VÔ*<¸hÐ)GÈÐLÑMÔMÐMÐMà�KŠK˜ 
¨6Ô 2°HÐ=¸rÐBÑCÔCÐCØˆ‰à€Kr   )r_   Ú
__future__r   rK   Úcmathr   Útypingr   r   rN   Úqiskit.circuit.controlledgater   Úqiskit.circuit.gater   Ú"qiskit.circuit.parameterexpressionr	   r
   Úqiskit.circuit.quantumregisterr   Úqiskit._accelerate.circuitr   r   r4   rƒ   rš   rx   r   r   ú<module>r£      sQ  ðð #Ð "à "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø $Ð $Ð $Ð $Ð $Ð $Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ :Ð :Ð :Ð :Ð :Ð :Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðZMð ZMð ZMð ZMð ZMˆTñ ZMô ZMð ZMðzC
ð C
ð C
ð C
ð C
ˆnñ C
ô C
ð C
ðL8ð 8ð 8ð+ð +ð +ð +ð +r   