
    kiW                        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m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 d dlmZmZmZ d d	lmZ  ej        d
e           dZdZdZdZdZdZdddZdZ d Z! e!ed          pd"                                #                                Z e!ed          Z e!ed          Z e!ed          Z e!ed          Z e!ed          Z e!e d          pe Z 	 e j$        %                    d          Z&e j$        %                    d          Z'e&e&dk    r e(e&          ed<   e'e'dk    r e(e'          ed<   n# e)$ r Y nw xY w e!e d          pe Z e j$        %                    dd          Z*e j$        %                    d d          Z+g d!Z,d" e,D             Z-d# Z. G d$ d%          Z/d& Z0d' Z1d( Z2d) Z3d* Z4d+ Z5d, Z6d- Z7d. Z8e9d/k    r%epd"                                #                                Z:dZ;dZ<eVeT e=e          "                                dk    s! e=e          "                                dk    r e2ee          Z>e>re>Z;d0Z<e;sMe:d1k    r$ e0            p e1eee          Z;e;re:d1k    rd2nd3Z<n# e2ee          p e1eee          Z;e;reserd4nd3Z<e;s e?d5           dS  ej@                    dcZAZB	  ed6          ZBnC# e)$ r;  e?d7            ed6          ZBn!# e)$ rZC e?d8eC d9           Y dZC[CndZC[Cww xY wY nw xY w ejD        e;d:         e;d;                   ZE ejF        e;d<                   ZG ejH        eG          ZHeAI                    eH          ZJ e?d=e;d>          d?eHK                    d@           dA           	 dB eL            v re<re<ndCZMn# e)$ r dCZMY nw xY wdDeM gZNe*reNO                    dEe*            e+reNO                    dFe+             e?dGdHP                    eN          z   dIz               e/e;d:         e;d;         e;d<         e ed         ed         J          Q                    eH          ZRdK dLdMdNdOdPdQdRS                                D             ZTg g cZUZVeBrT e3eBeEeAeJeG          ZWdS dTdUdVdWdXdYS                                D             ZU e4eBeEeAeHX                                eG          ZVdZ ZY eYeTeH          ZZ eYeUeH          Z[ eYeVeH          Z\ e?d[           eTD ]AZ] e?d\eZre]d]         eZd]         k    rd^nd_ e]d`         dadb e5e]d]                               BeBr e?dc           eUD ]AZ] e?d\e[re]d]         e[d]         k    rd^nd_ e]d`         dddb e5e]d]                               BeVr} e^de eVD             df dg          Z_e_re_d`         dhk    rdindjZ` e?dke`            eVD ]AZa e?d\e\read]         e\d]         k    rd^nd_ ead`         dddb e5ead]                               BeBdl         eEz   b                    eJ          c                    eBdm                   d                                Zdede                                \  ZfZgZh e?dn            e?doegji        dpdq            e?drefji        dpdq            e?dsehjj        dtdu           dv Zk ejl        eJeAI                    eH edwx          z              ejm        eB                    \  ZnZo ep eqdy  ereneo          D             S                                          dz {          Zs e?d|           esrK etesdd}                   D ]7\  Zu\  ZvZX e?d~eud k    rd^nd_ evddbeXK                    d                      8 e?d            e6eBdeJ          \  ZwZx e6eBdmeJ          \  ZyZzew e7ewexeBeAd          ndZ{ey e7eyezeBeAdm          ndZ| e8eBeA          Z}e{rD e?dewdpdHexdpde{d                      e?de{d                      e?de{d                     e|rD e?deydpdHezdpde|d                      e?de|d                      e?de|d                      e?ddHP                    e}d                   z               e?ddHP                    e}d                   z              n e?d            e?d           dS dS )    N)datetime	timedelta)	Nominatim)TimezoneFinder)loadwgs84)almanac)itrs)GeocoderUnavailableGeocoderTimedOutGeocoderServiceError)RequestsDependencyWarningignore)category MoscowIdahoUSAg      2@)fajrishahanafic                 L    t           j                            |          }|| S |S N)osenvironget)orignamevs      try.py_env_orr!   "   s$    

tAyH    LOCATION_MODECITYSTATECOUNTRYLATITUDE	LONGITUDEMADHABPRAYER_METHOD_ANGLES_FAJRPRAYER_METHOD_ANGLES_ISHAr   r   GEOIP_DETECTED_IP
GEOIP_NOTE))TokyoJapangK7AA@g	h"va@i77;)z	New DelhiIndiag(<@gL7A`MS@ie)ShanghaiChinag~:?@g_Q^^@i0)u
   São PauloBrazilgrh7gEGrQGiYM)Mumbair0   g~jt3@g<,8R@i3)Beijingr2   gZӼC@gs]@i1)CairoEgyptgAc]>@gΪV<?@ie8)Dhaka
Bangladeshgo7@gfffffV@i5)zMexico CityMexicog?߾n3@gJYXiJ)Osakar/   g^)XA@gs`@iP%)KarachiPakistangΪV8@gP@iH0 )	Chongqingr2   g㥛 =@gOjMZ@iH )IstanbulTurkeyg镲D@g
h"lx<@iS )zBuenos Aires	Argentinag0L
FMAgD0Mih )Kolkatar0   g镒6@g9#JV@i$ )KinshasaCongogh og=yX.@i )LagosNigeriagHP@gF%u@i( )ManilaPhilippinesgm2-@gI.!>^@i )Tianjinr2   g$C@gSt$W]@i h )zRio de Janeiror3   gGx$6g<R!EiC )	Guangzhour2   g镲!7@gCP\@i )r   Russiag(K@g;MB@io~ )Shenzhenr2   g%u6@g3\@i )Lahorer=   g48?@gDR@i` )	Bangalorer0   gS!u)@g(fS@iQ )ParisFrancegvmH@g5;N@i( )BogotaColombiagMb@gQIRiu )Jakarta	Indonesiagͪg_vOZ@i7X )Chennair0   g'W**@g&ST@i( )LimaPerug(g46<BSix )BangkokThailandg9+@gH} Y@i )zNew Yorkr   g^K=[D@gMbRi' )LondonUKg{I@g6[i )SeoulzSouth KoreagnB@g;O_@i+ )Nagoyar/   gZd;A@g a@iԑ )zHo Chi Minh CityVietnamgڬ\m%@g:MZ@i8 )TehranIrang37A@goʱI@i )z	Hong Kongr2   gQ6@gPs׊\@i(er )zLos Angelesr   glV}A@gAǘ]i< )MadridSpaing|гY5D@geaiPYe )	Singaporerc   g3?gPkwY@iDY )SantiagoChilegS!u@gͪժQif )RiyadhSaudi ArabiaglV}8@g~:pVG@iLj )zSaint PetersburgrK   gH.M@g\ Ac\>@i(R )Sydney	Australiaga4@g镲b@iQ )	Melbourneri   gGx$BgXb@i|M )BaghdadIraqg=yX@@gfc].F@i@m )TorontoCanadag߾E@gJYSiP, )BerlinGermanyg(\BJ@g(\*@iH7 )RomeItalygjMD@gx$((@i+ )Chicagor   gOeD@gUNUiJJ) )Houstonr   g=@g䃞ͪWi{# )Phoenixr   ga+e@@g~j\ipU )Philadelphiar   gC@g&SRi
, )Dallasr   gfjc@@g^I3Xi )zSan Franciscor   gV/B@gPsך^iiz )Bostonr   g.E@g oQi7
 )zWashington, D.C.r   g2w-!tC@g<Nё\BSi
 )Miamir   g\m9@gׁsFTi/ )Atlantar   gZd;@@gFUi )Seattler   gj+G@g[ A^i] )Denverr   gC@gN@a?Zi
 )	Vancouverrn   g#J{/H@g$(~^iM
 )Montrealrn   g37F@gUNdRi ) )Calgaryrn   gǺI@gF%u\iO )Ottawarn   gˡEF@g[Ri. )JohannesburgSouth Africag?4:gQ<@iU )z	Cape Townr   g	c@g;Nёl2@ia}D )NairobiKenyagꕲqgJ4iB@iC )zAddis AbabaEthiopiag(\"@gQ^C@i3 )
CasablancaMoroccog6>W[@@g$[iJD3 )AccraGhanag|a2U0j@gV-ǿi" )AlgiersAlgeriag33333cB@g-x@ipe) )TunisTunisiagZd;gB@grh\$@i}	 )AucklandNew ZealandgS㥛lBg-!le@iH )
Wellingtonr   g&1Dgae@i> )Perthri   gS?gPn\@il )Brisbaneri   g*Dx;g&䃞 c@i@" )Adelaideri   g+vAg48Sa@i )Canberrari   g$Ag\(b@iЂ )Honolulur   gt$N5@gŏ1wci0^ )	ReykjavikIcelandgea	P@g5;N5i )HelsinkiFinlandgHN@g ~:8@iJ	 )OsloNorwayg>٬M@g7[ %@i
 )	StockholmSwedengRI&M@goŏ2@i  )
CopenhagenDenmarkgiqK@g47")@i,	 )DublinIrelandg?ƬJ@g_L
ikM )	AmsterdamNetherlandsg;M/J@g Ac̝@i* )BrusselsBelgiumgalI@gGx$h@ir )ViennaAustriag{/LH@g>W[_0@i( )PraguezCzech Republicgl	I@g`TR',@iH )WarsawPolandg<Nё\I@go3@iR )BudapestHungarygV/G@gLJ
3@i޼ )KievUkrainegu9I@gڊ>@i3- )	BucharestRomaniagfa6F@g
ףp=:@i )AthensGreeceg(B@g
ףp=7@i!
 )LisbonPortugalgMSt\C@ge`TRG"i )GenevaSwitzerlandgy)G@g&S@iZ )	Frankfurtrp   g.1I@g46<]!@i} )Munichrp   gEJH@gDl)'@i v )	Barcelonarb   gEJD@g	c@iw )z	Abu DhabiUAEgW2t8@gc]K0K@i )AbujarF   gI+'"@g0*@i )AmmanJordangW2?@gjqA@if&= )Ankarar@   gyC@g/L
n@@iS )Antananarivo
MadagascargN@2g G@iGu )AsuncionParaguaygׁC9gXLi )Baku
Azerbaijang\ Ac4D@gI.!H@il" )BamakoMalig48EG)@gQ| ie) )BanguizCentral African Republicg<,@g12@i )BeirutLebanong	h@@g ~:A@i )BelgradeSerbiagMOdF@g,Cr4@i )Bernr   gMbXyG@g9#@i
 )
BratislavaSlovakiag&SH@gz):1@iݭ )BrazzavillerD   gǺgec]|.@i )ChisinauMoldovagMbXG@gH.!<@i!  )DakarSenegalgjMn-@gV/w1i| )DamascusSyriagW2@@gZd#B@i )zDar es SalaamTanzaniagfj+gC@iB )DilizTimor-LestegY !g)Ǻd_@isd )Djiboutir   g!rh-'@g(\E@iP )DohaQatargxF9@g(\I@iX$ )Dubair   g8m49@gK@i/ )Dushanbe
Tajikistang&GC@g|?5^2Q@i@ )	Edinburghr[   gnK@gı.n	irr )FreetownzSierra Leonegd]F @ghsu*i )	Fortalezar3   g	cgfjCCi( )GaboroneBotswanagXѠ8gHP9@i )
GeorgetownGuyanag#4@gQMia )zGuatemala City	GuatemalaguE-@gꕲqViz. )Hanoir^   g,Ԛ5@gecuZ@i(v )HarareZimbabwegN@1gjt?@i )HavanaCubag[Ӽ7@g_vTiO  )JubazSouth SudangǺp@gn4@?@i )KabulAfghanistangGA@gzGMQ@i0l@ )KampalaUgandag??g(\J@@i )	KathmanduNepalgPk;@g~jTU@i )KhartoumSudang6[ /@g䃞ͪG@@izP )KigaliRwandag%ugV>@i )KingstonJamaicag-1@gn2Si
 )zKuwait CityKuwaitg ~:`=@g"uqG@iț- )zLa PazBoliviag٬\}0gkwQi )
LibrevilleGabong&S?gsA"@i
 )LilongweMalawig[B>+gs@@i )	LjubljanaSloveniag:HG@g47-@iV )LomeTogo^)@gǘ?i= )LuandaAngolag o_!g<,*@iU>' )LusakaZambiagfffff.g&SR<@iШ )
Luxembourgr  gHH@r  i )MalabozEquatorial Guineag?ܵ@gΪV!@i( )MaleMaldivesgʡE@g_`R@i$	 )Managua	Nicaraguag{G:(@g,ԚUi )ManamaBahraing"~::@g^IKI@i"g )Maputo
MozambiquegH}9g^I@@i )MaseruLesothogXP=g	h"|;@i )MbabaneEswatinig2ı.N:g\m"?@i	 )Meccarg   g߾c5@gͪC@i( )MinskBelarusgJ@g9v;@i )	MogadishuSomaliaguq` @g)ǺF@i p$ )Monacor  g%E@gWʲ@i  )MonroviaLiberiagg3@gHPs%iB )
MontevideoUruguaygz6>WsAgVLi  )MoroniComorosg&g'gJYE@i  )MuscatOmangڊ7@g 1M@ia )z	N'DjamenaChadgi oE(@g?ܵ.@i( )NassauBahamasgy&19@g?߾VSi/ )	NaypyidawMyanmargl	g3@g/$X@i )NiameyNigerggDio+@gX @i )NicosiaCyprusgA@gb4@@iS )
Nouakchott
MauritaniagA`2@g0/i )z
Nuku'alofaTongag2U0*#5gǺeiZ  )z
Nur-Sultan
Kazakhstang1殕I@g(Q@iU )OuagadougouzBurkina Fasogx$((@g{Pio% )zPanama CityPanamagI.!!@g0L
FSi3p )
ParamariboSurinameg rh@g`vOKi )z
Phnom PenhCambodiag"u'@gl	g;Z@i}  )	Podgorica
MontenegrogeX7E@g	hB3@iM )z
Port Louis	Mauritiusg)0)4g`TR'L@iB )zPort MoresbyzPapua New Guineag "g oeb@i] )zPort-au-PrinceHaitig 	2@gݓRi )zPort of SpainzTrinidad and TobagogsAO%@gb=NitF  )z
Porto-NovoBeningZ@gI+@i )Praiaz
Cabo VerdegV--@gl	g7i )Pretoriar   g_v9g	g:<@iQ )	PyongyangzNorth Koreagi oC@gp_@i+ )QuitoEcuadorgŏ1w-!ǿggDioSi6 )Rabatr   gB>٬A@g Ac]i# )RigaLatviag$(~yL@g	c8@i&	 )RoseauDominicagё\C.@gR'Ni9  )zSan Josez
Costa RicagV/#@go_Ui )zSan JuanzPuerto Ricogo_w2@gÆPi8 )
San MarinorD  g-E@g7d(@is  )zSan SalvadorzEl Salvadorgb+@g.!MVi )zSana'aYemengH.!.@g rF@ih& )zSanto DomingozDominican Republicgꕲq|2@gAǘ{Qi )zSao TomezSao Tome and PrincipegK7?ga2U0*@i )SarajevozBosnia and HerzegovinagK=E@gDi2@iD4 )SkopjezNorth MacedoniagD@g鷯l5@i. )SofiaBulgariag5;NYE@g	hR7@iK )zSri Jayawardenepura Kottez	Sri Lankag$@g"S@ir )Sucrer   gi o3g7PPi )SuvaFijig?$2gGx$Nf@iX )TaipeiTaiwang r9@g#J{/d^@i`( )TallinnEstoniag-M@gC8@i )Tashkent
UzbekistanguVD@gAc]OQ@i% )TbilisiGeorgiagOeD@gBiiF@iS )TegucigalpaHondurasgi o%,@gc]KUi )ThimphuBhutang~k	y;@g7A`hV@iw )TiranaAlbaniagRD@g6<R3@ib )Tiraspolr   gjMkG@g?5^I=@i
 )TripoliLibyagoŏq@@gsa*@ip. )UlaanbaatarMongoliagH}G@g#Z@i )VaduzLiechtensteing5^IG@g^I#@i@  )VallettaMaltag/'A@gy-@i,  )Victoria
Seychellesgt$~g`"۹K@iRg  )	VientianeLaosg$(~1@gd`Y@i  )Vilnius	Lithuaniagj+WK@gPkG9@i9 )WindhoekNamibiaga46g_L1@id )Yamoussoukrou   Côte d'Ivoiregc]KH@g!uqi> )YaoundeCameroongbX9@gN@'@i0* )YerevanArmeniagD@g@?F@iXj )ZagrebCroatiagQF@gǘ/@iM c                 R    i | ]$}|d           d|d          |d         |d         f%S )r   ,           .0cs     r    
<dictcomp>r|     s<    	@	@	@aQqT

QqT

adAaD\	@	@	@r"   c                    d}t          j        |           t          j        |          }}t          j        t          j        || z
            dz            dz  t          j        |          t          j        |          z  t          j        t          j        ||z
            dz            dz  z  z   }d|z  t          j        t          j        |                    z  S )z4Calculates the distance between two points on Earth.g     @rv  )mathradianssincosasinsqrt)lat1lon1lat2lon2Rphi1phi2as           r    haversine_kmr     s    AT\$//d1C1CddTk**1,--q048D>>$(4..3PQUQYZ^ZfgknrgrZsZstuZuQvQvxyQy3yyAq549TYq\\****r"   c                   2    e Zd ZdZd Zd Zd Zd	dZd ZdS )
LocalPrayerCalculatorz.Calculates prayer times from first principles.c                 ^    |||c| _         | _        | _        |||c| _        | _        | _        d S r   )latlontz_strmadhab
fajr_angle
isha_angle)selflatitude	longitudetimezone_strr  r  r  s          r    __init__zLocalPrayerCalculator.__init__   s2    *2I|'$(DK8>
J5T_dooor"   c           
      r    |t          ddddddt          j                  z
                                  dz  S )Ni  ru     r   tzinfog     @)r   pytzutctotal_seconds)r  dts     r    _get_julian_datez&LocalPrayerCalculator._get_julian_date   s8    XdAq"a48DDDDSSUUX___r"   c           
      P   dd|z  z   dz  }dd|z  z   dz  }|dt          j        t          j        |                    z  z   dt          j        t          j        d|z                      z  z   dz  }d	d
|z  z
  }t          j        t          j        t          j        t          j        |                    t          j        t          j        |                    z  t          j        t          j        |                                        }t          j        t          j        t          j        t          j        |                    t          j        t          j        |                    z                      }|dz  |dz  z
  }|dz  dk    r|dz  dk     r|dz  }||fS )Ngŏ1wXv@g0	?h  gMbXq@gUl?gp=
ף?g{Gz?rv  gMbp7@gv(>      .@         )r~  r  r  degreesatan2r  r  )	r  julian_datemean_solar_anomalymean_longitudeecliptic_longitude	obliquityright_ascensiondeclinationequation_of_times	            r    _calculate_sun_positionz-LocalPrayerCalculator._calculate_sun_position   s   &k)AASH!J$<<C,utxM_@`@`7a7a/aadilpltuy  vB  CD  GY  CY  vZ  vZ  m[  m[  e[  [  _b  bZ+55	,tz$(4<	;R;R2S2SVZV^_c_kl~__  WA  WA  3A  CG  CK  LP  LX  Yk  Ll  Ll  Cm  Cm  (n  (n  o  ol49TXdl96M6M-N-NQUQYZ^ZfgyZzZzQ{Q{-{#|#|}}*T1o6LMT!R''_t-Cq,H,HJZ^`J`JZ,,,r"   Fc           	         t          j        | j                  t          j        |          t          j        |          }}}t          j        t          j        t          j        |          t          j        |          t          j        |          z  z
  t          j        |          t          j        |          z  z                      }n# t          $ r Y d S w xY w|r| }d| j        dz  z
  |z
  }	|	|dz  z   S )Nr  r  )	r~  r  r  r  acosr  r  
ValueErrorr  )
r  angler  eot
is_sunriselat_raddec_rad	angle_rad
hour_angletransits
             r    _calculate_time_from_anglez0LocalPrayerCalculator._calculate_time_from_angle   s   &*l48&<&<dl;>W>WY]YefkYlYl),ty$(92E2EQXHYHY\`\del\m\mHm2mrvrz  |C  sD  sD  GK  GO  PW  GX  GX  sX  2Y  (Z  (Z  [  [ZZ&&&$$$&/ZKz4(3.*t+,,s   BC 
CCc                     |                     t          j                   fd}                                                              \  }} j        dk    rdnd}t          j        t          j        d|t          j	        t          t          j         j        |z
                                z   z                      } |                      j         ||d                     |                     d||d                     |d j        d	z  z
  |z
             |                     |||                     |                     d||                     |                      j         ||                    d
S )Nc                     | d S                      ddd          t          |           z                       t          j        j                            S )Nr   )hourminutesecondhours)replacer   
astimezoner  timezoner  )utc_hourdt_utcr  s    r    to_localz@LocalPrayerCalculator.calculate_times_for_date.<locals>.to_local   si    NN!AN>>QYAZAZAZZffgkgtuy  vA  hB  hB  C  C  Cr"   r   rv  ru  T)r  g-r  r  r   sunrisedhuhrasrmaghribr   )r  r  r  r  r  r  r~  r  atantanabsr  r  r  r  r  r  )r  dt_localr  r  r  shadow_length	asr_angler  s   `      @r    calculate_times_for_datez.LocalPrayerCalculator.calculate_times_for_date   s   $$TX..	C 	C 	C 	C 	C 	C  778M8Mf8U8UVVS![H44!L1T\Z^ZbepZpMqMqIrIr@s@s0s+t!u!uvv	HT<<do=M{\_lp<qqrrx ? ?UXei ? j jkkXbDHtO4s:;;8D;;I{TWXXYYx ? ?UX Y YZZHT<<do=M{\_``aa
 
 	
r"   N)F)	__name__
__module____qualname____doc__r  r  r  r  r  rx  r"   r    r  r     sp        88W W W` ` `	- 	- 	-- - - -
 
 
 
 
r"   r  c                  ~   	 t          j        dd                                          } t          t          | d                             d                    \  }}t                      }|||                    ||          d|                     dd	           d
dS # t           j        j	        t          f$ r Y d S w xY w)Nzhttps://ipinfo.io/json   timeoutloc,lngr  zCurrent Location (cityUnknown)r  r  r  address)requestsr   jsonmapfloatsplitr   timezone_at
exceptionsConnectionError	Exception)datar  r  tfs       r    get_location_by_ipr     s    I|4a@@@EEGGud5k//4455Scr~~RU[^~?_?_  m`  BF  BJ  BJ  KQ  S\  B]  B]  m`  m`  m`  a  a  	a/;HHHDDDHs   BB B<;B<c                    |  d| }|t           v r:t           |         \  }}t                      }|||                    ||          |dS 	 t          d          }|                    |  d| d| d          }|rCt                      }|j        |j        |                    |j        |j                  |j        dS d S # t          t          f$ r Y d S w xY w)Nrt  r  r  cosmic_compass)
user_agentr  r  )
CITIESr   r  r   geocoder  r  r  r   r  )	r  statecountrycity_keyr  r  r  
geolocatorr  s	            r    get_location_by_addressr      s5   ##'##H6(#Scr~~RU[^~?_?_ltuuu:*:;;;
  D!>!>E!>!>W!>!> JJ 	c!!B #3=VXVdVdiliv|  }IVd  WJ  WJ  WZ  Wb  c  c  c	c 	c !),999TTT9s   A3C CCc                 v   t          | |t          |                                           t          |                                          f          sd S 	 t          |           t          |          }}t	                      }|                    ||          }|r|||d| d| ddS d S # t          $ r Y d S w xY w)Nr  zCoordinates (rt  r  r  )allstrstripr  r   r  r  )r  r  lat_flon_fr  r  s         r    get_location_by_coordsr    s    S#c((..**CHHNN,<,<=>>Ktt"Szz5::uEu55  	Du5f  bCqv  bC  bCz  bC  bC  bC  D  D  D  	D  	D!!!TTT!s   AB* *
B87B8c           	      N    |                               |                                                   dddd          }}|                    |t          d          z
            |                    |t          d          z             }}fdd d d d d d	 d }	t	          j        ||t	          j          d                             \  }
} |	fd	t          |
|          D             |           |	fd
t          |
|          D             |          cd<   d<   t	          j        ||t	          j          d                             \  }}|r#t          | fd          } |          d<    fd}d|_
        t	          j        |||          \  }}d         r.t          fdt          ||          D             d           d<   d         r.t          fdt          ||          D             d           d<   n# t          $ r Y nw xY wS )Nr   )r  r  r  microsecondrv  daysc                     |                                                      t          j                                                S Nr  utc_datetimer  r  r  r  ttzs    r    _to_dtz(calculate_moon_mysteries.<locals>._to_dt  3    !..**22$(2CCNNrRRRr"   )riser  set	ascent_45
descent_45c                     | sd S t          d          z   }| D ]}|cxk    r|k     rn |c S t          | fd          S )Nru  r
  c                 J    t          | t          d          z   z
            S )Nr  r  )r  r   )xstart_day_dts    r    <lambda>z?calculate_moon_mysteries.<locals>.choose_best.<locals>.<lambda>  s%    SlYUWEXEXEX6X1Y-Z-Z r"   key)r   min)eventsr  
end_day_dtes    `  r    choose_bestz-calculate_moon_mysteries.<locals>.choose_best  s{    &$$%	q(9(9(99J < <11111z11111!8881v#Z#Z#Z#Z[[[[r"   moonc                 0    g | ]\  }}| |          S rx  rx  rz  r  yr  s      r    
<listcomp>z,calculate_moon_mysteries.<locals>.<listcomp>   s+    <l<l<l41ajk<lVVAYY<l<l<lr"   c                 0    g | ]\  }}| |          S rx  rx  r'  s      r    r)  z,calculate_moon_mysteries.<locals>.<listcomp>   ss      G{  G{  G{  VZ  VW  YZ  yz  G{  HN  HN  OP  HQ  HQ  G{  G{  G{r"   r  r  c                     d         z                        |                               d                                                                                   d         j        S )Nearthr%  r   atobserveapparentaltazr  r  ephobservers    r    r  z*calculate_moon_mysteries.<locals>.<lambda>$  sk    CL8<S;W;WXY;Z;Z;b;bcfgmcn;o;o;x;x;z;z  <A  <A  <C  <C  DE  <F  <N r"   r  r  c                     d         z                        |                               d                                                                                   d         j        dk    S )Nr,  r%  r   g     F@r-  r2  s    r    moon_above_45z/calculate_moon_mysteries.<locals>.moon_above_45'  sY    c'lX&=%A%A!%D%D%L%LSQW[%Y%Y%b%b%d%d%j%j%l%lmn%o%wz~%~~r"   g?c              3   b   K   | ])\  }}| |          d          k     |          V  *dS )r  Nrx  rz  r  r(  r  
moon_timess      r    	<genexpr>z+calculate_moon_mysteries.<locals>.<genexpr>*  s        ?N  ?NTQPQhi  ?Nntntuvnwnw  {E  FL  {M  oM  oMvvayy  oM  oM  oM  oM  ?N  ?Nr"   r  c              3   b   K   | ])\  }}| |          d          k     |          V  *dS )r  Nrx  r8  s      r    r:  z+calculate_moon_mysteries.<locals>.<genexpr>+  s        CY  CYQUQRTUpq  CYv|v|}~vv  CM  NW  CX  wX  wX66!99  wX  wX  wX  wX  CY  CYr"   r  )r  r  from_datetimer   r	   find_discreterisings_and_settingszipmeridian_transitsmax	step_daysnextr  )r3  r4  tst0r  now_dt	day_startsearch_start_tssearch_end_tsr$  t_risey_rise	t_transit_highest_transitr6  t_45y_45r  r9  s   ``  `             @@r    calculate_moon_mysteriesrQ    s   b))2==+<+<+D+D!TU^_mn+D+o+oIF%'%5%5i)QRBSBSBS6S%T%TVXVfVfgps|  CD  tE  tE  tE  hE  WF  WF]ORRRRR44_cddJ	\ 	\ 	\ !.wOkloqtu{q|  G  PH  PH  I  I0;<l<l<l<lSVW]_eSfSf<l<l<lnw0x0x  {F  {F  G{  G{  G{  G{  ^a  bh  jp  ^q  ^q  G{  G{  G{  }F  {G  {G-
6Ju-,_mWMfgjlopvlw  zB  NC  NC  D  D	1 	<!)  2N  2N  2N  2N  2N  O  O  OO$*F?$;$;Jy!~~~~~~"&*?M=YY
df  	U  ?N  ?N  ?N  ?N  ?NUXY]_cUdUd  ?N  ?N  ?N  PT  :U  :Uz+6i   	`T  CY  CY  CY  CY  CYY\]acgYhYh  CY  CY  CY  [_  >`  >`*\":dds   !E3H 
H"!H"c           	         t          |j        |j        |j                  |                    t          d          z
            |                    t          d          z             }}fdg }	 t          j        ||t          j        | | d         |                    \  }}	t          fd|D                       }
t          t          |
          dz
            D ]X}|                    d	|
|         d
           |
|         |
|dz            |
|         z
  dz  z   }|                    d|d
           Y|
r|                    d	|
d         d
           n# t          $ r Y nw xY wt          fd|D             d           S )Nr  r  r  $   c                     |                                                      t          j                                                S r  r  r  s    r    r  z&calculate_inland_tides.<locals>._to_dt2  r  r"   r%  c                 &    g | ]} |          S rx  rx  )rz  r  r  s     r    r)  z*calculate_inland_tides.<locals>.<listcomp>7  s!    ;;;1VVAYY;;;r"   ru  z	High Tider   timerv  Low Tidec                 b    g | ]+}|d          cxk    rt          d          z   k     &n n|,S )rW  ru  r
  )r   )rz  r  rG  s     r    r)  z*calculate_inland_tides.<locals>.<listcomp>?  sO    ^^^yAfI']']']']	I[\L]L]L]@]']']']']']1']']']r"   c                     | d         S NrW  rx  r  s    r    r  z(calculate_inland_tides.<locals>.<lambda>?  s    nopvnw r"   r  )r   yearmonthdayr<  r   r	   r=  r@  sortedrangelenappendr  )r3  r4  rD  target_dater  rH  rI  tides
t_transitsrM  
high_tidesilow_tide_timer  rG  s       `        @@r    calculate_inland_tidesrk  /  s   );+<koVXYYYI%'%5%5i)RTBUBUBU6U%V%VXZXhXhiru~  FH  vI  vI  vI  jI  YJ  YJ]ORRRRRE	-o}gNghkmpqwmx  {C  OD  OD  E  E
A;;;;
;;;<<
s:*++ 	F 	FALL+z!}EEFFF&qMZ!_z!}-LPQ,QQMLL*mDDEEEERu||[*R.$Q$QRRRdd^^^^e^^^dwdwxxxxs   :C&E! !
E.-E.c                 4    | r|                      d          ndS )N%I:%M %pzDoes not occur)strftime)	dt_objects    r    format_timerp  A  s     Y#d9#5#5j#A#A#ATddr"   c                 4   	 | d                              |                              | |                                                                       t                    \  }}}|j        dk    r
|j        dz
  n|j        }|j        |fS # t          $ r Y dS w xY w)Nr,     r  )NN)r.  r/  r0  frame_latlonr
   r  r  )r3  bodyr  r  r  rM  lon_degs          r    subpoint_of_bodyrv  B  s    ('looa((00T;;DDFFSSTXYYS!'*{S'8'8#+##ck{G##'''ZZZ's   BB	 	
BBc                     |                                 }g }t          D ]}t          j        |d         |d                   }|d         |z                       |                              ||                                                                                   \  }	}
}
|	j        dk    r|	                    |           |st          }t          | fd          }d |D             d |D             }}d	 dfd
	} ||           }|r!|d         |d         k    r || |          } ||           }|r!|d         |d         k    r || |          }d } ||            ||            ||           dS )Nrv  rw  r,  r   c                 @    t          | d         | d                   S Nrv  rw  r  )r{  
target_lat
target_lons    r    r  z-analyze_sub_point_locations.<locals>.<lambda>T  s#    ZUVWXUY[\]^[_0`0` r"   r  c                 *    g | ]}|d          dk    |S rv  r   rx  ry  s     r    r)  z/analyze_sub_point_locations.<locals>.<listcomp>V  s!    @@@qtaxx!xxxr"   c                 *    g | ]}|d          dk     |S r~  rx  ry  s     r    r)  z/analyze_sub_point_locations.<locals>.<listcomp>V  s*    BiBiBi`abc`dgh`h`h1`h`h`hr"   c                     t          ||| d         | d                   }|dk    r| d         |dz  z  nt          d          S )Nrv  rw  ru  r  inf)r  r  )r  t_latt_londists       r    get_influence_scorez8analyze_sub_point_locations.<locals>.get_influence_scoreX  sC    E5$q'47;;&*QhhtAw$'""E%LL@r"   c                 ^    rfd| D             } | sd S t          | fd          S )Nc                 8    g | ]}|d          d          k    |S )r   rx  )rz  r{  excludes     r    r)  zManalyze_sub_point_locations.<locals>.find_most_influenced.<locals>.<listcomp>^  s+    FFF1Q471:3E3E!3E3E3Er"   c                      |           S r   rx  )r{  r  r  r  s    r    r  zKanalyze_sub_point_locations.<locals>.find_most_influenced.<locals>.<lambda>`  s    -@-@E5-Q-Q r"   r  )rA  )
candidatesr  r  r  r  s    ```r    find_most_influencedz9analyze_sub_point_locations.<locals>.find_most_influenced\  sU     	GFFFFZFFFJ&$$:#Q#Q#Q#Q#Q#QRRRRr"   )r  c                     | sdS t          ||| d         | d                   }| d          d| d          dt          |           dS )	NzN/Arv  rw  r   rt  ru  z (~z km))r  int)	city_datar  r  r  s       r    format_cityz0analyze_sub_point_locations.<locals>.format_cityj  sT    &E5)A,	!EEA,BB)A,BB3t99BBBBr"   )nearestmost_influenced_northmost_influenced_southr   )nowWORLD_CITIESr   latlonr.  r/  r0  r1  r  rd  r   )r{  r|  r3  rD  	body_namerE  visible_citiesr  city_obsaltrM  closestnorthernsouthernr  pop_npop_sr  r  s   ``                @r    analyze_sub_point_locationsr  H  sK   	BN! - -	<	!il;;\H,0044<<S^LLUUWW]]__	Q;??!!),,,8L>.&`&`&`&`&`aaaG@@^@@@BiBinBiBiBihHA A AS S S S S S ! :zBBE VqWQZ''$$Xz:uUUU  :zBBE VqWQZ''$$Xz:uUUUC C C
 #{7J
CC^i^ijoq{  ~H  _I  _I  do  do  pu  wA  CM  dN  dN  O  O  Or"   c                   
 |                                 }t          | d|          \  }}t          | d|          \  }}|dz   dz  dz
  }||f| |f||fg}d|dz   dz  dz
  fd|dz
  dz  dz
  fg}	d 
t          t          d 
fd|D                                 t          t          d 
fd	|	D                                 d
S )Nr%  sunrr  r  r   Z   c                 h      d S t          t           fd          }|d          d|d          S )Nc                 @    t          | d         | d                   S ry  rz  )r{  p_latp_lons    r    r  zQfind_global_tide_locations.<locals>.find_nearest_city_for_point.<locals>.<lambda>|  s     ,ueQqTSTUVSW2X2X r"   r  r   rt  ru  )r   r  )r  r  r  s   `` r    find_nearest_city_for_pointz?find_global_tide_locations.<locals>.find_nearest_city_for_pointz  sH    =l(X(X(X(X(XYYY!*,,
,,,r"   c                 .    h | ]\  }} ||          S rx  rx  rz  r  r  r  s      r    	<setcomp>z-find_global_tide_locations.<locals>.<setcomp>  s,    "j"j"jXSRU#>#>sC#H#H"j"j"jr"   c                 .    h | ]\  }} ||          S rx  rx  r  s      r    r  z-find_global_tide_locations.<locals>.<setcomp>  s,    !h!h!hHCQT"="=c3"G"G!h!h!hr"   )highlow)r  rv  listfilter)r3  rD  rE  moon_latmoon_lonsun_latsun_lonantipode_lonhigh_tide_pointslow_tide_pointsr  s             @r    find_global_tide_locationsr  q  s   	B)#vr::Hh'UB77GWsNc)C/L!8,y,.G'SZI[\HrMS0367!hms=RUX=X9YZO- - - VD"j"j"j"jYi"j"j"jkkllF4!h!h!h!hXg!h!h!hiijj  r"   __main__
ENV_COORDSAUTOGEOIPADDRESSCOORDSz<The cosmos remains veiled. Location could not be determined.z	de421.bspzKLocal de421.bsp not found. Attempting to download for future offline use...z'Warning: Could not download ephemeris (z&). Moon and Tide data will be skipped.r  r  r  z
--- Qibla-Numa Report for: r  z at rm  z ---location_sourceUNKNOWNzsource=z	geoip_ip=zgeoip_note=[rt  ])r  r  r  r  r  r  c                 h    g | ]/\  }}t                               |          |t           |         d 0S rV  )	sun_timesr   rz  r  labels      r    r)  r)    sj      _  _  _ZS%  LU  LY  LY  Z]  L^  L^  _%3@@  _  _  _r"   FajrSunriseDhuhrAsrMaghribIshar  c                 h    g | ]/\  }}t                               |          |t           |         d 0S r  )r9  r   r  s      r    r)  r)    sj      l  l  l
U  Xb  Xf  Xf  gj  Xk  Xk  lE:c?CC  l  l  lr"   Moonriseu   Ascent 45°Zenithu   Descent 45°Moonset)r  r  r  r  r  c                 X    t          fd| D             d           }|r|d         nd S )Nc                 ,    g | ]}|d          k    |S rW  rx  )rz  r#  now_times     r    r)  z"get_next_event.<locals>.<listcomp>  s'    GGG1!F)h2F2FQ2F2F2Fr"   c                     | d         S r\  rx  r]  s    r    r  z get_next_event.<locals>.<lambda>  s    WXY_W` r"   r  r   )ra  )r!  r  futures    ` r    get_next_eventr    sA    GGGGGGGM`M`aaaF &06!99D0r"   u'   
☀️ The Sun's Decree (Prayer Times) rW  z* z  r   z<10z: u'   
🌙 The Moon's Mysteries (Local Time)z<12c                 4    g | ]}|d          t           k    |S r  )r  )rz  r  s     r    r)  r)    s&     L L Lq1V9;K;K;K;K;Kr"   c                     | d         S r\  rx  r]  s    r    r  r    s    \]^d\e r"   )r  defaultrX  RisingFallingu,   
🌊 Inland Tide (Theoretical) - Currently r,  r%  z
   Current Moon:z     Direction (azimuth): z.2f   °z     Altitude:            z     Distance:            z,.0fz kmc                     |                                                      t          j                                      t
                    S r  )r  r  r  r  r  r  )r  s    r    r  r    s3    !.."2"2":":$(":"K"K"V"VWY"Z"ZZr"   #   r
  c                 T    i | ]%\  }}t           j        |         t          |          &S rx  )r	   MOON_PHASESr  )rz  ptpvs      r    r|  r|    s/    (x(x(xQWQSUW)<R)@&**(x(x(xr"   c                     | d         S )Nru  rx  )items    r    r  r    s      UY  Z[  U\ r"   r  z
   Upcoming Primary Phases:r  z   z<15z%b %d, %Y, %I:%M %pz!
Sub-point & Global Tide Summary:r  z  Sun Zenith:  z | Nearest: r  z    > Most Influenced (North): r  z    > Most Influenced (South): r  z
  Moon Zenith: z
  Global High Tides Near: r  z  Global Low Tides Near:  r  u@   
🌙 Moon and Tide data unavailable (ephemeris file not found).z----------------------------------------------)~r   r  r~  r  warningsr   r   geopy.geocodersr   timezonefinderr   skyfield.apir   r   skyfieldr	   skyfield.framelibr
   	geopy.excr   r   r   requests.exceptionsr   filterwarningsr#   r$   r%   r&   r'   r(   PRAYER_METHOD_ANGLESr)   r!   r  upperr   r   fajr_envisha_envr  r  r,   r-   r  r  r  r  r  r   r  rQ  rk  rp  rv  r  r  r  modelocationr  r  
coords_locprint	timescalerD  r3  r#  r  r4  r  r  r  r<  rE  rn  localsprov
prov_partsrd  joinr  r  itemsprayer_eventsmoon_eventstide_eventsr9  dater  next_prayer_eventnext_moon_eventnext_tide_eventeventrA  	last_tidecurrent_statetider.  r/  r0  r1  r  azdistancer  kmr  r=  moon_phasesphase_times
phase_valsra  r  r?  unique_phases	enumerateri  r   r  r  r  r  
sun_citiesmoon_citiesglobal_tidesrx  r"   r    <module>r     s   
			     ( ( ( ( ( ( ( ( % % % % % % ) ) ) ) ) ) $ $ $ $ $ $ $ $       " " " " " " Q Q Q Q Q Q Q Q Q Q 9 9 9 9 9 9  +D E E E E 
	 $d33 	   88>BEEGGMMOOwtVw
''9
%
%78Z((GI{++			"	"	,f	z~~9::Hz~~9::HB',uXV$B',uXV$ 	 	 	D	 
	"	"	,f JNN#6;; Z^^L"--
p p pd 
A	@<	@	@	@+ + +'
 '
 '
 '
 '
 '
 '
 '
RI I I: : :" " "  <y y y$ e d d( ( ('O 'O 'OR  & zR&&((..00DHO	 533x==;N;N;P;PTV;V;VZ]Z]^gZhZhZnZnZpZptvZvZv++Hi@@
 	+!H*O ^6>>))++\/F/FtUT[/\/\H)1Sdfnngg)OO--h	BBsF]F]^bdikrFsFsH*2]]I]hhT]O dLMMMMM $.""DC	~${##CC 	~ 	~ 	~E_```tK((}}}55)|ST)|)|)|#}#}#}#}#}#}#}#}}	~
  5< 4h{6KLLT]8J/00R8H8H#c""ehy.Aees||T^G_G_eeefff	&76688&C&C&C??]fDD 	 	 	DDD	&&&'
 	?=*;==>>> 	:8J88999cDIIj)))C/000))j)Xk5J!*-f+F3@TU[@\
 
 
 #
"3
'
'	 	 _  _\box  DK  TY  fo  y  T@  T@  TF  TF  TH  TH  _  _  _#%r [ 	T11#xRLLJ l  l_i  yF  S[  ky  BK  WL  WL  WR  WR  WT  WT  l  l  lK00hCHHJJPRSSK	1 	1 	1 +N=#>>(.c::(.c::8999" 	] 	]EE  \/hE&MEVW]E^4^4^dddh  \jopvjw  \  \  \  @K  @K  LQ  RX  LY  @Z  @Z  \  \  ]  ]  ]  ] -	YE<===$ ] ]  \/heFmW]G^6^6^$$dh  \jopvjw  \  \  \  @K  @K  LQ  RX  LY  @Z  @Z  \  \  ]  ]  ]  ] ^C L LK L L LReReosttt	,5 h)F:Kz:Y:Y_hUmUUVVV' ^ ^DE  ]ok$v,/Z`Ja:a:addgk  ]mqrxmy  ]  ]  ]  BM  BM  NR  SY  NZ  B[  B[  ]  ]  ^  ^  ^  ^Gx/33B77??FLLUUWWH ( 0 0CXE&'''EArzAAAABBBEBs{BBBBCCCEDx{DDDDEEEZZZ&;g&;B@P@PQTW`W`fhWiWiWiQi@j@jllsl  AD  mE  mE  'F  'F#K"F44(x(x[^[^_jlv[w[w(x(x(x(~(~  )A  )A  $B  $B  H\  H\  ]  ]  ]ME1222 n'0yrr1B'C'C n nOA|dElQDl$llldmmTiFjFjllmmmmE6777//UB??GW!1!1#vr!B!BHhZaZm44WgsBPUVVVswJ^f^r55h#rSYZZZx|K55c2>>L _ggggwgggPZ[dPegghhh]
CZ8[]]^^^]
CZ8[]]^^^ `l(lll(lllT_`iTjllmmm^D[8\^^___^D[8\^^___E0499\&=Q3R3RRSSSE.<;N1O1OOPPPPeWXXXho sa   2A E EEK% %L%5L L%LLL%LL%$L%,N? ?O	O	