§
    Sù©jÝ/  ã                   ót   — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ ZdS )uŠ  
Unit Tests for Optical Inventory Scanner & Hooded One Identify All (Doc 48 / Doc 43 P1-5)
==========================================================================================
Kiá»ƒm thá»­ cÃ¡c báº¥t biáº¿n kiáº¿n trÃºc:
- INV-UI-INVENTORY-ROW1: Ä�á»™ khá»›p tá»�a Ä‘á»™ Slot 0..11 trÃªn 2560x1440 vÃ  1920x1080 (Sai sá»‘ Delta = 0px).
- INV-NPC-01: Interlock an toÃ n vÃ¹ng Town/Hideout, fail-closed khi cÃ³ quÃ¡i váº­t.
- Full Inventory Detection: PhÃ¡t hiá»‡n chÃ­nh xÃ¡c tráº¡ng thÃ¡i tÃºi Ä‘á»“ Ä‘áº§y (>= 48/60 slots).
- Opcode 8 Emission: Gá»­i lá»‡nh EXECUTE_NPC_INTERACT_ROUTINE vá»›i mode 1 (IdentifyAll) khi tÃºi Ä‘áº§y táº¡i lÃ ng.
é    N)ÚImage)ÚOpticalInventoryScanner)ÚAutonomousLifecycleManagerÚLifecyclePhasec                  óÂ  — t          dd¬¦  «        } |                      dd¦  «        \  }}|dk    sJ ‚|dk    sJ ‚|                      dd¦  «        \  }}|dk    sJ ‚|dk    sJ ‚|                      d	d¦  «        \  }}|d
k    sJ ‚|dk    sJ ‚|                      dd¦  «        \  }}|dk    sJ ‚|dk    sJ ‚|                      dd	¦  «        \  }	}
|	dk    sJ ‚|
dk    sJ ‚dS )uk   Kiá»ƒm tra Ä‘á»™ khá»›p tá»�a Ä‘á»™ 1440p so vá»›i Ground-Truth thá»±c Ä‘á»‹a táº¡i 0ms (Doc 48 Má»¥c 2.1).é 
  é   ©Úscreen_wÚscreen_hr   iÃ  i6  é   i	  é   iÛ  é   iÅ	  iN  N)r   Úget_slot_center)Úscanner_1440Úc0_xÚc0_yÚc1_xÚc1_yÚc4_xÚc4_yÚc11_xÚc11_yÚc0_r4_xÚc0_r4_ys              ú<C:\Projects\AutoPOE2\tests\test_optical_inventory_scanner.pyÚ*test_optical_inventory_coordinates_scalingr      s"  € å*°DÀ4ÐHÑHÔH€Lð ×-Ò-¨a°Ñ3Ô3�J€Dˆ$Ø�4Š<ˆ<ˆ<ˆ<Ø�3Š;ˆ;ˆ;ˆ;ð ×-Ò-¨a°Ñ3Ô3�J€Dˆ$Ø�4Š<ˆ<ˆ<ˆ<Ø�3Š;ˆ;ˆ;ˆ;ð ×-Ò-¨a°Ñ3Ô3�J€Dˆ$Ø�4Š<ˆ<ˆ<ˆ<Ø�3Š;ˆ;ˆ;ˆ;ð  ×/Ò/°°AÑ6Ô6�L€Eˆ5Ø�DŠ=ˆ=ˆ=ˆ=Ø�CŠ<ˆ<ˆ<ˆ<ð $×3Ò3°A°qÑ9Ô9Ñ€GˆWØ�dŠ?ˆ?ˆ?ˆ?Ø�dŠ?ˆ?ˆ?ˆ?ˆ?ˆ?ó    c            	      óv  — t          dd¬¦  «        } t          j        ¦   «         5 }t          j                             |d¦  «        }t          j        ddd¦  «        }t          d¦  «        D ]_}|  	                    |d	¦  «        \  }}t          d
d¦  «        D ]3}t          d
d¦  «        D ] }| 
                    ||z   ||z   fd¦  «         Œ!Œ4Œ`|                     |¦  «         |                      |¦  «        }	t          |	¦  «        dk    sJ ‚d„ |	D ¦   «         }
|
g d¢k    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )u=   Kiá»ƒm tra phÃ¡t hiá»‡n Waystone trÃªn áº£nh thá»±c nghiá»‡m.r   r	   r
   ztest_inv.pngÚRGB©r   r	   ©é   r#   r#   é   r   iñÿÿÿé   ©éx   én   éZ   c                 ó   — g | ]
}|d          ‘ŒS )r   © )Ú.0Úfs     r   ú
<listcomp>zCtest_optical_inventory_row1_waystones_detection.<locals>.<listcomp>F   s   € Ð*Ð*Ð*˜q�a˜”dÐ*Ð*Ð*r   )r   r   é   é   r   N)r   ÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinr   ÚnewÚranger   ÚputpixelÚsaveÚscan_row1_waystonesÚlen)ÚscannerÚtmpdirÚimg_pathÚimgÚcolÚcxÚcyÚdxÚdyÚfoundÚ
found_colss              r   Ú/test_optical_inventory_row1_waystones_detectionrG   3   s¥  € å%¨t¸dÐCÑCÔC€Gå	Ô	$Ñ	&Ô	&ð -¨&Ý”7—<’< ¨Ñ7Ô7ˆÝŒi˜˜|¨YÑ7Ô7ˆõ ˜‘8”8ð 	Eð 	EˆCØ×,Ò,¨S°!Ñ4Ô4‰FˆB�Ý˜C ‘n”nð Eð E�Ý  R™.œ.ð Eð E�BØ—L’L " r¡'¨2°©7Ð!3°^ÑDÔDÐDÐDðEðEð 	�Š�ÑÔÐà×+Ò+¨HÑ5Ô5ˆÝ�5‰zŒz˜QŠˆˆˆØ*Ð* EÐ*Ñ*Ô*ˆ
Ø˜_˜_˜_Ò,Ð,Ð,Ð,Ð,ð!-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s   ¥C;D.Ä.D2Ä5D2c            
      óÊ  — t          dd¬¦  «        } t          j        ¦   «         5 }t          j                             |d¦  «        }t          j        ddd¦  «        }d}t          d	¦  «        D ]|}t          d
¦  «        D ]j}|dk     rb|  	                    ||¦  «        \  }}t          dd¦  «        D ]3}	t          dd¦  «        D ] }
| 
                    ||	z   ||
z   fd¦  «         Œ!Œ4|dz  }ŒkŒ}|                     |¦  «         |                      |¦  «        }|d         dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚|d         du sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )uV   Kiá»ƒm tra phÃ¡t hiá»‡n tÃºi Ä‘á»“ Ä‘áº§y (is_full == True khi >= 48 slots cÃ³ Ä‘á»“).r   r	   r
   úfull_inv.pngr    r!   r"   r   r$   é   é2   éöÿÿÿr   ©éd   rN   rN   r   Útotal_slotsé<   Úoccupied_countÚempty_counté
   Úis_fullTN)r   r1   r2   r3   r4   r5   r   r6   r7   r   r8   r9   Úscan_full_inventory)r<   r=   r>   r?   ÚoccupiedÚrÚcrA   rB   rC   rD   Úress               r   Ú%test_optical_inventory_full_detectionrZ   J   sì  € å%¨t¸dÐCÑCÔC€Gå	Ô	$Ñ	&Ô	&ð &¨&Ý”7—<’< ¨Ñ7Ô7ˆÝŒi˜˜|¨YÑ7Ô7ˆð ˆÝ�q‘”ð 	"ð 	"ˆAÝ˜2‘Y”Yð "ð "�Ø˜b’=�=Ø$×4Ò4°Q¸Ñ:Ô:‘F�B˜Ý# C¨™nœnð Nð N˜Ý"'¨¨R¡.¤.ð Nð N˜BØŸLšL¨"¨r©'°2¸±7Ð);¸_ÑMÔMÐMÐMðNà ‘M�Høð"ð 	�Š�ÑÔÐà×)Ò)¨(Ñ3Ô3ˆØ�=Ô! RÒ'Ð'Ð'Ð'ØÐ#Ô$¨Ò*Ð*Ð*Ð*Ø�=Ô! RÒ'Ð'Ð'Ð'Ø�9Œ~ Ð%Ð%Ð%Ð%Ð%ð+&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &s   ¥D%EÅEÅEc            
      óÞ  — t          dd¬¦  «        }  G d„ d¦  «        } |¦   «         }t          j        ¦   «         5 }t          j                             |d¦  «        }t          j        ddd	¦  «        }d
}t          d¦  «        D ]|}t          d¦  «        D ]j}|dk     rb|  	                    ||¦  «        \  }	}
t          dd¦  «        D ]3}t          dd¦  «        D ] }| 
                    |	|z   |
|z   fd¦  «         Œ!Œ4|dz  }ŒkŒ}|                     |¦  «         |                      ||dd
¬¦  «        }|d         du sJ ‚d|d         v sJ ‚|j        �J ‚|                      ||dd¬¦  «        }|d         du sJ ‚d|d         v sJ ‚|j        �J ‚|                      ||dd
¬¦  «        }|d         du sJ ‚|d         du sJ ‚|d         du sJ ‚|j        dk    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )uv   Kiá»ƒm tra báº¥t biáº¿n INV-NPC-01: Chá»‰ kÃ­ch hoáº¡t Identify All táº¡i Town/Hideout vÃ  khi khÃ´ng cÃ³ quÃ¡i váº­t.r   r	   r
   c                   ó2   — e Zd Zd„ Zddedededed	ef
d
„ZdS )ú@test_hooded_one_identify_trigger_town_safety.<locals>.MockBridgec                 ó   — d | _         d S ©N©Ú	last_call©Úselfs    r   Ú__init__zItest_hooded_one_identify_trigger_town_safety.<locals>.MockBridge.__init__k   ó   € Ø!ˆDŒNˆNˆNr   r   r   é˜:  Únpc_idÚmodeÚ
option_idxÚ
timeout_msÚreturnc                 ó   — ||||f| _         dS ©NTr`   ©rc   rg   rh   ri   rj   s        r   Úsend_npc_interactzRtest_hooded_one_identify_trigger_town_safety.<locals>.MockBridge.send_npc_interactn   ó   € Ø$ d¨J¸
ÐCˆDŒNØ�4r   N©r   r   r   rf   ©Ú__name__Ú
__module__Ú__qualname__rd   ÚintÚboolro   r+   r   r   Ú
MockBridger]   j   ób   € € € € € ð	"ð 	"ð 	"ð	ð 	¨Cð 	¸3ð 	ÐPSð 	Ðehð 	Ðuyð 	ð 	ð 	ð 	ð 	ð 	r   rx   zinv.pngr    r!   r"   r   r$   rJ   é7   rL   r   rM   r   zMap Deserted©Ú	area_nameÚmonster_countÚ	triggeredFzkhong phai la Town/HideoutÚerrorNúShoreline HideoutzVi pham INV-NPC-01TÚ
is_in_townrT   ©r   r   r   rf   )r   r1   r2   r3   r4   r5   r   r6   r7   r   r8   r9   Ú%check_and_trigger_hooded_one_identifyra   )r<   rx   Úmock_bridger=   r>   r?   rV   rW   rX   rA   rB   rC   rD   Ú
res_combatÚres_monstersÚres_oks                   r   Ú,test_hooded_one_identify_trigger_town_safetyrˆ   f   sý  € å%¨t¸dÐCÑCÔC€Gðð ð ð ð ñ ô ð ð �*‘,”,€Kå	Ô	$Ñ	&Ô	&ð &9¨&Ý”7—<’< ¨	Ñ2Ô2ˆÝŒi˜˜|¨YÑ7Ô7ˆàˆÝ�q‘”ð 	"ð 	"ˆAÝ˜2‘Y”Yð "ð "�Ø˜b’=�=Ø$×4Ò4°Q¸Ñ:Ô:‘F�B˜Ý# C¨™nœnð Nð N˜Ý"'¨¨R¡.¤.ð Nð N˜BØŸLšL¨"¨r©'°2¸±7Ð);¸_ÑMÔMÐMÐMðNà ‘M�Høð"ð 	�Š�ÑÔÐð ×BÒBØ�k¨^È1ð Cñ 
ô 
ˆ
ð ˜+Ô&¨%Ð/Ð/Ð/Ð/Ø+¨z¸'Ô/BÐBÐBÐBÐBØÔ$Ð,Ð,Ð,ð ×DÒDØ�kÐ-@ÐPQð Eñ 
ô 
ˆð ˜KÔ(¨EÐ1Ð1Ð1Ð1Ø# |°GÔ'<Ð<Ð<Ð<Ð<ØÔ$Ð,Ð,Ð,ð ×>Ò>Ø�kÐ-@ÐPQð ?ñ 
ô 
ˆð �kÔ" dÐ*Ð*Ð*Ð*Ø�lÔ# tÐ+Ð+Ð+Ð+Ø�iÔ  DÐ(Ð(Ð(Ð(ØÔ$Ð(8Ò8Ð8Ð8Ð8Ð8ðM&9ð &9ð &9ñ &9ô &9ð &9ð &9ð &9ð &9ð &9ð &9ð &9øøøð &9ð &9ð &9ð &9ð &9ð &9s   ¼FG"Ç"G&Ç)G&c            
      óÈ  —  G d„ d¦  «        }  | ¦   «         }t          |¬¦  «        }d|_        d|_        t          j        ¦   «         5 }t
          j                             |d¦  «        }t          j	        ddd	¦  «        }t          d
¦  «        D ]v}t          d¦  «        D ]d}|j                             ||¦  «        \  }}	t          dd¦  «        D ]3}
t          dd¦  «        D ] }|                     ||
z   |	|z   fd¦  «         Œ!Œ4ŒeŒw|                     |¦  «         |                     |¦  «        }|d         du sJ ‚|j        dk    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )uO   Kiá»ƒm tra tÃ­ch há»£p Hooded One Identify All vÃ o AutonomousLifecycleManager.c                   ó2   — e Zd Zd„ Zddedededed	ef
d
„ZdS )úDtest_autonomous_lifecycle_hooded_one_integration.<locals>.MockBridgec                 ó   — d | _         d S r_   r`   rb   s    r   rd   zMtest_autonomous_lifecycle_hooded_one_integration.<locals>.MockBridge.__init__    re   r   r   r   rf   rg   rh   ri   rj   rk   c                 ó   — ||||f| _         dS rm   r`   rn   s        r   ro   zVtest_autonomous_lifecycle_hooded_one_integration.<locals>.MockBridge.send_npc_interact£   rp   r   Nrq   rr   r+   r   r   rx   r‹   Ÿ   ry   r   rx   )Úcore_bridger€   TrI   r    r!   r"   r$   rJ   rL   r   ©r'   r'   r'   r~   r‚   N)r   Úcurrent_area_namer�   r1   r2   r3   r4   r5   r   r6   r7   Úinventory_scannerr   r8   r9   Útrigger_hooded_one_identifyra   )rx   ÚbridgeÚmanagerr=   r>   r?   rW   rX   rA   rB   rC   rD   rY   s                r   Ú0test_autonomous_lifecycle_hooded_one_integrationr•   �   sö  € ðð ð ð ð ñ ô ð ð ˆZ‰\Œ\€FÝ(°VÐ<Ñ<Ô<€GØ 3€GÔØ€GÔå	Ô	$Ñ	&Ô	&ð 4¨&Ý”7—<’< ¨Ñ7Ô7ˆÝŒi˜˜|¨YÑ7Ô7ˆÝ�q‘”ð 	Jð 	JˆAÝ˜2‘Y”Yð Jð J�Ø Ô2×BÒBÀ1ÀaÑHÔH‘��BÝ  R™.œ.ð Jð J�BÝ# C¨™nœnð Jð J˜ØŸš b¨2¡g¨r°B©wÐ%7¸ÑIÔIÐIÐIðJðJðJð
 	�Š�ÑÔÐà×1Ò1°(Ñ;Ô;ˆØ�;Ô 4Ð'Ð'Ð'Ð'ØÔÐ#3Ò3Ð3Ð3Ð3Ð3ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4ð 4s   Á	D EÅEÅEc            
      óØ  — t          dd¬¦  «        }  G d„ d¦  «        } |¦   «         }t          j        ¦   «         5 }t          j                             |d¦  «        }t          j        ddd	¦  «        }d
}t          d¦  «        D ]|}t          d¦  «        D ]j}|dk     rb|  	                    ||¦  «        \  }	}
t          dd¦  «        D ]3}t          dd¦  «        D ] }| 
                    |	|z   |
|z   fd¦  «         Œ!Œ4|dz  }ŒkŒ}|                     |¦  «         |                      |¦  «        }|d         dk    sJ ‚|d         du sJ ‚|                      ||dd
¬¦  «        }|d         du sJ ‚|d         du sJ ‚d|d         v sJ ‚|j        �J ‚t          j                             |d¦  «        }t          j        ddd	¦  «        }d
}t          d¦  «        D ]|}t          d¦  «        D ]j}|dk     rb|  	                    ||¦  «        \  }	}
t          dd¦  «        D ]3}t          dd¦  «        D ] }| 
                    |	|z   |
|z   fd¦  «         Œ!Œ4|dz  }ŒkŒ}|                     |¦  «         |                      |¦  «        }|d         dk    sJ ‚|d         du sJ ‚|                      ||dd
¬¦  «        }|d         du sJ ‚|d         du sJ ‚|j        dk    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )ux   Kiá»ƒm tra chÃ­nh xÃ¡c ngÆ°á»¡ng biÃªn: 47 slots (ChÆ°a Ä‘áº§y, khÃ´ng kÃ­ch hoáº¡t) vs 48 slots (Ä�áº§y, kÃ­ch hoáº¡t).r   r	   r
   c                   ó2   — e Zd Zd„ Zddedededed	ef
d
„ZdS )ú<test_optical_inventory_boundary_47_vs_48.<locals>.MockBridgec                 ó   — d | _         d S r_   r`   rb   s    r   rd   zEtest_optical_inventory_boundary_47_vs_48.<locals>.MockBridge.__init__Á   re   r   r   r   rf   rg   rh   ri   rj   rk   c                 ó   — ||||f| _         dS rm   r`   rn   s        r   ro   zNtest_optical_inventory_boundary_47_vs_48.<locals>.MockBridge.send_npc_interactÄ   rp   r   Nrq   rr   r+   r   r   rx   r˜   À   ry   r   rx   z
inv_47.pngr    r!   r"   r   r$   rJ   é/   rL   r   r�   r   rQ   rT   Fr€   r{   r~   zTui do chua day (47/60 o)r   Nz
inv_48.pngé0   Tr‚   )r   r1   r2   r3   r4   r5   r   r6   r7   r   r8   r9   rU   rƒ   ra   )r<   rx   r„   r=   Úimg_47_pathÚimg_47rV   rW   rX   rA   rB   rC   rD   Úres_47Ú
trigger_47Úimg_48_pathÚimg_48Úres_48Ú
trigger_48s                      r   Ú(test_optical_inventory_boundary_47_vs_48r¥   ¼   s  € å%¨t¸dÐCÑCÔC€Gðð ð ð ð ñ ô ð ð �*‘,”,€Kå	Ô	$Ñ	&Ô	&ð 29¨&å”g—l’l 6¨<Ñ8Ô8ˆÝ”˜5 ,°	Ñ:Ô:ˆØˆÝ�q‘”ð 	"ð 	"ˆAÝ˜2‘Y”Yð "ð "�Ø˜b’=�=Ø$×4Ò4°Q¸Ñ:Ô:‘F�B˜Ý# C¨™nœnð Qð Q˜Ý"'¨¨R¡.¤.ð Qð Q˜BØ"ŸOšO¨R°"©W°b¸2±gÐ,>ÀÑPÔPÐPÐPðQà ‘M�Høð"ð 	�Š�KÑ Ô Ð à×,Ò,¨[Ñ9Ô9ˆØÐ&Ô'¨2Ò-Ð-Ð-Ð-Ø�iÔ  EÐ)Ð)Ð)Ð)à×BÒBØ˜Ð0CÐSTð Cñ 
ô 
ˆ
ð ˜+Ô&¨%Ð/Ð/Ð/Ð/Ø˜)Ô$¨Ð-Ð-Ð-Ð-Ø*¨j¸Ô.AÐAÐAÐAÐAØÔ$Ð,Ð,Ð,õ ”g—l’l 6¨<Ñ8Ô8ˆÝ”˜5 ,°	Ñ:Ô:ˆØˆÝ�q‘”ð 	"ð 	"ˆAÝ˜2‘Y”Yð "ð "�Ø˜b’=�=Ø$×4Ò4°Q¸Ñ:Ô:‘F�B˜Ý# C¨™nœnð Qð Q˜Ý"'¨¨R¡.¤.ð Qð Q˜BØ"ŸOšO¨R°"©W°b¸2±gÐ,>ÀÑPÔPÐPÐPðQà ‘M�Høð"ð 	�Š�KÑ Ô Ð à×,Ò,¨[Ñ9Ô9ˆØÐ&Ô'¨2Ò-Ð-Ð-Ð-Ø�iÔ  DÐ(Ð(Ð(Ð(à×BÒBØ˜Ð0CÐSTð Cñ 
ô 
ˆ
ð ˜+Ô&¨$Ð.Ð.Ð.Ð.Ø˜)Ô$¨Ð,Ð,Ð,Ð,ØÔ$Ð(8Ò8Ð8Ð8Ð8Ð8ðe29ð 29ð 29ñ 29ô 29ð 29ð 29ð 29ð 29ð 29ð 29ð 29øøøð 29ð 29ð 29ð 29ð 29ð 29s   ¼JKËK#Ë&K#c            
      ór  — t          dd¬¦  «        } t          j        ¦   «         5 }t          j                             |d¦  «        }t          j        ddd¦  «        }t          d¦  «        D ]_}|  	                    |d	¦  «        \  }}t          d
d¦  «        D ]3}t          d
d¦  «        D ] }| 
                    ||z   ||z   fd¦  «         Œ!Œ4Œ`d	}	t          dd¦  «        D ]|}
t          d¦  «        D ]j}|	dk     rb|  	                    ||
¦  «        \  }}t          dd¦  «        D ]3}t          dd¦  «        D ] }| 
                    ||z   ||z   fd¦  «         Œ!Œ4|	dz  }	ŒkŒ}|                     |¦  «         |                      |¦  «        }|d         dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚|d         du sJ ‚|                      |¦  «        }|d         dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚|d         du sJ ‚|                      |¦  «        du sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS ) uW   Kiá»ƒm tra phÃ¢n vÃ¹ng Row 0 (Reserved Zone) vÃ  Rows 1-4 (Loot Zone) theo Doc 63 SSoT.r   r	   r
   zpartition_test.pngr    r!   r"   r0   r   iôÿÿÿé   r&   r   r$   rJ   é-   rL   r   rM   Útotal_reserved_slotsÚready_countrR   é	   Úhas_waystoneTÚtotal_loot_slotsrœ   Úoccupied_loot_slotsÚempty_loot_slotsÚis_loot_fullN)r   r1   r2   r3   r4   r5   r   r6   r7   r   r8   r9   Úscan_row0_statusÚscan_loot_capacityÚis_inventory_full)r<   r=   r>   r?   rX   rA   rB   rC   rD   Úloot_occupiedrW   Úrow0Úloot_caps                r   Ú.test_optical_inventory_row0_and_loot_partitionr·   ÿ   s  € å%¨t¸dÐCÑCÔC€Gå	Ô	$Ñ	&Ô	&ð %;¨&Ý”7—<’< Ð(<Ñ=Ô=ˆÝŒi˜˜|¨YÑ7Ô7ˆõ �q‘”ð 	Eð 	EˆAØ×,Ò,¨Q°Ñ2Ô2‰FˆB�Ý˜C ‘n”nð Eð E�Ý  R™.œ.ð Eð E�BØ—L’L " r¡'¨2°©7Ð!3°^ÑDÔDÐDÐDðEðEð
 ˆÝ�q˜!‘”ð 	'ð 	'ˆAÝ˜2‘Y”Yð 'ð '�Ø  2Ò%Ð%Ø$×4Ò4°Q¸Ñ:Ô:‘F�B˜Ý# C¨™nœnð Nð N˜Ý"'¨¨R¡.¤.ð Nð N˜BØŸLšL¨"¨r©'°2¸±7Ð);¸_ÑMÔMÐMÐMðNà! QÑ&�Møð'ð 	�Š�ÑÔÐð ×'Ò'¨Ñ1Ô1ˆØÐ*Ô+¨rÒ1Ð1Ð1Ð1Ø�MÔ" aÒ'Ð'Ð'Ð'Ø�MÔ" aÒ'Ð'Ð'Ð'Ø�NÔ# tÐ+Ð+Ð+Ð+ð ×-Ò-¨hÑ7Ô7ˆØÐ*Ô+¨rÒ1Ð1Ð1Ð1ØÐ-Ô.°"Ò4Ð4Ð4Ð4ØÐ*Ô+¨qÒ0Ð0Ð0Ð0Ø˜Ô'¨4Ð/Ð/Ð/Ð/Ø×(Ò(¨Ñ2Ô2°dÐ:Ð:Ð:Ð:Ð:ðK%;ð %;ð %;ñ %;ô %;ð %;ð %;ð %;ð %;ð %;ð %;ð %;øøøð %;ð %;ð %;ð %;ð %;ð %;s   ¥G9H,È,H0È3H0)Ú__doc__r3   r1   ÚpytestÚPILr   Ú,src.assistant_tool.optical_inventory_scannerr   Ú'src.assistant_tool.autonomous_lifecycler   r   r   rG   rZ   rˆ   r•   r¥   r·   r+   r   r   ú<module>r½      sà   ððð ð 
€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à PÐ PÐ PÐ PÐ PÐ PØ ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^ðð ð ð>-ð -ð -ð.&ð &ð &ð849ð 49ð 49ðn4ð 4ð 4ð>@9ð @9ð @9ðF);ð );ð );ð );ð );r   