Description de la déclaration CNRPS
1. Introduction
La Caisse Nationale de Retraite et de Prévoyance Sociale (CNRPS) exige des établissements affiliés la transmission périodique de fichiers de déclaration contenant les données des employés et de leurs rémunérations.
Cette documentation décrit la structure, les champs, les codes, et les règles de formatage nécessaires pour générer un fichier texte conforme aux spécifications CNRPS.
2. Structure Générale du Fichier de Déclaration
Le fichier de déclaration est un fichier texte (TXT) à largeur fixe, où chaque ligne représente un enregistrement (un employé) et chaque champ occupe une position précise en nombre de caractères.
· Encodage : ASCII ou UTF-8 selon spécification.
· Séparation : Aucun séparateur, alignement par position fixe.
· Longueur totale : 2069 caractères par ligne (selon la feuille CNRPS).
3. Structure Complète du Fichier de Déclaration
3.1. Section En-tête de l'établissement
Cette section identifie l'organisme déclarant et définit la période de référence. Elle comprend le code établissement, le type de salaire, la période de paie et les informations relatives au détachement si applicable.
Champ | Type | Taille | Position | Description |
Code Etablissement | Number | 10 | 1-10 | Code de l'établissement (format "000000PPPP") |
Type Salaire | Number | 2 | 11-12 | "01" pour personnel statutaire, "02" pour occasionnel |
Période | Number | 2 | 13-14 | Type déclaration : "01-12" mensuel, "21-24" trimestriel, "13" annuel |
Année de la paie | Number | 4 | 15-18 | Année de déclaration sur 4 chiffres |
Base de calcul de la paie | Number | 1 | 19 | "1" calcul organisme origine, "2" calcul organisme détachement |
Code Etablissement d'origine | Number | 10 | 20-29 | Code établissement d'origine "0000000OOOO" |
Code Etablissement de détachement | Number | 10 | 30-39 | Code établissement de détachement "000000DDDD" |
3.2. Section Identification de l'employé
Ces champs contiennent les informations personnelles et d'identification de chaque assuré social, y compris ses coordonnées administratives de base.
Champ | Type | Taille | Position | Description |
Identifiant Unique CNRPS | Number | 10 | 40-49 | Identifiant unique à 10 chiffres de l'assuré social |
Nom | Varchar | 40 | 50-89 | Nom de famille de l'agent |
Prenom | Varchar | 40 | 90-129 | Prénom de l'agent |
Date Naissance | Date | 8 | 130-137 | Date de naissance au format "JJMMAAAA" |
Sexe | Varchar | 1 | 138 | "M" pour Masculin, "F" pour Feminin |
Lieu D'Affectation | Number | 4 | 139-142 | Code du lieu de travail de l'agent |
Position administrative | Number | 2 | 143-144 | Code correspondant à la position administrative actuelle |
DATE_EFFET_POSITION_ADM | Date | 8 | 145-152 | Date d'effet de la position administrative "JJMMAAAA" |
Sous Position administrative | Number | 2 | 153-154 | Code de la sous position administrative |
DATE_EFFET_SOUS_POS | Date | 8 | 155-162 | Date d'effet de la sous position "JJMMAAAA" |
QUALITE_RECRUTEMENT | Number | 2 | 163-164 | Code du mode de recrutement de l'agent |
Date effet qualite recrutement | Date | 8 | 165-172 | Date d'effet du mode du recrutement "JJMMAAAA" |
Date Fin Contrat | Date | 8 | 173-180 | Date de fin de contrat pour contractuels/occasionnels |
3.3. Section Carrière et Situation professionnelle
Cette partie décrit la situation professionnelle complète de l'agent, incluant son grade, fonction, catégorie et progression dans l'échelle hiérarchique.
Champ | Type | Taille | Position | Description |
Grade | Number | 4 | 181-184 | Code correspondant du grade en cours |
Date Effet Grade | Date | 8 | 185-193 | Date d'effet du grade en cours "JJMMAAAA" |
Fonction | Number | 4 | 193-197 | Code correspondant de la fonction en cours |
Date Effet Fonction | Date | 8 | 197-204 | Date d'effet de la fonction "JJMMAAAA" |
Regime | Number | 2 | 205-206 | "40" pour 40 heures, "48" pour 48 heures |
Categorie Classement | Number | 4 | 207-210 | Code de la catégorie de classement en cours |
Date Effet Categorie | Date | 8 | 211-218 | Date d'effet de la catégorie "JJMMAAAA" |
Code Categorie Professionnelle | Number | 4 | 219-222 | Code de la catégorie professionnelle (A1,A2,B,C,D,U1,U2,U3) |
Date Effet Categorie Professionnelle | Date | 8 | 223-230 | Date d'effet de la catégorie professionnelle "JJMMAAAA" |
Ordre Echelle | Number | 4 | 231-234 | Code correspondant à l'ordre de l'échelle |
Code Echelle | Number | 4 | 235-238 | Code correspondant à l'échelle |
Date Effet Echelle | Date | 8 | 239-246 | Date d'effet de l'échelle en cours "JJMMAAAA" |
Echelon | Number | 4 | 247-250 | Code correspondant à l'échelon |
Date Effet Echelon | Date | 8 | 251-258 | Date d'effet de l'échelon en cours "JJMMAAAA" |
Niveau | Number | 4 | 259-262 | Code correspondant au niveau en cours (par défaut "0000") |
Date Effet Niveau | Date | 8 | 263-270 | Date d'effet du niveau "JJMMAAAA" (par défaut "00000000") |
Classe | Number | 4 | 271-274 | Code correspondant de la classe en cours (par défaut "0000") |
Date Effet Classe | Date | 8 | 275-282 | Date d'effet de la classe "JJMMAAAA" (par défaut "00000000") |
Classe Productive | Number | 4 | 283-286 | Code de la classe productive (par défaut "0000") |
Date Effet Classe Productive | Date | 8 | 287-294 | Date d'effet de la classe productive "JJMMAAAA" (par défaut "00000000") |
3.4. Section Indemnités (20 occurrences répétées)
Cette section permet de déclarer jusqu'à 20 indemnités différentes par agent. Chaque indemnité est décrite par son code, son montant et sa date d'effet.
Champ | Type | Taille | Position | Description |
Code Indemnite (x20) | Number | 3 | 295-... | Code de l'indemnité (voir table des indemnités) |
Montant Indemnite (x20) | Number | 12 | ... | Montant de l'indemnité sur 12 chiffres |
Date Effet indemnite (x20) | Date | 8 | ...-754 | Date d'effet du bénéfice de l'indemnité "JJMMAAAA" |
3.5. Section Cotisations sociales obligatoires
Ces champs contiennent les montants des cotisations sociales retenues sur le salaire et les subventions correspondantes versées par l'employeur.
Champ | Type | Taille | Position | Description |
Cotisation Retraite | Number | 12 | 755-766 | Montant de la cotisation du régime de retraite |
Cotisation CNAM | Number | 12 | 767-778 | Montant de la cotisation CNAM |
Cotisation CD | Number | 12 | 779-790 | Montant de la cotisation du CD |
Subevention Retraite | Number | 12 | 791-802 | Montant de la subvention du régime de retraite |
Subevention CNAM | Number | 12 | 803-814 | Montant de la subvention CNAM |
3.6. Section Rappels (15 occurrences répétées)
Cette partie permet de déclarer jusqu'à 15 rappels de paie. Chaque rappel comprend son code, montant, sens (plus/moins) et date d'effet.
Champ | Type | Taille | Position | Description |
Code Rappel (x15) | Number | 3 | 815-... | Code correspondant du rappel |
Montant Rappel (x15) | Number | 12 | ... | Montant du rappel sur 12 chiffres |
En plus (x15) | Number | 1 | ... | "1" pour rappel en plus, "2" pour rappel en moins |
Date Effet Rappel (x15) | Date | 8 | ...-1174 | Date d'effet du rappel "JJMMAAAA" |
3.7. Section Cotisations des rappels
Champ | Type | Taille | Position | Description |
Cotisation Retraite Rappel | Number | 12 | 1175-1186 | Montant cotisation retraite du rappel |
Cotisation CNAM Rappel | Number | 12 | 1187-1198 | Montant cotisation CNAM du rappel |
Cotisation CD Rappel | Number | 12 | 1199-1210 | Montant cotisation CD du rappel |
Subevention Retraite Rappel | Number | 12 | 1211-1222 | Montant subvention retraite du rappel |
Subevention AM Rappel | Number | 12 | 1223-1234 | Montant subvention CNAM du rappel |
3.8. Section Retenues CNRPS (20 occurrences répétées)
Cette section permet de déclarer jusqu'à 20 retenues sur salaire au profit de la CNRPS, principalement pour le remboursement de prêts et avances.
Champ | Type | Taille | Position | Description |
Code Retenue (x20) | Number | 4 | 1235-... | Code de la retenue (voir table des oppositions) |
Montant Retenue (x20) | Number | 12 | ... | Montant de la retenue prélevée |
Du (x20) | Number | 6 | ... | Date début de la retenue au format "MMAAAA" |
Au (x20) | Number | 6 | ... | Date fin de la retenue au format "MMAAAA" |
Réf CNRPS (x20) | Varchar | 13 | ...-2054 | Référence de la CNRPS pour la retenue |
3.9. Section Information complémentaire
Dernière section contenant le matricule interne de l'agent au sein de l'établissement déclarant.
Champ | Type | Taille | Position | Description |
Matricule interne | Varchar | 15 | 2055-2069 | Matricule de l'agent au niveau de l'établissement |
4. Tables de Référence - Codes d'Équivalence
4.1. Table des Grades (الرتب)
Cette table contient les codes CNRPS pour tous les grades du personnel maritime et portuaire de l'OMMP, avec leurs équivalents OMMP et traductions arabe/français.
Code CNRPS | Libellé Français | Libellé Arabe | Code OMMP |
4109 | manœuvre | عامل يدوي | 14441 |
331 | manœuvre 1 er degré | عامل يدوي درجة أولى | 14442 |
334 | manœuvre 2 eme degré | عامل يدوي درجة ثانية | 14443 |
338 | manœuvre 3 eme degré | عامل يدوي درجة ثالثة | 14444 |
6211 | manœuvre 4 eme degré | عامل يدوي درجة رابعة | 14445 |
2024 | manœuvre 5 eme degré | عامل يدوي درجة خامسة | 14446 |
... | ... | ... | ... |
4.2. Table des Indemnités (المنح)
Correspondance des codes d'indemnités versées aux agents, incluant avantages en nature et primes spéciales.
Code CNRPS | Libellé Arabe | Libellé Français | Code OMMP |
735 | الأجر الأساسي | Salaire de base | 1 |
80 | المنحة الخصوصية للإرشاد البحري | Prime spécifique de pilotage | 30 |
210 | منحة الكيلومترية | Voiture de fonction | 70 |
12 | منحة السكن | Logement de fonction | 71 |
363 | منحة النقل | indemnité de transport | 105 |
4.3. Table des Fonctions (الخطط الوظيفية)
Codes des postes d'encadrement et de direction au sein de l'OMMP.
Code CNRPS | Libellé Français | Libellé Arabe | Code OMMP |
1209 | directeur general adjoint | مدير عام مساعد | 2 |
1609 | directeur central | مدير مركزي | 3 |
1065 | directeur | مدير | 4 |
1080 | chef de division | رئيس دائرة | 5 |
1073 | chef de service | رئيس مصلحة | 6 |
1045 | chef de section | رئيس قسم | 7 |
4.4. Table des Catégories de Classement (categ)
Catégories hiérarchiques spécifiques à l'établissement 3002 (OMMP).
Code_Etablissement | Categorie_Classement |
3002 | 1 |
3002 | 2 |
3002 | 3 |
... | ... |
3002 | 17 |
4.5. Table des Échelons (ech echelon)
Les 20 échelons hiérarchiques pour la gestion de carrière.
Code | Libellé Français |
01 | Echelon 1 |
02 | Echelon 2 |
03 | Echelon 3 |
... | ... |
20 | Echelon 20 |
4.6. Table des Périodes de Paie
Codes des périodes de déclaration CNRPS.
Code CNRPS | Libellé Français |
1 | JANVIER |
2 | FEVRIER |
3 | MARS |
... | ... |
13 | 13 EME MOIS (FIN D'ANNEE) |
21 | PRIME 1ER TRIMESTRE |
4.7. Table des Types de Paie
Classification des différents types de paie à déclarer.
Code CNRPS | Libellé CNRPS | Code OMMP | Libellé OMMP |
1 | PAIE NORMALE | 0 | salaire mensuel |
1 | PAIE NORMALE | 2 | Gratification de fin d'année |
5 | RAPPELS | 5 | Rappel rappel |
2 | PAIE DES CONTRACTUELS | ? |
4.8. Table des Localités Géographiques
Extrait des codes géographiques des lieux de travail.
Code | Libellé Arabe | Libellé Français |
101 | تونس المدينة | TUNIS MEDINA |
114 | حلق الوادي | TUNIS LA GOULETTE |
115 | المرسى | TUNIS LA MARSA |
301 | بنزرت الشمالية | BIZERTE NORD |
1301 | صفاقس المدينة | SFAX SFAX MEDINA |
4.9. Table des Positions Administratives
Les cinq positions administratives principales.
code_position | libelle_francais | libelle_arabe |
1 | En Activite | مباشرة |
2 | En détachement | إلحاق |
3 | Sous les drapeaux | تحت السلاح |
4 | Disponibilite | عدم مباشرة |
5 | Départ | المغادرة |
4.10. Table des Sous-Positions Administratives
Détail des situations spécifiques par position.
code_position | code_sous_position | libelle_francais | libelle_arabe |
1 | 8 | Réintégration et reprise de l'activité | إرجاع إلى حالة مباشرة |
1 | 9 | Mise à la disposition | وضع على الذمة |
1 | 4 | Congé de maladie avec maintien du salaire | عطلة مرض مع الإبقاء على كامل المرتب |
2 | 1 | Détachement auprès d'un Etablissement Public | إلحاق لدى إدارة عمومية |
4.11. Table des Statuts
Liste exhaustive des statuts du personnel (extrait).
Code | Libellé |
0 | En instance de recrutement |
1 | Permanent titulaire plein-temps |
4 | Permanent stagiaire |
7 | Retraité |
9 | Détaché auprès de l'OMMP |
24 | Contrat à durée déterminée |
4.12. Table des Modes de Recrutement
Types de recrutement reconnus.
code_mode_recrutement | libelle_français | libelle_arabe |
1 | PERMANENT | قار / مترسم |
2 | STAGIAIRE | متربص |
3 | OCCASIONNEL | عرضي |
4 | CONTRACTUEL | متعاقد |
5 | TEMPORAIRE | وقتي |
4.13. Table des Oppositions sur Salaire
Codes des retenues sur salaire au profit de la CNRPS.
Code CNR | Libellé Français | Libellé Arabe | Code OMMP |
20 | PRET PERSONNEL | قرض شخصي | 467 |
25 | PRET VEHICULE | قرض سيارة | 473 |
30 | PRET LOGEMENT | قرض سكن | 468 |
91 | PRET UNIVERSITAIRE | قرض جامعى | 528 |
4.14. Table des Natures des Services
Classification des périodes de service pour calcul des droits à retraite.
code nature | Nature des services | نوعية الخدمات |
1 | Services effectifs cotisés | خدمات فعلية تم خلاص المساهمات |
2 | Services validés et cotisés bonifiés | فترات موضوع ضم خدمات قابلة للتنفيل |
16 | services militaires obligatoire | خدمات عسكرية إجبارية |
5. Notes d'Utilisation
1. Validation des codes : Toujours vérifier que le code utilisé existe dans la table correspondante
2. Format : Respecter les tailles de champ et l'alignement (droite pour nombres, gauche pour textes)
3. Valeurs par défaut : Utiliser "0000" ou "00000000" pour les champs non traités
4. Correspondance : Privilégier les codes CNRPS pour la déclaration officielle
5. Complétude : Remplir tous les champs requis, même avec des valeurs par défaut si nécessaire
6. Exemple de Ligne Générée
text
00000030010120241 0000003002 1234567890DUPONT JEAN 01121965M101101202401012024010120241010120241010120241010120240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000