관리-도구
편집 파일: nftables.cpython-39.pyc
a �������gɆ������������������%���@���s���d�dl�Z�d�dlZd�dlZd�dlmZ�d�dlmZmZmZm Z m Z �d�dlmZm Z mZmZmZmZmZ�d�dlmZmZmZmZmZmZmZmZmZ�d�dlmZ�d�dlm Z �dZ!e!d �d �Z"e!d �d�Z#dZ$d Z%i�ddde%�fidde%�fdde%�fdde%�fd�dd�e%�fdd�e%�fdd�e%�fdd�e%�fd�d�Z&dEdd�Z'e'ddd�e'dd�e'dd�e'dd �e'ddd!�e'ddd"�e'ddd �e'dd#d$�e'ddd%�e'ddd$�e'dd&d$�e'ddd'�e'dd#d��e'ddd(�e'ddd��e'dd&�e'ddd)�e'ddd*�e'ddd+�e'dd#�e'dd&d$�e'dd,�e'dd-�e'dd.�e'ddd/�e'dd0�e'dd1�e'dd2�e'dd#d)�e'ddd3�e'dd#d+�e'ddd4�e'dd0d$�e'dd0d��d5�"e'd6dd)�e'd6d&d��e'd6dd+�e'd6dd$�e'd6d�e'd6d�e'd6d �e'd6dd/�e'd6d7�e'd6d8�e'd6d9�e'd6d:�e'd6d;�e'd6d<�e'd6dd��e'd6d=�e'd6d&�e'd6dd!�e'd6d>�e'd6dd(�e'd6d?�e'd6d@�e'd6d0�e'd6d0d$�e'd6d0d��e'd6d&d$�e'd6d&d+�dA�dB�Z(G�dCdD��dDe)�Z*dS�)F�����N)�log)� check_mac�getPortRange�normalizeIP6�check_single_address� check_address)� FirewallError� UNKNOWN_ERROR�INVALID_RULE�INVALID_ICMPTYPE�INVALID_TYPE� INVALID_ENTRY�INVALID_PORT) �Rich_Accept�Rich_Reject� Rich_Drop� Rich_Mark�Rich_Masquerade�Rich_ForwardPort�Rich_IcmpBlock�Rich_Tcp_Mss_Clamp� Rich_NFLog)�DEFAULT_ZONE_TARGET)�NftablesZ firewalld�_Zpolicy_dropZprobeZpolicy_� ���� PREROUTING� preroutingij���i����Zpostrouting�d����output)r����POSTROUTING�OUTPUT�inputZforward)r����INPUT�FORWARDr!���)�raw�mangle�nat�filterc�����������������C���sH���dd|�dd�id|d�ig}|d�urD|��dd|�dd�id|d�i��|S�)N�match�payload�type��protocol�field�==��left�op�right�code)�append)r-���r+���r4���� fragments��r7����:/usr/lib/python3.9/site-packages/firewall/core/nftables.py�_icmp_types_fragmentsT���s����� � r9����icmp�destination-unreachable� ���� echo-reply�echo-request���������redirect���������parameter-problem���������������������router-advertisement�router-solicitation� source-quench����� time-exceeded�timestamp-reply�timestamp-request��������)"�communication-prohibitedr;���r=���r>���zfragmentation-neededzhost-precedence-violation�host-prohibitedz host-redirectzhost-unknown�host-unreachablez ip-header-badznetwork-prohibitedznetwork-redirectznetwork-unknownznetwork-unreachablerD����port-unreachablezprecedence-cutoffzprotocol-unreachablerA���zrequired-option-missingrJ���rK���rL���zsource-route-failedrN���rO���rP���ztos-host-redirectztos-host-unreachableztos-network-redirectztos-network-unreachable�ttl-zero-during-reassembly�ttl-zero-during-transit�icmpv6�mld-listener-done�mld-listener-query�mld-listener-report�mld2-listener-reportznd-neighbor-advert�nd-neighbor-solicit�packet-too-bigznd-redirect�nd-router-advertznd-router-solicit)zaddress-unreachablez bad-headerzbeyond-scoperS���r;���r=���r>���z failed-policyrZ���r[���r\���r]���zneighbour-advertisementzneighbour-solicitation�no-router_���rD���rV���rA���zreject-routerJ���rK���rN���rW���rX���zunknown-header-typezunknown-option��ipv4�ipv6c�������������������@���sh��e�Zd�Zd�ZdZdd��Zdd��Zdd��Zdd ��Zd d��Z dd ��Z dd��Zdd��Zdd��Z d�dd�Zdd��Zdd��Zdd��Zdd��Zdd ��Zd�d!d"�Zd#d$��Zd�d&d'�Zd(d)��Zd*d+��Zd�d-d.�Zd/d0��Zd1d2��Zd3d4��Zd5d6��Zd7d8��Zd9d:��Zd;d<��Z d=d>��Z!d?d@��Z"dAdB��Z#dCdD��Z$dEdF��Z%dGdH��Z&dIdJ��Z'dKdL��Z(dMdN��Z)d�dOdP�Z*dQdR��Z+dSdT��Z,dUdV��Z-dWdX��Z.d�dYdZ�Z/d�d[d\�Z0d�d]d^�Z1d�d_d`�Z2dadb��Z3d�dcdd�Z4d�dedf�Z5d�dgdh�Z6didj��Z7d�dkdl�Z8dmdn��Z9d�dodp�Z:dqdr��Z;dsdt��Z<dudv��Z=dwdx��Z>d�dydz�Z?d�d{d|�Z@d}d~��ZAd�dd��ZBd�d���ZCd�d���ZDd�d���ZEd�d���ZFd�d���ZGd�d���ZHd�d���ZId�d�d��ZJdS�)��nftablesTc�����������������C���sZ���||�_�d|�_d|�_g�|�_i�|�_i�|�_i�|�_i�|�_i�|�_t ��|�_ |�j �d��|�j �d��d�S�)NTF) �_fwZrestore_command_exists�supports_table_ownerZavailable_tables�rule_to_handle�rule_ref_count�rich_rule_priority_counts�policy_priority_counts�zone_source_index_cacher���re����set_echo_outputZset_handle_output)�self�fwr7���r7���r8����__init__����s����znftables.__init__c�����������������C���s��z�ddddiidddt�dd gd �iigi}|�j�|�\}}}|rHtd��ddddiidddt�d �iigi}|�j�d��|�j�|�\}}}|�j�d��|d�d�d�d�}|��dddt�d �ii|�j�����d|vs�d |vr�td��t� d��d|�_ W�n���t� d��d|�_ Y�n0�d�S�)Nre����metainfo�json_schema_versionrB����add�table�inet�owner�persist)�family�name�flagsz!nftables probe table owner failed�list�rx���ry���FTrz����deletez3nftables: probe_support(): owner flag is supported.z7nftables: probe_support(): owner flag is NOT supported.)�TABLE_NAME_PROBEre����json_cmd� ValueErrorrm����set_rulerf����get_log_deniedr����debug2rg���)rn����rules�rcr���r���rz���r7���r7���r8����_probe_support_table_owner����sH���� ����� ��� z#nftables._probe_support_table_ownerc�����������������C���s���|������d�S��N)r�����rn���r7���r7���r8���� probe_support����s����znftables.probe_supportc�����������������C���sx��dD�]}||v�r�qqd||�d�v�r^||�d�d�d�||�d�d�d�f}||�d�d=�n(d||�d�v�r�d�}||�d�d=�nd�S�||�d�d�}|r�|dkr�||v�r�|||�v�r�||���|��n�|dk�rt||vr�g�||<�|�r&|||�v�r||��|��||�jd d ��d��||��|�}nt||��}||�}||=�|dk�rT||d <�n |d8�}||d<�||d�d�d<�d�S�)N�rs����insertr}����%%ZONE_SOURCE%%�rule�zone�address�%%ZONE_INTERFACE%%rx���r}���c�����������������S���s���|�d�S�)Nr���r7���)�xr7���r7���r8����<lambda> �������z3nftables._run_replace_zone_source.<locals>.<lambda>)�keyr���r����rB���rs����index)�remover5����sortr�����len)rn���r����rl����verbZzone_sourcerx���r����� _verb_snippetr7���r7���r8����_run_replace_zone_source����sD����� � z!nftables._run_replace_zone_sourcec�����������������C���sB���d|v�rdt��|d��iS�d|v�r4dt��|d��iS�ttd��d�S�)Nr����r}���rs���zFailed to reverse rule)�copy�deepcopyr���r ���)rn����dictr7���r7���r8����reverse_rule��s ����znftables.reverse_rulec����������� ������C���s���dD�]}||v�r�qq|||�d�v��r�||�d�|�}||�d�|=�t�|�tkr\ttd��||�d�d�||�d�d�f}|dkr�||vs�|||�vs�||�|�dkr�ttd��||�|��d 8��<�n�||vr�i�||<�|||�vr�d||�|<�d}t||�����D�]J}||k�r"|d k�r"��qP|||�|�7�}||k�r|dk�r��qP�q||�|��d 7��<�||�} ||=�|dk�r�| |d <�n |d 8�}| |d<�||d�d�d<�d�S�) Nr����r����z%priority must be followed by a numberrx����chainr}���r���z*nonexistent or underflow of priority countrB���r����rs���r����)r+����intr���r ���r ����sorted�keys) rn���r����Zpriority_counts�tokenr�����priorityr����r�����pr����r7���r7���r8����_set_rule_replace_priority ��sH���� �� z#nftables._set_rule_replace_priorityc�����������������C���sb���dD�]X}||v�rd||�v�rt��||�d��}dD�]}||v�r2||=�q2tj|dd�}|��S�qd�S�)Nr����r����)r�����handleZpositionT)Z sort_keys)r����r�����json�dumps)rn���r����r�����rule_keyZnon_keyr7���r7���r8���� _get_rule_keyN��s���� znftables._get_rule_keyc�����������������C���sX��g�d�}g�d�}g�}g�}t��|�j�}t��|�j�}t��|�j�} |�j����} |D��]�}t|�tkrjtt d|���|D�]}||v�rn�q�qn||vr�tt d|���|��|�} | | v��r4t� d|�j| | �| ��|dkr�| | ��d7��<�qJnV| | �dkr�| | ��d8��<�qJn6| | �dk�r| | ��d8��<�ntt d| | | �f���n| �rL|dk�rLd| | <�|�|��t��|�}| �r�ttd�||�d �d ���||�d �d <�|��||d��|��||d��|��|| ��|dk�r�dd |d�d �d �|d�d �d�|d�d �d�|�j| �d�ii}|�|��qJddddiig|�i}t���dk�rDt�d|�jt�|���|�j�|�\}}}|dk�rxtdd|t�|�f���||�_||�_| |�_| |�_d}|D�]�}|d7�}|��|�} | �s��q�d|v��r�|�j| =�|�j| =��q�|D�]}||d�|�v��r���q��q�||d�|�v�r�q�t|d�|�|�d �d�k�r2�q�|d�|�|�d �d�|�j| <��q�d�S�)N)rs���r����r}����flush�replace)rs���r����r����z#rule must be a dictionary, rule: %szno valid verb found, rule: %sz%s: prev rule ref cnt %d, %sr}���rB���z)rule ref count bug: rule_key '%s', cnt %dr�����expr�%%RICH_RULE_PRIORITY%%�%%POLICY_PRIORITY%%rx���rt���r����)rx���rt���r����r����re���rq���rr���rG���z.%s: calling python-nftables with JSON blob: %sr���z'%s' failed: %s JSON blob: %szpython-nftablesr����)r����r����rj���rk���rl���ri���r+���r����r���r ���r ���r����r���r����� __class__r5���r{���r(���r����r����rh���ZgetDebugLogLevelZdebug3r����r����re���r���r�����TABLE_NAME_POLICY)rn���r����� log_deniedZ_valid_verbsZ_valid_add_verbsZ_deduplicated_rulesZ_executed_rulesrj���rk���rl���ri���r����r����r����Z_ruleZ json_blobr����r����errorr����r7���r7���r8���� set_rules\��s����� � � & � � znftables.set_rulesc�����������������C���s���|���|g|��dS�)N��)r����)rn���r����r����r7���r7���r8���r�������s����znftables.set_ruleNc�����������������C���s���|r |gS�t����S�r����)�IPTABLES_TO_NFT_HOOKr�����rn���rt���r7���r7���r8����get_available_tables���s����znftables.get_available_tablesc�����������������C���sB���ddd|d�ii}|t�kr<|�jjr<|�jr<ddg|d�d�d<�|gS�)Nrs���rt���ru���r|���rv���rw���rz���)� TABLE_NAMErf���Z_nftables_table_ownerrg���)rn���rt���r����r7���r7���r8����_build_add_table_rules���s�������znftables._build_add_table_rulesc�����������������C���s���|���|�ddd|d�iig�S�)Nr}���rt���ru���r|���)r����r����r7���r7���r8����_build_delete_table_rules���s�����z"nftables._build_delete_table_rulesc�����������������C���s(���i�|�_�i�|�_i�|�_i�|�_i�|�_|��t�S�r����)rh���ri���rj���rk���rl���r����r����r����r7���r7���r8����build_flush_rules���s����znftables.build_flush_rulesc�����������������C���sP���ddd�|�}|ddt�dd|f�dd d diidd ddgid�idd�igd�iiS�)Nrs���r}����TFr����ru����%s_%sr(���r)����ctr�����state�in�set�established�relatedr0����accept�rx���rt���r����r����)r����)rn����enable�hook�add_delr7���r7���r8����_build_set_policy_rules_ct_rule���s���� ���z(nftables._build_set_policy_rules_ct_rulec�������������� ���C���s\��g�}|dkrZ|��|��t���dD�]6}|�dddtdd|f�d|d t�d �dd�ii��q n�|d k�r4|��|��t���dD�]�}||�}|dv�s�J��|���}d|���}|�dddt|d|dt�d �dd�ii��|�|��d|���|dkr�dd�i}n"|d k�rdd�i}ndddd�i}|�dddt||gd�ii��qxn$|dk�rN||��t�7�}n tt d��|S�)NZPANIC)r���r���rs���r����ru���r����r%���r(���i���rB����drop)rx���rt���ry���r+���r�����prio�policy�DROP)r#���r$���r!���)�ACCEPT�REJECTr����Zfilter_r���Tr����r�����reject�icmpx�admin-prohibited�r+���r����r����r����znot implemented) �extendr����r����r5����NFT_HOOK_OFFSET�lowerr����r����r���r ���)rn���r����Zpolicy_detailsr����r����Zd_policyZ chain_nameZ expr_fragmentr7���r7���r8����build_set_policy_rules���sb���� � � ����� znftables.build_set_policy_rulesc�����������������C���s8���t���}|r|gnt���D�]}|�t|������qt|�S�r����)r�����ICMP_TYPES_FRAGMENTSr�����updater{���)rn����ipvZ supportedZ_ipvr7���r7���r8����supported_icmp_types5��s����znftables.supported_icmp_typesc�����������������C���s ���|���t�S�r����)r����r����r����r7���r7���r8����build_default_tables?��s����znftables.build_default_tables�offc�����������������C���s"��g�}t�d����D�]�}|�dddtd|�ddt�d�|�d��t�d�|�d �d �ii��dD�]&}|�dddtd||f�d �ii��qXdD�]6}|�dddtd|�ddd||f�iigd�ii��q�qt�d����D��]}|�dddtd|�ddt�d�|�d��t�d�|�d �d �ii��|dv��r|dD�]Z}|�dddtd||f�d �ii��|�dddtd|�ddd||f�iigd�ii���qq�dD�](}|�dddtd||f�d �ii���q�dD�]8}|�dddtd|�ddd||f�iigd�ii���q�q�t�d����D�]F}|�dddtd|�ddt�d�|�d��t�d�|�d �d �ii���q�|�dddtdd�ddddiiddd d!gid"�id#d�igd�ii��|�dddtdd�dddd$iidd%d"�id#d�igd�ii��|�dddtdd�dd&dd'iid(d)d"�id#d�igd�ii��|d*k�rR|�dddtdd�ddddiiddd+gid"�i|��|�d,d-d.iigd�ii��|�dddtdd�ddddiiddd+gid"�id/d�igd�ii��dD�](}|�dddtd0d|f�d �ii���q�dD�]8}|�dddtdd�ddd0d|f�iigd�ii���q�|d*k�r<|�dddtdd�|��|�d,d-d1iigd�ii��|�dddtdd�d2d3d4d5�igd�ii��|�dddtdd6�ddddiiddd d!gid"�id#d�igd�ii��|�dddtdd6�dddd$iidd%d"�id#d�igd�ii��|�dddtdd6�dd&dd'iid(d)d"�id#d�igd�ii��|d*k�r||�dddtdd6�ddddiiddd+gid"�i|��|�d,d-d.iigd�ii��|�dddtdd6�ddddiiddd+gid"�id/d�igd�ii��d7D�](}|�dddtd0d6|f�d �ii���q�dD�]Z}|�dddtd0d6|f�d �ii��|�dddtdd6�ddd0d6|f�iigd�ii���q�d8D�](}|�dddtd0d6|f�d �ii���qP|d*k�r�|�dddtdd6�|��|�d,d-d1iigd�ii��|�dddtdd6�d2d3d4d5�igd�ii��|�dddtdd9�ddddiiddd d!gid"�id#d�igd�ii��|�dddtd:ddⅆiid(d)d"�id#d�igd�ii��d7D�]Z}|�dddtd0d9|f�d �ii��|�dddtdd9�ddd0d9|f�iigd�ii���qbd8D�]Z}|�dddtd0d9|f�d �ii��|�dddtdd9�ddd0d9|f�iigd�ii���q�|S�)<Nr&���rs���r����ru���z mangle_%sr(����%sr���rB���)rx���rt���ry���r+���r����r����)�POLICIES_pre�ZONES� POLICIES_postzmangle_%s_%s�rx���rt���ry���)r����r�����jump�targetr����r'���znat_%s)r!���)r����r����� nat_%s_%sz filter_%sr#���r)���r����r����r����r����r����r����r����r0���r�����status�dnat�meta�iifnamer/����lor����Zinvalidr����prefixzSTATE_INVALID_DROP: r�����filter_%s_%szFINAL_REJECT: r����r����r����r����r$���)r����)r����r!���� filter_OUTPUT�oifname)r����r����r5���r�����_pkttype_match_fragment)rn���r����Z default_rulesr����Zdispatch_suffixr7���r7���r8����build_default_rulesB��s��� � � � � � � � � � ��� ��� ��� � �� ��� � � �� � ��� ��� ��� � �� ��� � � � � �� � ��� ��� � � � �znftables.build_default_rulesc�����������������C���s2���|dkrddgS�|dkrdgS�|dkr.ddgS�g�S�)Nr(���r#���r$���r&���r���r'���r ���r7���r����r7���r7���r8����get_zone_table_chains��s����znftables.get_zone_table_chainsc �������������� ������sJ���j�j�|���jdk�rdnd��dkr4�dkr4dnd} �j�j�|�t| ���g�} g�}g�}g�} |D�]V}|t|�d��d kr�| �d ddd iid|d�t|�d���d�d�i��q`|�|��q`|D�]X}|t|�d��d k�r |�d dddiid|d�t|�d���d�d�i��q�| �|��q�|�r>| �d ddd iidd|id�i��| �rf|�d dddiidd| id�i��|�r�|D�]}| ���d|����qp|�r�|D�]}|���d|����q���������fdd�}g�}| �r| D�]:}|�r�|D�]}|�|||����q�n|�||d�����q�n4|�r6|D�]}|�|d�|����qn|�|d�d����|S�)Nr����pre�postr'���r ���TFrB����+r)���r����r����r����r/����*r0���r����r�����saddr�daddrc��������������������s����|�rT|rTd|�d�d�v�rTd|d�d�v�rT|�d�d�d�d�|d�d�d�d�krTd�S�g�}|�rf|��|���|rt|��|��|��ddd���f�ii��dtd ���f�|d �}|��������r�dd|iiS�d d|iiS�d�S�)Nr*���r)���r1���r-���r����r����r����ru���z%s_%s_POLICIES_%sr����rs���r����r}���)r5���r����r�����_policy_priority_fragment)�ingress_fragment�egress_fragment�expr_fragmentsr������_policyr�����chain_suffixr�����p_objrn���rt���r7���r8����_generate_policy_dispatch_ruleR��s0������� �zRnftables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule) rf���r����� get_policyr�����policy_base_chain_name�POLICY_CHAIN_PREFIXr����r5����_rule_addr_fragment)rn���r����r����rt���r����Zingress_interfacesZegress_interfacesZingress_sourcesZegress_sources�isSNATZingress_fragmentsZegress_fragmentsZ$ingress_interfaces_without_wildcardsZ#egress_interfaces_without_wildcardsZingress_interfaceZegress_interface�src�dstr��r����r����r����r7���r����r8����!build_policy_ingress_egress_rules!��sf������� � z*nftables.build_policy_ingress_egress_rulesFc�����������������C���sN��|dkr|dkrdnd}|�j�jj||t|d�} dddddd�|�} |t|�d ��d krn|d�t|�d ���d�}d}|dkr�|d d|| f�iig}n,ddd| iid|d�i|d d|| f�iig}|r�|s�d} dtd||f�|d�}|�|������nP|�rd} dtd||f�|d�}n.d} dtd||f�|d�}|�s@|�|������| d|iigS�)Nr'���r ���TF�r��r����r�����r���r ���r#���r$���r!���rB���r����r�����gotor����r����r)���r����r����r/���r0���r����ru����%s_%s_ZONESr����rs���r}���r����)rf���r����r��r��r����r����r�����_zone_interface_fragment)rn���r����r����r����� interfacert���r����r5���r��r����opt�actionr����r����r����r7���r7���r8����!build_zone_source_interface_rules���sZ�������� � � �z*nftables.build_zone_source_interface_rulesc����������� ��� ���C���s����|dkr|dkrdnd}|�j�jj||t|d�}ddd�|�} d d d d d d�|�} d}d td||f�|��| |�|dd||f�iigd�}|�|��||���| d|iigS�)Nr'���r ���TFr��r����r}���r����r����r����r ��r��ru���r��r����r����r����r����)rf���r����r��r��r����r��r�����_zone_source_fragment) rn���r����r����r����r����rt���r����r��r���r����r��r��r����r7���r7���r8����build_zone_source_address_rules���s*������ ��z(nftables.build_zone_source_address_rulesc�����������������C���sp��ddd�|�}|dkr"|dkr"dnd}|�j�jj||t|d�}|�j�j�|�}g�} | �|d d td||f�d�ii��d D�](} | �|d d td||| f�d�ii��qt|jr�| �ddd td||f�ddd||df�iigd�ii��d D�]<} | �|dd td||f�ddd||| f�iigd�ii��q�|j�r^| �ddd td||f�ddd||df�iigd�ii��|�j�jj|�j }|�j�� ��dk�r�|dk�r�|tdddfv��r�|}|tdfv��r�d}| �|dd td||f�|��|�j�� ���ddd||f�iigd�ii��|dk�r^|tddddfv��r^|tddfv��r,|�� ��} n|���d�i} | �|dd td||f�| gd�ii��|�sl| ����| S�)Nrs���r}���r����r'���r ���TFr��r����ru���r����r����)r����r����deny�allowr�����%s_%s_%sr����r����r����r����r����r����r����r(���r����z %%REJECT%%r����r���r����zfilter_%s_%s: r����)rf���r����r��r��r��r5���r����Zderived_from_zoneZ _policiesr����r����r���r�����_reject_fragmentr�����reverse)rn���r����r����rt���r����r����r��r���r��r����r��r����Z log_suffix�target_fragmentr7���r7���r8����build_policy_chain_rules���sx���� � � � � � �� � �z!nftables.build_policy_chain_rulesc�����������������C���s<���|dkri�S�|dv�r,ddddiid|d�iS�t�td |��d�S�) N�all)�unicast� broadcastZ multicastr)���r����r�����pkttyper/���r0���zInvalid pkttype "%s"�r���r ���)rn���r!��r7���r7���r8���r������s�����z nftables._pkttype_match_fragmentc�����������������C���s��dddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�iddd d�iddd d�iddd d�iddd d�iddd d�idddd�idddd�iddd d�iddd d�idddd�idddd�idddiidddiid�}||�S�)Nr����r:���rT���r����znet-prohibitedr����rY���znet-unreachablerU���rV���r����zprot-unreachablezaddr-unreachablera���r+���z tcp reset)zicmp-host-prohibitedzhost-prohibzicmp-net-prohibitedz net-prohibzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezicmp6-port-unreachablezport-unreachzicmp-proto-unreachablez proto-unreachzicmp6-addr-unreachable�addr-unreachzicmp6-no-routera���z tcp-resetztcp-rstr7���)rn���Zreject_typeZfragsr7���r7���r8����_reject_types_fragment��s2���� �znftables._reject_types_fragmentc�����������������C���s���dddd�iS�)Nr����r����r����r����r7���r����r7���r7���r8���r��9��s�����znftables._reject_fragmentc�����������������C���s ���ddddiiddddgid �iS�) Nr)���r����r�����l4protor/���r����r:���rY���r0���r7���r����r7���r7���r8����_icmp_match_fragment=��s���� �znftables._icmp_match_fragmentc�����������������C���sn���|si�S�ddddd�}z|j��d�}W�n�tyB���ttd��Y�n0�dt|j�d |���||j�|d ���d�iS�)N�secondZminuteZhourZday)�s�m�h�d�/zExpected '/' in limit�limitr���rB���)ZrateZper)�valuer����r����r���r ���r����)rn���r-��Zrich_to_nft�ir7���r7���r8����_rich_rule_limit_fragmentB��s������z"nftables._rich_rule_limit_fragmentc�����������������C���s����t�|j�ttttfv�rn<|jrJt�|j�ttt t fvrTttdt�|j����n ttd��|j dkr�t�|j�tttfv�s�t�|j�tt fv�r�dS�t�|j�tfv�s�t�|j�tt fv�r�dS�n|j dk�r�dS�dS�d�S�)N�Unknown action %szNo rule action specified.r���r��r��r����r����)r+����elementr���r���r���r���r��r���r���r���r���r���r ���r�����rn���� rich_ruler7���r7���r8����_rich_rule_chain_suffixU��s$���� �� z nftables._rich_rule_chain_suffixc�����������������C���s:���|j�s|jsttd��|jdkr$dS�|jdk�r2dS�dS�d�S�)NzNot log or auditr���r���r����r����)r����auditr���r ���r����r3��r7���r7���r8���� _rich_rule_chain_suffix_from_logk��s���� z)nftables._rich_rule_chain_suffix_from_logc�����������������C���s���dd�iS�)Nr����r7���r����r7���r7���r8���r��v��s����z!nftables._zone_interface_fragmentc�����������������C���sN���t�d|�rt|�}n,td|�r@|�d�}t|d��d�|d��}d||d�iS�)Nrd���r,��r���rB���r����)r����r����)r���r���r����split)rn���r����r����Z addr_splitr7���r7���r8���r��y��s���� znftables._zone_source_fragmentc�����������������C���s ���d|j�iS�)Nr�����r����)rn���r����r7���r7���r8���r�������s����z"nftables._policy_priority_fragmentc�����������������C���s���|r|j�dkri�S�d|j�iS�)Nr���r����r9��r3��r7���r7���r8����_rich_rule_priority_fragment���s����z%nftables._rich_rule_priority_fragmentc�����������������C���s ��|j�s i�S�|�jj�||t�}ddd�|�}|��|�}i�} t|j��tkr||j�jrZt |j�j�nd| d<�|j�j r�t |j�j �| d<�n,|j�jr�d|j�jkr�dn|j�j} d | �| d <�|j�jr�d |j�j�| d<�dt d |||f�||��|j�j�d| ig�d�}|�|��|���|d|iiS�)Nrs���r}���r����r����groupzqueue-thresholdZwarning�warnr�����levelr����ru���r��r���r����r����)r���rf���r����r��r��r7��r+���r���r;��r����Z thresholdr=��r����r����r0��r-��r����r:��)rn���r����r4��r����rt���r����r���r����r��Zlog_optionsr=��r����r7���r7���r8����_rich_rule_log���s4���� ���znftables._rich_rule_logc����������� ������C���s����|j�s i�S�|�jj�||t�}ddd�|�}|��|�}dtd|||f�||��|j�j�dddiig�d �} | � |�� |���|d | iiS�)Nrs���r}���r����ru���r��r���r=��r6��r����r����)r6��rf���r����r��r��r7��r����r0��r-��r����r:��) rn���r����r4��r����rt���r����r���r����r��r����r7���r7���r8����_rich_rule_audit���s ���� ���znftables._rich_rule_auditc����������� ������C���s���|j�s i�S�|�jj�||t�}ddd�|�}|��|�}d|||f�} t|j��tkr\dd�i} �n�t|j��tkr�|j�jr�|�� |j�j�} ndd�i} n�t|j��t kr�dd�i} n�t|j��tk�rHd}|�jj�||t�}d|||f�} |j�j� d �}t|�d k�r,dddd iiddddd ii|d �gi|d�gid�i} ndddd ii|d�d�i} nttdt|j�����dt| ||��|j�j�| g�d�}|�|��|���|d|iiS�)Nrs���r}���r����r��r����r����r����r&���r,��rB���r����r�����mark�^�&r����r����r.��r1��ru���r����r����)r��rf���r����r��r��r5��r+���r���r���r$��r���r���r����r8��r����r���r ���r����r0��r-��r����r:��) rn���r����r4��r����rt���r����r���r����r��r����Zrule_actionr.��r����r7���r7���r8����_rich_rule_action���sL���� "� � ���znftables._rich_rule_actionc�����������������C���s����|��d�r0|��|td�d���d|kr(dnd|�S�t|�r>d}n�td|�rNd}nvtd|�r�d}tj|dd�}d |jj |j d �i}nDtd|�r�d}t|�}n,d}|�d �}d t|d��t |d��d �i}dd||d�i|r�dnd|d�iS�d�S�)N�ipset:r����TF�etherrc����ip)�strictr������addrr����rd����ip6r,��r���rB���r)���r*���r,����!=r/���r0���)� startswith�_set_match_fragmentr����r���r���r���� ipaddress�IPv4Network�network_address� compressed� prefixlenr���r8��r����)rn���Z addr_fieldr�����invertrx���Znormalized_addressZaddr_lenr7���r7���r8���r�����s,���� & � �znftables._rule_addr_fragmentc�����������������C���s6���|si�S�|dvrt�td|���ddddiid|d�iS�) Nrb���zInvalid familyr)���r����r�����nfprotor/���r0���r"��)rn���Zrich_familyr7���r7���r8����_rich_rule_family_fragment���s������z#nftables._rich_rule_family_fragmentc�����������������C���s8���|si�S�|j�r|j�}n|jr&d|j�}|�jd||jd�S�)NrE��r�����rT��)rJ���ipsetr��rT��)rn���Z rich_destr����r7���r7���r8����_rich_rule_destination_fragment ��s���� z(nftables._rich_rule_destination_fragmentc�����������������C���sZ���|si�S�|j�r|j�}n2t|d�r.|jr.|j}nt|d�rH|jrHd|j�}|�jd||jd�S�)N�macrX��rE��r����rW��)rJ���hasattrrZ��rX��r��rT��)rn���Zrich_sourcer����r7���r7���r8����_rich_rule_source_fragment��s���� z#nftables._rich_rule_source_fragmentc�����������������C���sP���t�|�}t|t�r$|dk�r$tt��n(t|�dkr8|d�S�d|d�|d�giS�d�S�)Nr���rB����range)r���� isinstancer����r���r���r����)rn����portr]��r7���r7���r8����_port_fragment!��s���� znftables._port_fragmentc�������������� ���C���s&��ddd�|�}d}|�j�j�||t�} g�} |r>| �|��|j���|rT| �|��d|���|r|| �|��|j ���| �|�� |j���| �dd|dd �id |��|�d�i��g�}|r�|�|�� ||||| ���|�|��||||| ���|�|��||||| ���n.|�|dd td|| f�| dd�ig�d�ii��|S�)Nrs���r}���r����r(���r����r)���r*����dportr,���r/���r0���r����ru����%s_%s_allowr����r�����rf���r����r��r��r5���rV��rx���r��rY���destinationr\���sourcer`��r>��r?��rD��r�����rn���r����r�����protor_��rd��r4��r����rt���r���r����r����r7���r7���r8����build_policy_ports_rules*��s8���� �� �z!nftables.build_policy_ports_rulesc�������������� ���C���s��ddd�|�}d}|�j�j�||t�}g�} |r>| �|��|j���|rT| �|��d|���|r|| �|��|j ���| �|�� |j���| �dddd iid |d�i��g�} |r�| �|��||||| ���| �|�� ||||| ���| �|��||||| ���n.| �|dd td||f�| dd�ig�d�ii��| S�)Nrs���r}���r����r(���r����r)���r����r����r%��r/���r0���r����ru���rb��r����r����)rf���r����r��r��r5���rV��rx���r��rY��rd��r\��re��r>��r?��rD��r����)rn���r����r����r-���rd��r4��r����rt���r���r����r����r7���r7���r8����build_policy_protocol_rulesJ��s4����� �z$nftables.build_policy_protocol_rulesc�����������������C���s����d}d}|�j�j�||t�}ddd�|�} g�} |r^| �|��|j���| �|��|j���|�� |�}| �dddd d d�idd �i��|dks�|d�u�r�| �ddddd�idddiid�i��n| �ddddd�i|d�i��| ddt d||f�| d�iigS�)Nr��r(���rs���r}���r����r)���r����r*����tcprz���r,���Zsyn)r2���r1���r3���Zpmtur&���z tcp optionZmaxseg�size)ry���r.���Zrtr����ZmturC��r����ru���r����r����)rf���r����r��r��r5���rY��rd��r\��re��r5��r����)rn���r����r����Ztcp_mss_clamp_valuerd��r4��r��rt���r���r����r����r7���r7���r8���� build_policy_tcp_mss_clamp_rulesi��s2���� � �� �z)nftables.build_policy_tcp_mss_clamp_rulesc�������������� ���C���s&��ddd�|�}d}|�j�j�||t�} g�} |r>| �|��|j���|rT| �|��d|���|r|| �|��|j ���| �|�� |j���| �dd|dd �id |��|�d�i��g�}|r�|�|�� ||||| ���|�|��||||| ���|�|��||||| ���n.|�|dd td|| f�| dd�ig�d�ii��|S�)Nrs���r}���r����r(���r����r)���r*����sportr,���r/���r0���r����ru���rb��r����r����rc��rf��r7���r7���r8����build_policy_source_ports_rules���s8���� �� �z(nftables.build_policy_source_ports_rulesc����������� ��� ���C���s����d}|�j�j�||t�} ddd�|�} g�}|rR|�dddtd||f�||d�ii��g�}|rl|�|��d |���|�d d|dd �id|��|�d�i��|�dd||f�i��|�| ddtd| �|d�ii��|S�)Nr(���rs���r}���r����z ct helperru���zhelper-%s-%s)rx���rt���ry���r+���r-���r����r)���r*���ra��r,���r/���r0���r�����filter_%s_allowr����)rf���r����r��r��r5���r����r��r`��) rn���r����r����rg��r_��rd��Zhelper_nameZmodule_short_namert���r���r����r����r����r7���r7���r8����build_policy_helper_ports_rules���s6���� � �� �z(nftables.build_policy_helper_ports_rulesc�����������������C���s����ddd�|�}|�j�j�||t�}g�} |rv|t|�d��dkrT|d�t|�d���d�}ddd d iid|d�id d�ig} n|��d|�d d�ig} dtd|�| d�}| �|d|ii��| S�)Nrs���r}���r����rB���r����r����r)���r����r����r����r/���r0���r����r����ru���ro��r����r����)rf���r����r��r��r����r��r����r5���)rn���r����r����r����rt���r��re��r����r���r����r����r����r7���r7���r8����build_zone_forward_rules���s(�������z!nftables.build_zone_forward_rulesc�������������� ���C���s����ddd�|�}g�}g�}|r\|��|��|j���|��|��|j���|��|��|j���|��|�}n"|��ddddiidd d �i��d}d}|�jj j ||td d�} dtd| |f�|ddddiiddd �idd�ig�d�} | � |��|���|��|d| ii��|S�)Nrs���r}���r����r)���r����r����rU��r/���rc���r0���r��r'���Tr��ru���r����r����rL��r����Z masquerader����r����)r5���rV��rx���rY��rd��r\��re��r5��rf���r����r��r��r����r����r:��)rn���r����r����r4��r����r����r����r��rt���r���r����r7���r7���r8����build_policy_masquerade_rules���s<����� ����z&nftables.build_policy_masquerade_rulesc�����������������C���sp��d}|�j�j�||t�} ddd�|�} g�}|rn|�|��|j���|�|��|j���|�|�� |j ���|��|�}n8d} |r�td|�r�d} |�ddd d iid| d�i��d }|�dd|dd�id|�� |�d�i��|�r$td|�r�t|�}|�r|dk�r|�d||�� |�d�i��n|�dd|ii��n|�dd|�� |�ii��dtd| |f�|d�}|�|��|���| d|iigS�)Nr'���rs���r}���r����rc���rd���r)���r����r����rU��r/���r0���r��r*���ra��r,���r����r����)rJ��r_��rJ��rA���r_��ru���r����r����r����)rf���r����r��r��r5���rV��rx���rY��rd��r\��re��r5��r���r`��r���r����r����r:��)rn���r����r����r_��r-���ZtoportZtoaddrr4��rt���r���r����r����r��rU��r����r7���r7���r8����build_policy_forward_port_rules���sJ����� �� �z(nftables.build_policy_forward_port_rulesc�����������������C���s2���|t�|�v�rt�|�|�S�ttd||�j|f���d�S�)Nz)ICMP type '%s' not supported by %s for %s)r����r���r���ry���)rn���r����Z icmp_typer7���r7���r8����_icmp_types_to_nft_fragments(��s �����z%nftables._icmp_types_to_nft_fragmentsc�����������������C���s:��d}|�j�j�||t�}ddd�|�}|r6|jr6|j}n<|jrjg�}d|jv�rT|�d��d|jv�rr|�d��nddg}g�} |D��]�} |�j�j�|�r�d||f�}dd�i}nd ||f�}|����}g�} |r�| �|�� |j ���| �|��|j���| �|��|j ���| �|��| |j���|�r�| �|��||||| ���| �|��||||| ���|j�rb| �|��||||| ���nN|��|�}d td|||f�| |����g�d�}|�|��|���| �|d |ii��qz|�j����dk�r|�j�j�|��s| �|d d t|| |��|�j�����ddd||f�iig�d�ii��| �|d d t|| |g�d�ii��qz| S�)Nr(���rs���r}���r����rc���rd���rb��r����z %s_%s_denyru���r��r����r����r����r���r�����%s_%s_ICMP_BLOCK: )rf���r����r��r���ipvsrd��r5����query_icmp_block_inversionr��rV��rx���rY��r\��re��r����rt��ry���r>��r?��r��rD��r5��r����r����r:��r����r����)rn���r����r����Zictr4��rt���r���r����rv��r����r����Zfinal_chainr��r����r��r����r7���r7���r8����build_policy_icmp_block_rules/��sl���� � ��� �z&nftables.build_policy_icmp_block_rulesc�����������������C���s����d}|�j�j�||t�}g�}ddd�|�}|�j�j�|�r@|����}ndd�i}|�|ddtd||f�d |����|gd �ii��|�j�� ��dkr�|�j�j�|�r�|�|ddtd||f�d |����|�� |�j�� ���dd d||f�iigd �ii��|S�)Nr(���rs���r}���r����r����r����ru���r����rF����rx���rt���r����r����r����r����r���r����ru��)rf���r����r��r��rw��r��r5���r����r&��r����r����)rn���r����r����rt���r���r����r����r��r7���r7���r8����'build_policy_icmp_block_inversion_rulesk��s4���� �� ��z0nftables.build_policy_icmp_block_inversion_rulesc�������������� ���C���s$��g�}d}|�j�jdkrddg}n<|�j�jdkr8ddg}d}n"|�j�jdkrRg�d�}d}ng�d�}d d ddiid dd�id d|dd�id dd�ig}|dkr�|�dddii��|�dd�i��|�dddt||d�ii��|�j�jdv�r |�dddt|d ddd d!�id d"d#d$gid�id%d�igd�ii��|S�)&NZfilter_PREROUTINGZlooser����r@��� loose-forward�filter_FORWARD�strict-forward)r����r@��Ziifr)���r����r����rU��r/���rd���r0���ZfibZoif)rz����resultFr����r���r����zrpfilter_DROP: r����r����r����ru���r�����r{��r}��r*���rY���r+���r,���r����r`���r^���r����)rf����_ipv6_rpfilterr5���r����)rn���r����r����Zrpfilter_chainZ fib_flagsr����r7���r7���r8����build_rpfilter_rules���sX���� ���� � � ���znftables.build_rpfilter_rulesc�������������� ���C���s����g�d�}dd��|D��}ddddd�id d |id�ig}|�j�jdv�rT|�d ddii��|�|��d���g�}|�dddtdd|d�ii��d}|�j����dkr�|d7�}|�j�jdv�r�|d7�}|�dddtd||d�ii��|S�)N) z::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19c�����������������S���s2���g�|�]*}d�|��d�d�t|��d�d��d�i�qS�)r����r,��r���rB���rI��)r8��r����)�.0r����r7���r7���r8���� <listcomp>���r����z5nftables.build_rfc3964_ipv4_rules.<locals>.<listcomp>r)���r*���rK��r����r,���r/���r����r0���)r��r��r���r����zRFC3964_IPv4_REJECT: r#��rs���r����ru���r����rB���ry��rG���r����r��r|��)rf���Z_log_deniedr5���r$��r����r����r���)rn���Z daddr_setr����r����Z forward_indexr7���r7���r8����build_rfc3964_ipv4_rules���s<���� �� � �z!nftables.build_rfc3964_ipv4_rulesc�������������� ���C���s����d}g�}|��|��|j���|��|��|j���|��|��|j���g�}|��|��|||||���|��|��|||||���|��|�� |||||���|S�)Nr(���) r5���rV��rx���rY��rd��r\��re��r>��r?��rD��)rn���r����r����r4��rt���r����r����r7���r7���r8����*build_policy_rich_source_destination_rules���s����z3nftables.build_policy_rich_source_destination_rulesc�����������������C���s���|dv�rdS�dS�)N)rc���rd���ZebTFr7���)rn���r����r7���r7���r8����is_ipv_supported���s����znftables.is_ipv_supportedc�������������� ���C���s����ddd�}||�||�ddg||�dd||�g||�dd||�g||�dg||�||�||�g||�ddg||�dd||�g||�dgdd �}||v�r�||�S�t�td |���d�S�)NZ ipv4_addrZ ipv6_addrrb���Z inet_protoZinet_servicer@��ZifnameZ ether_addr)zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netz hash:net,portzhash:net,port,netzhash:net,iface�hash:macz!ipset type name '%s' is not valid)r���r���)rn���r����r+���Zipv_addr�typesr7���r7���r8����_set_type_list���s(����� ��znftables._set_type_listc�����������������C���s����|rd|v�r|d�dkrd}nd}dt�||��||�d�}|�d�d��d �D�]}|d v�rLdg|d<��qhqL|r�d |v�r�t|d ��|d <�d|v�r�t|d��|d<�dd|iigS�)Nrx����inet6rd���rc���ru���)rx���rt���ry���r+����:rB����,)rG���netr_���intervalrz����timeoutZmaxelemrk��rs���r����)r����r���r8��r����)rn���ry���r+����optionsr����Zset_dict�tr7���r7���r8����build_set_create_rules��s$���� � znftables.build_set_create_rulesc�����������������C���s$���|���|||�}|��||�j�����d�S�r����)r���r����rf���r����)rn���ry���r+���r���r����r7���r7���r8���� set_create$��s����znftables.set_createc�����������������C���s*���dddt�|d�ii}|��||�j�����d�S�)Nr}���r����ru���r����)r����r����rf���r����)rn���ry���r����r7���r7���r8����set_destroy(��s ����� znftables.set_destroyc�����������������C���s��|�j�j�|�j�d�d��d�}g�}|D�]�}|dkrd|�dddii��|�dd |rVd ndd�i��q(|d v�r�|�d|��|�|r�dndd�i��q(|dkr�|�dd|r�dndii��q(|dkr�|�dddii��q(ttd|���q(dt |�dkr�d|in|d�|�rdndd|�d�iS�)Nr���rB���r���r_��r����r����r%��r*����thra��rm��r,���)rG��r���rZ��r����r����Zifacer����r����r@��z-Unsupported ipset type for match fragment: %sr)����concatr���rL��r/����@r0���) rf���rX��� get_ipsetr+���r8��r5����_set_get_familyr���r���r����)rn���ry���Z match_destrT���type_formatr6����formatr7���r7���r8���rN��.��s*���� � ��znftables._set_match_fragmentc�������������� ���C���s8��|�j�j�|�}|j�d�d��d�}|�d�}t|�t|�krHttd��g�}t|�D��]�\}}|dk�rz||�� d�} W�n$�t y����|�d��||�} Y�n,0�|�||�d�| ����||�| d�d���} z| � d�} W�n�t y����|�| ��Y�n(0�|�d| d�| ��| | d�d���gi��qT|d v��rd||�v��rP|�d||��d�i��n�z||�� d �} W�nJ�t �y����||�}d|jv��r�|jd�dk�r�t |�}|�|��Y�n^0�||�d�| ��}d|jv��r�|jd�dk�r�t |�}|�d |t||�| d�d����d�i��qT|�||���qTt|�dk�r4d|igS�|S�)Nr���rB���r���z+Number of values does not match ipset type.r_��rj���-r]��)rG��r���r,��rx���r���r����rI��r���)rf���rX��r���r+���r8��r����r���r ���� enumerater����r����r5���r���r���r����)rn���ry����entry�objr���Zentry_tokens�fragmentr/��r���r����Zport_strrJ��r7���r7���r8����_set_entry_fragmentE��sP���� � ( �znftables._set_entry_fragmentc�������������� ���C���s0���g�}|���||�}|�dddt||d�ii��|S�)Nrs���r2��ru����rx���rt���ry����elem)r���r5���r����)rn���ry���r���r����r2��r7���r7���r8����build_set_add_rulesy��s���� �znftables.build_set_add_rulesc�����������������C���s"���|���||�}|��||�j�����d�S�r����)r���r����rf���r����)rn���ry���r���r����r7���r7���r8����set_add���s����znftables.set_addc�����������������C���s8���|���||�}dddt||d�ii}|��||�j�����d�S�)Nr}���r2��ru���r���)r���r����r����rf���r����)rn���ry���r���r2��r����r7���r7���r8���� set_delete���s����� znftables.set_deletec�����������������C���s���dddt�|d�iigS�)Nr����r����ru���r����)r����)rn���ry���r7���r7���r8����build_set_flush_rules���s�����znftables.build_set_flush_rulesc�����������������C���s ���|���|�}|��||�j�����d�S�r����)r���r����rf���r����)rn���ry���r����r7���r7���r8���� set_flush���s���� znftables.set_flushc�����������������C���sJ���|�j�j�|�}|jdkrd}n(|jrBd|jv�rB|jd�dkrBd}nd}|S�)Nr���rF��rx���r���rK��rG��)rf���rX��r���r+���r���)rn���ry���rX��rx���r7���r7���r8���r������s���� �znftables._set_get_familyc����������� ������C���s����g�}|��|��|||���|��|��|���d}|D�]D}|��|��||���|d7�}|dkr0|��||�j�����|����d}q0|��||�j�����d�S�)Nr���rB���i���)r����r���r���r���r����rf���r�����clear) rn���Zset_name� type_name�entriesZcreate_optionsZ entry_optionsr�����chunkr���r7���r7���r8����set_restore���s����znftables.set_restore)N)N)r����)F)F)NN)NN)NN)NN)NN)N)N)N)F)N)N)F)NN)K�__name__� __module__�__qualname__ry���Zpolicies_supportedrp���r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r��r��r��r��r����r$��r��r&��r0��r5��r7��r��r��r����r:��r>��r?��rD��r��rV��rY��r\��r`��rh��ri��rl��rn��rp��rq��rr��rs��rt��rx��rz��r���r���r���r���r���r���r���r���rN��r���r���r���r���r���r���r���r���r7���r7���r7���r8���re�������s����0,.e C �V c�� 2B + �� �� ! !�� + < +( 4 ��re���)N)+r����r����rO��Zfirewall.core.loggerr���Zfirewall.functionsr���r���r���r���r���Zfirewall.errorsr���r ���r ���r���r���r ���r���Zfirewall.core.richr���r���r���r���r���r���r���r���r���Zfirewall.core.baser���Znftables.nftablesr���r����r����r~���r��r����r����r9���r�����objectre���r7���r7���r7���r8����<module>���s����$,� � �� �& ��E