
    iS[                     p   d Z ddlZddlZddlZddlZ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mZ d Z e        ddlmZ ddlmZ ddlmZmZmZmZ 	 dd	lmZ d
Zej:                  j=                  d      xs ej:                  j=                  d      Zej:                  j=                  d      Z ej:                  j=                  d      Z!dZ" ed      Z#e#dz  Z$e#dz  Z%e#jM                  d
d
       e$jM                  d
d
        ejN                  ejP                  d ejR                  e%d       ejT                  ejV                        g        ejX                  d      Z-dZ. G d d      Z/ G d d      Z0dZ1d Z2 G d! d"      Z3d# Z4e5d$k(  r ejl                   e4              yy# e$ r dZY Vw xY w)%a  
Gemini 3 Flash Vision Browser Agent
Think -> Act -> Observe loop using Playwright + Gemini 3 Flash agentic vision
Connects to Elestio Browserless OR runs local headless Playwright

Usage:
    python3 core/gemini_vision_agent.py --task "your task here" [--headless] [--max-steps 50]
    python3 core/gemini_vision_agent.py --godaddy --headless
    python3 core/gemini_vision_agent.py --elestio --headless
    N)datetime)Pathc                     t        d      } | j                         rt        |       5 }|D ]  }|j                         }|s|j	                  d      r(d|v s-|j                  d      \  }}}|j                         }|j                         j                  d      j                  d      }|s|st        j                  j                  ||        	 d d d        y y # 1 sw Y   y xY w)N(/mnt/e/genesis-system/config/secrets.env#="')	r   existsopenstrip
startswith	partitionosenviron
setdefault)secrets_pathflinekey_vals         1/mnt/e/genesis-system/core/gemini_vision_agent.pyload_secretsr      s    BCL, 	81 8zz| 4"&.."5KCC))+C))+++C066s;Cs

--c378	8 	8 	8 	8s*   C CCAC-C0"CC&)genai)types)async_playwrightPageBrowserBrowserContext)StealthTFGEMINI_API_KEY_NEWGEMINI_API_KEYBROWSERLESS_URLBROWSERLESS_TOKENzgemini-3-flash-previewz/mnt/e/genesis-system/logsvision_screenshotszvision_agent.log)parentsexist_okz'%(asctime)s [%(levelname)s] %(message)szutf-8)encoding)levelformathandlersvision_agentut  You are controlling a web browser to complete a task.
Current task: {task}
Previous actions (last 10): {history}
Step: {step}/{max_steps}
Current URL: {url}

Look at the screenshot carefully. Decide the SINGLE best next action.
Respond with ONLY a valid JSON object — no markdown, no code fences, no explanation.

AVAILABLE ACTIONS:
- Navigate:   {{"action": "navigate", "url": "https://...", "description": "reason"}}
- Click:      {{"action": "click", "x": 640, "y": 400, "description": "what you're clicking"}}
- Type:       {{"action": "type", "text": "text to type", "description": "reason"}}  (types into focused element)
- Fill field: {{"action": "fill", "selector": "#id or input[name=x]", "text": "value", "description": "reason"}}
- Press key:  {{"action": "key", "key": "Enter", "description": "reason"}}
- Scroll:     {{"action": "scroll", "direction": "down", "amount": 400, "description": "reason"}}
- Wait:       {{"action": "wait", "ms": 2000, "description": "waiting for page"}}
- Done:       {{"action": "complete", "result": "full description of what was accomplished"}}
- Blocked:    {{"action": "blocked", "reason": "exact description of what is blocking (2FA, captcha, bot check, login failed)"}}

IMPORTANT RULES:
- If you see a bot check / unusual browser warning that persists after retry, use "blocked"
- If login fails with wrong credentials, use "blocked" immediately
- If you've been on the same page doing the same action for 5+ steps, try a different approach
- When adding DNS records, confirm each record is saved before adding the next
- Never type into a field without first clicking it or using fill with selector
c                   @    e Zd Zd Z	 ddedee   dededededefd	Z	y
)GeminiVisionClientc                     t         st        d      t        j                  t               | _        t
        j                  dt                y )NzJNo Gemini API key. Set GEMINI_API_KEY_NEW or GEMINI_API_KEY in secrets.env)api_keyu   Gemini client ready — model: )r#   RuntimeError	new_genaiClientclientloginfoVISION_MODELselfs    r   __init__zGeminiVisionClient.__init__i   s=    \   &&~>2<.AB    taskhistoryscreenshot_bytesstep	max_stepscurrent_urlreturnc                    |rdj                  |dd        nd}t        j                  |||||      }	 | j                  j                  j                  t        t        j                  j                  |d      t        j                  j                  |      g      }	|	j                  j                         }
t        j#                  d|
d d         t%        j&                  dd|
      }t%        j&                  dd|      j                         }	 t)        j*                  |      S # t        $ r7}t        j                  d	|        d
ddt!        |      d d  dcY d }~S d }~ww xY w# t(        j,                  $ r t%        j.                  d|t$        j0                        }|r?	 t)        j*                  |j3                               cY S # t(        j,                  $ r Y nw xY wt        j5                  d|
d d         d
dddcY S w xY w)N
izNone yet)r=   r>   r@   rA   urlz	image/png)data	mime_type)text)modelcontentszGemini API error: wait  zAPI error: d   actionmsdescriptionzGemini raw: ,  z^```(?:json)?\s* z\s*```$z\{.*\}zJSON parse failed for:    i  zparse error)joinVISION_PROMPTr+   r5   modelsgenerate_contentr8   genai_typesPart
from_bytes	from_textrI   r   	Exceptionr6   errorstrdebugresubjsonloadsJSONDecodeErrorsearchDOTALLgroupwarning)r:   r=   r>   r?   r@   rA   rB   history_textprompt_textresponserawecleanedms                 r   decide_actionz GeminiVisionClient.decide_actionq   s   3:tyy/
#**  + 
	_{{))::"$$//5EQ\/]$$..K.@ ; H --%%'C
 			LTc,- &&,b#6&&R1779
	Q::g&&  	_II*1#./$D;sSTvVZWZ|nA]^^	_ ## 	Q		)Wbii8A::aggi00++ KK1#ds)=>$D;PP	QsT   BD% E( %	E%.,E E% E%(:H#"GHGHG$HHNrT   )
__name__
__module____qualname__r;   r`   listbytesintdictrr    r<   r   r/   r/   h   sU    C EG(Q# (QS	 (QU (Q(Q,/(Q>A(QKO(Qr<   r/   c                       e Zd Z	 	 	 ddededededef
dZd Zded	efd
Z	ddede
d	efdZdeded	e
fdZde
d	efdZy)GeminiVisionAgentheadlessrA   viewport_widthviewport_heightuse_stealthc                     || _         || _        ||d| _        |xr t        | _        t               | _        g | _        d| _        g | _	        y )N)widthheightr   )
r~   rA   viewportSTEALTH_AVAILABLEr   r/   geminir>   r@   results)r:   r~   rA   r   r   r   s         r   r;   zGeminiVisionAgent.__init__   sK     !""0OL&<+<(*"$	#%r<   c                 .    g | _         d| _        g | _        y )Nr   )r>   r@   r   r9   s    r   resetzGeminiVisionAgent.reset   s    	r<   pagerC   c                    K   	 |j                  dd       d {   S 7 # t        $ r"}t        j                  d|        Y d }~yd }~ww xY ww)NpngF)type	full_pagezScreenshot failed: r<   )
screenshotr^   r6   rj   )r:   r   ro   s      r   _get_screenshotz!GeminiVisionAgent._get_screenshot   sJ     	euEEEE 	KK-aS12	s6   A! ! A! 	AAAAAr   labelc                 D  K   |st        d      S t        j                         j                  d      }t	        j
                  dd|      d d }t        d| j                  dd| d| dz  }|j                  |       t        j                  d	|j                          |S w)
Nz	/dev/nullz%Y%m%d_%H%M%Sz[^\w\-]r   (   step_03dz.pngz  Screenshot: )r   r   nowstrftimerb   rc   SCREENSHOT_DIRr@   write_bytesr6   r7   name)r:   r   r   tslabel_cleanfnames         r   _save_screenshotz"GeminiVisionAgent._save_screenshot   s     $$\\^$$_5ffZe4Sb953qAk]$!OO*%>%**./s   BB rP   c                 p  K   |j                  dd      }|j                  dd      }t        j                  d| d|        |dk(  rP|j                  dd      }	 |j                  |d	d
       d {    	 |j	                  dd       d {    d| S |dk(  rt        |j                  dd            t        |j                  dd            }}|j                  j                  ||       d {    t        j                  d       d {    d| d| dS |dk(  rM|j                  dd      }	|j                  dd      }
	 |j                  |	|
d       d {    d|	 d|
d d  d S |d$k(  r@|j                  dd      }
|j                  j                  |
d%       d {    d&|
d d'  d S |d(k(  rW|j                  d(d)      }|j                  j                  |       d {    t        j                  d*       d {    d+| S |d,k(  r|j                  d-d.      }t        |j                  d/d0            }|d.k(  r|n| }|j                  j!                  d|       d {    t        j                  d1       d {    d2| d3| d4S |dk(  rAt        |j                  d5d6            }t        j                  |d6z         d {    d7| d5S |d8v rd9| S t        j                  d:|        t        j                  d;       d {    d<| d=S 7 7 # t
        $ r Y w xY w# t
        $ r#}t        j                  d|        Y d }~d }~ww xY w7 s7 Y7 # t
        $ r*}t        j                  d!|	 d"|        d#| cY d }~S d }~ww xY w7 7 7 7 B7 (7 7 w)>NrP   rL   rR   rT   z  EXEC [] navigaterF   domcontentloadedi0u  )
wait_untiltimeoutnetworkidlei@  )r   z%Navigate timeout/error (continuing): znavigated to clickxr   yg?z	clicked (,)fillselectorrI   i  zfilled 'z' with 'r   r
   zFill failed for z: zfill failed: r   )delayztyped '2   r   Enterg      ?zpressed scroll	directiondownamountrS   g333333?z	scrolled  pxrQ   i  zwaited )completeblockedz
terminal: zUnknown action:    zunknown action 'z	' skipped)getr6   r7   gotowait_for_load_stater^   rj   ry   mouser   asynciosleepr   keyboardr   presswheel)r:   r   rP   actdescrF   ro   r   r   r   rI   r   r   r   deltarQ   s                   r   _execute_actionz!GeminiVisionAgent._execute_action   s    jj6*zz-,8C54&)****UB'CIii0BEiRRR22=$2OOO
 #3%((G^vzz#q)*C

30B,CqA**""1a(((--$$$qc1#Q''F]zz*b1H::fb)D+ii$i===!(8D"I;a@@
 F]::fb)D--$$T$444T#2YKq))E\**UG,C--%%c***--$$$cU##H_

;7IHc23F'61FwE**""1e,,,--$$$yk6("55F]VZZd+,B--T	***RD##++u%% KK*3%01--"""%cU)44o SO   ICA3GHHI )$ > +.xj1#>?&qc**+ 5
 +$ -$
 + #sO  AN6L5 1L2L5 7L% L"L% AN61M$2N6M'6N6M- M*M- -8N6%N#&AN6(N&)N6N)A$N6*N,+N6N/AN6N2AN6N4
N6L5 "L% %	L2.L5 1L22L5 5	M!>MN6M!!N6'N6*M- -	N 6NN N6N  N6&N6)N6,N6/N62N64N6r=   c                   K   t         j                  d       t         j                  d|d d         t         j                  dt         d| j                   d| j                   d| j
                          t         j                  d       t        j                         }|dd	d d d	g d
}t               4 d {   }t        rzt        rtt         j                  dt                |j                  j                  t         dt                d {   }|j                  | j                  ddd       d {   }nmt         j                  d       |j                  j                  | j                  g d       d {   }|j                  | j                  ddd       d {   }| j
                  r7	 t               j!                  |       d {    t         j                  d       |j'                          d {   }| j)                  |       d {   }	| j+                  |	d       d {    t-        d| j                  dz         D ]  | _        |j0                  }
t         j                  d| j.                   d| j                   d|
d d  d       |	s| j)                  |       d {   }		 | j2                  j5                  || j6                  |	| j.                  | j                  |
      }t         j                  d#t;        j<                  |              |j?                  d$      d%k(  rf|j?                  d&d'      }t         j                  d(|        |jA                  d%|| j.                  d)       | j+                  |	d%       d {     n|j?                  d$      d*k(  rf|j?                  d+d,      }t         j%                  d-|        |jA                  d*|| j.                  d.       | j+                  |	d*       d {     n,	 | jC                  ||       d {   }| j6                  jE                  d1| j.                   d2|j?                  d$       d3|j?                  d4d5       d6|        | jF                  jE                  | j.                  ||d7       tI        jJ                  d8       d {    | j)                  |       d {   }	| j.                  d9z  d	k(  s| j+                  |	d:| j.                          d {     t         j%                  d;       | j                  |d<<   tM        t        j                         |z
  d      |d=<   | j6                  |d><   |jO                          d {    |jO                          d {    d d d       d {    t         j                  d?t;        j<                  |jQ                         D ci c]  \  }}|d>k7  s|| c}}d@A              |S 7 T7 7 7 7 s7 H# t"        $ r#}t         j%                  d|        Y d }~Xd }~ww xY w7 M7 77  7 # t"        $ r)}t         j9                  d|        dd d!d"}Y d }~d }~ww xY w7 7 7 h# t"        $ r(}d/| }t         j9                  d0|        Y d }~d }~ww xY w7 	7 7 7 L7 77 *# 1 d {  7  sw Y   ;xY wc c}}w w)BNF======================================================================zTASK: rU   zModel: z | headless: z | max_steps: z | stealth: 
incompleter   )r=   statusstepsresultblocked_reason	elapsed_sr>   zConnecting to Browserless: z?token=zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36zen-AUzAustralia/Sydney)r   
user_agentlocaletimezone_idz!Launching local Chromium headless)z--no-sandboxz--disable-dev-shm-usagez---disable-blink-features=AutomationControlledz--disable-infobars)r~   argszStealth mode appliedzStealth apply failed: initialr   z

--- Step /z | URL: P   z ---)r=   r>   r?   r@   rA   rB   zGemini error: rL   rM   zgemini errorrO   z
  ACTION: rP   r   r   zTask completedz  COMPLETE: )r   r   r   r   reasonzUnknown blockz  BLOCKED: )r   r   r   zexecution error: z	  Error: zStep z: [r   rR   rT   u    — )r@   rP   r   g      ?   
progress_sz$Max steps reached without completionr   r   r>   z	
RESULT:    )indent))r6   r7   r8   r~   rA   r   timer   r$   r%   chromiumconnect_over_cdpnew_contextr   launchr!   apply_stealth_asyncr^   rj   new_pager   r   ranger@   rF   r   rr   r>   r_   rd   dumpsr   updater   appendr   r   r   roundcloseitems)r:   r=   start_tsr   pwbrowsercontextro   r   r   rB   rP   result_textr   r   kvs                    r   runzGeminiVisionAgent.run  sU    6$t*&'7<.dmm_ E#~~.l4;K;K:LN 	O99;, Dq! $% v	" v	"#466GHI)+)E)E&'w/@.AB* $ 180C0C!]]9 # 2 1D 	1 	+ <=)+););!]] *< * $ 180C0C!]]9 # 2 1D 	1 	+ >!)77@@@HH34  '//11D#33D99J''
I>>>"1dnnq&89 >1	"hh;tyyk4>>2B(;WZXZK[J\\`ab!'+';';D'A!AJ[![[66! $)3!YY"&..$/ 7 F :djj&8%9:; ::h':5"(**X7G"HKHH|K=9:MMZ;,0II#7 8//
JGGG::h'94#ZZ/BFKK+fX 67MMY&,0II#7 8//
IFFF/#'#7#7f#EEF
 ##DII;c&**X*>)?rzz-34E&C ##TYY&TZ$[\ mmC(((#'#7#7#==
99q=A%//
j<TUUUu>1z BC"&..w"'		h(>"BF; $F9--/!!--/!!mv	" v	"p 	:djj6<<>)\41aQR[^!Q$)\efghijsv	"$	+$	+ A  >KK"8 <==> 29> "B ! [IIqc23(.d>ZF[ H G
 F  /04FII	!o../ )= V "!mv	" v	" v	" v	"p *]s  B5[87X8[8;A[X&[6X7A[=X>&[$X%[6XXX,[?Y [Y[2Y3A>[1Y2[7?Y6B[ZA9[Z[Z+Z,Z0B[[
[[[3"[[A1[[[[ [$[8/[06[8&[24[29[8[[[[X	Y	&Y>[Y		[[[[	Z
!Z?[Z

[[Z	[[<[[[[[[[[8[/"[%#[/*[8N)Tr   i   i  Trs   )rt   ru   rv   boolry   r;   r   r   rx   r   r`   r   r   rz   r   r   r{   r<   r   r}   r}      s    ?ADG%)
& 
& 
&!$
&>A
&"
&
$ 5  s D ?5$ ?5 ?5 ?5BEc Ed Er<   r}   a  
TASK: Add DNS A records to GoDaddy for sunaiva.com and sunaivadigital.com

Login credentials:
- URL: https://sso.godaddy.com/
- Username/Customer ID: 108866004
- Password: TripleWebsites333

EXACT STEPS:
1. Navigate to https://sso.godaddy.com/
2. Fill the username field (id="username") with: 108866004
3. Fill the password field (id="password") with: TripleWebsites333
4. Click the Sign In button (id="submitBtn")
5. Wait for redirect to account dashboard
6. Navigate to https://account.godaddy.com/products
7. Look for domains listed: sunaiva.com and/or sunaivadigital.com
8. For each domain, click on DNS or Manage DNS
9. Add A record: Name=@, Value=152.53.201.221, TTL=600
10. Add A record: Name=memory, Value=152.53.201.221, TTL=600
11. Add A record: Name=api, Value=152.53.201.221, TTL=600
12. Save all changes

If login fails or bot check appears that cannot be resolved, report as BLOCKED.
Report which domains were found and which DNS records were successfully added.
aY  
TASK: Find the Browserless WebSocket URL and token from Elestio

Steps:
1. Navigate to https://app.elestio.app/
2. You may see a login page. Try navigating to: https://app.elestio.app/dashboard
3. Look at the URL - if redirected to login, the admin console might need credentials.
4. Check if there's a direct service URL for browserless
5. Try navigating to: https://browserless-genesis-u50607.vm.elestio.app/
6. Or try: https://browserless-u50607.vm.elestio.app/
7. Look for a WebSocket URL in the format: wss://browserless-XXXXX.vm.elestio.app
8. If you find a browserless service, get its health page or config page
9. Report the exact WebSocket URL and any auth token found

Also check:
- https://openclaw-genesis-u50607.vm.elestio.app/ (existing service for reference)

Report: the Browserless WebSocket URL and token, or what was found at each URL.
c                   N    e Zd ZdZdZdedefdZdefdZdded	ed
ede	de
f
dZy)GoDaddyDirectDNSz7Use GoDaddy REST API when API_KEY+SECRET are available.zhttps://api.godaddy.comr1   
api_secretc                 &    d| d| ddd| _         y )Nzsso-key :zapplication/json)AuthorizationzContent-TypeAcceptheaders)r:   r1   r   s      r   r;   zGoDaddyDirectDNS.__init__  s!    'y*>.(
r<   rC   c                   K   dd l }|j                  | j                        4 d {   }|j                  | j                   d      4 d {   }|j                          d {   }t        |t              r|ng cd d d       d {    cd d d       d {    S 7 y7 T7 >7 7 # 1 d {  7  sw Y   nxY wd d d       d {  7   y # 1 d {  7  sw Y   y xY ww)Nr   r   z/v1/domains?limit=50)aiohttpClientSessionr   r   BASErd   
isinstancerw   )r:   r   srrG   s        r   list_domainszGoDaddyDirectDNS.list_domains  s     (((> 	> 	>!uu		{*>?@ > >AVVX~)$5t2> > >	> 	> 	>>%>	>> > >	> 	> 	> 	> 	>s   %C'B!C'#CB#CB+&B%'B+>C
B'CC'B)C'#C%B+'C)C'+B=	1B42B=	9C C'CC'C$CC$ C'domainr   ipttlc                   K   dd l }|||ddg}|j                  | j                        4 d {   }|j                  | j                   d| d| |      4 d {   }|j
                  |||dcd d d       d {    cd d d       d {    S 7 e7 97 7 # 1 d {  7  sw Y   nxY wd d d       d {  7   y # 1 d {  7  sw Y   y xY ww)	Nr   A)rG   r   r  r   r   z/v1/domains/z/records/A/)rd   )r   r  r   r  )r   r   r   patchr   r   )	r:   r  r   r  r  r   recordr   r  s	            r   add_a_recordzGoDaddyDirectDNS.add_a_record  s     tCEF(((> 	V 	V!ww99+\&TFC   V V "#((fdRTU	V V V	V 	V 	VV V	VV V V	V 	V 	V 	V 	Vs   -CBC*CBC!B2C>B?CCBCCCCB/	#B&$B/	+C2C=C >CC
CCCN)iX  )rt   ru   rv   __doc__r   r`   r;   rw   r  ry   rz   r
  r{   r<   r   r   r     sX    A$D
 
 
>D >V VC VS Vs VUY Vr<   r   c                  	  K   t        j                  d      } | j                  dt        d        | j                  ddd       | j                  d	d
d       | j                  dt        d       | j                  ddd       | j                  ddd       | j                  ddd       | j                         }|j                   }t        |j                  |j                  |      }g }|j                  rVt        j                  d       |j                  t               d {   }|j                  d|d       |j!                          |j"                  rt        j                  d       |j                  t$               d {   }|j                  d|d       |j'                  d      dk(  rx|j'                  d      rf|d   }t)        j*                  d|      }t)        j*                  d |t(        j,                        }t/        d!      }	g }
|r`|j1                  d"      j3                  d#      }t        j                  d$|        |	j5                         }d%|vr|
j                  d&|        |rU|j1                  d'      }t        j                  d(|d d)  d*       |	j5                         }d+|vr|
j                  d,|        |
r^t7        |	d-      5 }|j9                  d.       |j9                  d/j;                  |
      d/z          d d d        t        j                  d0       |j<                  r]t        j                  d1|j<                  d d2  d3       |j                  |j<                         d {   }|j                  d4|d       t?        |j                  |j"                  |j<                  g      s| jA                          y tC        d5       tC        d6       tC        d7       |D ]  }|d   }tC        d8|d9           tC        d:|j'                  d              tC        d;|j'                  d<              tC        d=|j'                  d>       d?       |j'                  d      rtC        d@|j'                  d              |j'                  dA      stC        dB|j'                  dA               y 7 7 C# 1 sw Y   xY w7 ]w)CNzGemini Vision Browser Agent)rR   z--task)r   defaultz
--headless
store_trueT)rP   r  z--no-headlessr~   store_false)destrP   z--max-stepsr   z	--godaddyzGoDaddy DNS setup)rP   helpz	--elestiozElestio Browserless discoveryz--no-stealthzDisable stealth mode)r~   rA   r   z!
>>> TASK: GoDaddy DNS Setup <<<
godaddy_dns)r=   r   z-
>>> TASK: Elestio Browserless Discovery <<<
elestio_browserlessr   r   r   zwss://[^\s\"'<>]+z!token[=:\s]+([a-zA-Z0-9_\-]{20,})r   r   z.,)zFound Browserless WSS URL: r$   zBROWSERLESS_URL=r   zFound Browserless token: 
   z...r%   zBROWSERLESS_TOKEN=az!
# Browserless (auto-discovered)
rE   z,Saved Browserless credentials to secrets.envz
>>> TASK: r   z <<<
customzG
======================================================================zFINAL SUMMARYr   z

Task:    r=   z	Status:  z	Steps:   r   z	Elapsed: r   r   z	Result:  r   z	Blocked: )"argparseArgumentParseradd_argumentr`   ry   
parse_args
no_stealthr}   r~   rA   godaddyr6   r7   r   GODADDY_DNS_TASKr   r   elestioELESTIO_TASKr   rb   rg   Ir   ri   rstrip	read_textr   writerV   r=   any
print_helpprint)parserr   r   agentall_resultsr   rtwss_mtok_mr   	additionswsscontenttokr   itemr  s                    r   mainr2    s5    $$1NOF
sD9
\4H
jO
C<
L?RS
L?^_
|BXYDoo%K..E
 K||67yy!122MVDE||BCyy..$9VLM ::h:-&**X2F!BII2B7EIIBBME JKLIkk!n++E26se<=&002$G3$$'7u%=>kk!n4S"XJcBC&002&g5$$'9#%?@,, 9GGABGGDIIi04789 GHyy<		#2/v67yy++H?@dllDII67 
/	/	(O 	9NDL>*+	!%%/*+,	!%%.)*+	!%%,-Q/055?IaeeHo./055!"Iaee$45678	9_ 3 /.9 9 ,sR   D%S 'S
(A"S 
SES 5SA-S  SD(S *!S S S	S __main__)7r  r   sysrd   base64r   r  loggingrb   r   r   pathlibr   r   googler   r3   google.genair   rZ   playwright.async_apir   r   r   r    playwright_stealthr!   r   ImportErrorr   r   r#   r$   r%   r8   LOG_DIRr   LOG_FILEmkdirbasicConfigINFOFileHandlerStreamHandlerstdout	getLoggerr6   rW   r/   r}   r  r  r   r2  rt   r   r{   r<   r   <module>rF     s  	 
 
      	   8  % - P P*
  45YHX9Y**..!23JJNN#67 '
+
,//'' dT *   TD  1   
,,4Hw7cjj) g'<1Q 1Qji i\ 4,V V>M9` zGKK w  s   F* *F54F5