Hacked By AnonymousFox

Current Path : /opt/cloudlinux/venv/lib64/python3.11/site-packages/lvestats/lib/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/lvestats/lib/__pycache__/lveinfolib.cpython-311.pyc

�

)�fr�����ddlmZddlmZddlmZddlmZmZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlmZddlmZmZddlmZdd	lmZdd
lmZmZmZmZmZmZmZddlmZm Z m!Z!m"Z"m#Z#ddl$m%Z%dd
l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5ddl6m7Z7m8Z8ddl9m:Z:m;Z;dZ<d�Z=d�Z>d�Z?d�Z@d�ZAGd�deB��ZCd�ZDd�E��d�E��d�E��d�E��d�E��d�E��d �E��d�E��d!�E��d"�E��d#�E��d"�E��d$�E��d%�E��d&�E��d%�E��d'�E��d(�E��d)�E��d(�E��d*�E��d+�E��d,�E��d+�E��d-�E��d.�E��d/�E��d.�E��iZFid0d1�dd2�dd3�d!d4�d$d5�d*d6�d'd7�d-d8�dd9�d"d:�dd;�d%d<�d+d=�d(d>�d.d?�d@dA�dBdC�idDdE�dFdG�dHdI�dJdK�dLdM�dNd2�dOd4�dPd3�dQd5�dRd6�dSd7�dTd8�dd2�d#d4�d d3�d&d5�d)d7��d6d8dU��ZGgdV�ZHgdW�ZIgdX�ZJgdY�ZKgdZ�ZLd[d\d]d^�ZMeNeG�O����D]ZPePeMeP�Q��<�d_�ZRd`�ZSda�ZTdbdc�fddde�fdfdg�fgZUdh�ZVGdi�djeB��ZWGdk�dleW��ZXGdm�dneX��ZYGdo�dpeW��ZZdrdq�Z[dS)s�)�absolute_import)�division)�
basestring)�map�zipN)�	strtobool)�Float�Integer)�exc)�text)�and_�or_�not_�select�label�desc�asc)�func�
ColumnElement�case�alias�cast)�LveStatsPluginTerminated)�gm_datetime_to_unixtimestamp�round_1m�str_to_timedelta�unixtimestamp_to_gm_datetime�gm_to_local�local_to_gm)�
convert_bytes�convert_powers_of_1000�mempages_to_bytes)�history�history_x60�servers�LVE_STATS_2_TABLENAME_PREFIX)�skip_user_by_maxuid�get_current_max_lve_id)�HIDE_MAX_UID_LVE_PARAMETER�read_config)�HistoryShow�HistoryShowUnion�OutputFormatter�get_lve_versionc��ttjg���tj|k��}|���5}|�|��}|jrE|���}|�	ddd��dSt|d��cddd��S	ddd��dS#1swxYwYdS)N��lve_version)
rr%r1�where�	server_id�begin�execute�returns_rows�fetchone�int)�dbenginer3�sql_query_lve_version�transaction_�cursor_�ress      ��/builddir/build/BUILDROOT/lve-stats-4.2.8-1.el8.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/lveinfolib.pyr.r..s=��"�G�$7�#8�9�9�?�?��@Q�U^�@^�_�_��	���	�	�	�\��&�&�'<�=�=����	��"�"�$�$�C��{��	�	�	�	�	�	�	�	��3�}�-�.�.�	�	�	�	�	�	�	�	��	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	s�4C�C�2C�C�Cc�v�ttjtjg��}|�|��S�N)rr%r3r1r5)r9r:s  r>�servers_inforA<s0��"�G�$5�w�7J�#K�L�L�����1�2�2�2�c�6�t�|��Sr@)�str�lower)�key_s r>�convert_key_to_labelrGAs���9�9�T�?�?�rBc���t��}t|�����D]D\}}t|jt
��rt
t|��|��}n|}|||<�E|S)z�
    Add label (on SQL add ".. as ..") to aggregate_func_dict
    key of dict convert to lowercase and add as label
    :param dict func_dict:
    :return dict:
    )�dict�list�items�
issubclass�	__class__rrrG)�	func_dict�func_dict_labeledrF�sqlalchemy_func�func_labeleds     r>�add_labes_to_columnrREs|������!%�i�o�o�&7�&7�!8�!8�/�/���o��o�/��?�?�	+� �!5�d�!;�!;�_�M�M�L�L�*�L�".��$����rBc�D�t|ttf��r|gS|Sr@)�
isinstancerr8)�args r>�convert_to_listrVVs%���#�
�C�(�)�)���u���JrBc���eZdZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Ze
dd
���Ze
d���Ze
d���Ze
d���Ze
d���Ze
d���ZdS)r-Nc�
�|p
t��|_t|��|_d�|D��|_t��|_t��|_|r|D]\}}|�||���dSdS)Nc�6�g|]}|�����S��rE��.0�_s  r>�
<listcomp>z,OutputFormatter.__init__.<locals>.<listcomp>as ��:�:�:�a����	�	�:�:�:rB)rJ�rows�fields�_fields_lowered�_orders�set�_hidden_fields�	add_order)�selfrar`�orders�field�orders      r>�__init__zOutputFormatter.__init__^s����N�D�F�F��	��6�l�l���:�:�6�:�:�:����v�v���!�e�e����	-� &�
-�
-���u����u�e�,�,�,�,�	-�	-�
-�
-rBc�F���jr�fd��jD��S�jS)Nc�&��g|]
}|�jv�|��SrZ)re)r]�f_rgs  �r>r_z.OutputFormatter.get_fields.<locals>.<listcomp>ks&���N�N�N�2��$�:M�0M�0M�B�0M�0M�0MrB)rera�rgs`r>�
get_fieldszOutputFormatter.get_fieldsis2�����	�N�N�N�N���N�N�N�N��;�rBc��||_dS)z{
        Use this method if you used hide_fields
        number items in row must bee same as in fields after hide
        N)r`)rgr`s  r>�set_rowszOutputFormatter.set_rowsos��
��	�	�	rBc�^�|j�t|����|_dS)z>
        :param tuple|list h_fields:
        :return:
        N)re�unionrd)rg�h_fieldss  r>�hide_fieldszOutputFormatter.hide_fieldsvs)��
#�1�7�7��H�
�
�F�F����rBc�>�t|t��ra	t||��}n #t$rt	d|z���wxYwt|d��st	dt|��z���|j�d�|D��|f��dS)zp
        :param list|tuples fields:
        :param order: field to use to order result
        :return:
        zNon such %s order�__call__z input object %s must be callablec�6�h|]}|�����SrZr[r\s  r>�	<setcomp>z,OutputFormatter.add_order.<locals>.<setcomp>�s ��8�8�8�A�a�g�g�i�i�8�8�8rBN)rTrD�getattr�AttributeError�
ValueError�hasattrrc�append)rgrarjs   r>rfzOutputFormatter.add_order}s����e�S�!�!�	R�
>���e�,�,����!�
>�
>�
>� �!4�u�!<�=�=�=�
>�����5�*�-�-�
R� �!C�c�%�j�j�!P�Q�Q�Q�����8�8��8�8�8�%�@�A�A�A�A�As	�(�Ac�6�t|��}t��}t|j|��D]e\}}||jvr�|jD]9\}}||vr0	||��}�#t
tttf$rY�5wxYw�:|�	|���f|S)z8
        :param iterable row_:
        :return:
        )
rJrrbrerc�	TypeErrorr}�KeyError�
IndexErrorr)rg�row_�row_out�field_�r_�order_fieldsrjs       r>�
_convert_linezOutputFormatter._convert_line�s���
�D�z�z���&�&���d�2�D�9�9�
	�
	�J�F�B���,�,�,��'+�|�
�
�#��e��\�)�)��"�U�2�Y�Y����%�z�8�Z�H����������*�

�N�N�2������s�A�A?�>A?c#�LK�|jD]}|�|��V��dSr@)r`r�)rgr�s  r>�__iter__zOutputFormatter.__iter__�s>�����I�	+�	+�D��$�$�T�*�*�*�*�*�*�	+�	+rBc���t|t��r9tt|j|j|j|j�����S|�|j|��Sr@)rT�slicerJrr�r`�start�stop)rg�indexs  r>�__getitem__zOutputFormatter.__getitem__�s[���e�U�#�#�	T���D�.��	�%�+�e�j�:P�0Q�R�R�S�S�S��!�!�$�)�E�"2�3�3�3rBc�*�t|j��Sr@)�lenr`ros r>�__len__zOutputFormatter.__len__�s���4�9�~�~�rBc� �t|��Sr@)rJros r>�get_corrected_listz"OutputFormatter.get_corrected_list�s���D�z�z�rB�%m-%d %H:%Mc�,�|�|��Sr@)�strftime)�value�format_s  r>r�zOutputFormatter.strftime�s���~�~�g�&�&�&rBc�z�|�dS	t|��n#t$r|cYSwxYwt|dz��dzS)N�-�d�%)�floatr}rD�r�s r>�
percentagezOutputFormatter.percentage�sW���=��3�	��%�L�L�L�L���	�	�	��L�L�L�	�����5��9�~�~��#�#s��%�%c�(�|�dSt|��S�Nr�)r r�s r>�byteszOutputFormatter.bytes�s���=��3��U�#�#�#rBc�(�|�dSt|��Sr�)r!r�s r>�powers_of_1000zOutputFormatter.powers_of_1000�s���=��3�%�e�,�,�,rBc�t�	tjt|����jS#t$r|cYSwxYwr@)�pwd�getpwuidr8�pw_namer�r�s r>�usernamezOutputFormatter.username�sD��	��<��E�
�
�+�+�3�3���	�	�	��L�L�L�	���s�%(�7�7c�@�tj�|��S)zE
        Convert unix timestamp to datetime (local timezone)
        )�datetime�
fromtimestampr�s r>r�zOutputFormatter.datetime�s��
� �.�.�u�5�5�5rB�NN)r�)�__name__�
__module__�__qualname__rkrprrrvrfr�r�r�r�r��staticmethodr�r�r�r�r�r�rZrBr>r-r-\s\������	-�	-�	-�	-�������G�G�G�
B�
B�
B����(+�+�+�4�4�4�
�������'�'�'��\�'��$�$��\�$��$�$��\�$�
�-�-��\�-�
����\���6�6��\�6�6�6rBr-c�~�t��}t��}|D]�}t|��}|�|��}|dkrGt|t��r|}n|j}|dt|dz��zz
}t
||��}|�|��|�|����|S)z�
    Enumerate if columns name or functions are duplicated
    Use for force add duplicate columns to select operator
    :param list|tuple columns:
    :return list|tuple: enumerated columns
    �r^)rJrD�countrTr�namerr)�columns�output�
output_str�c_�c_str�
dubl_count�c_names       r>�enumerate_duplicate_columnsr��s����V�V�F����J��!�!���B�����%�%�e�,�,�
���?�?��"�j�)�)�
!�������
�c�C�
�Q��/�/�/�/�F��v�r�"�"�B��
�
�b�������%� � � � ��MrB�aCPU�lCPU�mCPU�aVMem�lVMem�mVMem�aEP�lEP�mEP�aPMem�lPMem�mPMem�aNproc�lNproc�mNproc�aIO�lIO�mIO�aIOPS�lIOPS�mIOPS�ID�id�cpu�mem�mep�memphy�io�nproc�iops�	cpu_limit�	mep_limit�	mem_limit�lmemphy�io_limit�lnproc�liops�VMemF�	mem_fault�PMemF�memphy_fault�EPf�	mep_fault�NprocF�nproc_fault�CPUf�	cpu_fault�IOf�io_fault�IOPSf�
iops_fault�uCPU�uEP�uVMem�uPMem�uIO�uNproc�uIOPS)r�r�)r�r�r�r�r�r�r�)r�r�r�r�r�r�r�)r�r�r�r�r�r�r�)r�r�r�r�r�r�r�)r�r�r�r�r�r�r��From�To�anyF)�FROM�TO�ANYFc�(�|�dSt|��Sr@)�normalize_column_names)�namess r>�normalize_optional_column_namesrCs���}��t�!�%�(�(�(rBc�X�g}|D]$}|�t|�����%|Sr@)r�normalize_column_name)r�resultr�s   r>rrIs9��
�F��3�3���
�
�+�D�1�1�2�2�2�2��MrBc�H�|rt|���SdSr@)�KEYS_NORMALIZATION_LOOKUP_TABLE�upper)r�s r>rrPs"���=�.�t�z�z�|�|�<�<��4rB�10mc�H�|tj|jdzdz���z
S)N�
��minutes)r��	timedelta�minute��dts r>�<lambda>rVs$��r�H�.�r�y�2�~��7J�K�K�K�K�rB�1hc�l�|jr|�d���n|tjd���z
S)Nr)rr�)�hours)r�replacer�rrs r>rrWs4��b�i�]�b�j�j��j�*�*�*�R�(�BT�[\�B]�B]�B]�=]�rB�1dc�0�|�dd���S)Nr)�hourr)rrs r>rrXs��b�j�j�a��j�2�2�rBc
�n�t|��t|tjd���z��g}dg}t}tD]_\}}||d��}||dz
t	|��kr-|}|�d|��|�|���`||d��|d<t��}t|��D]]\}	}|�||	dz
||	dz
tt	|���
����f���^|S)Nr�r�1mr�)rr�r�time_unit_ordersr�insertrrJ�	enumerater8�
total_seconds)
�period_from�	period_to�
period_groups�time_unit_list�_from_order_fun�	time_unit�	order_fun�
from_to_point�from_to_groupsr�s
          r>�dyn_time_unit_groupsr,\sa���k�*�*��i�(�*<�Q�*G�*G�*G�G�H�H�J�M��V�N��O� 0�-�-��	�9�!�	�-��"2�3�3�
��=��+�+�/?�	�/J�/J�J�J�'�O�� � ��M�2�2�2��!�!�)�,�,�,��&��}�Q�'7�8�8�M�!���V�V�N�%�n�5�5�R�R���y����}�e�V�a�Z�8�,�e�V�a�Z�8�"�#3�I�#>�#>�#L�#L�#N�#N�O�O�Q�	R�	R�	R�	R��rBc��eZdZ			d"d�Zd�Zd#d	�Zd
�Zd$d�Zd
�Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd%d�Zd�Zd�Zd�Zd �Zd!�ZdS)&r+N�	localhost��������?r�rFc���||_||_t|t��|_|�5tt
||������}|�dd��t|��|_	||_
||_t|��|_
|rt|��|_nK|j
r+td��|j
vrtd��|_n|j
o|j
d|_t|	��|_|
|_||_|
|_|pt)jd��|_|�|nt.j|_t5|jd	��|_t|tt8f��r|nt;|��|_t|tt8f��r|nt;|��|_|p|� ��|_!tE|j	tFtHztJztLzd
�ggd�d�gg�
��|_'tQtS���*tVd����|_,dS)a*
        Show different statistics from history table
        :param sqlalchemy.engine.base.Engine dbengine: database engine to use
        :param datetime.datetime|float|int period_from:  start time retrieve data
        :param datetime.datetime|float|int period_to:    end time retrieve data
        :param int|None|list|tuple uid:                  filter the output information to the user uid
        :param tuple|list show_columns:        display columns in the order specified. If not, show all supported
                valid column names: 'aCPU', 'lPMem', 'uIO', 'uEP', 'lEP', 'aVMem', 'PMemF', 'lVMem', 'NprocF', 'anyF',
                'aNproc', 'VMemF', 'ID', 'lCPU', 'aIOPS', 'aEP', 'aPMem', 'uPMem', 'lIO', 'lIOPS', 'uCPU',
                'lNproc', 'aIO', 'uIOPS', 'EPf', 'uVMem', 'uNproc'

        :param str server_id:                  filtering the output for "server id"
        :param int time_unit:                  grouping output over an interval of time (in seconds)
        :param str|None order_by:              sorting output by column name (supported by columns)
        :param str|tuple|list by_usage:        filtering are grouped data for the percentage of the use of resources
        :param float by_usage_percentage:      percent for the parameter setting 'by_usage'
        :param tuple|list|None by_fault:       filtering data are grouped for quantity faults (None if it is not filtered)
                valid names: 'aCPU', 'lPMem', 'uIO', 'uEP', 'lEP', 'aVMem', 'PMemF', 'lVMem', 'NprocF', 'anyF', 'aNproc',
                'VMemF', 'ID', 'lCPU', 'aIOPS', 'aEP', 'aPMem', 'uPMem', 'lIO', 'lIOPS', 'uCPU', 'lNproc', 'aIO', 'uIOPS',
                'EPf', 'uVMem', 'uNproc'
        :param threshold:                     number faults for filtering the data are grouped (used together with by_fault)
        :param int|None limit:                 limit on the number of output data (if 0 or None, then the limit is not set)
        :return generator:                     returns a list/generator of data with the order set out in the 'show_columns'
        N)r9r3)r1rr�r�r��SQL�alivec�"�t|d��S)N�)�round��xs r>rz&HistoryShow.__init__.<locals>.<lambda>�s��e�A�q�k�k�rB)r�r�r�c�B�tt|��dzd��S)NgY@�)r5r�)�items r>rz&HistoryShow.__init__.<locals>.<lambda>�s��%��d���TX�HX�Z[�B\�B\�rB)rarh�true)-r9�uidrTr8�_is_multi_uids�get_supported_columnsr.r r�show_columnsr3r(r�by_faultr�order_by�by_usage�by_usage_percentage�	threshold�limit�logging�	getLogger�logr#�	__table__�tabler�_table_aliver�rr#r$�get_time_count�
time_countr-�	FIELD_MAX�
FIELD_AVERAGE�FIELD_LIMIT�FIELD_USAGE�result_correctorrr*�getr)�hide_maxuid_lve)rgr9r#r$r<r?r3r(rArBrCr@rDrErJrHrM�	show_idles                  r>rkzHistoryShow.__init__tsC��6!��
����",�S�#�"6�"6�6�����0�_�V^�js�=t�=t�=t�u�u�u�L�����4�(�(�(�2�<�@�@���"���"���7��A�A��
��	?�1�(�;�;�D�M�M�
�]�	?�4�V�<�<��
�M�M�1�&�9�9�D�M�M� �M�>�d�m�A�.>�D�M�7��A�A��
�#6�� �"�����
��2�'�+�E�2�2���#�/�U�U�W�5F��
�!�$�*�g�6�6���*4�[�3��,�*O�*O�~�;�;�Uq�r}�U~�U~���&0��S�%�L�&I�&I�v���Ok�lu�Ov�Ov���$�=��(;�(;�(=�(=���!0�t�7H�5>��5N�Q\�5\�_j�5j�5I�5I�5K�5M�5M�5M�5\�5\�5^�8_�!`�!`�!`��� )����):�):�;U�W]�)^�)^�_�_����rBc�@�|j�gd�d����|jjjdkrF|j�gd�t
���|j�gd�t���|j�gd�t���dS)N)	r�r�r�r�r�r�r�r�r�c�:�tt|����Sr@)r8r5r6s r>rz3HistoryShow.set_normalised_output.<locals>.<lambda>�s��C��a���M�M�rB)rarj�sqlite)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�)r�r�r�r�r�r�r�)r�r�r�r�r�r�)rRrfr9�url�
drivernamer�r8r"ros r>�set_normalised_outputz!HistoryShow.set_normalised_output�s���	
��'�'�&�&�&�)�)�	(�	+�	+�	+��=��'�8�3�3��!�+�+�!�!�!��
,�
�
�
�
�!�+�+�!�!�!��
,�
�
�
�	
��'�'�I�I�I�#�	(�	%�	%�	%�	%�	%rBc�h�|�|j}|jj�|j|j��S)zX
        Generate WHERE created BETWEEN xxxxxxxxx AND yyyyyyyy
        :return:
        )rJ�c�created�betweenr#r$)rgrJs  r>�_where_time_periodzHistoryShow._where_time_period�s/���=��J�E��w��&�&�t�'7���H�H�HrBc�6�|jjj|jkS)zK
        Generate WHERE server_id = 'server_name'
        :return:
        )rJr]r3ros r>�_where_server_idzHistoryShow._where_server_id�s��
�z�|�%���7�7rB���c
��|�|j}|dkr|j}|��|jrjt|jjdkt
tt|jj����|jjt��k����S|jjdkSt|ttf��r�|j
jjdkrYt!|jj�t|����j�ddi���j��S|jj�t|����S|jj|kS)zGenerate WHERE id = 'user_uid'NrcrrX�
literal_bindsT��compile_kwargs)rJr<rTr
r]r�rrr'r(rTrJ�tupler9rYrZr�in_�
expression�compile�string)rgr<rJs   r>�
_where_uidzHistoryShow._where_uid�s2���=��J�E��"�9�9��(�C��;��#�
X��E�G�J��N�C��5H����5T�5T�0U�0U�05��
�=S�=U�=U�0U�-W�-W�X�X�X��7�:��>�!�
��d�E�]�
+�
+�	%��}� �+�x�7�7��E�G�J�N�N�4��9�9�5�5�'����QU�?V��(W�(W�#�%�%�%�
�w�z�~�~�d�3�i�i�0�0�0��7�:��$�$rBc��ttj�|j|j��tjdktj|jk��}ttd��g���
|��}tj��}t|�
ddi������dd��}|j�|��|j�|��}|j�dtj��|z
��|���ddS)	z
        SELECT count(*) FROM lve_stats2_history WHERE id = 0 AND created BETWEN xxxx AND yyyy server_id = 'localhost'
        r�count(*)reTrf�
� �query time: %s)r
r#r^r_r#r$r�r3rrr2�timerDrkrrH�debugr9r5�fetchall)rgr2�query�
time_start�q�datas      r>rLzHistoryShow.get_time_count�s����O�#�#�D�$4�d�n�E�E��J�!�O�W�.�$�.�@�B�B����Z�(�(�)�*�*�0�0��7�7���Y�[�[�
���
�
�o�t�-D�
�E�E�F�F�N�N�t�UX�Y�Y������q�����}�$�$�U�+�+������'�����z�)A�B�B�B��}�}���q�!�!�$�$rBc��ttj|��t|���t��zt��S)z�
        Generate aggregate function for calculate average
        for example sum(lve_stats2_history.cpu) / 60
        :param item:
        :return:
        )rr�sum�_fun_time_countr	�rgr:s  r>�_fun_avgzHistoryShow._fun_avgs7���D�H�T�N�N�4��(<�(<�(>�(>��#F�#F�F��N�N�NrBc�z�ttj|��dktj|��fgd���S)a
        Generate aggregate function for calculate limit
        if column_limit is zero its mean no limit
        for example CASE WHEN (min(lve_stats2_history.cpu_limit) > 0) THEN max(lve_stats2_history.cpu_limit) ELSE 0 END
        :param item:
        :return:
        r��else_)rr�min�maxr}s  r>�
_fun_limitzHistoryShow._fun_limits4���d�h�t�n�n�q�(�$�(�4�.�.�9�:�!�D�D�D�DrBc�*�tj|��S)z�
        Generate aggregate function for calculate fault
        for example sum(lve_stats2_history.cpu_fault)
        :param item:
        :return:
        )rr{r}s  r>�
_fun_faultzHistoryShow._fun_faults���x��~�~�rBc���t|�|��dkdf|�|��dk|�|��|�|��zfgd���S)ac
        Generate aggregate function for calculate resource usage equivalent average/limit
        for example
        CASE WHEN ( CASE WHEN (min(lve_stats2_history.cpu_limit) > 0) THEN max(lve_stats2_history.cpu_limit) ELSE 0 END IS NULL) THEN NULL
                WHEN (CASE WHEN (min(lve_stats2_history.cpu_limit) > 0) THEN max(lve_stats2_history.cpu_limit) ELSE 0 END > 0)
                    THEN (sum(lve_stats2_history.cpu) / 1422) / CASE WHEN (min(lve_stats2_history.cpu_limit) > 0)
                    THEN max(lve_stats2_history.cpu_limit) ELSE 0 END END
        :param item:
        :return:
        Nrr�)rr�r~)rgr:�
item_limits   r>�
_fun_usagezHistoryShow._fun_usage$su���
�_�_�Z�
(�
(�D�
0�$�7�
�_�_�Z�
(�
(�1�
,�d�m�m�D�.A�.A�D�O�O�T^�D_�D_�._�`�
��	���	rBc��ttj|��dktj|��fgtj|�����S)a�
        Generate aggregate function for calculate maximum resource usage; for backward capability with lve-stats 0.x
        for example:
            CASE
                WHEN
                    (sum(lve_stats2_history.cpu_fault) > 0)
                THEN
                    max(lve_stats2_history.cpu_limit)
                ELSE
                    max(lve_stats2_history.cpu) END
        :param item:
        :param item_limit:
        :param item_fault:
        :return:
        rr�)rrr{r�)rgr:r��
item_faults    r>�_fun_maxzHistoryShow._fun_max6sA�� �d�h�z�*�*�Q�.����0D�0D�E�F�d�h�W[�n�n�]�]�]�]rBc�V�|���rtd��S|jS)Nro)�_check_need_joinrrMros r>r|zHistoryShow._fun_time_countHs,��� � �"�"�	#��
�#�#�#��?�"rBc��|jr|jS|���r|j}n|j}|jjjdkr?t|j	j
|jz
|jzt��|jz|jzStj|j	j
|jz
|jz��|jz|jzS)NrX)r=r#r�rKrJr9rYrZrr]r^r(r
r�floor)rg�_tables  r>�_fun_time_fromzHistoryShow._fun_time_fromNs�����	z��#�#��$�$�&�&�
$��*�������}� �+�x�7�7��V�X�-��0@�@�$�.�P�RY�Z�Z�[_�[i�i�lp�l|�|�|��z�6�8�#3�d�6F�#F���"V�W�W�X\�Xf�f�im�iy�y�yrBc�V�|jr|jS|���|jzSr@)r=r$r�r(ros r>�_fun_time_tozHistoryShow._fun_time_to\s.����	:��>�!��&�&�(�(�4�>�9�9rBc��|jrtd|jjj��Stdtt
|j������S�Nr�)r=rrJr]r�rrDr<ros r>�_fun_user_idzHistoryShow._fun_user_idcsC����	4���t�z�|��/�/�/���t�C���M�M�2�2�3�3�3rBc�&�|dkr�tj|jjj|jjjz|jjjz|jjjz|jjjz|jjj	z|jjj
z��}�n�|dkr|���}�n�|dkr|���}�n�|dkr|�
��}�n�t|}t|jj|��}|t vr|�|��}�n^|t$vr|�|��}�n>|t(vr|�|��}�n|t,vratt$t,�|��}t|jj|��}|�||��}n�|t2vr�tt$t2�|��}tt(t2�|��}t|jj|��}t|jj|��}|�|||��}|S)a
        Function for obtain aggregate function (or column name) by column name
        :param item: 'aCPU', 'aVMem', 'aPMem', 'aEP', 'aNproc',  'aIO', 'aIOPS', 'lCPU', 'lVMem', 'lPMem', 'lEP',
                     'lNproc',  'lIO', 'lIOPS', 'CPUf', 'VMemF', 'PMemF', 'EPf', 'NprocF',  'IOf', 'IOPSf', 'uCPU',
                     'uVMem', 'uPMem', 'uEP', 'uNproc',  'uIO', 'uIOPS', 'mCPU', 'mVMem', 'mPMem', 'mEP',  'mNproc',
                     'mIO', 'mIOPS', 'anyF', 'ID', 'From', 'To'
        :type item: str
        :return:
        r�r�r�r�)rr{rJr]r�r�r�r�r�r�r�r�r�r��FIELD_TO_TABLE_COLUMNr{rOr~rPr��FIELD_FAULTr�rQr�r�rNr�)	rgr:�fun_�column_name�table_column�column_name_limit�table_column_limit�column_name_fault�table_column_faults	         r>�_aggregate_fun_casezHistoryShow._aggregate_fun_caseis.���6�>�>��8��
��&����)B�B�T�Z�\�E[�[�^b�^h�^j�^v�v��
��&�'�)-���)>�?�AE���AX�Y�Z�Z�D�D��T�\�\��$�$�&�&�D�D�
�V�^�^��&�&�(�(�D�D�
�T�\�\��$�$�&�&�D�D�/��5�K�"�4�:�<��=�=�L��}�$�$��}�}�\�2�2�����$�$����|�4�4�����$�$����|�4�4�����$�$�$9�+�k�FW�FW�X\�F]�F]�:^�$_�!�%,�T�Z�\�;L�%M�%M�"����|�5G�H�H�����"�"�$9�+�i�o�o�VZ�F[�F[�:\�$]�!�$9�+�i�o�o�VZ�F[�F[�:\�$]�!�%,�T�Z�\�;L�%M�%M�"�%,�T�Z�\�;L�%M�%M�"��}�}�\�3E�GY�Z�Z���rBc���t�j��}t�j��}�jr%|��jjj��}nL|����������	����}�j
r=���j
��}|�t|����n`�jr2|�t�jjj����n'|�������|r�t��}|D]�}|t vrDt �|��}�j��t&|��k}	nYt(�|��}�j��t*|��z��|��k}	|�|	����|�t1|���|r*�fd�|D��}
|�t1|
����jdkr!�j�|��j��}|S)Nc�L��g|] }�j��|��k��!SrZ)rDr�)r]�	funk_key_rgs  �r>r_z/HistoryShow._group_by_query.<locals>.<listcomp>�s/���t�t�t�Yb�t�~��1I�1I�)�1T�1T�T�t�t�trBr)rVrBr@r=�group_byrJr]r�r�r�rAr��append_order_byrrrJrOr�rCrQrNrPr�
append_havingrrE)rg�select_query�
by_usage_list�
by_fault_listrv�order_by_aggregate_func�filter_fun_listr:r��
filter_fun�by_fault_filters`          r>�_group_by_queryzHistoryShow._group_by_query�sk���'��
�6�6�
�'��
�6�6�
���	_� �)�)�$�*�,�/�:�:�E�E�
!�)�)�$�*=�*=�*?�*?�@�@�I�I�$�J[�J[�J]�J]�^�^�E��=�	=�&*�&>�&>�t�}�&M�&M�#��!�!�$�'>�"?�"?�@�@�@�@��"�
=��%�%�c�$�*�,�/�&:�&:�;�;�;�;��%�%�d�&9�&9�&;�&;�<�<�<��
	7�"�f�f�O�%�
3�
3���=�(�(�)�/�/��5�5�E�!%�!9�T�=U�=U�Va�bg�Vh�=i�=i�!i�J�J�%�O�O�D�1�1�E�!%�!9�$�:R�:R�S^�_d�Se�:f�:f�!f�jn�kC�kC�DH�kI�kI�"I�J��&�&�z�2�2�2�2�����_� 5�6�6�6��	7�t�t�t�t�fs�t�t�t�O�����_� 5�6�6�6��:��?�?�t�z�5��K�K��
�+�+�E��rBc��t��}|jD]k}|�|��}t|t��r|�|���B|dvrt||��}|�|���l|S)ze
        Generate output columns for SELECT <_columns_query(self)> FROM ...
        :return:
        )r�r�)rJr?r�rT�extendrr)rg�columns_agregate_func�
column_key�
column_funs    r>�_columns_queryzHistoryShow._columns_query�s���
!%�����+�	9�	9�J��1�1�*�=�=�J��*�d�+�+�
9�%�,�,�Z�8�8�8�8��^�3�3�!&�z�:�!>�!>�J�%�,�,�Z�8�8�8�8�$�$rBc��hd�}t|t|j��|jhzt|jp
t����zz��S)N>r�r�r�r�r�r�r�r�r�r�r�r�r�r�)�boolrdr?rArB)rgr�s  r>�_check_need_time_countz"HistoryShow._check_need_time_count�sU��%�%�%���G�s�4�#4�5�5����G�#�d�m�Nd�_b�_d�_d�Je�Je�e�f�g�g�grBc�:�|���o|jSr@)r�r=ros r>r�zHistoryShow._check_need_join�s���*�*�,�,�H�T�5H�1H�HrBc	��|�|���}|rDt|�|j���|�d|j�����}n4t|���|�����}|jr"t||�����}t|���|��}|r~|j�	|j
t|jjj|j
jjk|�|j
�������}|�|��}|S)z'
        :type need_join: bool
        N)rJr)r<rJ)r<)r�r
r`rKrmr3rbrr2�	outerjoinrJr]r^r<�select_from)rg�columns_�	need_join�where_queryrv�
_table_joineds      r>�
_select_queryzHistoryShow._select_query�sD�����*�*�,�,�H��	M��t�6�6�T�=N�6�O�O�#���1�D�<M��N�N�P�P�K�K��t�6�6�8�8�$�/�/�:K�:K�L�L�K��>�	E��{�D�,A�,A�,C�,C�D�D�K��x� � �&�&�{�3�3���	5� �-�7�7��
�D��!2�!4�!<��
��@T�!T�!%���T�X��!>�!>�@�@�A�A�M��%�%�m�4�4�E��rBc��|���}|�||������}|�|��}|S�N)r�r�)r�r�r�r�)rgr�rvs   r>�
main_queryzHistoryShow.main_query�sO���&�&�(�(���"�"�H��@U�@U�@W�@W�"�X�X���$�$�U�+�+���rBc���t|���|���|�����}t	tj|jjj	��tj
|jjj	��g���|��}tj��}t|�ddi������dd��}|j�|��|j�|��}|j�dtj��|z
��|���dS)z�
        SELECT min(created), max(created) FROM lve_stats2_history WHERE id = <ID> AND created BETWEN xxxx AND yyyy server_id = 'localhost'
        reTrfrprqrrr)r
r`rmrbrrr�rJr]r^r�r2rsrDrkrrHrtr9r5ru)rgr�rvrwrxrys      r>�_min_max_createdzHistoryShow._min_max_created�s���4�2�2�4�4�d�o�o�6G�6G��I^�I^�I`�I`�a�a��������!5�6�6������AU�8V�8V�W�X�X�^�^�_j�k�k���Y�[�[�
���
�
�o�t�-D�
�E�E�F�F�N�N�t�UX�Y�Y������q�����}�$�$�U�+�+������'�����z�)A�B�B�B��}�}���q�!�!rBc�:�|���\}}|�|jStt|����}tt|����}t	||��}t��}t
|��D]�\}}}	tj|��}
tt|����|
_
tt|����dz
|
_|	|
_d|
_
|�|
�������|S)Nr�r)r�rRrrr,rJ�reversed�copyrrr#r$r(rEr��proceed)rg�min_created�max_createdr#r$�time_unit_groupsr`�_from�_to�
_time_unit�	self_copys           r>�proceed_dyn_time_unitz!HistoryShow.proceed_dyn_time_unit�s��#'�#8�#8�#:�#:� ��[����(�(�!�">�{�"K�"K�L�L��� <�[� I� I�J�J�	�/��Y�G�G���v�v��&.�/?�&@�&@�	-�	-�"�E�3�
��	�$���I�$@��U�AS�AS�$T�$T�I�!�">�{�3�?O�?O�"P�"P�ST�"T�I��",�I���I�O��K�K�	�)�)�+�+�,�,�,�,��rBc�~�|jt��ks|jt��krt��S|j�:t|jttf��s|jdkrt��S|���}tj��}t
|�ddi�����}|j�	|�
dd����|j���}	|�
|��}|j�	dtj��|z
��|���|j_|���|jS#t$$r#|���t%���wxYw)NrreTrfrprqrr)r<rhrJrTr�rsrDrkrHrtrr9�connectr5rurRr`�closer)rgrvrwrx�conn�cursors      r>r�zHistoryShow.proceedsk���8�u�w�w���$�(�d�f�f�"4�"4��6�6�M��8��
�4�8�d�E�]�(K�(K��PT�PX�\]�P]�P]��6�6�M����!�!���Y�[�[�
���
�
�o�t�-D�
�E�E�F�F������q�y�y��s�+�+�,�,�,��}�$�$�&�&��		)��\�\�%�(�(�F��H�N�N�+�T�Y�[�[�:�-E�F�F�F�)/���):�):�D�!�&�

�J�J�L�L�L��(�(��(�	-�	-�	-��J�J�L�L�L�*�,�,�,�	-���s
�A"F�-F<c�D���fd�����D��S)Nc�N��g|]!}d�t�j|��D����"S)c��i|]\}}||��	SrZrZ)r]r:�vals   r>�
<dictcomp>z7HistoryShow.proceed_dict.<locals>.<listcomp>.<dictcomp>&s��N�N�N�y�t�S��s�N�N�NrB)rr?)r]�	items_valrgs  �r>r_z,HistoryShow.proceed_dict.<locals>.<listcomp>&s6���o�o�o�S\�N�N�C��0A�9�,M�,M�N�N�N�o�o�orB)r�ros`r>�proceed_dictzHistoryShow.proceed_dict%s*���o�o�o�o�`d�`l�`l�`n�`n�o�o�o�orB)NNr.NNNr/Nr�rNNNFr@)rcN)NF)r�r�r�rkr[r`rbrmrLr~r�r�r�r�r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�rZrBr>r+r+rs�������w{�sw�6;�>`�>`�>`�>`�@%�%�%�0I�I�I�I�8�8�8�%�%�%�%�8
%�
%�
%�O�O�O�E�E�E�������$^�^�^�$#�#�#�z�z�z�:�:�:�4�4�4�'�'�'�R&�&�&�P%�%�%� h�h�h�
I�I�I�����*���"�"�"����()�)�)�.p�p�p�p�prBr+c� �eZdZd�Zd�Zd�ZdS)�_HistoryShowX1c��tj|g|�Ri|��d|jvrdg|jz|_t��|_dSr�)r+rkr?rJ�_labels�rg�args�kwargss   r>rkz_HistoryShowX1.__init__*sR����T�3�D�3�3�3�F�3�3�3��t�(�(�(�!%���):� :�D���v�v����rBc��|dkrt|jjj|jjj|jjj|jjj|jjj|jjj|jjjg}�n�|dkr!td|jjj
��}�n�|dkr	|j}�n�|dkr	|j}�n�t|}t|jj|��}|tt zt"zvrt||��}�n8|t$vr]tt t$�|��}t|t|jj|����}||g}n�|t(vr�tt t(�|��}tt"t(�|��}t|t|jj|����}t|t|jj|����}t|dz|��}	||||	g}|S)�!
        :type item: str
        r�r�r�r�r��_max)rJr]r�r�r�r�r�r�r�rr�r#r$r�r{rOrPr�rQr�rN)
rgr:r�r�r�r�r�r�r��table_column_maxs
          r>r�z"_HistoryShowX1._aggregate_fun_case0s����6�>�>��
��&��
��(A�4�:�<�CY�[_�[e�[g�[s��
��&��
��(=�t�z�|�?V�X�D�D��T�\�\���t�z�|��/�/�D�D�
�V�^�^��#�D�D�
�T�\�\��>�D�D�/��5�K�"�4�:�<��=�=�L��
��3�k�A�B�B��[�,�7�7�����$�$�$9�+�k�FW�FW�X\�F]�F]�:^�$_�!�%*�+<�g�d�j�l�Te�>f�>f�%g�%g�"�$�&8�9�����"�"�$9�+�i�o�o�VZ�F[�F[�:\�$]�!�$9�+�i�o�o�VZ�F[�F[�:\�$]�!�%*�+<�g�d�j�l�Te�>f�>f�%g�%g�"�%*�+<�g�d�j�l�Te�>f�>f�%g�%g�"�#(��v�)=�|�#L�#L� �$�&8�:L�N^�_���rBc��t��}|j|jp
t��z}|jr�t	|j��D]�}|t
vr;t
�|��}|�t|���Ft�|��}|�
t||g����|jr|�|j��|D]�}|�
|��}t|t��rX|D]T}t|d��rB|j|jvr4|�|��|j�|j���U��t|d��rB|j|jvr4|�|��|j�|j����|S)Nr�)rJr?r@rBrVrOr�rrQrNr�r�rAr�rTr~r�r�)rgr�r?r:r�r�r�r�s        r>r�z_HistoryShowX1._columns_queryPs��� $�����(�D�M�,C�T�V�V�D���=�	D�'��
�6�6�
D�
D���=�(�(�)�/�/��5�5�E� �'�'��E�(:�;�;�;�;�%�O�O�D�1�1�E� �'�'��U�);�T�(B�C�C�C�C��=�	/�����
�.�.�.�&�
	9�
	9�J��1�1�*�=�=�J��*�d�+�+�
9�&�7�7�D��t�V�,�,�7���$�,�1N�1N�-�4�4�T�:�:�:���+�+�D�I�6�6�6��7�
�:�v�.�.�9�:�?�$�,�3V�3V�)�0�0��<�<�<��L�'�'�
��8�8�8��$�$rBN)r�r�r�rkr�r�rZrBr>r�r�)sB������������@%�%�%�%�%rBr�c�*�eZdZdZd�Zd�Zd�Zd�ZdS)�_HistoryShowX60ic���tj|g|�Rdtji|��|���\|_|_|�d��p|���|_	dS)NrJrM)
r�rkr$rI�get_history_x60_from_tor#r$rSrLrMr�s   r>rkz_HistoryShowX60.__init__rsp�����S�t�S�S�S�;�3H�S�F�S�S�S�,0�+G�+G�+I�+I�(���$�.� �*�*�\�2�2�K�d�6I�6I�6K�6K����rBc�^�|j|jfdkrdSt�|��S)Nr�r)r#r$r�rLros r>rLz_HistoryShowX60.get_time_countys0����d�n�-��=�=��1��,�,�T�2�2�2rBc�j�|j|jz
|jkrdS|jjj�|j|jz|j��}ttj	|jjj��tj
|jjj��g���t||�
������}tj��}|j�t#|�ddi������dd����|j�|�����d}|j�dtj��|z
��|\}}|�||jz
d
z|fS|S)zG
        calculate present in aggregate table from and to time
        r�reTrfrprqrrrNr�)r$r#�AGGREGATE_PERIODrJr]r^r_rrr�r�r2r
rbrsrHrtrDrkrr9r5ru)rg�
between_queryrvrwr�
create_min�
create_maxs       r>r�z'_HistoryShowX60.get_history_x60_from_to~sw���>�D�,�,��0E�E�E��:��
��,�4�4�T�5E��H]�5]�_c�_m�n�n�
��
�X�d�j�l�*�
+�
+�T�X�d�j�l�6J�-K�-K�L�N�N�NS�e���� 5� 5� 7� 7�8�8�O:�O:�	��Y�[�[�
�����s�5�=�=��$�8O�=�P�P�Q�Q�Y�Y�Z^�`c�d�d�e�e�e���&�&�u�-�-�6�6�8�8��;������'�����z�)A�B�B�B�!'��
�J��!��� 5�5��9�:�E�E��MrBc���|tvrIt|}t|jj|��}t|||jjjz��St�||��S)r�)	rOr�r{rJr]rrsr�r�)rgr:r�r�s    r>r�z#_HistoryShowX60._aggregate_fun_case�s^���=� � �/��5�K�"�4�:�<��=�=�L���l�4�:�<�3D�&D�E�E�E�!�5�5�d�D�A�A�ArBN)r�r�r�r�rkrLr�r�rZrBr>r�r�ns^��������L�L�L�3�3�3�
���*	B�	B�	B�	B�	BrBr�c�,�eZdZdZd�Zd�Zd�Zdd�ZdS)r,z=
    Class for retrieve statistics data using two tables
    c�Z�tj|g|�Ri|��tdz|_|�t|j�����t|i|��|_t|i|��|_
|jjduo|j|_
|j
r|���|_dSdS)Nrt)rM)r+rkr&�_alias�updaterIrMr��x60r��x1r$r=�_need_union�_select_union_queryrJr�s   r>rkzHistoryShowUnion.__init__�s�����T�3�D�3�3�3�F�3�3�3�2�W�<����
�
�d�d�o�6�6�6�7�7�7�"�D�3�F�3�3��� �$�1�&�1�1����8�-�T�9�Q�d�>Q�����	4��1�1�3�3�D�J�J�J�	4�	4rBc��|jr�|tvr�t|}ttt�|��}tt
t�|��}t
|jj|��}t
|jj|��}t
|jj|dz��}|�	|||��}|St�||��S)r�r�)r�rNr�rPr�r�r{rJr]r�r+r�)	rgr:r�r�r��column_limit�column_fault�
column_maxr�s	         r>r�z$HistoryShowUnion._aggregate_fun_case�s�����
	?��	� 1� 1�/��5�K� 5�k�)�/�/�RV�BW�BW�6X� Y�� 5�k�)�/�/�RV�BW�BW�6X� Y��"�4�:�<�1B�C�C�L�"�4�:�<�1B�C�C�L� ����{�V�/C�D�D�J��=�=��\�<�H�H�D��K��2�2�4��>�>�>rBc	��tj��5tjdtj���|j����t|jj	j
j�|j
j|j
j������}|�|j
�����}t#||j��}ddd��n#1swxYwY|S)z"
        union two tables
        �ignore)�categoryN)�warnings�catch_warnings�simplefilter�sa_exc�	SAWarningr�r�r2rrJr]r^r_r�r#r$�	union_allrr�)rg�union_querys  r>r�z$HistoryShowUnion._select_union_query�s���
$�
&�
&�	:�	:��!�(�V�5E�F�F�F�F��'�/�/�1�1�7�7��T�W�]�_�=T�=\�=\�]a�]e�]q�]a�]e�]o�>q�>q�9r�9r�s�s�K�%�/�/���0F�0F�0H�0H�I�I�K���T�[�9�9�K�	:�	:�	:�	:�	:�	:�	:�	:�	:�	:�	:����	:�	:�	:�	:��s�CC7�7C;�>C;Nc�h�|jrt|��St�|||���Sr�)r�rr+r�)rgr�r�s   r>r�zHistoryShowUnion._select_query�s8����	[��(�#�#�#��,�,�T�H�PY�,�Z�Z�ZrBr�)r�r�r��__doc__rkr�r�r�rZrBr>r,r,�se��������4�4�4�?�?�?� 
�
�
�[�[�[�[�[�[rBr,c��t��}|dkr$gd�}|�|dkr|�gd���nO|dkr$gd�}|�|dkr|�gd���n%|�#gd	�}|�|dkr|�gd
���|S)z�
    preparation list columns depending of the lve version
    :type mode: Union[None, str]
    :type lve_version: Union[None, int]
    �v1)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Nr0)r�r�r��v2)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�)r�r�r�)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�)r�r�r�r�r�)rJr�)r1�moder�s   r>r>r>�s����f�f�G��t�|�|�m�m�m����+��/�/��N�N�6�6�6�7�7�7��	
����Z�Z�Z����+��/�/��N�N�6�6�6�7�7�7��	
��/�/�/����+��/�/��N�N�H�H�H�I�I�I��NrBr�)\�
__future__rr�
past.builtinsr�builtinsrrr�r�rFr�rsr�distutils.utilr�
sqlalchemyr	r
rr	r�sqlalchemy.sqlr
rrrrrr�sqlalchemy.sql.expressionrrrrr�lvestats.core.pluginr�lvestats.lib.commons.dateutilrrrrrr�lvestats.lib.commons.sizeutilr r!r"�lvestats.ormr#r$r%r&�lvestats.lib.commons.funcr'r(�lvestats.lib.configr)r*�__all__r.rArGrRrV�objectr-r�rE�usage_to_limit_dictr�rOrPr�rQrNr	rJ�keys�keyr
rrrrr,r+r�r�r,r>rZrBr>�<module>r%s���'�&�&�&�&�&�������$�$�$�$�$�$���������������������
�
�
�
���������$�$�$�$�$�$�%�%�%�%�%�%�%�%�$�$�$�$�$�$�������D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�L�L�L�L�L�L�L�L�L�L�L�L�L�L�9�9�9�9�9�9�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�>�>�>�>�>�>�>�>�>�>�T�T�T�T�T�T�T�T�T�T�T�T�����������������
T�����3�3�3�
������"���z6�z6�z6�z6�z6�f�z6�z6�z6�z���<�L�L�N�N�f�l�l�n�n�
�L�L�N�N�f�l�l�n�n��M�M�O�O�g�m�m�o�o��M�M�O�O�g�m�m�o�o�	�K�K�M�M�e�k�k�m�m�	�K�K�M�M�e�k�k�m�m��M�M�O�O�g�m�m�o�o��M�M�O�O�g�m�m�o�o��N�N���h�n�n�&�&��N�N���h�n�n�&�&�	�K�K�M�M�e�k�k�m�m�	�K�K�M�M�e�k�k�m�m��M�M�O�O�g�m�m�o�o��M�M�O�O�g�m�m�o�o�)��.)��$�)�
�E�)��U�)�
�E�	)�
�X�)�
�4�
)�
�g�)��V�)��K�)�
�;�)��[�)��Y�)�
�:�)�
�h�)� �W�!)�$�[�%)�&�^�')�)�(
�;�))�*
�m�+)�,�K�-)�.
�:�/)�0�\�1)�4�E�5)�6
�5�7)�8�U�9)�:�X�;)�<
�4�=)�>
�g�?)�@�V�A)�D�e�E)�F
�e�G)�H�e�I)�J�h�K)�L
�g�M)�)�N��Q)�)�)��VM�L�L�
�L�L�L��L�L�L��L�L�L��L�L�L�	�,2�4��"P�"P���4�%�*�*�,�,�-�-�7�7�C�36�#�C�I�I�K�K�0�0�)�)�)��������K�K�L�	�]�]�^�	�2�2�3������,tp�tp�tp�tp�tp�&�tp�tp�tp�n
B%�B%�B%�B%�B%�[�B%�B%�B%�J.B�.B�.B�.B�.B�n�.B�.B�.B�b0[�0[�0[�0[�0[�{�0[�0[�0[�f�����rB

Hacked By AnonymousFox1.0, Coded By AnonymousFox