Team Ai
Apppublic

documentExtractionag051/ExtractDocument

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
invoice_post_processing.cpython-313.pyc182 linesDownload Raw Back to __pycache__
1�

2S"aiC����SSKrSSKrSSKJrJrJrJr SSKJrJ	r	J3r4 \R"\RSS9 \R"\5rSSjrSSjrSrS	rS5rSrSSjrSS
jrg)�N)�List�Dict�Any�Optional)�compute_global_bounds�Rect�TextRectz"%(levelname)s:%(name)s:%(message)s)�level�formatc	�^�U(d[RS5 g/nUHHnURR5nU(dM&[	U5S:�dM7URU5 MJ [	U5U:a#[RS[	U5S35 gSnUVs/sH6oe"U5PM nn0nUH6n	[
SU	55n7URU8/5RU	5 M8 [UR5SS	9nUup�[	U
5U:a[RS95 g/n[[	U55HinU
V	s/sHo�[	U	5:dMX�SPM nn	U(a'UR[U5[U545 MXURS5 Mk S
/n[U5H�unnUUunnUS:XaSnOWUS:XaSnONUS:XaSnOEUS:XaSnO<US:XaSnO3US;a[R"U5nO[R"U5nUU:Xa2US:XaURU5 M�URUSUS35 M�URUSUSUS35 M� URS5 SRU5n[R "U5m[#U4SjU55nU[	U5-S-n[R%S 5 [R%S!U35 [R%S"USS#[	U5S#:�aS$OS35 [R%S%US&[	U5S'US(S)35 US*:�aT$[RS+US(S,35 T$s snfs sn	f![R&a%n[R'S-US.U35 SnAgSnAff=f)/u�10Automatically infer a regex pattern from anchor column values.11 12Analyzes sample values to detect common patterns like:13- Pure digits: "12345678" → r"^\d{8}$"14- Alphanumeric: "ABC123" → r"^[A-Z]{3}\d{3}$"15- With separators: "INV-2024-001" → r"^[A-Z]+-\d+-\d+$"16 17Args:18    anchor_column_lines: List of TextRect elements from the anchor column19    min_samples: Minimum samples needed for reliable pattern detection20 21Returns:22    Compiled regex pattern, or None if detection fails23z5No anchor column lines provided for pattern inferenceN�zNot enough samples (z ) for reliable pattern detectionc�P�/nSnSnUH�nUR5(aSnODUR5(aUR5(aSnOSnOUS;aUnOUS:XaSnOS	nXR:XaUS24-
nMkUbURX#45 UnS25nM� UbURX#45 U$)z%Convert value to a pattern signature.Nr�D�U�L�-_/\.:� �S�X�)�isdigit�isalpha�isupper�append)�value�
pattern_parts�current_type�
current_count�char�	char_types      �oC:\Users\poona\OneDrive\Documents\nextlifyai\Document_Automation\Document_Extraction\invoice_post_processing.py�_analyze_value�-_infer_anchor_pattern.<locals>._analyze_value,s����
����
��D��|�|�~�~��	�������<�<�>�>� #�I� #�I���"� �	�����	��	��(���"�
��+�!�(�(�,�)F�G�(�� !�
�+�.�#�� � �,�!>�?���c3�*# �UH	upUv� M g7f�N�)�.0�t�cs   r!�	<genexpr>�(_infer_anchor_pattern.<locals>.<genexpr>Us���-����1����c��[US5$�Nr)�len)�xs r!�<lambda>�'_infer_anchor_pattern.<locals>.<lambda>Ys��s�1�Q�4�yr$��keyz*No consistent pattern found across samplesr)rr�^rz\drz[A-Z]rz[a-z]rz\sr�.r�{�}�,�$�c3�X># �UHnTRU5(dMSv� M! g7f)rN)�match)r(�v�compileds  �r!r+r,�s����A�V��x�~�~�a�/@�!�!�V�s�*�	*�dz$=== Auto-detected Anchor Pattern ===zGenerated pattern: zSample values: �z...zMatch rate: �/z (z.1fz%)�<zPattern match rate too low (z%), pattern may be unreliablez$Failed to compile inferred pattern 'z': )�logger�warning�text�stripr0r�tuple�26setdefault�max�items�range�min�	enumerate�re�escape�join�compile�sum�info�error)�anchor_column_lines�min_samples�values�linerGr"r?�27signatures�sig_structures�sig�28struct_key�best_structure�structure_types�
matching_sigs�position_counts�pos_idx�counts�regex_parts�idxr �	min_count�	max_count�29char_class�pattern_str�match_count�	match_pct�er@s                           @r!�_infer_anchor_patternrns���� ����N�O���F�#���y�y��� ���4�C��I��N��M�M�$��$�30�6�{�[� ����-�c�&�k�]�:Z�[�\�� �F.4�4�V��.��#�V�J�4��N����-��-�-�31��!�!�*�b�1�8�8��=����-�-�/�5H�I�N�%3�"�O�32�=��K�'����C�E���O���_�-�.��-:�Q�]�c��C��>P�/�#�,�q�/�]��Q���"�"�C��K��V��#=�>��"�"�6�*�/��%�K�#�O�4���Y�.�s�3��	�9�����J�
�#�
�!�J�
�#�
�!�J�
�#�
��J�
�#�
��J�
�)�
#����9�-�J����9�-�J��	�!��A�~��"�"�:�.��"�"�j�\��I�;�b�#A�B����*��R�	�{�!�I�;�b�I�J�55�8���s���'�'�+�&�K���:�:�k�*���A�V�A�A�� �3�v�;�.�#�5�	����:�<����)�+��7�8����o�f�R�a�j�\�3�v�;��?�%�PR�1S�T�U����l�;�-�q��V��
�R�	�#��b�Q�R���?��O��N�N�9�)�C��He�f�g��O��Y5��*R��r�8�8�����;�K�=��A�3�O�P����s1�(N�N�.N�3CN!�;N!�!O�5O�Oc	���[RS5 Uc0nURSS5n33URSS5nURSS5nURSS	5n
URS34/5nU(aUOSSSS
SS.nU(aUOSn[U5n[	XU5n[XU5n[
UU5nU(a0[R"U5/n[RSU35 OvURU/5n[U5nU(a&U/n[RSUR35 O,[RS5 [R"S5/nURU/5n[UUUSU5n[RS[U5SUS35 [UUUUUUUU35UUU
US9n[RS[U5S35 SU0US'U$)a�36Specialized post-processing pipeline for Invoice documents.37 38Fixes applied:39- Multi-line cell text is now ordered top-to-bottom, then left-to-right.40- Rows with invalid Material codes are removed based on multiple regex opt.41- Auto-detects anchor pattern from column values if not provided.42 43Args:44    column_headers: Dict mapping field names to header text in document45    anchor_column: Column name used for row detection46    anchor_pattern: Regex pattern string for validating anchor column values.47                   If not provided, the pattern will be AUTO-DETECTED from48                   the values in the anchor column (e.g., if values are49                   "12345678", "87654321", pattern becomes r"^\d{8}$")50    advanced_options: Dict for special logic options:51        - stop_text: Text marking end of table on last page52        - enable_continuation: Whether to enable continuation column53        - continuation_marker: Text after which continuation starts54z.Running invoice specialized post-processing...�	stop_textz
Total Amount:�enable_continuationF�continuation_column�Description�continuation_markerzRef.:�table_end_markers�
Material CodezQty.z55Unit PricezTotal Net Value)rvrs�Quantity�56unit_price�total_pricez$Using user-provided anchor pattern: z$Using auto-detected anchor pattern: zBCould not auto-detect pattern, using fallback (any non-empty text)z^.+$rzIdentified z rows based on anchor column '�')�rows�
column_spaces�space_to_lines�cumulative_heights�MATERIAL_CODE_PATTERNS�	ocr_elems�
anchor_columnrprqrrrt�table_boundariesz57Extracted z table rows�table�tables)rErU�get�_calculate_cumulative_heights�_create_column_spaces�_find_table_boundaries�_assign_lines_to_spacesrPrSrn�patternrF�_identify_rowsr0�_extract_table_rows)r��validation_data�58field_name�anchor_keywords�column_headersr��anchor_pattern�advanced_options�page_dimensions�kwargsrprqrrrtru�COLUMN_HEADERS�
ANCHOR_COLUMNr~r|r�r}r�anchor_col_lines�auto_patternr{�59table_rowss                          r!�extract_invoice_tablesr��s.��@�K�K�@�A����� �$�$�[�/�B�I�*�.�.�/D�e�L��*�.�.�/D�m�T��*�.�.�/D�g�N��)�,�,�-@�"�E��(6�^�(�$��"�(�<�N�&3�M��M�7��G��*�)�n�U�M�.�i�J[�\��-�Y�
�F�N��"$�*�*�^�"<�!=�����:�>�:J�K�L�*�-�-�m�R�@��,�-=�>���&2�^�"��K�K�>�|�?S�?S�>T�U�V�
�N�N�_�`�&(�j�j��&9�%:�"�&�)�)�-��<������q�!��	�D��K�K�+�c�$�i�[�(F�}�o�UV�W�X�%�
�#�%�-�5��#��/�/�/�)�
�J��K�K�*�S��_�-�[�9�:�")�*� 5�O�H���r$c�l�0nSn[UR55HnX!U'XSnX$-
nM U$)z;Calculate cumulative page heights for multi-page documents.rr)�sorted�keys)r�r~�cumulative_height�page_num�heights     r!r�r�sL�������?�/�/�1�2��'8�8�$� �*�1�-���#��3�60�r$c�6^�UR5Vs0sHo3S_M nnU(a [SUR555OSnUVs/sH)nURS:XdMURS:XdM'UPM+ nn[61R
S5 [62R
SU35 [63R
S[U5S	35 [64RS655 UHgn[66RSURR5SURS
URSURS
UR3675 Mi SmU4Sjn0n	UR5GHup�SnSn
SnUH'nU"URU5unnUU
:�dM!Un
UnUnM) U(a�U(a�[!URSURUS9XJ'UURR5UU
URS
UR3S.X�'[68R
SU69SURR5SUSU
SURS
URS3
5 M�[70R#SU71SUS35 GM [%SUR555nUR5VVs/sH
unnUbMUPM nnn[72R
S5 [73R
SUS[U5S35 U(av[74R#S S!R'U535 [75R
S"5 UH4n[76R
S#URR5S35 M6 U$s snfs snfs snnf)$a77Create vertical column spaces based on header text positions.78 79Uses a multi-pass matching strategy:801. Exact match (case-sensitive)812. Case-insensitive match823. Partial/contains match (header text in element or element in header)834. Normalized match (strip whitespace, lowercase)84 85Args:86    ocr_elems: List of OCR TextRect elements87    page_dimensions: Dict of {page_num: (width, height)}88    column_headers: Dict mapping column keys to header text patterns89 90Returns:91    Dict mapping column keys to Rect objects representing column spaces92Nc3�*# �UH	upUv� M g7fr&r')r(�widthr�s   r!r+�(_create_column_spaces.<locals>.<genexpr>=s���O�6N�]�U�&�6N�r-rr�LINEz=== Column Header Detection ===zLooking for headers: �Found z LINE elements on page 1zPage 1 LINE elements:z  'z' at x=�-�, y=c�x�SRUR5R5R55$)zENormalize text for comparison: lowercase, strip, collapse whitespace.r)rR�lowerrH�split)rGs r!�_normalize_text�._create_column_spaces.<locals>._normalize_textNs)���x�x��93�94��*�*�,�2�2�4�5�5r$c�8>�UR5nUR5nX#:XagUR5UR5:XagT"U5nT"U5nXE:XagXT;agXE;agURU5(agURU5(agg)	z^95Multi-strategy header matching.96 97Returns: (match_type, confidence) where confidence is 0-10098)�exactrA)�case_insensitive�_)�99normalized�Z)�contains_header�P)�
contains_elem�K)�starts_with�F)�
header_starts�A�Nr)rHr��100startswith)�	elem_text�header_text�101elem_clean�header_clean�	elem_norm�header_normr�s      �r!�
_match_header�,_create_column_spaces.<locals>._match_headerRs�����_�_�&�102�"�(�(�*���%�!������!3�!3�!5�5�+�$�J�/�	�%�l�3���#�%��#�*��#�(�����,�,�&��!�!�)�,�,�(�r$)�x1�y1�x2�y2)r��matched_text�103match_type�104confidence�x_rangeu
✓ Matched 'z' -> 'z' (type=z, conf=z%, x=�)u✗ No match found for column 'z' with header 'rzc3�.# �UHocMSv� M
 g7fr/r')r(�spaces  r!r+r��s���Q�%;�E�a�a�%;�s��	z === Header Detection Summary ===rCz columnszMissing columns: �, z/Available LINE texts on page 1 (for debugging):�  - ')r�rKrYr��105block_typerErUr0�debugrGrHr�r�r�r�rLrrFrTrR)r�r�r�r5r|�max_page_height�elem�page1_linesr��matched_headers�col_keyr��106best_match�best_confidence�	best_elemr�r��found_countr��missing_colsr�s                    @r!r�r�*sW���$+9�*=�*=�*?�@�*?�3�$�Y�*?�M�@�Sb�c�O�o�6L�6L�6N�O�O�hi�O�#��"���=�=�A��	
�"&�/�/�V�";�	
����107�K�K�1�2�108�K�K�'��'7�8�9�109�K�K�&��[�)�*�*B�C�D��L�L�(�)������s�4�9�9�?�?�,�-�W�T�W�W�I�Q�t�w�w�i�t�D�G�G�9�TU�VZ�V]�V]�U^�_�`��6�#�L�O� .� 4� 4� 6����110����	��D�%2�4�9�9�k�%J�"�J�111��O�+�",��'�112� �	� ��)�%)��<�<���<�<�"�	&�M�"� +� )��� 4� 4� 6�(�-�'�l�l�^�1�Y�\�\�N�;�(�O�$�
�K�K���y��y�~�~�/C�/C�/E�.F�G�#��G�O�+<�E�)�,�,��q�QZ�Q]�Q]�P^�^_�a�
�113
�N�N�<�W�I�_�U`�Ta�ab�c�d�?!7�D�Q�]�%9�%9�%;�Q�Q�K�*7�*=�*=�*?�Q�*?�J�C��5�C�*?�L�Q�114�K�K�2�4�115�K�K�&��
�Q�s�>�':�&;�8�D�E�����*�4�9�9�\�+B�*C�D�E����E�F��D��K�K�%��	�	��� 1�2�!�4�5� ����YA����zRs#�N�N�'N�9N�;116N�	Nc
��0nUR5H�unupVSUS.X4'U(dMUnUH�nURU:XdMURS:XdM'UH_n	X�R;dMURU:a:URS-117n[118R
SUSU	SURSU35  M� M� XsUS	'M� U$)119z�120Find the table content boundaries for each page.121Returns dict: {page_num: {'top': y1, 'bottom': y2}}122 123The bottom boundary is determined by finding footer markers.124r)�top�bottomr��125zPage z: Found footer marker 'z' at y=z, setting table bottom to r�)rLr�r�rGr�rErU)126r�r�ru�127boundariesr��128page_width�page_height�129footer_topr��markers130          r!r�r��s����J�/>�/D�/D�/F�+��+�:��!� 131�132��133!��!�134��D��}�}��(�T�_�_��-F�/�F����*��7�7�Z�/�)-���2��J�"�K�K�%��z�9P�QW�PX�Y.�.2�g�g�Y�6P�Q[�P\�)^�_��0��*4�8��X�&�/0G�2�r$c�F�UR5Vs0sHo"/_M nnUHunURS:waMSupVUR5H$upxUcM135URU5n	X�:�dM"X�pVM& U(dMZUS:�dMbX5R	U5 Mw U$s snf)z;Assign each LINE element to its best-matching column space.r�r�r)r�r�rL�intersection_pctr)136r�r|r5r}�	line_elem�137best_space�best_intersectionr��138space_rect�intersections139          r!r�r��s���)6�);�);�)=�>�)=�#�2�g�)=�N�>��	����6�)��(/�%�140�#0�#6�#6�#8��G��!��%�6�6�y�A�L��/�0<�:�$9��:�+�a�/��&�-�-�i�8�� ���%?s�Bc��[RS[U5SUR35 UHRnURR5nUR
U5n[RSUSU(aSOS35 MT UVs/sH4oBR
URR55(dM2UPM6 nn[RS[U5S35 U(a3[RS	UVs/sHoDRPM sn35 O�[RS141URS35 [RS5 US
SHNn[RSURR5SURSURS35 MP 0/p�UH.nURUR/5RU5 M0 [UR55H�up�[USS9nXup�U(a
X�;aX:SnOUn[U5H�unnURnUS-[U5:aUUS-RnOUn[!SUU
USSS9n[RSU142SUR"SUR35 U	RU143US.5 M� M� U	$s snfs snf)z�144Identify row boundaries based on material code positions.145 146Args:147    table_boundaries: Dict with table content boundaries per page148zTesting z lines against anchor pattern: z  Line 'z' -> �MATCHzno matchr�z valid anchor column valueszValid material lines: zNo lines matched pattern 'rzzAvailable anchor column values:N�r�z' (page r�r�c��UR$r&�r���ls r!r2� _identify_rows.<locals>.<lambda>s��1�4�4r$r4r�rr�ROWg�?)r�r�r�r�r�r�zCreated row rect: page=z, x1=z, y1=)r��row_rect)rErUr0r�rGrHr>r�rFr�r�rJrr�rLrOrr�)�material_code_linesr�r�r�rZrGr>�valid_material_lines�
page_to_linesr{r��lines�lines_sortedr�r��table_bottom�ir�r�r�s                    r!r�r��s����K�K�(�3�2�3�4�4S�T[�Tc�Tc�Sd�e�f�#���y�y��� ���
�
�d�#�����x��v�U�e�7��*L�M�N�$�-��,��
�
�d�i�i�o�o�>O�0P��,����K�K�&��1�2�3�3N�O�P�����,�DX�-Y�DX�D�i�i�DX�-Y�,Z�[�\�	���3�G�O�O�3D�A�F�G����8�:�'���,�D��K�K�%��	�	��� 1�2�(�4�=�=�/��d�g�g�Y�VW�X�Y�-��b�4�$��� � �����3�:�:�4�@�%�"�-�"5�"5�"7�8����e��8��"1�";��149��� <�+�5�h�?�L�&�L� ��.�G�A�t����B��1�u�s�<�(�(�!�!�a�%�(�+�+��"���q�R�J�2�%�\_�`�H��L�L�2�8�*�E�(�+�+��e�T\�T_�T_�S`�a�b��K�K�X�8�D�E�/�9�,�K��Q��.Zs�1K�K�K150c��/nU(dU$[SU55n
[RSU
35 [USS9n[	U5GH`unnUSnUSnURUS5n0nUR
5GH�unnUcMSnU(aUU;aUUS	nURnUU
:Xa^U(aW[URU/5S151S9nUH6nUUR;dMURU:XdM'URS-152n O /nURU/5HVnURU:waMURU5S::aM,U(aURU:�aMEURU5 MX /nUH/nURU5nUS:�dMURUU45 M1 /nUH[unn Sn!UH3n"U"ULaM153U"SU:waMU"SRU5n#U#U :�dM1S
n! O U!(dMJURU5 M] /n$U(Ga~UU	:XGawSn%X�S-SHn&U&SU:XdMS
n% O U%(Ga�US-n'Sn(Sn)U(a/U'U;a)UU'RSS5n(UU'RS	5n)Sn*X�S-SHn&U&SU':XdMU&SRn+ O Sn,U154(aKUHEn-U-RU':XdMU-RS:XdM'U155U-R;dM9U-Rn, O W+b�URU/5H�nURU':waMURU5S::aM,URU+:�aM>U)(aURU):�aMWU156(aU,(aURU,::aMwU$RU5 M� U$(a.[RS[U$5SUSUSU'SU+S35 O�URU/5HvnURW':waMURU5S::aM,W)(aURU):�aMEU157(aW,(aURU,::aMeU$RU5 Mx U$(a+[RS[U$5SUSUSW'S3	5 UU$-n.[U.SS9n/SRSU/55n0[USS9n1U1(ab[!SU155n2[!SU155U-n3[SU155n4[SU155U-n5U2S U3S U4U2-158S U5U3-1593n6OS!n6U0U6S".UU'GM� URU05RS#S$5R#5n7[RS%US&U7S'35 URU5 GMc [RS([U535 U$))a�160Extract cell values for each table row by finding line elements at row-column intersections.161 162Args:163    stop_text: Text that marks end of table on last page164    enable_continuation: Whether to look for continuation on next page165    continuation_column: Which column may continue to next page166    continuation_marker: Text after which continuation starts167    table_boundaries: Dict with table content boundaries per page (to filter out footer)168c3�*# �UH	oSv� M g7f)r�Nr')r(�rows  r!r+�&_extract_table_rows.<locals>.<genexpr>Cs���!B�T�c�j�/�T�r-zHighest page row number: c�*�USUSR4$)Nr�r�r�)�rs r!r2�%_extract_table_rows.<locals>.<lambda>Gs��a�169�m�Q�z�]�=M�=M�-Nr$r4r�r�rNr�c��UR$r&r�r�s r!r2rcs��!�$�$r$r�TFrr�r�r�z continuation lines for z from page z	 to page z (above next row at y=r�z (no more rows on next page)c�\�UR[URS5UR4$r/)r��roundr�r�r�s r!r2r�s��q�z�z�5����q�>�1�4�4�@r$rc3�T# �UHoRR5v� M  g7fr&)rGrH�r(r�s  r!r+r�s��� J�9I�A�������9I�s�&(c�F�[URS5UR4$r/)r	r�r�r�s r!r2r�s��u�Q�T�T�1�~�q�t�t�4r$c3�8# �UHoRv� M g7fr&)r�rs  r!r+r�����9�'8�!���'8���c3�8# �UHoRv� M g7fr&r�rs  r!r+r�rrc3�8# �UHoRv� M g7fr&)r�rs  r!r+r�rrc3�8# �UHoRv� M g7fr&)r�rs  r!r+r�rrr�z0, 0, -1, -1)r�boundsrr<zValidating anchor column 'z170' value: 'rzz'Final table row count after filtering: )rKrErUr�rOr�rLr�rGr�r�r�rr�r0rRrNrH)8r{r|r}r~rr�r�rprqrrrtr�r��highest_page_row_number�sorted_rows�row_idxrr�r��
height_offset�row_datar��col_rect�page_table_bottom�effective_col_rect_y2�anchor_linesrZ�candidate_linesr��scored_lines�row_intersection�171cell_lines�score�best_row_for_line�	other_row�other_intersection�continuation_lines�is_last_row_on_page�172future_row�
next_page_num�next_page_table_top�next_page_table_bottom�next_row�next_row_y1�marker_line_y2r��all_lines_for_text�all_lines_sorted�	cell_text�cell_lines_sortedr�r�r�r�r�anchor_values8                                                        r!r�r� sE��<�J����!�!B�T�!B�B��173�K�K�+�,C�+D�E�F���#N�O�K�!�+�.�����z�?���z�?��*�.�.�x��;�
���!.�!4�!4�!6��G�X����174!%���H�0@�$@�$4�X�$>�x�$H�!�175%-�K�K�!��2�2�y�%�"�&�&�}�b�9�&� ��)�D� �D�I�I�-��=�=�H�4�48�G�G�b�L�1�!�	)�!�O�#�'�'���4���:�:��)���,�,�Q�/�1�4��$����1B�)B���&�&�q�)�5��L�'��#+�#<�#<�T�#B� �#�a�'� �'�'��/?�(@�A�(��J�+���e�$(�!�!,�I� �C�'� � ��,��8� �)2�:�)>�)O�)O�PT�)U�&�)�E�1�,1�)��"-�%�$��%�%�d�+� ,�$"$��"�w�2E�'E�&*�#�"-��k�l�";�J�!�*�-��9�.3�+��#<�176'�$,�q�L�M�+,�'�-1�*�'�M�=M�,M�.>�}�.M�.Q�.Q�RW�YZ�.[�+�1A�-�1P�1T�1T�U]�1^�.� $�H�&1�A�+�,�&?�177�%�j�1�]�B�*4�Z�*@�*C�*C�K�!�'@�&'�N�*�$-�D�#�}�}�
�=�$�/�/�U[�B[�#6�$�)�)�#C�59�W�W�N�$)�	%.�#�.�!/�!3�!3�G�R�!@�A� �z�z�]�:� (�'�8�8��;�q�@� (� �t�t�{�2� (�5�!�$�$�BX�:X� (�2�~�!�$�$�R`�J`� (�.�5�5�a�8�"A�"*����$�S�);�%<�$=�=U�V]�U^�_)�)1�178�)�M�?�J`�al�`m�mn�p���,�/�/���<���:�:��6�$�#�4�4�Q�7�1�<�$�1�a�d�d�>T�6T�$�.�>�a�d�d�n�F\�$�*�1�1�!�4�=�*����$�S�);�%<�$=�=U�V]�U^�_)�)1�179�)�M�?�Jf�h��",�.@�!@��%�"�@� ��180��� J�9I� J�J�I�!'��4�!��181!��9�'8�9�9���9�'8�9�9�M�I���9�'8�9�9���9�'8�9�9�M�I���4�r�"��R��R��y��2��7�)�<��'��#� �!�H�W��e"7�t �|�|�M�2�6�:�:�7�B�G�M�M�O�����0���z�,��WX�Y�Z�	���(�#�O/�R�K�K�9�#�j�/�9J�K�L��r$)�)�custom_field_nameNNNNNNr&)rvNFNNN)�loggingrP�typingrrrr�utils.geometry_utilsrrr	�basicConfig�INFO�	getLogger�__name__rErnr�r�r�r�r�r�r�r'r$r!�<module>r<s����	�,�,�F�F����'�,�,�/S�T�	�	�	�8�	$��S�r#�������x�v182�~�B"�J�.6�@"������vr$