§
    œ*¢j9  ã                  óÖ   — d Z ddlm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
mZ ddlmZ d1d„Zd2d„Zd3d„Zd4d„Zd5d„Zd6d„Zd7d„Zd8d!„Zd9d#„Zd:d$„Zd;d(„Zd3d)„Zd<d+„Zd=d-„Zd>d0„ZdS )?zIWrite catalog, HashCache, dat tables and HUD projections into SQLite WAL.é    )ÚannotationsN)ÚdatetimeÚtimezone)ÚPath)ÚAnyÚIterableé   )Ú	GgpkEntryÚnameÚstrÚreturnc                óÆ  — g }t          | ¦  «        D ]§\  }}|                     ¦   «         rg|re| |dz
                                ¦   «         s3|dz   t          | ¦  «        k     r2| |dz                                 ¦   «         r|                     d¦  «         |                     |                     ¦   «         ¦  «         Œ¨d                     |¦  «                             dd¦  «        S )Nr	   Ú_Ú Ú__)Ú	enumerateÚisupperÚislowerÚlenÚappendÚlowerÚjoinÚreplace)r   ÚoutÚiÚchs       úEC:\Projects\AutoPOE2\src\assistant_tool\ggpk_extract\sqlite_export.pyÚsnaker      sÐ   € Ø
€CÝ˜4‘”ð ð ‰ˆˆ2Ø�:Š:‰<Œ<ð 	˜Að 	 4¨¨A©¤;×#6Ò#6Ñ#8Ô#8ð 	¸QÀ¹UÅSÈÁYÄYÒ=NÐ=NÐSWÐXYÐ\]ÑX]ÔS^×SfÒSfÑShÔShÐ=NØ�JŠJ�s‰OŒOˆOØ�
Š
�2—8’8‘:”:ÑÔÐÐØ�7Š7�3‰<Œ<×Ò  cÑ*Ô*Ð*ó    Údb_pathr   úsqlite3.Connectionc                óþ   — | j                              dd¬¦  «         t          j        t	          | ¦  «        ¦  «        }|                     d¦  «         |                     d¦  «         |                     d¦  «         |S )NT)ÚparentsÚexist_okzPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzPRAGMA foreign_keys=ON)ÚparentÚmkdirÚsqlite3Úconnectr   Úexecute)r    Úconns     r   r(   r(      sp   € Ø„N×Ò °ÐÑ5Ô5Ð5ÝŒ?�3˜w™<œ<Ñ(Ô(€DØ‡L‚LÐ*Ñ+Ô+Ð+Ø‡L‚LÐ,Ñ-Ô-Ð-Ø‡L‚LÐ)Ñ*Ô*Ð*Ø€Kr   r*   ÚNonec                ó0   — |                       d¦  «         d S )Na0  
        CREATE TABLE IF NOT EXISTS extract_meta (
            key TEXT PRIMARY KEY,
            value TEXT
        );
        CREATE TABLE IF NOT EXISTS ggpk_files (
            path TEXT PRIMARY KEY,
            tag TEXT NOT NULL,
            offset INTEGER NOT NULL,
            record_length INTEGER NOT NULL,
            data_size INTEGER NOT NULL,
            sha256 BLOB
        );
        CREATE TABLE IF NOT EXISTS hashcache_files (
            name TEXT PRIMARY KEY,
            size INTEGER NOT NULL,
            filetime INTEGER NOT NULL,
            sha256 BLOB NOT NULL
        );
        CREATE TABLE IF NOT EXISTS logical_files (
            path TEXT PRIMARY KEY,
            hash INTEGER,
            bundle_name TEXT,
            bundle_offset INTEGER,
            size INTEGER
        );
        )Úexecutescript)r*   s    r   Úinit_catalog_schemar.      s)   € Ø×Òð	ñô ð ð ð r   Úitemsúdict[str, Any]c                ój   — |                       dd„ |                     ¦   «         D ¦   «         ¦  «         d S )Nz=INSERT OR REPLACE INTO extract_meta(key, value) VALUES (?, ?)c                ó>   — g | ]\  }}||€dnt          |¦  «        f‘ŒS )Nr   )r   )Ú.0ÚkÚvs      r   ú
<listcomp>zupsert_meta.<locals>.<listcomp>B   s/   € ÐDÐDÐD©d¨a°ˆ!�1�9ˆRˆR¥# a¡&¤&Ð	)ÐDÐDÐDr   )Úexecutemanyr/   )r*   r/   s     r   Úupsert_metar8   ?   s@   € Ø×ÒØGØDÐD°e·k²k±m´mÐDÑDÔDñô ð ð ð r   ÚentriesúIterable[GgpkEntry]Úintc                óŽ   — d„ |D ¦   «         }|                       d¦  «         |                      d|¦  «         t          |¦  «        S )Nc                ó^   — g | ]*}|j         |j        |j        |j        |j        |j        pd f‘Œ+S ©N)ÚpathÚtagÚoffsetÚrecord_lengthÚ	data_sizeÚsha256)r3   Úes     r   r6   z%insert_ggpk_files.<locals>.<listcomp>G   sF   € ð ð ð àð 
Œ�”˜œ !¤/°1´;ÀÄÐ@PÈDÐQðð ð r   zDELETE FROM ggpk_filesz`INSERT INTO ggpk_files(path, tag, offset, record_length, data_size, sha256) VALUES (?,?,?,?,?,?)©r)   r7   r   )r*   r9   Úrowss      r   Úinsert_ggpk_filesrH   F   sa   € ðð àðñ ô €Dð 	‡L‚LÐ)Ñ*Ô*Ð*Ø×ÒØjØñô ð õ ˆt‰9Œ9Ðr   ÚrecordsúIterable[Any]c                óŽ   — d„ |D ¦   «         }|                       d¦  «         |                      d|¦  «         t          |¦  «        S )Nc                óB   — g | ]}|j         |j        |j        |j        f‘ŒS © )r   ÚsizeÚfiletimerD   ©r3   Úrs     r   r6   z$insert_hashcache.<locals>.<listcomp>T   s)   € ÐDÐDÐD°qˆQŒV�Q”V˜QœZ¨¬Ð2ÐDÐDÐDr   zDELETE FROM hashcache_fileszJINSERT INTO hashcache_files(name, size, filetime, sha256) VALUES (?,?,?,?)rF   )r*   rI   rG   s      r   Úinsert_hashcacherR   S   sT   € ØDÐD¸GÐDÑDÔD€DØ‡L‚LÐ.Ñ/Ô/Ð/Ø×ÒØTØñô ð õ ˆt‰9Œ9Ðr   Úvaluec                ó@   — t          | ¦  «        dz  }|dk    r|dz
  n|S )z>Store unsigned 64-bit hashes in SQLite's signed INTEGER range.l   ÿÿÿÿ ì            l            )r;   )rS   Úns     r   Ú_i64rW   ]   s)   € åˆE‰
Œ
Ð'Ñ'€AØ 'šN˜Nˆ1�‰=ˆ=°Ð1r   Úfilesc                óŽ   — d„ |D ¦   «         }|                       d¦  «         |                      d|¦  «         t          |¦  «        S )Nc                óh   — g | ]/}|j         t          |j        ¦  «        |j        |j        |j        f‘Œ0S rM   )r?   rW   ÚhashÚbundle_namerA   rN   )r3   Úfs     r   r6   z(insert_logical_files.<locals>.<listcomp>d   s3   € ÐSÐSÐSÈˆQŒV•T˜!œ&‘\”\ 1¤=°!´(¸A¼FÐCÐSÐSÐSr   zDELETE FROM logical_fileszZINSERT INTO logical_files(path, hash, bundle_name, bundle_offset, size) VALUES (?,?,?,?,?)rF   )r*   rX   rG   s      r   Úinsert_logical_filesr^   c   sT   € ØSÐSÈUÐSÑSÔS€DØ‡L‚LÐ,Ñ-Ô-Ð-Ø×ÒØdØñô ð õ ˆt‰9Œ9Ðr   r   c                ó  — t          | t          t          f¦  «        rt          j        | d¬¦  «        S t          | t
          ¦  «        rt          | ¦  «        S t          | t          ¦  «        r| dk    s| dk     rt          | ¦  «        S | S )NF)Úensure_asciirU   lûÿÿÿ         )Ú
isinstanceÚlistÚdictÚjsonÚdumpsÚboolr;   rW   ©rS   s    r   Ú	_sql_cellrh   m   s‚   € Ý�%�$¥˜Ñ&Ô&ð 5ÝŒz˜%¨eÐ4Ñ4Ô4Ð4Ý�%�ÑÔð Ý�5‰zŒzÐÝ�%�ÑÔð  5¨WÒ#5Ð#5¸ÀÒ9KÐ9KÝ�E‰{Œ{ÐØ€Lr   c                ó�   — t          | t          ¦  «        rdS t          | t          ¦  «        rdS t          | t          ¦  «        rdS dS )NÚINTEGERÚREALÚTEXT)ra   rf   r;   Úfloatrg   s    r   Ú	_sql_typern   w   sL   € Ý�%�ÑÔð ØˆyÝ�%�ÑÔð ØˆyÝ�%�ÑÔð ØˆvØˆ6r   Ú
table_namerG   úlist[dict[str, Any]]c           
     ó(  ‡— dt          |¦  «        z   }|                      d|› d�¦  «         |s|                      d|› d�¦  «         |S t          |d                              ¦   «         ¦  «        }|d         }g }|D ]L}|dk    r|                     d¦  «         Œ|                     d|› d	t          ||         ¦  «        › �¦  «         ŒM|                      d|› d
d                     |¦  «        › d�¦  «         d                     dt          |¦  «        z  ¦  «        }d                     d„ |D ¦   «         ¦  «        }	g }
|D ]0Š|
                     t          ˆfd„|D ¦   «         ¦  «        ¦  «         Œ1|  	                    d|› d
|	› d|› d�|
¦  «         |S )NÚdat_zDROP TABLE IF EXISTS "ú"zCREATE TABLE "z" (_row INTEGER)r   Ú_rowz_row INTEGERz" z" (z, ú)ú,ú?c              3  ó"   K  — | ]
}d |› d �V — ŒdS )rs   NrM   )r3   Úcs     r   ú	<genexpr>z"write_dat_table.<locals>.<genexpr>‘   s*   è è € Ð.Ð. A�x˜1�x�x�xÐ.Ð.Ð.Ð.Ð.Ð.r   c              3  ó\   •K  — | ]&}t          ‰                     |¦  «        ¦  «        V — Œ'd S r>   )rh   Úget)r3   ry   Úrecs     €r   rz   z"write_dat_table.<locals>.<genexpr>•   s5   øè è € Ð6Ð6¨A•)˜CŸGšG A™JœJÑ'Ô'Ð6Ð6Ð6Ð6Ð6Ð6r   zINSERT INTO "z
) VALUES ()
r   r)   rb   Úkeysr   rn   r   r   Útupler7   )r*   ro   rG   Úsql_nameÚcolsÚsampleÚdefsry   ÚplaceholdersÚcol_sqlÚpackedr}   s              @r   Úwrite_dat_tabler‡   �   sØ  ø€ Ø�˜jÑ)Ô)Ñ)€HØ‡L‚LÐ5¨(Ð5Ð5Ð5Ñ6Ô6Ð6Øð Ø�ŠÐ@ hÐ@Ð@Ð@ÑAÔAÐAØˆÝ��Q”—’‘”ÑÔ€DØ�!ŒW€FØ€DØð 9ð 9ˆØ�Š;ˆ;Ø�KŠK˜Ñ'Ô'Ð'Ð'à�KŠKÐ7˜AÐ7Ð7¥¨6°!¬9Ñ!5Ô!5Ð7Ð7Ñ8Ô8Ð8Ð8Ø‡L‚LÐA (ÐAÐA¨t¯yªy¸©¬ÐAÐAÐAÑBÔBÐBØ—8’8˜C¥# d¡)¤)™OÑ,Ô,€LØ�hŠhÐ.Ð.¨Ð.Ñ.Ô.Ñ.Ô.€GØ€FØð 
ð 
ˆØ�ŠÝÐ6Ð6Ð6Ð6°Ð6Ñ6Ô6Ñ6Ô6ñ	
ô 	
ð 	
ð 	
ð 	×ÒÐT XÐTÐT°'ÐTÐTÀ\ÐTÐTÐTÐV\Ñ]Ô]Ð]Ø€Or   c                ó¶	  — |                       d¦  «         t          | d¦  «        r't          | ddd¦  «        r|                      d¦  «         t          | d¦  «        rút          | ddd¦  «        rèt	          | d¦  «        }d|v o t          | d¦  «        ot          | dd¦  «        }|rdnd	}|rd
nd|v rdnd}d|v rdnd}d|v rdnd}d|v rdnd}|                      d|› d|› d|› d|› d|› d|› d�¦  «         |                      d¦  «         t          | d¦  «        r<t          | ddd¦  «        r*|                      d ¦  «         |                      d!¦  «         t          | d"¦  «        r„t          | d"dd¦  «        rrt	          | d"¦  «        }d#|v rd#nd}	d$|v rd$nd}
d%|v rd&nd}d'|v rd(nd}d)|v rd)nd}|                      d*|	› d+|
› d,|› d-|› d.|› d/�¦  «         |                      d0¦  «         t          | d1¦  «        ryt          | d¦  «        rit          | d1d¦  «        rXt          | dd¦  «        rGt	          | d1¦  «        }d2|v rd3nd}d4|v rd5nd}d6|v rd7nd}|                      d8|› d9|› d:|› d;�¦  «         t          | d<¦  «        rdt	          | d<¦  «        }d=|v r7t          | d>¦  «        r't          | d>d?¦  «        r|                      d@¦  «         nd|v r|                      dA¦  «         t          | dB¦  «        rXt          | dBd¦  «        rGt	          | dB¦  «        }d|v rdnd}dC|v rdCnd}dD|v rdDnd}|                      dE|› dF|› dG|› dH�¦  «         t          | dI¦  «        rMt          | dId¦  «        r<t	          | dI¦  «        }d|v rdnd}dJ|v rdJnd}|                      dK|› dF|› dL�¦  «         t          | dM¦  «        r„t          | d¦  «        rtt          | dMd¦  «        rct          | ddd¦  «        rQt	          | dM¦  «        }dN|v rdOnd}dP|v rdQnd}|                      dR|› dS|› dT�¦  «         |                      dU¦  «         t          | dV¦  «        rHt          | d¦  «        r8t          | dVd¦  «        r't          | ddd¦  «        r|                      dW¦  «         t          | dXt          j        t          j	        ¦  «         
                    ¦   «         i¦  «         d S )YNas  
        DROP TABLE IF EXISTS base_items;
        DROP TABLE IF EXISTS world_areas;
        DROP TABLE IF EXISTS skill_gems;
        DROP TABLE IF EXISTS uniques;
        DROP TABLE IF EXISTS item_classes;
        DROP TABLE IF EXISTS mods;
        DROP TABLE IF EXISTS monsters;
        DROP TABLE IF EXISTS soul_cores;
        DROP TABLE IF EXISTS map_tablets;
        Údat_item_classesÚIdÚNamez£
            CREATE TABLE item_classes AS
            SELECT _row, Id AS id, Name AS name, lower(Name) AS name_lower
            FROM dat_item_classes
            Údat_base_item_typesÚ	ItemClassz6LEFT JOIN dat_item_classes ic ON ic._row = b.ItemClassr   zic.IdzCAST(b.ItemClass AS TEXT)ÚNULLÚWidthzb.WidthÚ1ÚHeightzb.HeightÚ	DropLevelzb.DropLevelÚ0z´
            CREATE TABLE base_items AS
            SELECT
                b.Id AS id,
                b.Name AS name,
                lower(b.Name) AS name_lower,
                z  AS item_class,
                z AS width,
                z AS height,
                zK AS drop_level,
                1 AS stack_size,
                CASE WHEN zy IN ('StackableCurrency','Currency') THEN 1 ELSE 0 END AS is_currency
            FROM dat_base_item_types b
            z
            zNCREATE INDEX IF NOT EXISTS idx_base_items_name_lower ON base_items(name_lower)Údat_currency_itemsÚBaseItemTypeÚ	StackSizeaË  
                UPDATE base_items SET stack_size = (
                    SELECT ci.StackSize FROM dat_currency_items ci
                    JOIN dat_base_item_types b ON b._row = ci.BaseItemType
                    WHERE b.Id = base_items.id
                )
                WHERE id IN (
                    SELECT b.Id FROM dat_currency_items ci
                    JOIN dat_base_item_types b ON b._row = ci.BaseItemType
                )
                zý
                UPDATE base_items SET is_currency = 1
                WHERE id IN (
                    SELECT b.Id FROM dat_currency_items ci
                    JOIN dat_base_item_types b ON b._row = ci.BaseItemType
                )
                Údat_world_areasÚActÚ	AreaLevelÚHasWaypointz'CASE WHEN HasWaypoint THEN 1 ELSE 0 ENDÚIsTownz"CASE WHEN IsTown THEN 1 ELSE 0 ENDÚConnectionsz¯
            CREATE TABLE world_areas AS
            SELECT
                Id AS id,
                Name AS name,
                lower(Name) AS name_lower,
                z AS act,
                z  AS area_level,
                z" AS has_waypoint,
                z AS is_town,
                z= AS connections
            FROM dat_world_areas
            zPCREATE INDEX IF NOT EXISTS idx_world_areas_name_lower ON world_areas(name_lower)Údat_skill_gemsÚStrengthRequirementPercentzg.StrengthRequirementPercentÚDexterityRequirementPercentzg.DexterityRequirementPercentÚIntelligenceRequirementPercentz g.IntelligenceRequirementPercentz�
            CREATE TABLE skill_gems AS
            SELECT
                b.Id AS id,
                b.Id AS base_item_id,
                z AS str_req,
                z AS dex_req,
                z| AS int_req
            FROM dat_skill_gems g
            JOIN dat_base_item_types b ON b._row = g.BaseItemType
            Údat_unique_stash_layoutÚWordsKeyÚ	dat_wordsÚTextaŸ  
                CREATE TABLE uniques AS
                SELECT
                    CAST(u._row AS TEXT) AS id,
                    w.Text AS name,
                    lower(w.Text) AS name_lower,
                    '' AS base_item
                FROM dat_unique_stash_layout u
                LEFT JOIN dat_words w ON w._row = u.WordsKey
                WHERE w.Text IS NOT NULL AND w.Text != ''
                a<  
                CREATE TABLE uniques AS
                SELECT
                    CAST(_row AS TEXT) AS id,
                    CAST(Name AS TEXT) AS name,
                    lower(CAST(Name AS TEXT)) AS name_lower,
                    '' AS base_item
                FROM dat_unique_stash_layout
                Údat_modsÚLevelÚDomainzE
            CREATE TABLE mods AS
            SELECT _row, Id AS id, z
 AS name, z AS level, z1 AS domain
            FROM dat_mods
            Údat_monster_varietiesÚMovementSpeedzI
            CREATE TABLE monsters AS
            SELECT _row, Id AS id, zF AS movement_speed
            FROM dat_monster_varieties
            Údat_soul_coresÚRequiredLevelzs.RequiredLevelÚIsSocketBoundz+CASE WHEN s.IsSocketBound THEN 1 ELSE 0 ENDz´
            CREATE TABLE soul_cores AS
            SELECT
                b.Id AS id,
                b.Name AS name,
                lower(b.Name) AS name_lower,
                z$ AS required_level,
                zº AS is_socket_bound
            FROM dat_soul_cores s
            JOIN dat_base_item_types b ON b._row = s.BaseItemType
            WHERE b.Name IS NOT NULL AND b.Name != ''
            zNCREATE INDEX IF NOT EXISTS idx_soul_cores_name_lower ON soul_cores(name_lower)Údat_endgame_map_tabletsaS  
            CREATE TABLE map_tablets AS
            SELECT
                b.Id AS id,
                b.Name AS name,
                lower(b.Name) AS name_lower
            FROM dat_endgame_map_tablets t
            JOIN dat_base_item_types b ON b._row = t.BaseItemType
            WHERE b.Name IS NOT NULL AND b.Name != ''
            Úprojected_at)r-   Ú
_has_tableÚ	_has_colsr)   Ú_table_colsr8   r   Únowr   ÚutcÚ	isoformat)r*   Úbit_colsÚ	has_classÚ
join_classÚ
class_exprÚ
width_exprÚheight_exprÚ	drop_exprÚwcolsÚactÚlevelÚwpÚtownÚ	conn_exprÚgcolsÚstr_reqÚdex_reqÚint_reqÚucolsÚmcolsÚ	name_exprÚ
level_exprÚdomain_exprr�   Ú
speed_exprÚscolsÚreqÚbounds                               r   Úwrite_projectionsrÏ   ›   sÜ  € Ø×Òð
	ñô ð õ �$Ð*Ñ+Ô+ð 
µ	¸$Ð@RÐTXÐZ`Ñ0aÔ0að 
Ø�Šðñ	
ô 	
ð 	
õ �$Ð-Ñ.Ô.ð 8µ9¸TÐCXÐZ^Ð`fÑ3gÔ3gð 8Ý˜tÐ%:Ñ;Ô;ˆà˜8Ð#ð :Ý˜4Ð!3Ñ4Ô4ð:å˜$Ð 2°DÑ9Ô9ð 	ð
 R[ÐbÐMÐMÐ`bˆ
Ø )ð 
�W�WØ+6¸(Ð+BÐ+BÐ'Ð'Èð 	ð #*¨XÐ"5Ð"5�Y�Y¸3ˆ
Ø$,°Ð$8Ð$8�j�j¸cˆØ%0°HÐ%<Ð%<�M�MÀ#ˆ	Ø�Šðð ðð ð ðð ð ðð ð ðð ð &ðð ð ðð ð ñ	
ô 	
ð 	
ð" 	�ŠÐeÑfÔfÐfÝ�dÐ0Ñ1Ô1ð 	µiØÐ&¨¸ñ7
ô 7
ð 	ð �LŠLð
ñô ð ð �LŠLðñô ð õ �$Ð)Ñ*Ô*ð i­y¸Ð?PÐRVÐX^Ñ/_Ô/_ð iÝ˜DÐ"3Ñ4Ô4ˆØ �~�~ˆeˆe¨6ˆØ*¨eÐ3Ð3��¸ˆØ:GÈ5Ð:PÐ:PÐ6Ð6ÐVYˆØ7?À5Ð7HÐ7HÐ3Ð3ÈcˆØ%2°eÐ%;Ð%;�M�MÀˆ	Ø�Šðð ðð ð ðð ð ðð ð ðð ð ðð ð ñ	
ô 	
ð 	
ð 	�ŠÐgÑhÔhÐhå�4Ð)Ñ*Ô*ð
å�tÐ2Ñ3Ô3ð
õ �dÐ,¨nÑ=Ô=ð
õ �dÐ1°4Ñ8Ô8ð	
õ ˜DÐ"2Ñ3Ô3ˆØ4PÐTYÐ4YÐ4YÐ0Ð0Ð_eˆØ5RÐV[Ð5[Ð5[Ð1Ð1ÐagˆØ8XÐ\aÐ8aÐ8aÐ4Ð4ÐgmˆØ�Šð
ð
 ð
ð 
ð ð
ð 
ð ð
ð 
ð 
ñ	
ô 	
ð 	
õ �$Ð1Ñ2Ô2ð Ý˜DÐ";Ñ<Ô<ˆà˜%ÐÐÝ˜4 Ñ-Ô-ð  å˜$ ¨VÑ4Ô4ð  ð �LŠLð
ñô ð ð ð �uˆ_ˆ_Ø�LŠLðñ
ô 
ð 
õ �$˜
Ñ#Ô#ð 
­	°$¸
ÀDÑ(IÔ(Ið 
Ý˜D *Ñ-Ô-ˆØ$¨˜o˜o�F�F°4ˆ	Ø '¨5Ð 0Ð 0�W�W°fˆ
Ø"*¨eÐ"3Ð"3�h�h¸ˆØ�Šðà$-ðð à9Cðð àP[ðð ð ñ	
ô 	
ð 	
õ �$Ð/Ñ0Ô0ð 

µY¸tÐE\Ð^bÑ5cÔ5cð 

Ý˜4Ð!8Ñ9Ô9ˆØ$¨˜n˜n�F�F°$ˆ	Ø(7¸4Ð(?Ð(?�_�_ÀVˆ
Ø�Šðà$-ðð à9Cðð ð ñ	
ô 	
ð 	
õ 	�4Ð)Ñ*Ô*ðgå�tÐ2Ñ3Ô3ðgõ �dÐ,¨nÑ=Ô=ðgõ �dÐ1°4¸Ñ@Ô@ð	gõ ˜DÐ"2Ñ3Ô3ˆØ#2°eÐ#;Ð#;ÐÐÀˆØAPÐTYÐAYÐAYÐ=Ð=Ð_bˆØ�Šðð ðð ð ðð ð ñ	
ô 	
ð 	
ð 	�ŠÐeÑfÔfÐfå�4Ð2Ñ3Ô3ð
å�tÐ2Ñ3Ô3ð
õ �dÐ5°~ÑFÔFð
õ �dÐ1°4¸Ñ@Ô@ð	
ð 	�Šð	ñ	
ô 	
ð 	
õ ��~¥x¤|µH´LÑ'AÔ'A×'KÒ'KÑ'MÔ'MÐNÑOÔOÐOÐOÐOr   rf   c                ó\   — |                       d|f¦  «                             ¦   «         }|d uS )Nz9SELECT 1 FROM sqlite_master WHERE type='table' AND name=?)r)   Úfetchone)r*   r   Úrows      r   r¯   r¯   |  s7   € Ø
�,Š,ØCØ	ˆñô ÷ ‚h�j„jð ð �dˆ?Ðr   úset[str]c                óH   — d„ |                       d|› d�¦  «        D ¦   «         S )Nc                ó   — h | ]
}|d          ’ŒS )r	   rM   rP   s     r   ú	<setcomp>z_table_cols.<locals>.<setcomp>…  s   € ÐGÐGÐG�QˆAˆaŒDÐGÐGÐGr   zPRAGMA table_info("z"))r)   )r*   r   s     r   r±   r±   „  s.   € ØGÐG˜$Ÿ,š,Ð'E¸TÐ'EÐ'EÐ'EÑFÔFÐGÑGÔGÐGr   ÚtableÚnamesc                óZ   ‡— t          | |¦  «        Št          ˆfd„|D ¦   «         ¦  «        S )Nc              3  ó    •K  — | ]}|‰v V — Œ	d S r>   rM   )r3   rV   r�   s     €r   rz   z_has_cols.<locals>.<genexpr>Š  s'   øè è € Ð(Ð(˜Qˆq�DˆyÐ(Ð(Ð(Ð(Ð(Ð(r   )r±   Úall)r*   r×   rØ   r�   s      @r   r°   r°   ˆ  s5   ø€ Ý�t˜UÑ#Ô#€DÝÐ(Ð(Ð(Ð( %Ð(Ñ(Ô(Ñ(Ô(Ð(r   )r   r   r   r   )r    r   r   r!   )r*   r!   r   r+   )r*   r!   r/   r0   r   r+   )r*   r!   r9   r:   r   r;   )r*   r!   rI   rJ   r   r;   )rS   r;   r   r;   )r*   r!   rX   rJ   r   r;   )rS   r   r   r   )rS   r   r   r   )r*   r!   ro   r   rG   rp   r   r   )r*   r!   r   r   r   rf   )r*   r!   r   r   r   rÓ   )r*   r!   r×   r   rØ   r   r   rf   )Ú__doc__Ú
__future__r   rd   r'   r   r   Úpathlibr   Útypingr   r   Úggpk_fsr
   r   r(   r.   r8   rH   rR   rW   r^   rh   rn   r‡   rÏ   r¯   r±   r°   rM   r   r   ú<module>rá      sÇ  ðØ OÐ OØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð ð+ð +ð +ð +ðð ð ð ðð ð ð ð@ð ð ð ð
ð 
ð 
ð 
ðð ð ð ð2ð 2ð 2ð 2ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð4^Pð ^Pð ^Pð ^PðBð ð ð ðHð Hð Hð Hð)ð )ð )ð )ð )ð )r   