o
    d                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlZd dl	Z	d dl
Z
d dl	mZ d dlmZ eeZG dd dZG dd dZG d	d
 d
ZG dd dZG dd dZG dd dZdd Zdd Zdd ZG dd deZdS )    N)Enum)sleep)datetimec                   @   sf   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< eed	< eed
< dd ZdS )positionprdexchZinstnameZsymnameexdopttstrprcZbuyqtyZsellqtyZnetqtyc                 C   s   | j S N)__dict__self r   RD:\Janisar\Projects\Python\Genie\myGenie\trading\NorenRestApiPy\NorenApiWrapper.pyencode   s   zposition.encodeN)__name__
__module____qualname__str__annotations__intfloatr   r   r   r   r   r      s   
 r   c                   @   s   e Zd ZdZdZdZdZdS )ProductTypeCIMN)r   r   r   DeliveryZIntradayNormalZCFr   r   r   r   r   !   
    r   c                   @      e Zd ZdZdZdS )FeedType      N)r   r   r   	TOUCHLINE	SNAPQUOTEr   r   r   r   r!   (       r!   c                   @   s   e Zd ZdZdZdZdZdS )	PriceTypeMKTLMTSL-LMTSL-MKTN)r   r   r   ZMarketZLimitZStopLossLimitZStopLossMarketr   r   r   r   r'   -   r   r'   c                   @   r    )	BuyorSellBSN)r   r   r   ZBuyZSellr   r   r   r   r,   4   r&   r,   c                   @   s   e Zd ZdZdZdZdS )	AlertTypeLTP_A_OLTP_B_OZ	LMT_BOS_ON)r   r   r   Z	LTP_ABOVEZ	LTP_BELOWZLTP_OCOr   r   r   r   r/   8   s    r/   c                 C      t |  d S r   )loggerdebugmsgr   r   r   	reportmsg=      r7   c                 C   r2   r   )r3   errorr5   r   r   r   reporterrorB   r8   r:   c                 C   r2   r   )r3   infor5   r   r   r   
reportinfoG   r8   r<   c                   @   sx  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ZdZdZdi ddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCZdDdE ZdFdG ZdHdI ZdJdK ZddMdNZddOdPZddQdRZ	L	L	L	L	LddSdTZdUdV ZdWdX ZdYdZ Zd[d\ Zd]d^ Zej fd_d`Z!ej fdadbZ"dcdd Z#dedf Z$dgdh Z%didj Z&dkdl Z'	L	mddpdqZ(	mddrdsZ)dtdu Z*dvdw Z+dxdy Z,dzd{ Z-d|d} Z.d~d Z/dd Z0dddZ1dd Z2dd Z3dddZ4dddZ5dddZ6dddZ7dd Z8de9fddZ:dd Z;dd Z<dd Z=		m	L	n		dddZ>dd Z?dLS )NorenApir.   r-   r   r   r   r(   r)   r*   r+   r0   r1   Z	LTP_BOS_Or"   r#   zhttp://wsapihost/	authorizez
/QuickAuthlogoutz/Logoutforgot_passwordz/ForgotPasswordZchange_passwordz
/Changepwdwatchlist_namesz/MWList	watchlistz/MarketWatchwatchlist_addz/AddMultiScripsToMWwatchlist_deletez/DeleteMultiMWScrips
placeorderz/PlaceOrdermodifyorderz/ModifyOrdercancelorderz/CancelOrder	exitorderz/ExitSNOOrderproduct_conversionz/ProductConversion	orderbookz
/OrderBook	tradebookz
/TradeBooksingleorderhistoryz/SingleOrdHistsearchscripz/SearchScripz	/TPSeriesz/GetOptionChainz	/Holdingsz/Limitsz/PositionBookz/GetSecurityInfoz
/GetQuotesz	/SpanCalcz/GetOptionGreekz/EODChartDataz/PlaceGTTOrderz/GetPendingGTTOrderz/GetEnabledGTTsz/CancelGTTOrderz/PlaceOCOOrder)TPSeriesoptionchainholdingslimits	positions	scripinfo	getquotesspan_calculatoroption_greekget_daily_price_seriesplacegttgtt
enabledgtt	cancelgttZocogttzwss://wsendpoint/)hostrouteswebsocket_endpointc                 C   s^   || j d< || j d< d | _d| _t | _d | _d | _d | _d | _	d | _
i | _g | _g | _d S )Nr\   r^   F)_NorenApi__service_config_NorenApi__websocket_NorenApi__websocket_connected	threadingLock_NorenApi__ws_mutex_NorenApi__on_error_NorenApi__on_disconnect_NorenApi__on_open_NorenApi__subscribe_callback _NorenApi__order_update_callbackZ_NorenApi__subscribersZ!_NorenApi__market_status_messagesZ_NorenApi__exchange_messages)r   r\   	websocketr   r   r   __init__   s   



zNorenApi.__init__c              
   C   sv   | j  dkr9z
| jjddd W n ty+ } ztd|  W Y d }~nd }~ww td | j  dksd S d S )NF   z	{"t":"h"})Zping_intervalZping_payloadz*websocket run forever ended in exception, g?)_NorenApi__stop_eventis_setr`   run_forever	Exceptionr3   warningr   )r   er   r   r   Z__ws_run_forever   s   
zNorenApi.__ws_run_foreverc                 O   sZ   | j dkrtd | j dks| j | jj|i |}W d    |S 1 s&w   Y  |S )NFg?)ra   r   rd   r`   send)r   argskwargsretr   r   r   Z	__ws_send   s   


zNorenApi.__ws_sendc                 C   s,   t | t | d| _| jr|   d S d S NF)r7   ra   rf   )r   ZwsappZclose_status_codeZ	close_msgr   r   r   Z__on_close_callback   s   zNorenApi.__on_close_callbackNc                 C   sT   d| _ ddi}| j|d< | j|d< | j|d< d|d< t|}t| | | d S )	NTtcuidactid
susertokenAPIsource)ra   _NorenApi__username_NorenApi__susertokenjsondumpsr7   _NorenApi__ws_send)r   wsvaluespayloadr   r   r   Z__on_open_callback   s   



zNorenApi.__on_open_callbackc                 C   s*   t |tjur	|}| jr| | d S d S r   )typerj   WebSocketAppre   )r   r   r9   r   r   r   Z__on_error_callback   s
   zNorenApi.__on_error_callbackc                 C   s   t |}| jd ur0|d dks|d dkr| | d S |d dks)|d dkr0| | d S | jd urH|d dkrH|d dkrH| | d S | jd urZ|d d	krZ| | d S | jro|d dkrq|d dkrs|   d S d S d S d S )
Nrx   tktfZdkdfcksOKZom)r   loadsrh   re   ri   rg   )r   r   message	data_typeZcontinue_flagresr   r   r   Z__on_data_callback   s,   







zNorenApi.__on_data_callbackc                 C   s   || _ || _|| _|| _|| _t | _| jd j	| j
d}td	| tj|| j| j| j| jd| _tj| jd| _d| j_| j  dS )z4 Start a websocket connection for getting live data r^   )access_tokenzconnecting to {})Zon_dataon_errorZon_closeon_open)targetTN)rg   rf   re   rh   ri   rb   Eventrm   r_   formatr   r7   rj   r   _NorenApi__on_data_callback_NorenApi__on_error_callback_NorenApi__on_close_callback_NorenApi__on_open_callbackr`   Thread_NorenApi__ws_run_forever_NorenApi__ws_threaddaemonstart)r   Zsubscribe_callbackZorder_update_callbackZsocket_open_callbackZsocket_close_callbackZsocket_error_callbackurlr   r   r   start_websocket   s&   

	zNorenApi.start_websocketc                 C   s6   | j dkrd S | j  d| _ | j  | j  d S rw   )ra   rm   setr`   closer   joinr   r   r   r   close_websocket	  s   


zNorenApi.close_websocketc                 C   s  t j}|d  |d d  }t| t|d }	d||}
t|
d }ddd}||d	< |	|d
< ||d< ||d< ||d< ||d< dt	| }td|  t
j||d}td|j  t|j}|d dkrsd S || _|| _|| _|d | _|S )Nr\   r]   r>   zutf-8z{0}|{1}r}   z1.0.0)r~   Z
apkversionrz   pwdfactor2ZvcZappkeyimeijData=Req:dataReply:statOkr|   )r=   r_   r7   hashlibsha256r   	hexdigestr   r   r   requestsposttextr   r   _NorenApi__accountid_NorenApi__passwordr   )r   useridpasswordtwoFAvendor_code
api_secretr   configr   r   Z	u_app_keyZapp_keyr   r   r   resDictr   r   r   login  s2   

zNorenApi.loginc                 C   s0   || _ || _|| _|| _t| d| j  dS )Nz session set to : T)r   r   r   r   r7   )r   r   r   	usertokenr   r   r   set_session7  s   zNorenApi.set_sessionc           
      C   s   t j}|d  |d d  }t| ddi}||d< ||d< ||d< d	t| }td
|  tj||d}td|j  t|j}	|	d dkrLd S |	S )Nr\   r]   r@   r~   r}   rz   pandobr   r   r   r   r   r   )	r=   r_   r7   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   r   r   r   r@   B  s   zNorenApi.forgot_passwordc                 C   s   t j}|d  |d d  }t| ddi}| j|d< dt| d| j  }t| tj||d	}t|j	 t
|j	}|d
 dkrGd S d | _d | _d | _d | _|S )Nr\   r]   r?   ordersourcer}   rz   r   &jKey=r   r   r   )r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   \  s"   

zNorenApi.logoutc                 C   st   i }|t jkrd|d< n|t jkrd|d< nt||d< t|tkr*d||d< n||d< t|}| 	| d S )Nrx   d#k)
r!   r$   r%   r   r   listr   r   r   r   r   
instrumentZ	feed_typer   r   r   r   r   	subscribex  s   




zNorenApi.subscribec                 C   sf   i }|t jkrd|d< n	|t jkrd|d< t|tkr#d||d< n||d< t|}| | d S )Nurx   Zudr   r   )	r!   r$   r%   r   r   r   r   r   r   r   r   r   r   unsubscribe  s   



zNorenApi.unsubscribec                 C   s2   ddi}| j |d< t|}t| | | d S )Nrx   or{   )r   r   r   r7   r   )r   r   r   r   r   r   subscribe_orders  s
   

zNorenApi.subscribe_ordersc                 C   s   t j}|d  |d d  }t| ddi}| j|d< dt| d| j  }t| tj||d	}t|j	 t
|j	}|d
 dkrGd S |S )Nr\   r]   rA   r   r}   rz   r   r   r   r   r   r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   r   get_watch_list_names  s   

zNorenApi.get_watch_list_namesc                 C   s   t j}|d  |d d  }t| ddi}| j|d< ||d< dt| d	| j  }t| tj||d
}t|j	 t
|j	}|d dkrKd S |S )Nr\   r]   rB   r   r}   rz   wlnamer   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   get_watch_list  s   

zNorenApi.get_watch_listc           	      C      t j}|d  |d d  }t| ddi}| j|d< ||d< t|tkr.d||d	< n||d	< d
t| d| j	  }t| t
j||d}t|j t|j}|d dkr]d S |S )Nr\   r]   rC   r   r}   rz   r   r   scripsr   r   r   r   r   r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   	r   r   r   r   r   r   r   r   r   r   r   r   add_watch_list_scrip  "   

zNorenApi.add_watch_list_scripc           	      C   r   )Nr\   r]   rD   r   r}   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   delete_watch_list_scrip  r   z NorenApi.delete_watch_list_scrip        DAYNOc                 C   sp  t j}|d  |d d  }t| ddi}| j|d< | j|d< ||d< ||d	< ||d
< tj||d< t||d< t||d< ||d< t||d< t|	|d< |
|d< ||d< ||d< |dkrqt||d< |dkrqt||d< |dkrt||d< t||d< |dkrt||d< dt	
| d| j  }t| tj||d}t|j t	|j}|d dkrd S |S )Nr\   r]   rE   r   r}   rz   r{   trantyper   r   tsymqtydscqtyprctypprctrgprcrv   remarksamoHblprcr   trailprcr-   bpprcr   r   r   r   r   r=   r_   r7   r   r   urllibparse
quote_plusr   r   r   r   r   r   r   r   )r   buy_or_sellproduct_typeexchangetradingsymbolquantitydiscloseqty
price_typepricetrigger_price	retentionr   r   bookloss_pricebookprofit_pricetrail_pricer   r   r   r   r   r   r   r   r   place_order  sF   


zNorenApi.place_orderc                 C   sN  t j}|d  |d d  }t| ddi}| j|d< | j|d< t||d< ||d	< tj||d
< t||d< ||d< t||d< |dksK|dkr\|d krVt||d< nt	d d S |dkrft||d< |
dkrpt|
|d< |	dkrzt|	|d< dt
| d| j  }t| tj||d}t|j t
|j}|d dkrd S |S )Nr\   r]   rF   r   r}   rz   r{   
norenordnor   r   r   r   r   r*   r+   r   ztrigger price is missingr   r   r   r   r   r   r   r   r   )r=   r_   printr   r   r   r   r   r   r:   r   r   r   r7   r   r   r   r   )r   ordernor   r   ZnewquantityZnewprice_typeZnewpriceZnewtrigger_pricer   r   r   r   r   r   r   r   r   r   r   r   modify_orderD  s>   


zNorenApi.modify_orderc                 C      t j}|d  |d d  }t| ddi}| j|d< t||d< dt| d	| j  }t| t	j
||d
}t|j t|j}|d dkrMd S |S )Nr\   r]   rG   r   r}   rz   r  r   r   r   r   r   r=   r_   r  r   r   r   r   r   r7   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   cancel_orderu     

zNorenApi.cancel_orderc           	      C   s   t j}|d  |d d  }t| ddi}| j|d< ||d< ||d< d	t| d
| j  }t| tj	||d}t|j
 t|j
}|d dkrOd S |S )Nr\   r]   rH   r   r}   rz   r  r   r   r   r   r   r   )r=   r_   r  r   r   r   r   r7   r   r   r   r   )	r   r  r   r   r   r   r   r   r   r   r   r   
exit_order  s   

zNorenApi.exit_orderc                 C   s   t j}|d  |d d  }	t|	 ddi}
| j|
d< | j|
d< ||
d< tj||
d	< t||
d
< ||
d< ||
d< ||
d< ||
d< dt	
|
 d| j  }t| tj|	|d}t|j t	|j}|d dkrndS |S )zV
        Coverts a day or carryforward position from one product to another. 
        r\   r]   rI   r   r}   rz   r{   r   r   r   r   Zprevprdr   Zpostyper   r   r   r   r   N)r=   r_   r  r   r   r   r   r   r   r   r   r   r7   r   r   r   r   )r   r   r   r   Znew_product_typeZprevious_product_typer   Z	day_or_cfr   r   r   r   r   r   r   r   r   position_product_conversion  s*   


z$NorenApi.position_product_conversionc                 C   s   t j}|d  |d d  }t| ddi}| j|d< ||d< dt| d	| j  }t| tj	||d
}t|j
 t|j
}t|tkrKd S |S )Nr\   r]   rL   r   r}   rz   r  r   r   r   )r=   r_   r  r   r   r   r   r7   r   r   r   r   r   r   r  r   r   r   single_order_history  s   

zNorenApi.single_order_historyc                 C      t j}|d  |d d  }t| ddi}| j|d< dt| d| j  }t| tj||d	}t|j	 t
|j	}t|tkrGd S |S )
Nr\   r]   rJ   r   r}   rz   r   r   r   r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   get_order_book     

zNorenApi.get_order_bookc                 C   s   t j}|d  |d d  }t| ddi}| j|d< | j|d< dt| d	| j  }t| tj	||d
}t|j
 t|j
}t|tkrLd S |S )Nr\   r]   rK   r   r}   rz   r{   r   r   r   r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   get_trade_book   s   


zNorenApi.get_trade_bookc           	      C   s   t j}|d  |d d  }t| |d krtd d S i }| j|d< ||d< tj||d< dt	| d	| j
  }t| tj||d
}t|j t|j}|d dkr[d S |S )Nr\   r]   rM   zsearch text cannot be nullrz   r   Zstextr   r   r   r   r   )r=   r_   r7   r:   r   r   r   r   r   r   r   r   r   r   r   )	r   r   Z
searchtextr   r   r   r   r   r   r   r   r   rM     s$   

zNorenApi.searchscripc                 C   s   t j}|d  |d d  }t| i }| j|d< ||d< tj||d< t||d< t||d< d	t	| d
| j
  }t| tj||d}	t|	j t|	j}
|
d dkr]d S |
S )Nr\   r]   rO   rz   r   r   r
   cntr   r   r   r   r   )r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   Zstrikepricecountr   r   r   r   r   r   r   r   r   get_option_chain9  s"   

zNorenApi.get_option_chainc           	      C      t j}|d  |d d  }t| i }| j|d< ||d< ||d< dt| d| j  }t| tj||d	}t|j	 t
|j	}|d
 dkrMd S |S )Nr\   r]   rS   rz   r   tokenr   r   r   r   r   r   	r   r   r  r   r   r   r   r   r   r   r   r   get_security_infoU     

zNorenApi.get_security_infoc           	      C   r  )Nr\   r]   rT   rz   r   r  r   r   r   r   r   r   r  r   r   r   
get_quoteso  r  zNorenApi.get_quotesc                 C   s  t j}|d  |d d  }t| |dkr)tdd }t|d}	t|	}dd	i}
| j|
d
< ||
d< ||
d< t||
d< |dkrJt||
d< |dkrTt||
d< dt	
|
 d| j  }t| tj||d}t|j t	|j}t|tkrdS |S )zj
        gets the chart data 
        interval possible values 1, 3, 5 , 10, 15, 30, 60, 120, 240
        r\   r]   rN   Nz%d-%m-%Yz	 00:00:00z%d-%m-%Y %H:%M:%Sr   r}   rz   r   r  stetZintrvr   r   r   )r=   r_   r7   timestrftimestrptimemktimer   r   r   r   r   r   r   r   r   r   r   )r   r   r  Z	starttimeendtimeintervalr   r   Z
timestringZtimeobjr   r   r   r   r   r   r   get_time_price_series  s0   


zNorenApi.get_time_price_seriesc                 C   s&  t j}|d  |d d  }t| |d kr-tj tjdd }t|tj	
  }|d kr7t  }i }| j|d< d|||d< t||d	< t||d
< dt| d| j  }	t|	 ddi}
tj||	|
d}t| |jdkrzd S t|jdkrd S t|j}t|tkrd S |S )Nr\   r]   rW      )daysrz   z{0}:{1}symfromtor   r   zContent-Typezapplication/json; charset=utf-8)r   headers   r   )r=   r_   r7   r   datetoday	timedeltadtcombineminr  	timestampnowr   r   r   r   r   r   r   r   status_codelenr   r   r   r   )r   r   r   Z	startdateZenddater   r   Zweek_agor   r   r*  r   r   r   r   r   rW     s4   

zNorenApi.get_daily_price_seriesc                 C   s   t j}|d  |d d  }t| |d krtj}i }| j|d< | j|d< ||d< dt| d| j	  }t| t
j||d	}t|j t|j}t|tkrUd S |S )
Nr\   r]   rP   rz   r{   r   r   r   r   )r=   r_   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   get_holdings  s"   


zNorenApi.get_holdingsc           
      C   s   t j}|d  |d d  }t| i }| j|d< | j|d< |d kr'||d< |d kr/||d< |d kr7||d< d	t| d
| j  }t| tj	||d}t|j
 t|j
}	|	S )Nr\   r]   rQ   rz   r{   r   segr   r   r   r   )r=   r_   r7   r   r   r   r   r   r   r   r   r   )
r   r   segmentr   r   r   r   r   r   r   r   r   r   
get_limits  s$   


zNorenApi.get_limitsc                 C   s   t j}|d  |d d  }t| i }| j|d< | j|d< dt| d| j  }t| tj	||d}t|j
 t|j
}t|tkrJd S |S )	Nr\   r]   rR   rz   r{   r   r   r   r  r   r   r   r   get_positions  s   


zNorenApi.get_positionsrR   c                 C   s   t j}|d  |d d  }t| i }| j|d< ||d< dtj|dd d	 d
| j  }t| tj||d}t|j	 t
|j	}|S )Nr\   r]   rU   r{   posr   c                 S   s   |   S r   )r   )r   r   r   r   <lambda>@  s    z*NorenApi.span_calculator.<locals>.<lambda>)defaultr   r   r=   r_   r7   r   r   r   r   r   r   r   r   )r   rR   r   r   Zsenddatar   r   r   r   r   r   rU   6  s    


zNorenApi.span_calculatorc                 C   s   t j}|d  |d d  }t| ddi}	| j|	d< ||	d< ||	d< ||	d	< ||	d
< ||	d< ||	d< dt|	 d| j  }
t|
 tj||
d}t|j	 t
|j	}|S )Nr\   r]   rV   r~   r}   r{   r   r
   ZsptprcZint_rateZ
volatilityr	   r   r   r   r>  )r   Z
expiredateZStrikePriceZ	SpotPriceZInterestRateZ
VolatilityZ
OptionTyper   r   r   r   r   r   r   r   r   rV   K  s"   

zNorenApi.option_greekc                 C   r  )
Nr\   r]   rY   r   r}   rz   r   r   r   r  r   r   r   r   get_pending_gtt_ordersg  r  zNorenApi.get_pending_gtt_ordersc                 C   r  )
Nr\   r]   rZ   r   r}   rz   r   r   r   r  r   r   r   r   get_enabled_gtt_orders  r  zNorenApi.get_enabled_gtt_ordersGTTr   c                 C   s   t j}|d  |d d  }t| ddi}| j|d< | j|d< tj||d< ||d	< ||d
< ||d< t||d< |
|d< ||d< ||d< ||d< ||d< t||d< t|	|d< t||d< dt	
| d| j  }t| tj||d}t|j t	|j}|d dkrd S |d S )Nr\   r]   rX   r   r}   rz   r{   r   r   Zai_tvalidityr   r   r   r   r   rv   r   r   r   r   r   r   r   z
OI createdZal_idr   )r   r   r   Z
alert_typeZalert_pricer   r   r   r   r   r   r   rB  r   r   r   r   r   r   r   r   r   r   place_gtt_order  s6   


zNorenApi.place_gtt_orderc                 C   r  )Nr\   r]   r[   r   r}   rz   r  r   r   r   r   r   r  r  r   r   r   cancel_gtt_order  r	  zNorenApi.cancel_gtt_orderr   )NN)NNNN)NNNNN)r   Nr   r   Nr   r   r   )r   Nr   r   r   )r#   )NNN)r(   r   Nr   rA  r   )@r   r   r   ZTRANSACTION_TYPE_SELLZTRANSACTION_TYPE_BUYZPRODUCT_TYPE_INTRADAYZPRODUCT_TYPE_DELIVERYZPRODUCT_TYPE_NORMALZPRICE_TYPE_MARKETZPRICE_TYPE_LIMITZPRICE_TYPE_STOPLOSS_LIMITZPRICE_TYPE_STOPLOSS_MARKETZALERT_TYPE_ABOVEZALERT_TYPE_BELOWZALERT_TYPE_OCOZFEED_TYPE_TOUCHLINEZFEED_TYPE_SNAPSHOTr_   rk   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  rM   r  r  r  r$  rW   r6  r9  r:  r   rU   rV   r?  r@  rC  rD  r   r   r   r   r=   L   s    	
"(



&	
7
1$


+
-
#
3r=   )r   r   rb   rj   loggingenumr   r   r   r  r   r   r/  	getLoggerr   r3   r   r   r!   r'   r,   r/   r7   r:   r<   objectr=   r   r   r   r   <module>   s.    
