Traducteur : Cranefly Zine : Rafale #8 Voici une nouvelle traduction d'un article de phrack... cette fois-ci plus pour l'interet technique qu'historique. Il s'agit donc d'hijacking radio pour le protocol RDS-TMC, qui tiens au courant des appareils commes les GPS du trafic en temps réel. La traduction a été relue par TboWan, d'arsouyes.org, ce qui leur permet de publier le phrack #64 entièrement traduit en français. Bonne lecture ;) ==Phrack Inc.== Volume 0x0c, Issue 0x40, Phile #0x05 of 0x11 |=-----------------------------------------------------------------------=| |=-----------------=[ Hijacking de signal d'informations ]=--------------=| |=----------------------=[ de trafic RDS-TMC ]=--------------------=| |=-----------------------------------------------------------------------=| |=-----------------------------------------------------------------------=| |=-----------------=[ By Andrea "lcars" Barisani ]=--------------=| |=-----------------=[ ]=--------------=| |=-----------------=[ ]=--------------=| |=-----------------=[ Daniele "danbia" Bianco ]=--------------=| |=-----------------=[ ]=--------------=| |=-----------------------------------------------------------------------=| --[ Contents 1. - Introduction 2. - Motivation 3. - RDS 4. - RDS-TMC 2. - Circuit espion 4. - Simple RDS Decoder v0.1 5. - Liens --[ 1. Introduction Les systèmes Modern Satellite Navigation utilisent un standard récemment développé appelé RDS-TMC (Radio Data System - Traffic Message Channel) pour la réception des informations sur la circulation via des émissions FM. Le protocole permet la communication d'événements liés au trafic comme des accidents et des embouteillages. Si des informations affectent l'itinéraire actuel tracé par l'utilisateur, l'information est utilisée pour calculer et suggérer des déviations et des itinéraires de remplacement. Nous allons montrer ici comment recevoir et décoder des paquets RDS-TMC en utilisant du matériel bon marché fait-maison, le but étant de comprendre le protocole pour que nous puissions finalement montrer à quel point il est simple d'injecter de fausses informations. Nous incluons aussi la première parution de notre "Simple RDS Decoder" (srdsd pour les paresseux) qui, à notre connaissance, est le premier outil open-source disponible qui essaye de décoder complètement les messages RDS-TMC. Il ne se restreint pas au RDS-TMC puisqu'il permet également un décodage basique des messages RDS. La deuxième partie de l'article va couvrir la transmission de messages RDS-TMC et le piratage de "satellite navigator" (SatNav) (NDT[1]) via TMC et son impact pour les attaques de Social Engineering. --[ 2. Motivation RDS a d'abord été utilisé pour afficher les noms des stations de radiodiffusion sur des radios FM et donner des fréquences alternatives, il n'y a pas eu beaucoup d'autres utilités que de la pure recherche et du fun en le détournant pour afficher des messages personnalisés. Cependant, avec la récente introduction de RDS-TMC à travers l'Europe nous assistons à la transmission de données précieuses via FM qui influent activement sur les opérations de SatNav et éventuellement sur le choix de la route du conducteur. De plus, les messages RDS-TMC peuvent être un vecteur d'attaque contre les capacités d'analyse de SatNav. Considérant l'importance grandissante du rôle de ces systèmes dans l'utilisation de la voiture (qui n'est plus strictement limité au traçage d'un itinéraire) et leur interaction humaine, ils représentent une cible intéressante, combiné avec la nature non-authentifiée et non-chiffrée des messages RDS/RDS-TMC. Nous explorerons les aspects de la sécurité dans la Partie II. --[ 3. RDS Le standard "Radio Data System" est largement adopté sur quasiment tous les équipements modernes de radio FM ; 99.9% de tous les modèles de radio FM pour voiture sont aujourd'hui dotés de RDS. Le standard est utilisé pour transmettre des données sur les ondes FM et RDS-TMC est un sous-ensemble du type de messages qu'il peut traiter. Le standard RDS est décrit dans le Standard européen 50067. La donnée la plus reconnaissable transmise via RDS est le nom de la station qui est souvent indiqué sur l'écran de votre radio, d'autres informations incluent des fréquences alternatives pour la station (qui peuvent être essayées quand le signal est perdu), des informations descriptives sur le type du programme, des annonces de trafic (la plupart des radios peuvent être configurées pour interrompre la lecture d'un CD et/ou d'une cassette et passer à la radio quand une annonce sur le trafic est détectée), l'heure et la date et bien d'autres encore, dont les messages TMC. Dans une transmission FM le signal RDS est transmis sur une onde sous-porteuse de 57k dans le but de séparer le canal de données de l'audio Mono et/ou Stéréo. Spectre FM: Mono Pilot Tone Stereo (L-R) RDS Signal ^ ^ ^ ^ ^^ |||||||||| | |||||||||| |||||||||| || |||||||||| | |||||||||| |||||||||| || |||||||||| | |||||||||| |||||||||| || |||||||||| | |||||||||| |||||||||| || |||||||||| | |||||||||| |||||||||| || -------------------------------------------------------------------------- 19k 23k 38k 53k 57k Freq (Hz) Le signal RDS est échantillonné à une fréquence de 1.11875 kHz, ce qui veut dire que le taux de transfert des données est de 1187.5 bits/s (avec un écart maximum de +/- 0.125 bits/s). L'amplitude de l'onde est décodée en une représentation binaire, le flux courant des données sera donc simplement des '1' et '0'. Le plus petit "paquet" RDS est appelé un Block, 4 Blocks représentent un Groupe. Chaque Block a 26 bits d'informations ce qui donne un Groupe de 104 bits de large. Structure d'un Groupe (104 bits): --------------------------------------- | Block 1 | Block 2 | Block 3 | Block 4 | --------------------------------------- Structure d'un Block (26 bits): ------------------- --------------------- | Données (16 bits) | Checkwork (10 bits) | ------------------- --------------------- Le Checkword est un checksum inclu dans chaque Block calculé pour protéger des erreurs; la nature même de la transmission radio analogique introduit de nombreuses erreurs dans les flots de données. L'algorithme utilisé est complètement spécifié dans le standard et ne nous concerne pas pour le moment. Voici une représentation du Groupe RDS le plus basique : Block 1: --------------------- code PI = 16 bits | code PI | Checkword | Checkword = 10 bits --------------------- Block 2: code Group = 4 bits B0 = 1 bit --------------------------------------------------- TP = 1 bit | code Group | B0 | TP | PTY | <5 bits> | Checkword | PTY = 5 bits --------------------------------------------------- Checkword = 10 bits Block 3: --------------------- Données = 16 bits | Données | Checkword | Checkword = 10 bits --------------------- Block 4: --------------------- Données = 16 bits | Données | Checkword | Checkword = 10 bits --------------------- Le code PI est le code "Programme Identification", il identifie la station radio qui transmet le message. Chaque opérateur radio a un code unique qui lui est assigné. Le code Group identifie le type du message transmis puisque le RDS peut être utilisé pour transmettre différents formats de messages. Les types 0A (00000) et 0B (00001) par exemple sont utilisé pour les informations de réglage. Les messages RDS-TMC sont transmis en Groups 8A (10000). En fonction du type de Group, les 5 bits restants du Block 2 et de la partie Données du Block- 3 et Block 4 sont utilisés conformément à la spécification du Group. Le bit 'B0' est le code de la version, '0' pour la version RDS A, '1' pour la version RDS B. Le bit TP pour "Traffic Programme" identifie si la station est capable d'envoyer des annonces de trafic (en combinaison avec le code TA présent dans les messages de type 0A, 0B, 14B, 15B), il n'a rien à voir avec RDS-TMC et renvoie uniquement à des annonces audio sur la circulation. Le code PTY est utilisée pour décrire le "Programme TYpe", par exemple le code 1 (converti en décimal à partir de sa représentation binaire) est 'News' tandis que le code 4 est 'Sport'. --[ 4. RDS-TMC Les paquets "Traffic Message Channel" transportent des informations sur les événements de la circulation, leur emplacement et la durée de l'événement. Un certain nombre de tables de recherche sont utilisée pour mettre en liaison les codes d'événement aux codes de leur description et de leur emplacement pour les coordonnées GPS. Ces tables sont supposées être présentes dans la mémoire de notre SatNav. Le standard RDS-TMC est décris dans l'International Standard (ISO) 14819-1. Tous les systèmes SatNav les plus récents supportent RDS-TMC à différents degrés : certains systèmes nécessitent une antenne externe dans le but de recevoir correctement le signal et les plus modernes intégrés dans les voitures se servent de l'antenne FM utilisée par le système radio. L'interface du SatNav permettent de fournir la liste des messages reçus et d'afficher les déviations pour les événements qui affectent l'itinéraire courant. Les paquets TMC sont transmis comme des Groupes de type 8A (10000) et peuvent être séparés en deux catégories : les messages Single Group et les messages Multi Groups. Les messages "Single Group" ont le bit numéro 13 du Block 2 mis à '1', les messages "Multi Group" ont le bit numéro 13 du Block 2 mis à '0'. Voici un message RDS-TMC Single Group : Block 1: --------------------- code PI = 16 bits | code PI | Checkword | Checkword = 10 bits --------------------- Block 2: code Group = 4 bits B0 = 1 bit ------------------------------------------------------ TP = 1 bit | code Group | B0 | TP | PTY | T | F | DP | Checkword | PTY = 5 bits ------------------------------------------------------ Checkword = 10 bits T = 1 bit DP = 3 bits F = 1 bit Block 3: D = 1 bit PN = 1 bit ------------------------------------- Extent = 3 bits | D | PN | Extent | Event | Checkword | Event = 11 bits ------------------------------------- Checkword = 10 bits Block 4: ---------------------- Location = 16 bits | Location | Checkword | Checkword = 10 bits ---------------------- On peut voir les données habituelles dont nous avons déjà discuté pour RDS ainsi que des nouvelles informations (les <5 bits> vont maintenant être décrits). On a déjà mentionné le bit 'F'; c'est le bit numéro 13 du Block 2 et il identifie le message en tant que Single Group (F = 1) ou Multi Group (F=0). Les bits 'T', 'F' et 'D' sont utilisés dans les messages Multi Group afin d'identifier si il s'agit du premier groupe (TFD = 001), ou d'un groupe ultérieur dans le flux. Le bit 'DP' signifie Durée et Persistance et contient des informations sur la fenêtre de temps de l'événement de façon à ce que le client puisse automatiquement retirer les anciens. Le bit 'D' indique au SatNav si il est nécessaire ou pas d'afficher un conseil de déviation. Le bit 'PN' (Positive/Negative) indique la direction des embouteillages; il est opposé à la direction de la route puisqu'il représente la direction de l'agrandissement de l'embouteillage (ou de tout autre événement de direction). Les données 'Extent' montrent l'extension de l'événement courant, il est mesuré en terme de voisinage d'entrées de la Location Table. La partie 'Event' contient les 11 bits du code Event, qui est récupéré dans la table Event Code locale stockée dans la mémoire du SatNav. La partie 'Location' contient les 16 bits du code Location qui est récupéré dans la base de données Location Table, également stockée sur votre mémoire SatNav. Certains pays autorisent le téléchargement gratuit de la base de données Location Table (comme l'Italie[1]). Les messages Multi Group sont une séquence de deux groupes 8A ou plus et peuvent contenir des informations supplémentaires comme des conseils de limite de vitesse et autres. --[ 5. Circuit espion Sniffer le trafic RDS nécessite essentiellement trois éléments: 1. radio FM avec output MPX 2. Démodulateur de signal RDS 3. Décodeur de protocole RDS Le premier élément est un récepteur radio FM capable de nous donner un signal qui n'a pas encore été démodulé en ses différents composants puisque nous avons besoin d'accéder à la subcarrier RDS (NDT[2]) (et une sortie uniquement audio ne serait pas assez bonne). Cette sorte de signal "brut" est appelée MPX (Multiplex). La manière la plus facile d'avoir un tel signal est d'acheter une carte PCI Video standard qui comporte un tuner (NDT[3]) ayant une broche MPX à laquelle nous pouvons nous accrocher. Un de ces tuners est le Philips FM1216[2] (disponible en différents "parfums" mais ils le font tous) qui fournit la broche 25 dans ce but. Il est relativement facile d'identifier une carte PCI Video qui utilise ce tuner; nous utilisons le WinFast DV2000. Une vaste base de données[3] est disponible. Une fois qu'on a le signal MPX il peut être connecté à un démodulateur de signal RDS qui va lui appliquer la démodulation et nous fournir une donnée qu'on pourra analyser. Notre choix est le ST Microelectronics TDA7330B[4], un contrôleur disponible dans le commerce et utilisé dans la plupart des radios capables de faire de la démodulation RDS. Une autre possibilité pourrait être le Philips SAA6579[5] qui offre la même fonctionnalité que le TDA7330, les pins pouvant différer. Finalement nous utilisons un PIC (Peripheral Interface Controller) personnalisé pour préparer et envoyer les informations générées par le TDA 7330 vers quelque chose que l'on puisse comprendre et utiliser, comme un port série standard. Le PIC amène les DATA, QUAL et CLOCK depuis le démodulateur et "crée" un flux suffisamment bon pour être envoyé au port série. Notre PIC utilise seulement deux broches du port série (RX - RTS); il affiche l'ascii '0' et '1' cadencé à 19200 baud avec un bit de début et deux bits stop, aucun bit de parité n'étant utilisé. Comme vous pouvez le voir le PIC rends notre vie plus facile : afin de voir le flux brut, nous avons seulement à connecter le circuit et rattacher un terminal au port série, aucun driver particulier n'est nécessaire. Le PIC que nous utilisons est un 16F84, ce micro contrôleur est bon marché et facile d'utilisation (son assembleur a seulement 35 instructions) et, en plus, un programmeur pour la configuration de la puce peut facilement être acheté ou assemblé. Si vous voulez construire votre propre programmeur, un bon choix serait le uJDM[6], c'est un des plus simple programmeur PIC disponible (c'est une variation du fameux programmeur JDM). En dernier lieu nous avons besoin de convertir les signaux venant du PIC à des niveaux de signal compatible RS232. Ceci est nécessaire parce que le PIC et autres circuits intégrés travaillent sous TTL (Transistor to Transistor Logic - 0V/+5V), tandis que les niveaux de signal port série sont de -12V/+12V. L'approche la plus facile pour convertir le signal est d'utiliser un Maxim RS-232[7]. C'est un circuit intégré récepteur et driver spécialisé utilisé pour convertir les niveaux logiques TTL en niveaux de signal compatibles RS-232. Voici un diagramme de l'installation : \ / \ / | | | [ RDS - Démodulateur ] | *diagramme* ______________[ ]__ |- || |=- |- || F T |=- |- || M U |=- P |- || 1 N |=- C |- || 2 E |=- I |- || 1 R |=- |- || 6 |=- 1 _______ 20 B | ||________|=- --------> MPX ---> MUXIN -|. U |- u |- | broche 25 -| |- s |- | AF sound output -| T |- |- | -| D |- |- | -| A |- |- | -| 7 |- |- | -| 3 |- QUAL______ |- | -| 3 |- DATA____ | |- | -| 0 |- CLOCK_ | | |___________________| -|_______|- | | V 10 11 | V | _______________________________________________________________V | | | ___________________________________________________________| | | ___|_____________________________________________________________| | | | | | | 1 _______ 18 V | V x -|. u |- -> data out (to rs232)______________ | V | x -| |- -> rts out (to rs232)____________ | | | _| x -| 1 |- <- osc1 / clkin | | | | | MCLR -> -| 6 |- -> OSC2 / CLKOUT | V | | | Vss (gnd) -> -| F |- <- Vdd (+5V) V | | | |_____ DATA -> -| 8 |- x | | | |_______ QUAL -> -| 4 |- x | | |________ CLOCK -> -| |- x | | x -|_______|- x | | 9 10 | | ______________________________ | | Port Série | 1 _______ 16 | | | (connecteur DB9) | -|. U |- ^ | | ______________ | -| |- | | | | RX - broche 2| | -| R |- RTS _| | | ____V________ | | -| S |- V | | . o . . . | | | -| 2 |- | V \ . o . . / | | -| 3 |- <- _____| | --------- |_________|____ <- DATA -| 2 |- <- _______| ^ RTS - broche 7 | -|_______|- |_______________________| 8 9 Ci-bas le code assembleur commenté pour notre PIC: ; ; Copyright 2007 Andrea Barisani ; Daniele Bianco ; ; Permission to use, copy, modify, and distribute this software for any ; purpose with or without fee is hereby granted, provided that the above ; copyright notice and this permission notice appear in all copies. ; ; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ; ; Diagramme broche: ; ; 1 _______ 18 ; x -|. U |- -> DATA out (to RS232) ; x -| |- -> RTS out (to RS232) ; x -| 1 |- <- OSC1 / CLKIN ; MCLR -> -| 6 |- -> OSC2 / CLKOUT ; Vss (gnd) -> -| F |- <- Vdd (+5V) ; DATA -> -| 8 |- x ; QUAL -> -| 4 |- x ; CLOCK -> -| |- x ; x -|_______|- x ; 9 10 ; ; Connection description: ; ; pin 4 : MCLR (il doit être connecté à un Vdd via une résistance ; pour empêcher le reset du PIC - 10K est bien) ; pin 5 : Vss (directement connecté au gnd) ; ; pin 6 : DATA input (directement connecté au démodulateur RDS DATA out) ; pin 7 : QUAL input (directement connecté au démodulateur RDS QUAL out) ; pin 8 : CLOCK input (directement connecté au démodulateur RDS CLOCK out) ; ; pin 14: Vdd (directement connecté au +5V) ; pin 15: OSC2 / CLKOUT (connecté à un oscillateur crystal 2.4576 MHz* ) ; pin 16: OSC1 / CLKIN (connecté à un oscillateur crystal 2.4576 MHz* ) ; ; pin 17: RTS output (RS232 - ''RTS'' broche 7 sur le connecteur DB9** ) ; pin 18: DATA output (RS232 - ''RX'' broche 2 sur le connecteur DB9** ) ; ; pin 1,2,3,9,10,11,12,13: inutilisé ; ; *) ; Nous pouvons connecter l'oscillateur crystal au PIC en utilisant ce simple ; circuit: ; ; C1 (15-33 pF) ; ____||____ ______ OSC1 / CLKIN ; | || | ; | ___ ; gnd ---| = XTAL (2.4576 MHz) ; | --- ; |____||____|______ ; || OSC2 / CLKOUT ; C2 (15-33 pF) ; **) ; Nous devons convertir les signaux TTL <-> RS232 avant de les envoyer/recevoir ; à/depuis le port série ; Configuration du terminal: ; 8-N-2 (8 bits de données - Pas de parité - 2 bits stop) ; ; HARDWARE CONF ----------------------- PROCESSOR 16f84 RADIX DEC INCLUDE "p16f84.inc" ERRORLEVEL -302 ; Supprime les warnings pour bank1 __CONFIG 1111111110001b ; Code Protection disabled ; Power Up Timer enabled ; WatchDog Timer disabled ; Oscillator type XT ; ------------------------------------- ; DEFINE ------------------------------ #define Bank0 bcf STATUS, RP0 ; active bank 0 #define Bank1 bsf STATUS, RP0 ; active bank 1 #define Send_0 bcf PORTA, 1 ; envois 0 à RS232 RX #define Send_1 bsf PORTA, 1 ; envois 1 à RS232 RX #define Skip_if_C btfss STATUS, C ; passe si C FLAG est mis #define RTS PORTA, 0 ; RTS pin RA0 #define RX PORTA, 1 ; RX pin RA1 #define DATA PORTB, 0 ; DATA pin RB0 #define QUAL PORTB, 1 ; QUAL pin RB1 #define CLOCK PORTB, 2 ; CLOCK pin RB2 RS232_data equ 0x0C ; char à transmettre à RS232 BIT_counter equ 0x0D ; n. de bits à transmettre à RS232 RAW_data equ 0x0E ; RAW data (from RDS demodulator) dummy_counter equ 0x0F ; dummy counter utilisé pour les délais ; ------------------------------------- ; BEGIN PROGRAM CODE ------------------ ORG 000h InitPort Bank1 ; sélectionne bank 1 movlw 00000000b ; output RA0-RA4 movwf TRISA ; movlw 00000111b ; input RB0-RB2 / output RB3-RB7 movwf TRISB ; Bank0 ; sélectionne bank 0 movlw 00000010b ; met le voltage à -12V à RS232 ''RX'' movwf PORTA ; Main btfsc CLOCK ; attend de signal clock (high -> low) goto Main ; movfw PORTB ; andlw 00000011b ; lit les niveaux sur PORTB et envois movwf RAW_data ; les données au RS232 call RS232_Tx ; btfss CLOCK ; attente du signal clock (low -> high) goto $-1 ; goto Main RS232_Tx ; RS232 (19200 baud) 8-N-2 ; 1 start+8 données+2 stop - Sans parité btfsc RAW_data,1 goto Good_qual goto Bad_qual Good_qual ; movlw 00000001b ; andwf RAW_data,w ; signal de bonne qualité iorlw '0' ; envoi '0' ou '1' au RS232 movwf RS232_data ; goto Char_Tx Bad_qual ; movlw 00000001b ; andwf RAW_data,w ; signal de mauvaise qualité iorlw '*' ; envoi '*' ou '+' au RS232 movwf RS232_data ; Char_Tx movlw 9 ; (8 bits à transmettre) movwf BIT_counter ; BIT_counter = n. bits + 1 call StartBit ; envoi un bit start Send_loop decfsz BIT_counter, f ; envoi tous les bits de données goto Send_data_bit ; contenus dans RS232_data call StopBit ; envoi 2 bits stop et reviens au Main Send_1 goto Delay16 StartBit Send_0 nop nop goto Delay16 StopBit nop nop nop nop nop Send_1 call Delay8 goto Delay16 Send_0_ Send_0 goto Delay16 Send_1_ nop Send_1 goto Delay16 Send_data_bit rrf RS232_data, f ; le résultat de la rotation est Skip_if_C ; enregistré dans C FLAG, donc passe si goto Send_zero ; il est mis call Send_1_ goto Send_loop Send_zero call Send_0_ goto Send_loop ; ; 4 / clock = ''normal'' période d'instruction (1 cycle machine ) ; 8 / clock = ''branch'' période d'instruction (2 cycles machine) ; ; clock normal instr. branch instr. ; 2.4576 MHz 1.6276 us 3.2552 us ; Delay16 movlw 2 ; dummy cycle, movwf dummy_counter ; utilisé seulement pour avoir des ; délais corrects pour le timing. decfsz dummy_counter,f ; goto $-1 ; Délai total: 8 cycles machines nop ; ( 1 + 1 + 1 + 2 + 2 + 1 = 8 ) Delay8 movlw 2 ; dummy cycle, movwf dummy_counter ; utilisé seulement pour avoir des ; délais corrects pour le timing. decfsz dummy_counter,f ; goto $-1 ; Délai total: 7 cycles machine ; ( 1 + 1 + 1 + 2 + 2 = 7 ) Delay1 nop RETURN ; point de retour unique END ; END PROGRAM CODE -------------------- En utilisant le circuit que nous avons assemblé, on peut "sniffer" le trafic RDS directement sur le port série en utilisant un écran, un minicom ou n'importe quel terminal que vous voulez. Vous devez configurer votre terminal avant de le brancher au port série, les paramètres étant 19200 baud, 8 bits de données, 2 bits stop, pas de parité. # stty -F /dev/ttyS0 19200 cs8 cstopb -parenb speed 19200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2; -parenb -parodd cs8 -hupcl cstopb cread clocal crtscts -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke # screen /dev/ttyS0 19200 1010100100001100000000101000*000101001+11101111011111111110000001011011100 10101001++000001100101100*110100101001000011000000111010000100101001111111 0011101100010011000100000+000000000 ... Comme vous pouvez le voir, nous avons des '0' et des '1' ainsi que des '*' et des '+', et ce parce que le circuit estime la qualité du signal. '*' et '+' sont des données '0' et '1' de mauvaise qualité. Nous ignorons les mauvaises données et acceptons seulement celles de bonne qualité. Les données de mauvaise qualité devraient être ignorées, et si vous voyez un nombre important de '*' et de '+' dans votre flot de données, vérifiez les paramètres du tuner. Dans le but d'identifier le début d'un message RDS et trouver le bon offset, on se "bloque" sur le code PI qui est présent au début de chaque groupe RDS. Les codes PI de chaque station radio FM sont disponibles publiquement sur Internet, si vous connaissez ma fréquence que vous écoutez alors vous pouvez en déduire le code PI et le chercher. Si vous n'avez aucune indication sur ce que pourrait être le code PI, une manière de la découvrir est de chercher la chaîne de 16 bits la plus récurrente et ce sera probablement le code PI. Voici un seul RDS Group brut avec le PI 5401 (conversion hexadécimale de 101010000000001): 01010100000000011111011001000001000010100011001011000000001000010100000011001001010010010000010001101110 Séparons les différentes sections : 0101010000000001 1111011001 0000 01 0 0001 01000 1100101100 0000001000010100 0000110010 0101001001000001 0001101110 code PI Checkword Group B0 TP PTY <5 bits> Checkword Données Checkword Données Checkword Nous pouvons donc isoler et identifier les messages RDS; maintenant vous pouvez soit les analyser visuellement en lisant les specs (ce qui n'est pas une façon très évolutive, pourrait-on dire) ou utiliser un outil comme notre Simple RDS Decoder. --[ 10. Simple RDS Decoder 0.1 Cet outil analyse les messages RDS basiques et de groupe 0A (le décodages de plus de groupes sera implémenté dans les versions futures) et effectue un décodage complet des messages RDS-TMC Single Group (le support Multi Group est aussi prévu dans les prochaines releases). Voici l'utilisation de base : # ./srdsd -h Simple RDS-TMC Decoder 0.1 || http://dev.inversepath.com/rds Copyright 2007 Andrea Barisani || Usage: ./srdsd.pl [-h|-H|-P|-t] [-d ] [-p ] -t display only tmc packets -H HTML output (outputs to /tmp/rds-*.html) -p PI number -P PI search -d location db path -h this help Note: L'option -d attends qu'on lui donne un code DAT Location Table selon le standard TMCF-LT-EF-MFF-v06 (2005/05/11) Comme nous l'avons mentionné, la première étape consiste à trouver le PI de votre flux RDS. Si vous ne le connaissez pas encore, vous pouvez utiliser l'option '-P' : # ./srdsd -P rds_dump.raw | tail 0010000110000000: 4140 (2180) 1000011000000001: 4146 (8601) 0001100000000101: 4158 (1805) 1001000011000000: 4160 (90c0) 0000110000000010: 4163 (0c02) 0110000000010100: 4163 (6014) 0011000000001010: 4164 (300a) 0100100001100000: 4167 (4860) 1010010000110000: 4172 (a430) 0101001000011000: 4185 (5218) Ici 5218 semble être un candidat raisonnable puisque c'est la chaîne la plus fréquente. Essayons-la : # ./srdsd -p 5218 -d ~/loc_db/ rds_dump.raw Reading TMC Location Table at ~/loc_db/: parsing NAMES: 13135 entries parsing ROADS: 1011 entries parsing SEGMENTS: 15 entries parsing POINTS: 12501 entries done. Got RDS message (frame 1) Programme Identification: 0101001000011000 (5218) Group type code/version: 0000/0 (0A - Tuning) Traffic Program: 1 Programme Type: 01001 (9 - Varied Speech) Block 2: 01110 Block 3: 1111100000010110 Block 4: 0011000000110010 Decoded 0A group: Traffic Announcement: 0 Music Speech switch: 0 Decoder Identification control: 110 (Artificial Head / PS char 5,6) Alternative Frequencies: 11111000, 00010110 (112.3, 89.7) Programme Service name: 0011000000110010 (02) Collected PSN: 02 ... Got RDS message (frame 76) Programme Identification: 0101001000011000 (5218) Group type code/version: 1000/0 (8A - TMC) Traffic Program: 1 Programme Type: 01001 (9 - Varied Speech) Block 2: 01000 Block 3: 0101100001110011 Block 4: 0000110000001100 Decoded 8A group: Bit X4: 0 (User message) Bit X3: 1 (Single-group message) Duration and Persistence: 000 (no explicit duration given) Diversion advice: 0 Direction: 1 (-) Extent: 011 (3) Event: 00001110011 (115 - slow traffic (with average speeds Q)) Location: 0000110000001100 (3084) Decoded Location: Location code type: POINT Name ID: 11013 (Sv. Grande Raccordo Anulare) Road code: 266 (Roma-Ss16) GPS: 41.98449 N 12.49321 E Link: http://maps.google.com/maps?ll=41.98449,12.49321&spn=0.3,0.3&q=41.98449,12.49321 ...etc. La variable 'Collected PSN' contient tous les caractères du "Programme Service Name" vus jusqu'à présent, de cette manière on peut tracer le nom de la station (comme Radio FM RDS le fait) : # ./srdsd -p 5201 rds_dump.raw | grep "Collected PSN" | head Collected PSN: DI Collected PSN: DIO1 Collected PSN: DIO1 Collected PSN: RADIO1 Collected PSN: RADIO1 Utiliser '-H' permet d'envoyer le résultat html'isé dans /tmp (ce qui peut être utile pour suivre directement les liens Google Map). Nous avons aussi une version qui note tout le trafic sur Google Map en utilisant leur API ; si vous êtes intéressé il suffit de nous envoyer un email. Have fun. --[ I. Références [1] - Italian RDS-TMC Location Table Database https://www2.ilportaledellautomobilista.it/info/infofree?idUser=1&idBody=14 [2] - Philips FM1216 DataSheet http://pvr.sourceforge.net/FM1216.pdf [3] - PVR Hardware Database http://pvrhw.goldfish.org [4] - SGS-Thompson Microelectronics TDA7330 http://www.datasheetcatalog.com/datasheets_pdf/T/D/A/7/TDA7330.shtml [5] - Philips SAA6579 http://www.datasheetcatalog.com/datasheets_pdf/S/A/A/6/SAA6579.shtml [6] - uJDM PIC Programmer http://www.semis.demon.co.uk/uJDM/uJDMmain.htm [7] - Maxim RS-232 http://www.maxim-ic.com/getds.cfm?qv_pk=1798&ln=en [8] - Xcircuit http://xcircuit.ece.jhu.edu --[ II. Code Le code est aussi disponible sur http://dev.inversepath.com/rds/ <++> Simple RDS Decoder 0.1 - srdsd.uue begin 644 srdsd M(R$O=7-R+V)I;B]P97)L"B,*(R!3:6UP;&4@4D13+51-0R!$96-O9&5R(#`N M,0HC"B,@5&AI0HC('!U M2`E;W!TR=T)WTL("=(=&UL)R`]/B!<)&]P='-[)T@G?2P@)U!) MR=H)WTI.PII9B`H)&]P='-[)V@G?2!OR!U2`H)&9I;F1022P@)$9(+"`D2`H)7!O:6YT+"`E;F%M92P@)7)O860L("5S96=M96YT+"`E8VAAR=P)WTI M('Q\("(P,3`Q,#`Q,#`P,#`P,#`Q(CL@(R!2861I;S$*;7D@)&1IPH@("`@)&1I3X\<')E/B(["GT*"G=H:6QE*"%E;V8H1DE,12DI('L* M("`@(')E860H1DE,12PD9FEN9%!)+#$V+#`I.PH*("`@(&EF("@D9FEN9%!) M(#T]("1022D@>PH@("`@("`@("1I;F1E>"LK.PH@("`@("`@(')E860H1DE, M12PD3X\+VAT;6P^(CL*("`@(&-L;W-E($E.1$58.PI]"@IS=6(@<&%RS$P M?2DH6S`Q77LT?2DH6S`Q77LQ?2DH6S`Q77LQ?2DH6S`Q77LU?2DH6S`Q77LU M?2DH6S`Q77LQ,'TI*%LP,5U[,39]*2A;,#%=>S$P?2DH6S`Q77LQ-GTI*%LP M,5U[,3!]*2\["B`@("`*("`@(&UY("@DR=()WTI('L@"B`@("`@("`@;W!E;B@D1D@L("(^)&1I#PO83X@+2!023H@(B`N(&)I M;C)H97@H)%!)*2`N("(@1U)0.B`D1U)0+R1615(@(B`N('!A7!E.B`D4%19(B`N("(@*"(@+B!P87)S95]P M='DH)%!462D@+B`B*2(@+B`B7&XB+`H@("`@("`@("`@("`@(")<=$)L;V-K M(#(Z("1B,EQN(BP*("`@("`@("`@("`@("`B7'1";&]C:R`S.B`D8C-<;B(L M"B`@("`@("`@("`@("`@(EQT0FQO8VL@-#H@)&(T7&XB.PH*("`@(&EF("AP M87)S95]GR`*("`@("`@("!P3XB(&EF("@D M;W!T2`D8VAAR`D4%-.6S%=(#T@(B1C:&%R,21C:&%R,B([('T*("`@ M(&EF("@H)$,Q("X@)$,P*2!E<2`B,#`B*2![("104TY;,%T@/2`B)&-H87(Q M)&-H87(R(CL@?0H@"B`@("!P2`D8VAAR`*("`@("`@("!I M9B`H)&-H87(I('L@<')I;G0@)$9(("1C:&%R.R!]"B`@("!]"B`@("!PS%]*2A;,#%= M>S%]*2A;,#%=>S-]*2\["B`@("!M>2`H)$0L("103BP@)$5X=&5N="P@)$5V M96YT*2`]("1?6S%=(#U^("\H6S`Q77LQ?2DH6S`Q77LQ?2DH6S`Q77LS?2DH M6S`Q77LQ,7TI+SL*("`@(&UY("@D3&]C871I;VXI("`@("`@("`@("`@("`@ M(#T@)%];,ET@/7X@+RA;,#%=>S$V?2DO.PH*("`@('!R:6YT("1&2"`B7'1< M=$)I="!8-#H@)%0@*"(@+B!P87)S95]4*"14*2`N("(I7&XB.PH@("`@<')I M;G0@)$9((")<=%QT0FET(%@S.B`D1B`H(B`N('!A'1E;G0Z("1%>'1E;G0@*"(@+B!B:6XR9&5C*"1%>'1E;G0I("X@(BE<;B(L M"B`@("`@("`@("`@("`@("`@("`@("`B7'1<=$5V96YT.B`D179E;G0@*"(@ M+B!B:6XR9&5C*"1%=F5N="D@+B`B("T@(B`N('!AS1]*5LP,5U[,C1]+SL*"B`@("`@("`@("`@('!R:6YT("1& M2"`B("T@PH@ M("`@;7D@)&-H87(@/2`D8VAAPH@("`@PH@("`@ MPH@("`@PH@("`@2!["B`@("!R971U7LB)%];,%TB?2!\?"`B=6YK M;F]W;B(["GT@("`@"@IS=6(@<&%RR(D7ULP72)]('Q\(")U;FMN;W=N(CL*?0H*R=D)WTI('L*("`@("`@("!PR1C;V1E?2D@>PH@("`@("`@(&UY("1X("`@("`@(#T@)'!O M:6YT>R1C;V1E?7LG6$-/3U)$)WT["B`@("`@("`@;7D@)'D@("`@("`@/2`D M<&]I;G1[)&-O9&5]>R=90T]/4D0G?3L*("`@("`@("!M>2`D;FED("`@("`] M("1P;VEN='LD8V]D97U[)TXQ240G?3L@"B`@("`@("`@;7D@)')O860@("`@ M/2`D<&]I;G1[)&-O9&5]>R=23T%?3$-$)WT["B`@("`@("`@;7D@)'-E9VUE M;G0@/2`D<&]I;G1[)&-O9&5]>R=314=?3$-$)WT["@H@("`@("`@('!R:6YT M("1&2"`B7'1<=%QT3&]C871I;VX@8V]D92!T>7!E.B!03TE.5%QN(CL*("`@ M("`@("!PR1N M:61]*5QN(B`@("`@("`@("`@("`@("`@("`@("`@("!I9B`D;FED.PH@("`@ M("`@('!R:6YT("1&2"`B7'1<=%QT4F]A9"!C;V1E.B`DR=.04U%)WTI7&XB("`@("`@("`@("`@(&EF("1R;V%D.PH@("`@ M("`@('!R:6YT("1&2"`B7'1<=%QT4V5G;65N="!C;V1E.B`DR=.04U%)WTI7&XB(&EF("1S96=M96YT.PH@ M("`@("`@(&EF("@D>2`F)B`D>"D@>PH@("`@("`@("`@("!P"!%7&XB.PH@("`@("`@("`@("!I9B`H)&]P M='-[)T@G?2D@>PH@("`@("`@("`@("`@("`@<')I;G0@)$9((")<=%QT7'0\ M82!H2`N("(L(B`N("1X("X@(B9S<&X],"XS+#`N,R9Q/2(@+B`D>2`N("(L(B`N M("1X("X@(EPB/DUA<"!,:6YK/"]A/EQN(CL*("`@("`@("`@("`@?2!E;'-E M('L*("`@("`@("`@("`@<')I;G0@)$9((")<=%QT7'1,:6YK.B!H='1P.B\O M;6%PR=03TQ?3$-$)WU]>R=80T]/4D0G?3L*("`@("`@("!M>2`D>2`@("`@("`] M("1P;VEN='LDR=.,4E$)WT["B`@ M("`@("`@;7D@)&XR:60@("`@/2`D2`D;F%M92`@("`]("1R;V%D>R1C;V1E?7LG3D%-12=].PH@("`@ M("`@(&UY("1R;V%D("`@(#T@)'!O:6YT>R1C;V1E?7LG4D]!7TQ#1"=].PH@ M("`@("`@(&UY("1S96=M96YT(#T@)'!O:6YT>R1C;V1E?7LG4T5'7TQ#1"=] M.PH*("`@("`@("!PR1R;V%D?7LG3D%-12=]*5QN M(B`@("`@("`@("`@("`@:68@)')O860["B`@("`@("`@<')I;G0@)$9((")< M=%QT7'1396=M96YT(&-O9&4Z("1S96=M96YT("@D"!%7&XB.PH@("`@("`@("`@("!I9B`H)&]P='-[)T@G?2D@>PH@("`@ M("`@("`@("`@("`@<')I;G0@)$9((")<=%QT7'0\82!H2`N("(L(B`N("1X("X@ M(B9S<&X],"XS+#`N,R9Q/2(@+B`D>2`N("(L(B`N("1X("X@(EPB/DUA<"!, M:6YK/"]A/EQN(CL*("`@("`@("`@("`@?2!E;'-E('L*("`@("`@("`@("`@ M<')I;G0@)$9((")<=%QT7'1,:6YK.B!H='1P.B\O;6%PR=03TQ?3$-$ M)WU]>R=80T]/4D0G?3L*("`@("`@("!M>2`D>2`@("`@("`]("1P;VEN='LD MR=.,4E$)WT["B`@("`@ M("`@;7D@)&XR:60@("`@/2`D2`D;F%M92`@("`]("1S96=M96YT>R1C;V1E?7LG3D%-12=].PH@ M("`@("`@(&UY("1R;V%D("`@(#T@)'!O:6YT>R1C;V1E?7LG4D]!7TQ#1"=] M.PH@("`@("`@(&UY("1S96=M96YT(#T@)'!O:6YT>R1C;V1E?7LG4T5'7TQ# M1"=].PH@("`@("`@(&UY("1P;VEN="`@(#T@)'!O:6YT>R1C;V1E?7LG4$], M7TQ#1"=].PH*("`@("`@("!PR=.04U% M)WTI7&XB("`@("`@("`@("`@(&EF("1R;V%D.PH@("`@("`@('!R:6YT("1& M2"`B7'1<=%QT4V5G;65N="!C;V1E.B`DR=.04U%)WTI7&XB(&EF("1S96=M96YT.PH@("`@("`@(&EF("@D M>2`F)B`D>"D@>PH@("`@("`@("`@("!I9B`H)&]P='-[)T@G?2D@>PH@("`@ M("`@("`@("`@("`@<')I;G0@(EQT7'1<=$QI;FLZ(#QA(&AR968]7")H='1P M.B\O;6%PPH* M("`@(&UY("1C;W5N="`](#`["B`@("!M>2`D=&%B;&5?<&%T:"`]("1?6S!= M.PH@("`@<')I;G0@(E)E861I;F<@5$U#($QO8V%T:6]N(%1A8FQE(&%T("1T M86)L95]P871H.EQN(CL*"B`@("!O<&5N*%!/24Y44RP@("`B/"1T86)L95]P M871H+U!/24Y44RYD870B*2`@(&]R(&1I92`B0V]U;&0@;F]T(&]P96X@)'1A M8FQE7W!A=&@O4$])3E13+F1A=#H@)"%<;B(["B`@("!O<&5N*$Y!3453+"`@ M("`B/"1T86)L95]P871H+TY!3453+F1A="(I("`@(&]R(&1I92`B0V]U;&0@ M;F]T(&]P96X@)'1A8FQE7W!A=&@O3D%-15,N9&%T.B`D(5QN(CL*("`@(&]P M96XH4D]!1%,L("`@("(\)'1A8FQE7W!A=&@O4D]!1%,N9&%T(BD@("`@;W(@ M9&EE(")#;W5L9"!N;W0@;W!E;B`D=&%B;&5?<&%T:"]23T%$4RYD870Z("0A M7&XB.PH@("`@;W!E;BA314=-14Y44RP@(CPD=&%B;&5?<&%T:"]314=-14Y4 M4RYD870B*2!OPH@("`@("`@(&YE>'0@=6YL M97-S("]>6S`M.5TO.PH*("`@("`@("!M>2!`;&EN92`]('-P;&ET("@O.R\L M("1?*3L*("`@("`@("!M>2`H)$-)1"P@)$Q)1"P@)$Y)1"P@)$Y!344L("1. M0T]-345.5"D@/2!`;&EN93L*("`@(`H@("`@("`@("1N86UE>R1.241](#T@ M)$Y!344[(`H@("`@("`@("1C;W5N="LK.PH@("`@?0H@("`@<')I;G0@(B1C M;W5N="!E;G1R:65S7&XB.R`D8V]U;G0@/2`P.PH*("`@('!R:6YT(")<="!P M87)S:6YG(%)/0413.B`B.PH@("`@=VAI;&4@*#Q23T%$4SXI('L*("`@("`@ M("!N97AT('5N;&5SR1,0T1]>R=.,4E$)WT@("`@("`@/2`D3C%) M1#L*("`@("`@("`DR1,0T1]>R=.04U%)WT@("`@("`@/2`D;F%M97LD M3C%)1'T@+B`B+2(@+B`D;F%M97LD3C))1'T["B`@("`@("`@)&-O=6YT*RL[ M"B`@("!]"B`@("!PPH@("`@("`@(&YE>'0@=6YL97-S("]>6S`M M.5TO.PH*("`@("`@("!M>2!`;&EN92`]('-P;&ET("@O.R\L("1?*3L*("`@ M("`@("!M>2`H)$-)1"P@)%1!0D,L("1,0T0L("1#3$%34RP@)%1#1"P@)%-4 M0T0L("123T%$3E5-0D52+"`D4DY)1"P@)$XQ240L("1.,DE$+"`D4D]!7TQ# M1"P@)%-%1U],0T0L("103TQ?3$-$*2`]($!L:6YE.PH@("`@"B`@("`@("`@ M)'-E9VUE;G1[)$Q#1'U[)U)/041.54U"15(G?2`]("123T%$3E5-0D52.PH@ M("`@("`@("1S96=M96YT>R1,0T1]>R=.,4E$)WT@("`@("`@/2`D3C%)1#L* M("`@("`@("`DR1,0T1]>R=314=?3$-$)WT@("`@/2`D M4T5'7TQ#1#L*("`@("`@("`DR1.,4E$?2`N("(M(B`N("1N86UE>R1.,DE$?3L*("`@ M("`@("`D8V]U;G0K*SL*("`@('T*("`@('!R:6YT("(D8V]U;G0@96YT2`D>"`]("@D6$-/3U)$+S$P,#`P,"D["B`@("`@ M("`@;7D@)'D@/2`H)%E#3T]21"\Q,#`P,#`I.PH*("`@("`@("`D<&]I;G1[ M)$Q#1'U[)UA#3T]21"=]("`@/2`D>#L*("`@("`@("`D<&]I;G1[)$Q#1'U[ M)UE#3T]21"=]("`@/2`D>3L*("`@("`@("`D<&]I;G1[)$Q#1'U[)U).240G M?2`@("`@/2`D4DY)1#L*("`@("`@("`D<&]I;G1[)$Q#1'U[)TXQ240G?2`@ M("`@/2`D3C%)1#L*("`@("`@("`D<&]I;G1[)$Q#1'U[)U)/05],0T0G?2`@ M/2`D4D]!7TQ#1#L*("`@("`@("`D<&]I;G1[)$Q#1'U[)U-%1U],0T0G?2`@ M/2`D4T5'7TQ#1#L*("`@("`@("`D8V]U;G0K*SL*("`@('T*("`@('!R:6YT M("(D8V]U;G0@96YT"!["B`@("!R971U#)B:6X@>PH@ M("`@2`D2`E:&%S:#L*("`@(&UY("1I(#T@,#L*"B`@("!O<&5N*$9)3$4L M("(\)$%21U9;,%TB*3L*"B`@("!W:&EL92@A96]F*$9)3$4I*2!["B`@("`@ M("`@2`D:V5Y("AS;W)T('L@)&AA2D@+B(I7&XB.R`*("`@ M('T*?0H*RRR

RRRRRR

RRRRRRRRRRRRRRRRRRRRRRRR2!TW-O;65T:&EN9R!T:&%T(&1O M97,@;F]T(&YE8V-E2!B;&]C:R!T:&4@2!T2!M=6-H(&AE879I97(@=&AA;B!N M;W)M86P@*'=I=&@@879E2!L;W)R*'DO:65S*2(["B`@("`D179E;G1;,C$S M72`@/2`B*%$I('9E:&EC;&4@9FER92AS*2(["B`@("`D179E;G1;,C$T72`@ M/2`B*%$I(&EN8VED96YT*',I(CL*("`@("1%=F5N=%LR,35=("`]("(H42D@ M86-C:61E;G0H2!T7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LR-#E=("`](")A M8V-I9&5N="X@3&]N9R!D96QA>7,@*%$I(CL*("`@("1%=F5N=%LR-3!=("`] M(")V96AI8VQE7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LR-S==("`](")V96AI8VQE M2!T2!T2!T2!T7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LS M,3)=("`](")S:&5D(&QO860N($QO;F<@9&5L87ES("A1*2(["B`@("`D179E M;G1;,S$S72`@/2`B*%$I(&)R;VME;B!D;W=N('9E:&EC;&4H'!E8W1E9"(["B`@("`D179E;G1;,S,R M72`@/2`B8G)O:V5N(&1O=VX@=F5H:6-L92X@3&]N9R!D96QA>7,@*%$I(CL* M("`@("1%=F5N=%LS,S-=("`](")A8V-I9&5N="!C;&5A2]I97,I(CL*("`@("1%=F5N=%LS,SE=("`]("(H42D@:F%C M:VMN:69E9"!T2!T7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N M=%LS-S==("`](")O=F5R='5R;F5D('9E:&EC;&4N($QO;F<@9&5L87ES("A1 M*2(["B`@("`D179E;G1;,S2!T7,@*%$I(&1U92!T;R!E87)L:65R M(&%C8VED96YT(CL*("`@("1%=F5N=%LS.3%=("`](")A8V-I9&5N="!I;G9E M2!A8V-I9&5N="AS*2X@1&%N9V5R(CL*("`@("1%=F5N M=%LS.3-=("`]("(H42D@8G)O:V5N(&1O=VX@=F5H:6-L92AS*2X@1&%N9V5R M(CL*("`@("1%=F5N=%LS.31=("`]("(H42D@8G)O:V5N(&1O=VX@:&5A=GD@ M;&]R2!T2!T2!T2!T2(["B`@("`D179E;G1;-#,T72`@/2`B8VQO M'!E8W1E9"([ M"B`@("`D179E;G1;-#,W72`@/2`B8VQO'!E8W1E9"(["B`@("`D M179E;G1;-#4Y72`@/2`B8FQO8VME9"!A:&5A9"X@2&5A=GD@=')A9F9I8R([ M"B`@("`D179E;G1;-#8P72`@/2`B8FQO8VME9"!A:&5A9"X@2&5A=GD@=')A M9F9I8R!E>'!E8W1E9"(["B`@("`D179E;G1;-#8Q72`@/2`B8FQO8VME9"!A M:&5A9"X@5')A9F9I8R!F;&]W:6YG(&9R965L>2(["B`@("`D179E;G1;-#8R M72`@/2`B8FQO8VME9"!A:&5A9"X@5')A9F9I8R!B=6EL9&EN9R!U<"(["B`@ M("`D179E;G1;-#8S72`@/2`B8FQO8VME9"!A:&5A9"X@1&5L87ES("A1*2([ M"B`@("`D179E;G1;-#8T72`@/2`B8FQO8VME9"!A:&5A9"X@1&5L87ES("A1 M*2!E>'!E8W1E9"(["B`@("`D179E;G1;-#8U72`@/2`B8FQO8VME9"!A:&5A M9"X@3&]N9R!D96QA>7,@*%$I(CL*("`@("1%=F5N=%LT-C9=("`](")S;&EP M(')O861S(')E;W!E;F5D(CL*("`@("1%=F5N=%LT-C==("`](")R96]P96YE M9"(["B`@("`D179E;G1;-#8X72`@/2`B;65S2!S;&EP(')O860@8FQO8VME9"(["B`@("`D M179E;G1;-#2!B;&]C:V5D(CL*("`@("1%=F5N=%LT.#E= M("`](")E>'!R97-S(&QA;F5S(&)L;V-K960B.PH@("`@)$5V96YT6S0Y,%T@ M(#T@(G1H2!R961U8V5D("AF'!E8W1E9"(["B`@("`D179E;G1;-30R72`@ M/2`B*%$I(&QA;F5S(&-L;W-E9"X@2&5A=GD@=')A9F9I8R(["B`@("`D179E M;G1;-30S72`@/2`B*%$I(&QA;F5S(&-L;W-E9"X@2&5A=GD@=')A9F9I8R!E M>'!E8W1E9"(["B`@("`D179E;G1;-30T72`@/2`B*%$I;&%N97,@8VQO2!R961U8V5D M("AF'!E8W1E9"([ M"B`@("`D179E;G1;-34R72`@/2`B8V%R'!E8W1E9"(["B`@ M("`D179E;G1;-34T72`@/2`B8V%R2([ M"B`@("`D179E;G1;-34U72`@/2`B8V%R2!T2!R961U8V5D M("AF'!E8W1E9"(["B`@("`D179E;G1;-38T72`@/2`B8V%R2!R961U8V5D("AF2!R961U8V5D("AF2!T2!T2!T'!E8W1E9"(["B`@("`D179E;G1;-3DW72`@/2`B8V]N=')A9FQO M=RX@2&5A=GD@=')A9F9I8R(["B`@("`D179E;G1;-3DX72`@/2`B8V]N=')A M9FQO=RX@2&5A=GD@=')A9F9I8R!E>'!E8W1E9"(["B`@("`D179E;G1;-3DY M72`@/2`B8V]N=')A9FQO=RX@5')A9F9I8R!F;&]W:6YG(&9R965L>2(["B`@ M("`D179E;G1;-C`P72`@/2`B8V]N=')A9FQO=RX@5')A9F9I8R!B=6EL9&EN M9R!U<"(["B`@("`D179E;G1;-C`Q72`@/2`B8V]N=')A9FQO=RX@0V%R2!T'!E8W1E9"(["B`@("`D179E;G1;-C$P72`@/2`B;F%R2!T2(["B`@ M("`D179E;G1;-C$S72`@/2`B;F%R'!E8W1E9"(["B`@("`D179E;G1;-C(P72`@/2`B8V]N=')A9FQO M=R!W:71H(&YA'!E8W1E9"(["B`@("`D179E;G1;-C(R72`@/2`B8V]N M=')A9FQO=R!W:71H(&YA2(["B`@("`D179E;G1;-C(S72`@/2`B8V]N=')A9FQO=R!W:71H(&YA M7,@2!T2!T M2!R961U8V5D("AF2!R961U8V5D("AF7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LW-#E=("`] M(")R;V%D=V]R:W,N($QO;F<@9&5L87ES("A1*2(["B`@("`D179E;G1;-S4P M72`@/2`B*%$@2!T2!R961U8V5D("AF2!R M961U8V5D("AF6]U M="(["B`@("`D179E;G1;.#$Q72`@/2`B;F5W(')O860@;&%Y;W5T(CL*("`@ M("1%=F5N=%LX,3)=("`]("(H42!S971S(&]F*2!R;V%D=V]R:W,N(%-T871I M;VYA2!T:6UE(CL*("`@("1%=F5N=%LX,C)=("`] M("(H42!S971S(&]F*2!R97-U2!T M'!E8W1E9"(["B`@ M("`D179E;G1;.#,Q72`@/2`B*%$@2!T2(["B`@("`D179E M;G1;.#,T72`@/2`B*%$@'!E8W1E9"(["B`@("`D179E;G1; M.#0R72`@/2`B=V%T97(@;6%I;B!W;W)K+B!,;VYG(&1E;&%Y7,@*%$I(CL*("`@("1%=F5N=%LX M-#==("`](")W;W)K(&]N(&)U7,@*%$I(CL*("`@("1%=F5N=%LX-#E=("`](")W M;W)K(&]N(&)U6]U="!U;F-H86YG960B M.PH@("`@)$5V96YT6S@U-ET@(#T@(F-O;G-T2![ M2(["B`@("`D179E;G1;.3(S72`@/2`B86YI;6%L2!S M=&]R;2!D86UA9V4B.PH@("`@)$5V96YT6SDR-ET@(#T@(F)L;V-K960@8GD@ M*%$I(&9A;&QE;B!T2!T2!T2(["B`@("`D179E;G1;.3,W72`@/2`B9FQO;V1I;F7,@*%$I(CL*("`@("1%=F5N=%LY-#!=("`](")F;&]O9&EN M9RX@1&5L87ES("A1*2!E>'!E8W1E9"(["B`@("`D179E;G1;.30Q72`@/2`B M9FQO;V1I;F2!R961U8V5D("AF2!R961U8V5D("AF7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LY-C1= M("`](")G87,@;&5A:RX@3&]N9R!D96QA>7,@*%$I(CL*("`@("1%=F5N=%LY M-C5=("`](")C;&]S960@9'5E('1O('-E7,@*%$I(CL*("`@("1% M=F5N=%LY-C==("`](")S97)I;W5S(&9I7,@*%$I(CL*("`@("1%=F5N=%LY-CE=("`](")C;&]S960@9F]R(&-L M96%R86YC92!W;W)K(CL*("`@("1%=F5N=%LY-S!=("`](")R;V%D(&9R964@ M86=A:6XB.PH@("`@)$5V96YT6SDW,5T@(#T@(FUEF%R9&]UFEN9R!R86EN("AA8F]V92!1(&AU;F1R960@;65T2!R;V%D("AA8F]V92!1(&AU;F1R960@;65T2!R961U8V5D("AF7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LQ,#(Y72`](")S M97=E7,@*%$I(CL*("`@("1%=F5N=%LQ M,#,P72`](")S97=E'1R96UE;'D@ M:&%Z87)D;W5S(&1R:79I;F<@8V]N9&ET:6]N2!D=64@ M=&\@;&]O2!P871C:&5S("AA8F]V92!1(&AU;F1R960@;65T M2!P871C:&5S("AA8F]V M92!1(&AU;F1R960@;65TF%R9&]U'1R96UE(&AE870@*'5P('1O(%$I(CL*("`@("1%=F5N M=%LQ,#@Q72`](")E>'1R96UE(&-O;&0@*&]F(%$I(CL*("`@("1%=F5N=%LQ M,#@R72`](")L97-S(&5X=')E;64@=&5M<&5R871U2!S;F]W9F%L;"`H42DN(%9I2!R86EN("A1*2(["B`@("`D179E;G1;,3$Q,%T@/2`B:&5A=GD@ MF%R9"`H=FES:6)I;&ET M>2!R961U8V5D('1O(%$I(CL*("`@("1%=F5N=%LQ,3,R72`](")D86UA9VEN M9R!H86EL("AV:7-I8FEL:71Y(')E9'5C960@=&\@42DB.PH@("`@)$5V96YT M6S$Q,S1=(#T@(FAE879Y('-N;W=F86QL+B!6:7-I8FEL:71Y(')E9'5C960@ M*'1O(%$I(CL*("`@("1%=F5N=%LQ,3,U72`](")S;F]W9F%L;"X@5FES:6)I M;&ET>2!R961U8V5D("AT;R!1*2(["B`@("`D179E;G1;,3$S-ET@/2`B:&5A M=GD@2!R961U8V5D("AT;R!1*2(["B`@("`D179E M;G1;,3$S-UT@/2`B2!R961U8V5D("AT;R!1*2([ M"B`@("`D179E;G1;,3$W,%T@/2`B:&5A=GD@2!R86EN("A1*2!E>'!E M8W1E9"(["B`@("`D179E;G1;,3$W,ET@/2`B=V5A=&AE'!E8W1E9"!T M;R!I;7!R;W9E(CL*("`@("1%=F5N=%LQ,3F%R9"`H=VET M:"!V:7-I8FEL:71Y(')E9'5C960@=&\@42D@97AP96-T960B.PH@("`@)$5V M96YT6S$Q-S1=(#T@(F1A;6%G:6YG(&AA:6P@*'=I=&@@=FES:6)I;&ET>2!R M961U8V5D('1O(%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LQ,3FEN9R!F;V<@97AP96-T960@*'=I=&@@=FES:6)I M;&ET>2!R961U8V5D('1O(%$I+B!$86YG97(@;V8@2!F;V<@*'=I=&@@=FES:6)I;&ET>2!R961U8V5D('1O(%$I M(&5X<&5C=&5D(CL*("`@("1%=F5N=%LQ,3&AA=7-T('!O;&QU=&EO;B(["B`@("`D179E;G1;,3(P,5T@/2`B=&]R M;F%D;V5S(CL*("`@("1%=F5N=%LQ,C`R72`](")H=7)R:6-A;F4@9F]R8V4@ M=VEN9',@*%$I(CL*("`@("1%=F5N=%LQ,C`S72`](")G86QE2!R961U8V5D('1O(#QM(CL*("`@("1% M=F5N=%LQ,S`T72`](")F;V<@*'9I2!F;V<@*'9IF%R9"`H=FES:6)I;&ET>2!R961U8V5D M('1O(%$I(CL*("`@("1%=F5N=%LQ,S$P72`](")B;&]W:6YG(&1U2!R961U8V5D("AT;R!1*2(["B`@("`D M179E;G1;,3,Q.5T@/2`B=FES:6)I;&ET>2!R961U8V5D('1O(#QM(CL*("`@ M("1%=F5N=%LQ,S(P72`](")V:7-I8FEL:71Y(')E9'5C960@=&\@/&TB.PH@ M("`@)$5V96YT6S$S,C%=(#T@(G9I2!R961U8V5D('1O(%$I(CL*("`@("1%=F5N=%LQ,S(T M72`](")S<')A>2!H87IA2!R961U8V5D('1O M(%$I(CL*("`@("1%=F5N=%LQ,S,R72`](")S;6]G(&%L97)T(CL*("`@("1% M=F5N=%LQ,S,W72`](")FFEN9R!F;V<@*'9I2!R M961U8V5D('1O(%$I(CL*("`@("1%=F5N=%LQ,S0U72`](")F;V<@8VQE87)I M;F2([ M"B`@("`D179E;G1;,30W,UT@/2`B8VAI;&1R96X@;VX@2(["B`@ M("`D179E;G1;,30W-%T@/2`B8WEC;&ES=',@;VX@2(["B`@("`D M179E;G1;,30W-5T@/2`B2!I;F-I9&5N="(["B`@("`D179E;G1;,30W-UT@/2`B<&]L:6-E M(&-H96-K<&]I;G0B.PH@("`@)$5V96YT6S$T-SA=(#T@(G1E2(["B`@("`D179E;G1;,30X,5T@/2`B86ER(')A:60L(&1A;F=E2X@ M1&%N9V5R(CL*("`@("1%=F5N=%LQ-#@T72`](")C>6-L:7-T7,@*%$I(CL*("`@("1%=F5N=%LQ-#@W M72`](")S96-U2!I;F-I9&5N="X@1&5L87ES("A1*2!E>'!E8W1E9"([ M"B`@("`D179E;G1;,30X.%T@/2`B7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N M=%LQ-#DQ72`](")P;VQI8V4@8VAE8VMP;VEN="X@3&]N9R!D96QA>7,@*%$I M(CL*("`@("1%=F5N=%LQ-#DR72`](")S96-U2!A;&5R="!W:71H9')A M=VXB.PH@("`@)$5V96YT6S$T.3-=(#T@(G-P;W)T&AI8FET:6]N(CL*("`@("1%=F5N=%LQ M-3`V72`](")F86ER(CL*("`@("1%=F5N=%LQ-3`W72`](")M87)K970B.PH@ M("`@)$5V96YT6S$U,#A=(#T@(F-E2!A;&5R M="(["B`@("`D179E;G1;,34Q-ET@/2`B8F]M8B!A;&5R="(["B`@("`D179E M;G1;,34Q-UT@/2`B;6%J;W(@979E;G0N(%-T871I;VYA7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LQ-3,P72`](")M86IO M7,@*%$I(CL*("`@("1%=F5N=%LQ-3,Q72`] M(")S<&]R=',@;65E=&EN9RX@4W1A=&EO;F%R>2!T2!T'!E8W1E9"(["B`@ M("`D179E;G1;,34S.5T@/2`B'!E8W1E9"(["B`@("`D179E M;G1;,34U,5T@/2`B9F%I'!E8W1E9"(["B`@("`D M179E;G1;,34U,UT@/2`B9F%I2([ M"B`@("`D179E;G1;,34U-%T@/2`B9F%I7,@*%$I(CL*("`@("1% M=F5N=%LQ-34W72`](")F86ER+B!$96QA>7,@*%$I(&5X<&5C=&5D(CL*("`@ M("1%=F5N=%LQ-34X72`](")F86ER+B!,;VYG(&1E;&%Y'!E8W1E9"(["B`@("`D M179E;G1;,34V,ET@/2`B<&%R861E+B!,;VYG(&1E;&%Y'!E8W1E9"(["B`@("`D M179E;G1;,34V-ET@/2`B'!E8W1E9"(["B`@("`D179E;G1;,34W,%T@/2`B9&5M;VYS=')A M=&EO;BX@3&]N9R!D96QA>7,@*%$I(CL*("`@("1%=F5N=%LQ-32!A;&5R="X@4W1A=&EO;F%R>2!T2!A;&5R="X@1&%N9V5R(&]F('-T871I;VYA M2!T2!A;&5R="X@2&5A=GD@=')A9F9I8R!E>'!E8W1E9"(["B`@("`D M179E;G1;,34W.5T@/2`B7,@*%$I(CL*("`@("1%=F5N=%LQ-3@R72`](")S96-U2!A;&5R="X@1&5L87ES("A1*2!E>'!E8W1E9"(["B`@("`D179E;G1;,34X M,UT@/2`B7,@=7`@=&\@;VYE(&AO=7(B.PH@("`@)$5V96YT6S$V,#5=(#T@(F1E;&%Y M7,@*%$I(&5X<&5C=&5D(CL*("`@("1%=F5N=%LQ-C`X72`](")L;VYG(&1E M;&%Y7,@ M=7`@=&\@;6EN=71E2!L M;W)R*'DO:65S*2(["B`@("`D179E;G1;,38Q,ET@/2`B9&5L87ES('5P('1O M(&]N92!H;W5R(&9O2!L;W)R*'DO:65S*2(["B`@("`D179E;G1; M,38Q,UT@/2`B9&5L87ES('5P('1O('1W;R!H;W5R2!L;W)R*'DO:65S*2(["B`@("`D179E;G1; M,38Q-5T@/2`B2!V96AI8VQE7,@ M=7`@=&\@;6EN=71E7,@=7`@=&\@ M;6EN=71E7,@=7`@=&\@;6EN=71E M7,@=7`@=&\@9F]U7,@ M*%$I(CL*("`@("1%=F5N=%LQ-C,R72`](")D96QA>7,@;V8@=6YC97)T86EN M(&1U65D('5N=&EL M(&9U2]I97,I(CL*("`@("1%=F5N=%LQ-C0S72`](")D96QA>7,@*%$I M(&9O2!L;W)R*'DO:65S*2(["B`@("`D M179E;G1;,38T-5T@/2`B*%$I('-E2!L;W)R*'DO:65S*2(["B`@("`D179E;G1;,38T-UT@ M/2`B;F5X="!D97!A'!E8W1E9"(["B`@("`D179E;G1;,38U,UT@/2`B;&]N M9R!D96QA>7,@97AP96-T960B.PH@("`@)$5V96YT6S$V-31=(#T@(G9E7,@97AP96-T960B.PH@("`@)$5V96YT6S$V-35=(#T@(F%L M;"!S97)V:6-E2!B;V]K960@*'5N=&EL(%$I(CL*("`@("1%=F5N M=%LQ-C4V72`](")N97AT(&%R2!S97)V:6-E(&YO="!O<&5R871I;F<@*'5N=&EL M(%$I(CL*("`@("1%=F5N=%LQ-C8R72`](")P87)K(&%N9"!R:61E('1R:7`@ M=&EM92`H42DB.PH@("`@)$5V96YT6S$V-C-=(#T@(F1E;&%Y(&5X<&5C=&5D M('1O(&)E(&-L96%R960B.PH@("`@)$5V96YT6S$V.35=(#T@(F-U6EN9R!V96AI8VQE*',I+"!D86YG97(B.PH@("`@)$5V M96YT6S$W,S9=(#T@(BA1*2!V96AI8VQE*',I(&-AF%R9&]U M2AS*2P@9&%N9V5R(CL*("`@("1%=F5N=%LQ-S,X72`]("(H42D@ M;6EL:71A2AS*2(["B`@("`D179E;G1;,3'!E8W1E9"(["B`@("`D179E;G1;,37,@*%$I(CL*("`@("1%=F5N=%LQ-S4Y M72`](")C;VYV;WD@8V%U7,@*%$I(CL*("`@("1%=F5N=%LQ M-S8P72`](")C;VYV;WDN($1E;&%Y2!C875S:6YG(&QO;F<@9&5L87ES("A1*2([ M"B`@("`D179E;G1;,3F%R9&]U2!C;VYV;WDH6EN9R!H87IA2!C;&5A2!T M96QE<&AO;F4@;G5M8F5R(&YO="!W;W)K:6YG(CL*("`@("1%=F5N=%LQ.#`T M72`]("(H42!S971S(&]F*2!T2(["B`@("`D179E;G1;,3@P-ET@/2`B M;&5V96P@8W)O7,@*%$I(CL*("`@("1%=F5N=%LQ.#(P72`](")L979E;"!C2(["B`@("`D179E M;G1;,3@S-UT@/2`B;65S2(["B`@("`D179E;G1;,3@T-5T@/2`B*%$@2(["B`@("`D179E;G1;,3@T-UT@ M/2`B=')A9F9I8R!S:6=N86P@8V]N=')O;"!C;VUP=71E2!T96QE<&AO;F5S(&]U="!O9B!O2P@=V%I="!F;W(@<&]L:6-E('!A=')O;"(["B`@("`D179E M;G1;,3@V-UT@/2`B*%$@2X@1&5L87ES("A1*2(["B`@("`D M179E;G1;,3@V.5T@/2`B=')A9F9I8R!L:6=H=',@=V]R:VEN9R!I;F-O2X@1&5L87ES("A1*2!E>'!E8W1E9"(["B`@("`D179E;G1;,3@W,%T@ M/2`B=')A9F9I8R!L:6=H=',@=V]R:VEN9R!I;F-O2X@3&]N9R!D M96QA>7,@*%$I(CL*("`@("1%=F5N=%LQ.#2!G2!T2!L96YG=&@@;&EM:70@*%$I(CL*("`@("1%=F5N=%LQ.#@R72`](")T M96UP;W)A2!A;F]T:&5R(%1-0R!S97)V:6-E(CL*("`@("1%=F5N=%LQ.3,T72`] M(")N;R!P87)K(&%N9"!R:61E(&EN9F]R;6%T:6]N(&%V86EL86)L92`H=6YT M:6P@42DB.PH@("`@)$5V96YT6S$Y,SA=(#T@(G!A2!V96AI8VQE2!V96AI8VQE(&QA;F4B.PH@("`@)$5V96YT M6S$Y-SA=(#T@(FAE879Y('9E:&EC;&4@;&%N92!A=F%I;&%B;&4@9F]R(&%L M;"!V96AI8VQEVYO="!V86QI9"!F;W(@;&]R MR7LG,#`P,#`G?2`]("(P("`M($YO;F4B.R`@("`@("`@("`@("`@)'!T M>7LG,#`P,#$G?2`]("(Q("`M($YE=W,B.PH@("`@)'!T>7LG,#`P,3`G?2`] M("(R("`M($-U7LG,#`P,3$G?2`]("(S M("`M($EN9F]R;6%T:6]N(CL*("`@("1P='E[)S`P,3`P)WT@/2`B-"`@+2!3 M<&]R="([("`@("`@("`@("`@("1P='E[)S`P,3`Q)WT@/2`B-2`@+2!%9'5C M871I;VXB.PH@("`@)'!T>7LG,#`Q,3`G?2`]("(V("`M($1R86UA(CL@("`@ M("`@("`@("`@)'!T>7LG,#`Q,3$G?2`]("(W("`M($-U;'1U7LG,#$P,#`G?2`]("(X("`M(%-C:65N8V4B.R`@("`@("`@("`@)'!T M>7LG,#$P,#$G?2`]("(Y("`M(%9A7LG M,#$P,3`G?2`]("(Q,"`M(%!O<"!-=7-I8R([("`@("`@("`@)'!T>7LG,#$P M,3$G?2`]("(Q,2`M(%)O8VL@375S:6,B.PH@("`@)'!T>7LG,#$Q,#`G?2`] M("(Q,B`M($5A7LG,#$Q,#$G?2`]("(Q M,R`M($QI9VAT($-L87-S:6-A;"(["B`@("`D<'1Y>RR7LG,3`P,#`G?2`]("(Q-B`M(%=E871H M97(@)B!-971R(CL@("`@)'!T>7LG,3`P,#$G?2`]("(Q-R`M($9I;F%N8V4B M.PH@("`@)'!T>7LG,3`P,3`G?2`]("(Q."`M($-H:6QD7LG,3`P,3$G?2`]("(Q.2`M(%-O8VEA;"!!9F9A:7)S(CL*("`@ M("1P='E[)S$P,3`P)WT@/2`B,C`@+2!296QI9VEO;B([("`@("`@("`@("1P M='E[)S$P,3`Q)WT@/2`B,C$@+2!0:&]N92!);B(["B`@("`D<'1Y>RRRB!-=7-I8R([("`@("`@("`D<'1Y>R2!-=7-I8R(["B`@("`D<'1Y>RR2(["B`@ M("`D<'1Y>RRRR'0B.R`@("`D9W)P>RRRRRRRRRR2!T;6,@<&%C:V5T RDS_Demodulator.ps.gz.uue begin 644 RDS_Demodulator.ps.gz M'XL("+9@]44``U)$4U]$96UO9'5L871O1W9(L2,["D(6^OX2);[)-T9ZQ`,`OZKO=NMQMOJ@?SEB2XD\0^0E;A2&, M7M3YW;;8==\7Q;I87Q9M?=?DB'I3[SKV35'=%UV99[VOLR_J:LT`_9/^P.OK MJOSUKN"7WY;;HIU=UMMLQR]UQ4B?KE;G]=;7+E%'HM-N7O3U%6]\8Z] M8\;>U&UWE3?EOF-[N@SX#:OONOU=QVZ:>LL>F[+IB MQZX_H!#LR_5O6;-N63I?S%?1;+:OM M"Z3R]K9@?ZEO=RW[IMZ_+^'SAUUYC\QV']A)L`)28*^8YKY"Y*_+K_^5O=SE MI^P$!V;[IFA!12^0*:XD::$SY#=OBPX\Y>7E.7Y!Z9E/_+=W^WW=="C6NK@I M=R4Z3@-R'CSKMYO MLX[!JRD?6'[7-,"<^(83O#E:N:TR,/4CFW.@>,AO<93]5\!\QJ\AY/\W\QC\ MHW'@<4T>0M^VV?N"OJWO]JPJ=IL.*)1YQ^8[^I`D"?\1J`%V\<#F7[V\8+L" MKO!I$8R`\U0,G>8)+N_K/;V>6'E35*"&)W2KK*J($$H3%_RN`FQD M!M4#@H'$P!3"Q:^LO:U_NZFR#:P&W]#+'MF&E(9DA9;V=0D4A0+!;$)KH`:V MK6'OU"P44G#BOY5K$!J9/?GY!=*YR9#A_#9K]AF,P(+HH`3CV_5U_<`VX"X0 M/0JN($06JD$"[=TU+ER!=)RXFF2Q&+&9T%JV7DO>?"30("I\`0;K]X4<0ETR MH:;Z[U,3O1_6U9B"(BUCU]P]6T>>]$&D-5@4M-^C.J!D$9"^.$W;"C66KDK? M$-G0/F+Y/?4CIL,";?>C4JNE36"#N!,U?KV#-DRQ[P=`I3C(F(+1D#.'T'CCY M=B=GW^)L0($?<67?[G.80G!^`URS%M(ICXS@V?3YQ*[!W?D+?:X*H#&7 MJRJ;(:-SP;BI*!A[`F0Y'PEH12&6X8^UMY19==%I6)9 MUV0[*!VZPLR82(0OC)J:-W5WGU6Z.#B:_W+7&O4'?8O2F'*/#SN,/O2,A)NJ: M7)S406^X7$1J"!I.P=$9\SP9=)G_T^>3CC`'WO*.;>'8ZM M(!R"AN:JY/"%0]Q@3*/`1DOP325V+`5E7Z0JQQX&=+6]N46(+W+BO-Y_8&+K MV-;CU[(.3D# MD0C[14"2\IJ.P`$FUZ1MR]W,A3'HK:-I(5! MH-NJN"\J2B@,:@](M[2]`LX[80);NI:PSF'FB\=@X8;]#`),;*KZ.D,N%$-B MK-S=U)+#_A@W9:[2B)0@OW]@J!PVOX"M>44G:JK%\+S=W925D7&P-E4I M!YU"&%]G'T4-SM*;HE\F0Z&38\4)A)O-=5Y75*+)1,?`JCD>60$^IS%=W2*> MF1+SRX(<8J[F"N_C1".[S*;`2'C7V#C8(,^&+^%A5U<+=+RFH$F3CXX1,[N# M$+W/FFP+!?I43$`M=RW$N[Q8*^2Y=!4'/ M.KC)Q+8RU5CLUEP9;,`61B1:1R72H56X%;PCM`Z0PI=!W9NK'<%;)MM]QCL? MONQZ<,_,8+.D$*J1?DSB6'`B,1B`,!78F(* MZAIK4Y;>L!706+.;G-VD[&8U!?7F!E?"M?E/1#\W0U2V'.PF"$/[K*36ECA@ M5^6>$Z98H.HRE4#1'RG[(!!#8L2T"2=W_E7FU)"7#S)5T5Y*Z8"6%V6%83NE M'"4)$#I'`EH'T73RGJ5L(;]XV#@3G1/.XT*<,.]XP063Y?"CT6(1W0HU59.` M^"?/G_C>C^]&5#2.@$77=A^J`@Y2GFK_Z)X)LF\U4>8TV^S_\0M&#;*K02%Y M5;>%K'3T+#\TB_]0TLZSO37/+&`&/,7JQ!3:'N(CN776VFN:"V*Q,4+O`"T1 M][@4Y@%$>.:&?Q#O]W7U85/O5%28 M[^ZV^M`I,Q-PWIK+F05E-QR#N2>QF](E`'*;%.0;T.96P#M')K!3&Q+13SR)\4`&D((02+ M`W'VA(^R(^(0039>7--VPWGMGHINQ8TP!NB)/H?+@RFYZOM6,F6D.H']&M"QV#^*['+[_`:8(E)$_9%4U5P@=5$#[5A*(.5'TZJ+>* M!N_P0&GXYJJ^_D7=LN''$.PI`CZ_Y#"XO<TS_DW<U6<8L1"MBF:]EMT12GGKSW=E5T=WO8 M\3_3O<,R#WV(J)]^.K\/V,F_O6"??<94I>U1K\]GLS#&-S_E4)Q`$C<^:21F M(H1X)^$+4)N^Z9J#BO"6+E/4(,Y'BU"'84)TT/KR%-_8XT3P*G/!$SG2&& M_"V/J6,&MS'0X!HCFH"!)M<8;JOW,$#3&F,Q`0.-KC'<=K"!Y<&"/#)4;'-@G0P,&;FW9&*:3P)$: ML-BK'WZ:O_Q^PJY$+_Y=P]C39WH7K]CKJ_/YZQ_>3D'3H2+P"6\27$%V4L](62'/OFLS3#ZH7U_ M/U*Y-X?E(';<"=U[P\*P8AMWJ0.;L)?01A:QIFO7&Y/-'88M3ON;^$#B=80* M=QRV,:QP%!S(OOV(Q_5W(*7TW?WRXOP[-B*-C:2=_O("$NN(/#:.WL7_\++3QQPH\1""T$B\[!0 MW)@*9H%@;!8+(300C#$V2Q5V$,K)"DK'E##C,A.T3"2>AF*'RM6(FJSP%4DW M4BJ1`V%?!;@8E`)+#4B52!TY$7"<*UGH7)C`.9F6YT84-I4V=D]?7&TGN++G5Y-YSZR<2R_M\%?5I;6/1(?KI"&JDZ(*RB"!__`*T8:63];KUVD04#13K3BAC/[TX- M!-W@4VZ_)ZE+&D,)^!(?P_$`=G&<,/$Q'(>=F*!CX+L>'9%6G/0N>YTO7']^3.GA=_R$O*A05>'T$+\J;#VV'M^<] M5PL,6*#2@5&"%.\S*R\JP1#YX0+V*S MQ?(P*5Z8*'T%-D5;MJ/ADSP[DC;`+1%H8J<;0M_.P.[S,; MO.S5^7>7S^WROFM;]E>L`/[ZXIG=7G;Q^=O/IS5EC*XOP]/C-"Q]XGSS$ELS M7Z7VF7.L_4M'@8_:_PW"],\&\/^O!O"D1I"-,:$/9"-,:`/9?:,)7:#G-YA[ MW=\)'6;;0Z9TF&TOG-)A=K0#G]E:9N??O3[_=F+75\>*25TS8_J$?IDQ>T*G M3`<[!J=("*Z?+/[Z8DJ[S`BNHDT^I8%M1'/>))_2PS;2!KM\>T5K3>AE&\F) M7?Y$6!-:V@>;ML^^64/^=*"+W;N),!:T)W2VATL?NE=D+VTE@"@TFYZJ#3IH MFUBA,$G-IJ=J@XXU9U2+TVAZJC;H6`M(M3B-IJ=J@XXUFE2+TVAZJC;H6#M+ M-3EUUU-V0<=:9K++J;N>L@LZTI)3+4ZCZ:G:H&--/]7@-'N>N@\ZVEP4`[H- MJ1J38PU3R8+J0\J^Y%AC5L@I&Y&B+3G2^I5JE(U(T98<:RU+0ZD^I.Q+CK6O MI3NH/J3L2XXUR:73J3YDK(FX^Y'"M54?4O8EQQK^<@.I/J3L2X[?5B#EF?=U M+2"VS#96[4]+V">T)-WRNX)Q3UO8)[0E'?*[@G%/5_N."^ MQ,<_V)321F]BK!T1:4+-;3S.,:'D-A^RF%!S&Y%.E+.3;E`;\71*J6U$ZRE% MMA&QS&B1Q+K0,#]Q(#[4@GOV09@\X;F/Z3SG!/6LFG[\^(U\*G;^?$S`0/HG M?$S@S]OI_RRWT_FSS.+A9/ZGG\Y80'_[">'735GL.OJS46?L3=UT359VWGR_ ML?ZX#SW_3?L8V^3B@6PO/$UH-YN_@[-8+=`;4PCF^G4`"$8K(*WN,T/U^.8GYNX, M`0WIVHL(S1^LS%!%"T7H1YABUG4'%=L2*H"O#M$*T:]]JY7!V8L7P/7*)Q/Q MNY=:(>BPT1(80(E./CFT1HS^L@I5ZG,P=;+M/=>`3T<.IR46732)%ZU4^I*W MQA8^)$!2+8"^`(=WT!;`$Q=13O-=-]I@%5].(U/VIEEFQC'4?L_,*6C`,#/( MMCML&7B/ELO$*1P2%%PC.,8.CBEVU-4EF(^NFDX@2"HTAR)H.40VZ#BF*46X MITE60HA^40Q)5]QH-?P8A*81>0?1X)20,!YS<.$V&8TA&0G&`Y.ME&F1AC9. M;Q`QC4'ETK@[%B1C$-D@#@E=(3BX'RS&T/D$A@EBYN34(^LAL<#<_%&MO'%XB4C#`52L)8N!""D4.&#B(67866>!J#Q`O\"4$TIM($PYFPV6&E$,]0 MS?C]N$M!DB<53+0&R%&&#ZN1&BD<1*D,!XYGVF@:!AM@E\)*J-A`7Q7("`[# M@4#&:0*9@R@V.?H0@Q_YD'ENOQZR"X/6)PRL.BP0#R*:)/_M1,/>>@Z9GD03 M\H2FSF:JA/*1D65LI`5!3(R@\W`P=3X7P\>25:)`*Z3-E/>&*[0B$M'>VQ]% MW&'T#U.,!(@)8##*"9^6)&J:BQ-?#BX/1S[U/`J@X,Z%0E9%OM-XL1P-8B8B M/GZY#&40Z^D=!4$F>I>1<;-@T.(<4(`4;!8FZ"(&B!M,F_\90J?+?KC2K(/5 MEH<<(U'3;',HB2FI8(*UJGWU((RF%U&4Q"(C4K6:`(D9S==PWPKD(%3(&B06 M-;?Q@$6M0:J_#\>T,%F*;=L+]"I(CP=Z-:\J"DTPI@851[9/Z*K*P,`-P2;I522X\N`J*L9Q%:D/KE*Q M/)R+NL$D9\_%336\FJ:.JVA#?=4\.\8+*KQ);A-,9(D5+Z@RQO)+@@LU@4Z? MA+?4<6Q?[L#/+Q_P;S`=+$3!LG&B6[R(N\3G%@XB(C]QK)N\4TK>.-&5J[,I M/.@*&`C.MG#_*!['NJAV]DFM%=!?XD&5%:_08V+:R2:(7H"-9S@\H>D1E+6& M#%*X@>(D3/F=4<-.HPVM)+D[$CWT;Q`0QK))H;.GT0#Z&T6.B!T:^;>Z#_L$S M8ZHCX$$$GW9]&O=+1TI%7.^ACA'4QO67H?.`0O-0068^X80H=$1!8H.TH<&C M?1.D$`O'-_!!`_1XD-/Q+AUXC0Z`(@T:(!T&W>E>N",W3>IJAPJ3AI8%'<<5 M38..*].:N8=ZN1%V?[QXI0XF'XDNU58>2?5QZ<;$[^)C\QL%40!T4_]C\^O# M" RDS_Demodulator.ps.gz.uue |=[ EOF ]=---------------------------------------------------------------=| Notes du traducteur (CraneFly pour le zine Rafale #8) : Note Générale : Vous aurez peut-être remarqué un petit problème au niveau du sommaire... en tant que traducteur, je ne peux rien y faire ;) NDT[1] : SatNav, traduisible par "récepteur de navigation par satellite" dans la marine, j'ai préféré laisser comme tel dans ce contexte. NDT[2] : subcarrier, traduisible par "sous-porteuse" ou "onde sous-porteuse", mais également utilisé tel quel. http://fr.wikipedia.org/wiki/Sous-porteuse NDT[3] : tuner, également utilisé comme tel, est néanmoins traduisible par "syntoniseur". http://fr.wikipedia.org/wiki/Tuner