2020-12-30

Creating Local FCC Database From Version 5 Data

 

This is a followup to this post, required because the FCC has changed the format of their files from version 4 to version 5.

The contents of the eight FCC files are now (as described in the version 5 document):

Amateur
[AM] -- unchanged from version 4
1   Record Type [AM]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   EBF Number                  varchar(30)
5   Call Sign                   char(10)
6   Operator Class              char(1)
7   Group Code                  char(1)
8   Region Code                 tinyint
9   Trustee Call Sign           char(10)
10  Trustee Indicator           char(1)
11  Physician Certification     char(1)
12  VE Signature                char(1)
13  Systematic Call Sign Change char(1)
14  Vanity Call Sign Change     char(1)
15  Vanity Relationship         char(12)
16  Previous Call Sign          char(10)
17  Previous Operator Class     char(1)
18  Trustee Name                varchar(50)

Comments
[CO] -- unchanged from version 4
1   Record Type [CO]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   Call Sign                   char(10)
5   Comment Date                mm/dd/yyyy
6   Description                 varchar(255)
7   Status Code                 char(1)
8   Status Date                 mm/dd/yyyy

Entity
[EN]
1   Record Type [EN]                char(2)
2   Unique System Identifier        numeric(9,0)
3   ULS File Number                 char(14)
4   EBF Number                      varchar(30)
5   Call Sign                       char(10)
6   Entity Type                     char(2)
7   Licensee ID                     char(9)
8   Entity Name                     varchar(200)
9   First Name                      varchar(20)
10  MI                              char(1)
11  Last Name                       varchar(20)
12  Suffix                          char(3)
13  Phone                           char(10)
14  Fax                             char(10)
15  Email                           varchar(50)
16  Street Address                  varchar(60)
17  City                            varchar(20)
18  State                           char(2)
19  Zip Code                        char(9)
20  PO Box                          varchar(20)
21  Attention Line                  varchar(35)
22  SGIN                            char(3)
23  FCC Registration Number (FRN)   char(10)
24  Applicant Type Code             char(1)
25  Applicant Type Code Other       char(40)
26  Status Code                     char(1)
27  Status Date                     mm/dd/yyyy
28  3.7 GHz License Type            char(1)
29  Linked Unique System Identifier numeric(9,0)
30  Linked Call Sign                 char(10)
 
Application/License Header -- unchanged from version 4
[HD]
1   Record Type [HD]                            char(2)
2   Unique System Identifier                    numeric(9,0)
3   ULS File Number                             char(14)
4   EBF Number                                  varchar(30)
5   Call Sign                                   char(10)
6   License Status                              char(1)
7   Radio Service Code                          char(2)
8   Grant Date                                  mm/dd/yyyy
9   Expired Date                                mm/dd/yyyy
10  Cancellation Date                           mm/dd/yyyy
11  Eligibility Rule Num                        char(10)
12  Reserved                                    char(1)
13  Alien                                       char(1)
14  Alien Government                            char(1)
15  Alien Corporation                           char(1)
16  Alien Officer                               char(1)
17  Alien Control                               char(1)
18  Revoked                                     char(1)
19  Convicted                                   char(1)
20  Adjudged                                    char(1)
21  Reserved                                    char(1)
22  Common Carrier                              char(1)
23  Non Common Carrier                          char(1)
24  Private Comm                                char(1)
25  Fixed                                       char(1)
26  Mobile                                      char(1)
27  Radiolocation                               char(1)
28  Satellite                                   char(1)
29  Developmental or STA or Demonstration       char(1)
30  InterconnectedService                       char(1)
31  Certifier First Name                        varchar(20)
32  Certifier MI                                char(1)
33  Certifier Last Name                         varchar(20)
34  Certifier Suffix                            char(3)
35  Certifier Title                             char(40)
36  Female                                      char(1)
37  Black or African-American                   char(1)
38  Native American                             char(1)
39  Hawaiian                                    char(1)
40  Asian                                       char(1)
41  White                                       char(1)
42  Hispanic                                    char(1)
43  Effective Date                              mm/dd/yyyy
44  Last Action Date                            mm/dd/yyyy
45  Auction ID                                  integer
46  Broadcast Services - Regulatory Status      char(1)
47  Band Manager - Regulatory Status            char(1)
48  Broadcast Services - Type of Radio Service  char(1)
49  Alien Ruling                                char(1)
50  Licensee Name Change                        char(1)
51  Whitespace Indicator                        char(1)
52  Operation/Performance Requirement Choice    char(1)
53  Operation/Performance Requirement Answer    char(1)
54  Discontinuation of Service                  char(1)
55  Regulatory Compliance                       char(1)

History
[HS] -- unchanged from version 4
1   Record Type [HS]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   Call Sign                   char(10)
5   Log Date                    mm/dd/yyyy
6   Code                        char(6)

License Attachment
[LA] -- unchanged from version 4
1   Record Type [LA]            char(2)
2   Unique System Identifier    numeric(9,0)
3   Call Sign                   char(10)
4   Attachment Code             char(1)
5   Attachment Description      varchar(60)
6   Attachment Date             mm/dd/yyyy
7   Attachment File Name        varchar(60)
8   Action Performed            char(1)

Special Condition
[SC] -- unchanged from version 4
1   Record Type [SC]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   EBF Number                  varchar(30)
5   Call Sign                   char(10)
6   Special Condition Type      char(1)
7   Special Condition Code      int
8   Status Code                 char(1)
9   Status Date                 mm/dd/yyyy

License Free Form Special Condition
Position Data Element Definition
[SF] -- unchanged from version 4
1   Record Type [SF]                    char(2)
2   Unique System Identifier            numeric(9,0)
3   ULS File Number                     char(14)
4   EBF Number                          varchar(30)
5   Call Sign                           char(10)
6   License Free Form Type              char(1)
7   Unique License Free Form Identifier numeric(9,0)
8   Sequence Number                     integer
9   License Free Form Condition         varchar(255)
10  Status Code                         char(1)
11  Status Date                         mm/dd/yyyy
The following extract from the code that creates the output database maps these on a one-to-one basis to internal identifiers (the four new fields in the [HD] records don't seem to be important -- at least for now -- so there is no change in the output as compared to the processing of version 3 files, although the new fields are processed):

[AM]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
OPERATOR_CLASS,
GROUP_CODE,
REGION_CODE,
TRUSTEE_CALLSIGN,
TRUSTEE_INDICATOR,
PHYSICIAN_CERTIFICATION,
VE_SIGNATURE,
SYSTEMATIC_CALLSIGN_CHANGE,
VANITY_CALLSIGN_CHANGE,
VANITY_RELATIONSHIP,
PREVIOUS_CALLSIGN,
PREVIOUS_OPERATOR_CLASS,
TRUSTEE_NAME
 [CO]
RECORD_TYPE,
ID,
ULS_NUMBER,
CALLSIGN,
COMMENT_DATE,
DESCRIPTION,
STATUS_CODE,
STATUS_DATE
 [EN]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
ENTITY_TYPE,
LICENSE_ID,
ENTITY_NAME,
FIRST_NAME,
MIDDLE_INITIAL,
LAST_NAME,
SUFFIX,
PHONE,
FAX,
EMAIL,
STREET_ADDRESS,
CITY,
STATE,
ZIP_CODE,
PO_BOX,
ATTENTION_LINE,
SGIN,
FRN,
APPLICANT_TYPE_CODE,
APPLICANT_TYPE_CODE_OTHER,
STATUS_CODE,
LICENSE_TYPE_37,
LINKED_ID,
LINKED_CALLSIGN,
 
  [HD]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
LICENSE_STATUS,
RADIO_SERVICE_CODE,
GRANT_DATE,
EXPIRED_DATE,
CANCELLATION_DATE,
ELIGIBILITY_RULE_NUM,
RESERVED_1,
ALIEN,
ALIEN_GOVERNMENT,
ALIEN_CORPORATION,
ALIEN_OFFICER,
ALIEN_CONTROL,
REVOKED,
CONVICTED,
ADJUDGED,
RESERVED_2,
COMMON_CARRIER,
NON_COMMON_CARRIER,
PRIVATE_COMM,
FIXED,
MOBILE,
RADIOLOCATION,
SATELLITE,
DEVELOPMENTAL_STA_DEMONSTRATION,
INTERCONNECTED_SERVICE,
CERTIFIER_FIRST_NAME,
CERTIFIER_MIDDLE_INITIAL,
CERTIFIER_LAST_NAME,
CERTIFIER_SUFFIX,
CERTIFIER_TITLE,
FEMALE,
BLACK_AFRICAN_AMERICAN,
NATIVE_AMERICAN,
HAWAIIAN,
ASIAN,
WHITE,
HISPANIC,
EFFECTIVE_DATE,
LAST_ACTION_DATE,
AUCTION_ID,
BROADCAST_SERVICES_REGULATORY_STATUS,
BAND_MANAGER_REGULATORY_STATUS,
BROADCAST_SERVICES_SERVICE_TYPE,
ALIEN_RULING,
LICENSEE_NAME_CHANGE,
WHITESPACE_INDICATOR
 [HS]
RECORD_TYPE,
ID,
ULS_NUMBER,
CALLSIGN,
LOG_DATE,
CODE
 [LA]
RECORD_TYPE,
ID,
CALLSIGN,
ATTACHMENT_CODE,
ATTACHMENT_DESCRIPTION,
ATTACHMENT_DATE,
ATTACHMENT_FILENAME,
ACTION_PERFORMED
 [SC]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
SPECIAL_CONDITION_TYPE,
SPECIAL_CONDITION_CODE,
STATUS_CODE,
STATUS_DATE
 [SF]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
LICENSE_FREEFORM_TYPE,
UNIQUE_LICENSE_FREEFORM_ID,
SEQUENCE_NUMBER,
LICENSE_FREEFORM_CONDITION,
STATUS_CODE,
STATUS_DATE

The 50 output fields selected from the above lists are (arranged in groups of ten for easy counting):

ID,
CALLSIGN,
OPERATOR_CLASS,
GROUP_CODE,
REGION_CODE,
TRUSTEE_CALLSIGN,
TRUSTEE_INDICATOR,
SYSTEMATIC_CALLSIGN_CHANGE,
VANITY_CALLSIGN_CHANGE,
VANITY_RELATIONSHIP,

PREVIOUS_CALLSIGN,
PREVIOUS_OPERATOR_CLASS,
TRUSTEE_NAME,
COMMENT_DATE,
DESCRIPTION,
CO_STATUS_CODE, (i.e., STATUS_CODE from [CO])
CO_STATUS_DATE, (i.e., STATUS_DATE from [CO])
ENTITY_NAME,
FIRST_NAME,
MIDDLE_INITIAL,

LAST_NAME,
SUFFIX,
PHONE,
FAX,
EMAIL,
STREET_ADDRESS,
CITY,
STATE,
ZIP_CODE,
PO_BOX,

ATTENTION_LINE,
FRN,
APPLICANT_TYPE_CODE,
APPLICANT_TYPE_CODE_OTHER,
EN_STATUS_CODE, (i.e., STATUS_CODE from [EN])
EN_STATUS_DATE, (i.e., STATUS_DATE from [EN])
LICENSE_STATUS,
RADIO_SERVICE_CODE,
GRANT_DATE,
EXPIRED_DATE,

CANCELLATION_DATE,
ELIGIBILITY_RULE_NUM,
REVOKED,
CONVICTED,
ADJUDGED,
EFFECTIVE_DATE,
LAST_ACTION_DATE,
LICENSEE_NAME_CHANGE,
LINKED_ID,
LINKED_CALLSIGN
The contents of these fields are based on the original equivalent entries in the original data files. The entries for the fields are subject to the following transformations before being written to the output file:
  • The entry is converted to upper case;
  • Any line feeds (yes, the FCC allows line feeds within a field) are converted to the four-character sequence: <LF>;
  • Leading and trailing spaces are removed;
  • If the field is a date, it is converted from FCC format (mm/dd/yyyy) to ISO 8601 extended format: YYYY-MM-DD.
The latest output file created in this manner (and its MD5 checksum) may be downloaded from this directory.

The full source code to generate the output file may be downloaded here.

To create the binary from the source code, go to the directory that contains the makefile and type:
make fcc-db
This should generate the executable program as: bin/fcc-db. The program may be executed from within the bin directory as:
fcc-db [directory]
where [directory] is the name of the directory that contains the input FCC AM.dat, CO.dat, EN.dat and HD.dat files. Those files should be processed and the output written to stdout.

For what it's worth, it takes somewhat less than 15 seconds for the program to execute to completion on my desktop computer if stdout is redirected to an output file.


2020-10-12

Creating Local FCC Database From Version 4 Data

This is a followup to this post, required because the FCC has changed the format of their files from version 3 to version 4.

The contents of the eight FCC files are now (as described in the version 4 document):

Amateur
[AM] -- unchanged from version 3
1   Record Type [AM]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   EBF Number                  varchar(30)
5   Call Sign                   char(10)
6   Operator Class              char(1)
7   Group Code                  char(1)
8   Region Code                 tinyint
9   Trustee Call Sign           char(10)
10  Trustee Indicator           char(1)
11  Physician Certification     char(1)
12  VE Signature                char(1)
13  Systematic Call Sign Change char(1)
14  Vanity Call Sign Change     char(1)
15  Vanity Relationship         char(12)
16  Previous Call Sign          char(10)
17  Previous Operator Class     char(1)
18  Trustee Name                varchar(50)

Comments
[CO] -- unchanged from version 3
1   Record Type [CO]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   Call Sign                   char(10)
5   Comment Date                mm/dd/yyyy
6   Description                 varchar(255)
7   Status Code                 char(1)
8   Status Date                 mm/dd/yyyy

Entity
[EN] -- unchanged from version 3
1   Record Type [EN]                char(2)
2   Unique System Identifier        numeric(9,0)
3   ULS File Number                 char(14)
4   EBF Number                      varchar(30)
5   Call Sign                       char(10)
6   Entity Type                     char(2)
7   Licensee ID                     char(9)
8   Entity Name                     varchar(200)
9   First Name                      varchar(20)
10  MI                              char(1)
11  Last Name                       varchar(20)
12  Suffix                          char(3)
13  Phone                           char(10)
14  Fax                             char(10)
15  Email                           varchar(50)
16  Street Address                  varchar(60)
17  City                            varchar(20)
18  State                           char(2)
19  Zip Code                        char(9)
20  PO Box                          varchar(20)
21  Attention Line                  varchar(35)
22  SGIN                            char(3)
23  FCC Registration Number (FRN)   char(10)
24  Applicant Type Code             char(1)
25  Applicant Type Code Other       char(40)
26  Status Code                     char(1)
27  Status Date                     mm/dd/yyyy
 
Application/License Header
[HD]
1   Record Type [HD]                            char(2)
2   Unique System Identifier                    numeric(9,0)
3   ULS File Number                             char(14)
4   EBF Number                                  varchar(30)
5   Call Sign                                   char(10)
6   License Status                              char(1)
7   Radio Service Code                          char(2)
8   Grant Date                                  mm/dd/yyyy
9   Expired Date                                mm/dd/yyyy
10  Cancellation Date                           mm/dd/yyyy
11  Eligibility Rule Num                        char(10)
12  Reserved                                    char(1)
13  Alien                                       char(1)
14  Alien Government                            char(1)
15  Alien Corporation                           char(1)
16  Alien Officer                               char(1)
17  Alien Control                               char(1)
18  Revoked                                     char(1)
19  Convicted                                   char(1)
20  Adjudged                                    char(1)
21  Reserved                                    char(1)
22  Common Carrier                              char(1)
23  Non Common Carrier                          char(1)
24  Private Comm                                char(1)
25  Fixed                                       char(1)
26  Mobile                                      char(1)
27  Radiolocation                               char(1)
28  Satellite                                   char(1)
29  Developmental or STA or Demonstration       char(1)
30  InterconnectedService                       char(1)
31  Certifier First Name                        varchar(20)
32  Certifier MI                                char(1)
33  Certifier Last Name                         varchar(20)
34  Certifier Suffix                            char(3)
35  Certifier Title                             char(40)
36  Female                                      char(1)
37  Black or African-American                   char(1)
38  Native American                             char(1)
39  Hawaiian                                    char(1)
40  Asian                                       char(1)
41  White                                       char(1)
42  Hispanic                                    char(1)
43  Effective Date                              mm/dd/yyyy
44  Last Action Date                            mm/dd/yyyy
45  Auction ID                                  integer
46  Broadcast Services - Regulatory Status      char(1)
47  Band Manager - Regulatory Status            char(1)
48  Broadcast Services - Type of Radio Service  char(1)
49  Alien Ruling                                char(1)
50  Licensee Name Change                        char(1)
51  Whitespace Indicator                        char(1)
52  Operation/Performance Requirement Choice    char(1)
53  Operation/Performance Requirement Answer    char(1)
54  Discontinuation of Service                  char(1)
55  Regulatory Compliance                       char(1)

History
[HS] -- unchanged from version 3
1   Record Type [HS]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   Call Sign                   char(10)
5   Log Date                    mm/dd/yyyy
6   Code                        char(6)

License Attachment
[LA] -- unchanged from version 3
1   Record Type [LA]            char(2)
2   Unique System Identifier    numeric(9,0)
3   Call Sign                   char(10)
4   Attachment Code             char(1)
5   Attachment Description      varchar(60)
6   Attachment Date             mm/dd/yyyy
7   Attachment File Name        varchar(60)
8   Action Performed            char(1)

Special Condition
[SC] -- unchanged from version 3
1   Record Type [SC]            char(2)
2   Unique System Identifier    numeric(9,0)
3   ULS File Number             char(14)
4   EBF Number                  varchar(30)
5   Call Sign                   char(10)
6   Special Condition Type      char(1)
7   Special Condition Code      int
8   Status Code                 char(1)
9   Status Date                 mm/dd/yyyy

License Free Form Special Condition
Position Data Element Definition
[SF] -- unchanged from version 3
1   Record Type [SF]                    char(2)
2   Unique System Identifier            numeric(9,0)
3   ULS File Number                     char(14)
4   EBF Number                          varchar(30)
5   Call Sign                           char(10)
6   License Free Form Type              char(1)
7   Unique License Free Form Identifier numeric(9,0)
8   Sequence Number                     integer
9   License Free Form Condition         varchar(255)
10  Status Code                         char(1)
11  Status Date                         mm/dd/yyyy
The following extract from the code that creates the output database maps these on a one-to-one basis to internal identifiers (the four new fields in the [HD] records don't seem to be important -- at least for now -- so there is no change in the output as compared to the processing of version 3 files, although the new fields are processed):

[AM]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
OPERATOR_CLASS,
GROUP_CODE,
REGION_CODE,
TRUSTEE_CALLSIGN,
TRUSTEE_INDICATOR,
PHYSICIAN_CERTIFICATION,
VE_SIGNATURE,
SYSTEMATIC_CALLSIGN_CHANGE,
VANITY_CALLSIGN_CHANGE,
VANITY_RELATIONSHIP,
PREVIOUS_CALLSIGN,
PREVIOUS_OPERATOR_CLASS,
TRUSTEE_NAME
 [CO]
RECORD_TYPE,
ID,
ULS_NUMBER,
CALLSIGN,
COMMENT_DATE,
DESCRIPTION,
STATUS_CODE,
STATUS_DATE
 [EN]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
ENTITY_TYPE,
LICENSE_ID,
ENTITY_NAME,
FIRST_NAME,
MIDDLE_INITIAL,
LAST_NAME,
SUFFIX,
PHONE,
FAX,
EMAIL,
STREET_ADDRESS,
CITY,
STATE,
ZIP_CODE,
PO_BOX,
ATTENTION_LINE,
SGIN,
FRN,
APPLICANT_TYPE_CODE,
APPLICANT_TYPE_CODE_OTHER,
STATUS_CODE,
STATUS_DATE
 [HD]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
LICENSE_STATUS,
RADIO_SERVICE_CODE,
GRANT_DATE,
EXPIRED_DATE,
CANCELLATION_DATE,
ELIGIBILITY_RULE_NUM,
RESERVED_1,
ALIEN,
ALIEN_GOVERNMENT,
ALIEN_CORPORATION,
ALIEN_OFFICER,
ALIEN_CONTROL,
REVOKED,
CONVICTED,
ADJUDGED,
RESERVED_2,
COMMON_CARRIER,
NON_COMMON_CARRIER,
PRIVATE_COMM,
FIXED,
MOBILE,
RADIOLOCATION,
SATELLITE,
DEVELOPMENTAL_STA_DEMONSTRATION,
INTERCONNECTED_SERVICE,
CERTIFIER_FIRST_NAME,
CERTIFIER_MIDDLE_INITIAL,
CERTIFIER_LAST_NAME,
CERTIFIER_SUFFIX,
CERTIFIER_TITLE,
FEMALE,
BLACK_AFRICAN_AMERICAN,
NATIVE_AMERICAN,
HAWAIIAN,
ASIAN,
WHITE,
HISPANIC,
EFFECTIVE_DATE,
LAST_ACTION_DATE,
AUCTION_ID,
BROADCAST_SERVICES_REGULATORY_STATUS,
BAND_MANAGER_REGULATORY_STATUS,
BROADCAST_SERVICES_SERVICE_TYPE,
ALIEN_RULING,
LICENSEE_NAME_CHANGE,
WHITESPACE_INDICATOR
 [HS]
RECORD_TYPE,
ID,
ULS_NUMBER,
CALLSIGN,
LOG_DATE,
CODE
 [LA]
RECORD_TYPE,
ID,
CALLSIGN,
ATTACHMENT_CODE,
ATTACHMENT_DESCRIPTION,
ATTACHMENT_DATE,
ATTACHMENT_FILENAME,
ACTION_PERFORMED
 [SC]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
SPECIAL_CONDITION_TYPE,
SPECIAL_CONDITION_CODE,
STATUS_CODE,
STATUS_DATE
 [SF]
RECORD_TYPE,
ID,
ULS_NUMBER,
EBF_NUMBER,
CALLSIGN,
LICENSE_FREEFORM_TYPE,
UNIQUE_LICENSE_FREEFORM_ID,
SEQUENCE_NUMBER,
LICENSE_FREEFORM_CONDITION,
STATUS_CODE,
STATUS_DATE

The 48 output fields selected from the above lists are (arranged in groups of ten for easy counting):

ID,
CALLSIGN,
OPERATOR_CLASS,
GROUP_CODE,
REGION_CODE,
TRUSTEE_CALLSIGN,
TRUSTEE_INDICATOR,
SYSTEMATIC_CALLSIGN_CHANGE,
VANITY_CALLSIGN_CHANGE,
VANITY_RELATIONSHIP,

PREVIOUS_CALLSIGN,
PREVIOUS_OPERATOR_CLASS,
TRUSTEE_NAME,
COMMENT_DATE,
DESCRIPTION,
CO_STATUS_CODE, (i.e., STATUS_CODE from [CO])
CO_STATUS_DATE, (i.e., STATUS_DATE from [CO])
ENTITY_NAME,
FIRST_NAME,
MIDDLE_INITIAL,

LAST_NAME,
SUFFIX,
PHONE,
FAX,
EMAIL,
STREET_ADDRESS,
CITY,
STATE,
ZIP_CODE,
PO_BOX,

ATTENTION_LINE,
FRN,
APPLICANT_TYPE_CODE,
APPLICANT_TYPE_CODE_OTHER,
EN_STATUS_CODE, (i.e., STATUS_CODE from [EN])
EN_STATUS_DATE, (i.e., STATUS_DATE from [EN])
LICENSE_STATUS,
RADIO_SERVICE_CODE,
GRANT_DATE,
EXPIRED_DATE,

CANCELLATION_DATE,
ELIGIBILITY_RULE_NUM,
REVOKED,
CONVICTED,
ADJUDGED,
EFFECTIVE_DATE,
LAST_ACTION_DATE,
LICENSEE_NAME_CHANGE
The contents of these fields are based on the original equivalent entries in the original data files. The entries for the fields are subject to the following transformations before being written to the output file:
  • The entry is converted to upper case;
  • Any line feeds (yes, the FCC allows line feeds within a field) are converted to the four-character sequence: <LF>;
  • Leading and trailing spaces are removed;
  • If the field is a date, it is converted from FCC format (mm/dd/yyyy) to ISO 8601 extended format: YYYY-MM-DD.
The latest output file created in this manner (and its MD5 checksum) may be downloaded from this directory.

The full source code to generate the output file may be downloaded here.

To create the binary from the source code, go to the directory that contains the makefile and type:
make fcc-db
This should generate the executable program as: bin/fcc-db. The program may be executed from within the bin directory as:
fcc-db [directory]
where [directory] is the name of the directory that contains the input FCC AM.dat, CO.dat, EN.dat and HD.dat files. Those files should be processed and the output written to stdout.

For what it's worth, it takes somewhat less than 15 seconds for the program to execute to completion on my desktop computer if stdout is redirected to an output file.

2020-09-13

Running RigExpert AntScope2 on Debian Stable (buster)

RigExpert have instructions as to how to load their AntScope2 software on a Raspberry Pi.

As the Raspberry Pi runs a system based on debian, it shouldn't be too difficult to get the code running on a debian stable (buster) system.

[I apologise for some of the formatting in this post. blogger.com has foisted a predictably putrid new interface on me. It seems to have no consistent concept of what to do when one hits the ENTER key, nor how to paste text properly. Things that used to be a single click on a text button are now a process of figuring out which meaningless icon causes the menu I want to appear, and then selecting the correct text from the menu -- this is somehow supposed to be an improvement; Yet Another Reason to hate applications that don't run on the desktop, and are controlled by another entity -- they can resist the temptation to break things for users for only so long. To make matters even worse, they falsely claim that they provide a way to continue to use the old interface -- making that selection still forces one into the new atrocity. Yes, I'm ranting.]

1. Download and install the necessary packages.

sudo apt-get install qt5-default qt5-qmake libegl1-mesa libgles2-mesa libqt5serialport5-dev libusb-1.0.0-dev

The output I received (after wasting gobs of time trying to get it to format somewhat sensibly in the new interface, which scattered vast numbers of non-breaking spaces seemingly at random throughout the text):

[ZB:rbn] sudo apt-get install qt5-default qt5-qmake libegl1-mesa libgles2-mesa libqt5serialport5-dev libusb-1.0.0-dev
[sudo] password for n7dr:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'libusb-1.0-0-dev' for regex 'libusb-1.0.0-dev'
libegl1-mesa is already the newest version (18.3.6-2+deb10u1).
libegl1-mesa set to manually installed.
The following packages were automatically installed and are no longer required:
  linux-headers-4.19.0-6-amd64 linux-headers-4.19.0-6-common linux-headers-4.19.0-8-amd64 linux-headers-4.19.0-8-common linux-image-4.19.0-6-amd64 linux-image-4.19.0-8-amd64
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libqt5opengl5-dev libqt5serialport5 libusb-1.0-doc libvulkan-dev qt5-qmake-bin qtbase5-dev qtbase5-dev-tools
Suggested packages:
  default-libmysqlclient-dev firebird-dev libegl1-mesa-dev libpq-dev libsqlite3-dev unixodbc-dev
The following NEW packages will be installed:
  libgles2-mesa libqt5opengl5-dev libqt5serialport5 libqt5serialport5-dev libusb-1.0-0-dev libusb-1.0-doc libvulkan-dev qt5-default qt5-qmake qt5-qmake-bin qtbase5-dev qtbase5-dev-tools
0 upgraded, 12 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,854 kB of archives.
After this operation, 29.9 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://ftp.us.debian.org/debian buster/main amd64 libgles2-mesa amd64 18.3.6-2+deb10u1 [47.4 kB]
Get:2 http://ftp.us.debian.org/debian buster/main amd64 libvulkan-dev amd64 1.1.97-2 [390 kB]
Get:3 http://ftp.us.debian.org/debian buster/main amd64 qt5-qmake-bin amd64 5.11.3+dfsg1-1+deb10u3 [1,004 kB]
Get:4 http://ftp.us.debian.org/debian buster/main amd64 qt5-qmake amd64 5.11.3+dfsg1-1+deb10u3 [213 kB]
Get:5 http://ftp.us.debian.org/debian buster/main amd64 qtbase5-dev-tools amd64 5.11.3+dfsg1-1+deb10u3 [770 kB]
Get:6 http://ftp.us.debian.org/debian buster/main amd64 qtbase5-dev amd64 5.11.3+dfsg1-1+deb10u3 [1,014 kB]
Get:7 http://ftp.us.debian.org/debian buster/main amd64 libqt5opengl5-dev amd64 5.11.3+dfsg1-1+deb10u3 [63.8 kB]
Get:8 http://ftp.us.debian.org/debian buster/main amd64 libqt5serialport5 amd64 5.11.3-2 [35.0 kB]
Get:9 http://ftp.us.debian.org/debian buster/main amd64 libqt5serialport5-dev amd64 5.11.3-2 [12.8 kB]
Get:10 http://ftp.us.debian.org/debian buster/main amd64 libusb-1.0-0-dev amd64 2:1.0.22-2 [74.5 kB]
Get:11 http://ftp.us.debian.org/debian buster/main amd64 libusb-1.0-doc all 2:1.0.22-2 [182 kB]
Get:12 http://ftp.us.debian.org/debian buster/main amd64 qt5-default amd64 5.11.3+dfsg1-1+deb10u3 [48.2 kB]
Fetched 3,854 kB in 4s (946 kB/s)
Selecting previously unselected package libgles2-mesa:amd64.
(Reading database ... 371509 files and directories currently installed.)
Preparing to unpack .../00-libgles2-mesa_18.3.6-2+deb10u1_amd64.deb ...
Unpacking libgles2-mesa:amd64 (18.3.6-2+deb10u1) ...
Selecting previously unselected package libvulkan-dev:amd64.
Preparing to unpack .../01-libvulkan-dev_1.1.97-2_amd64.deb ...
Unpacking libvulkan-dev:amd64 (1.1.97-2) ...
Selecting previously unselected package qt5-qmake-bin.
Preparing to unpack .../02-qt5-qmake-bin_5.11.3+dfsg1-1+deb10u3_amd64.deb ...
Unpacking qt5-qmake-bin (5.11.3+dfsg1-1+deb10u3) ...
Selecting previously unselected package qt5-qmake:amd64.
Preparing to unpack .../03-qt5-qmake_5.11.3+dfsg1-1+deb10u3_amd64.deb ...
Unpacking qt5-qmake:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Selecting previously unselected package qtbase5-dev-tools.
Preparing to unpack .../04-qtbase5-dev-tools_5.11.3+dfsg1-1+deb10u3_amd64.deb ...
Unpacking qtbase5-dev-tools (5.11.3+dfsg1-1+deb10u3) ...
Selecting previously unselected package qtbase5-dev:amd64.
Preparing to unpack .../05-qtbase5-dev_5.11.3+dfsg1-1+deb10u3_amd64.deb ...
Unpacking qtbase5-dev:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Selecting previously unselected package libqt5opengl5-dev:amd64.
Preparing to unpack .../06-libqt5opengl5-dev_5.11.3+dfsg1-1+deb10u3_amd64.deb ...
Unpacking libqt5opengl5-dev:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Selecting previously unselected package libqt5serialport5:amd64.
Preparing to unpack .../07-libqt5serialport5_5.11.3-2_amd64.deb ...
Unpacking libqt5serialport5:amd64 (5.11.3-2) ...
Selecting previously unselected package libqt5serialport5-dev:amd64.
Preparing to unpack .../08-libqt5serialport5-dev_5.11.3-2_amd64.deb ...
Unpacking libqt5serialport5-dev:amd64 (5.11.3-2) ...
Selecting previously unselected package libusb-1.0-0-dev:amd64.
Preparing to unpack .../09-libusb-1.0-0-dev_2%3a1.0.22-2_amd64.deb ...
Unpacking libusb-1.0-0-dev:amd64 (2:1.0.22-2) ...
Selecting previously unselected package libusb-1.0-doc.
Preparing to unpack .../10-libusb-1.0-doc_2%3a1.0.22-2_all.deb ...
Unpacking libusb-1.0-doc (2:1.0.22-2) ...
Selecting previously unselected package qt5-default:amd64.
Preparing to unpack .../11-qt5-default_5.11.3+dfsg1-1+deb10u3_amd64.deb ...
Unpacking qt5-default:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Setting up libvulkan-dev:amd64 (1.1.97-2) ...
Setting up libgles2-mesa:amd64 (18.3.6-2+deb10u1) ...
Setting up libusb-1.0-doc (2:1.0.22-2) ...
Setting up libusb-1.0-0-dev:amd64 (2:1.0.22-2) ...
Setting up libqt5serialport5:amd64 (5.11.3-2) ...
Setting up qtbase5-dev-tools (5.11.3+dfsg1-1+deb10u3) ...
Setting up qt5-qmake-bin (5.11.3+dfsg1-1+deb10u3) ...
Setting up qt5-qmake:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Setting up qtbase5-dev:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Setting up qt5-default:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Setting up libqt5opengl5-dev:amd64 (5.11.3+dfsg1-1+deb10u3) ...
Setting up libqt5serialport5-dev:amd64 (5.11.3-2) ...
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for libc-bin (2.28-10) ...
[ZB:rbn]

2. The official RigExpert repository for the software is here. After downloading the software, set the working directory to Antscope2-master in the downloaded hierarchy and then:

[ZB:AntScope2-master] qmake AntScope.pro
Info: creating stash file /tmp/antscope/AntScope2-master/.qmake.stash
Project MESSAGE: AntScope2:
Project MESSAGE:        [/tmp/antscope/AntScope2-master/build/release]
Project MESSAGE:        [/tmp/antscope/AntScope2-master/build/release/.obj]
Project MESSAGE:        [/tmp/antscope/AntScope2-master/build/release/.moc]
Project MESSAGE:        [/tmp/antscope/AntScope2-master/build/release/.ui]
Project MESSAGE:        [/tmp/antscope/AntScope2-master/build/release/.rcc]
[ZB:AntScope2-master]


3. Assuming that you receive similar results, then you can make the executable:

[ZB:AntScope2-master] make                                 

This should generate many pages of output, including not a few warnings, but no errors. RigExpert say about this step: "This process will take considerable time. Caution! Warning messages may appear during compilation. This is not scary."

4. Unusually, this is not the end of the process; RigExpert requires a few more steps. After the make command completes, you should have files in a .../build/release directory. Now you must:

5. Create (manually) the directory .../build/release/Resources.

6. Download this ZIP file.

7. Put the file cables.txt from the ZIP archive in the .../Resources directory.

8. Put the remaining files from the ZIP archive in the .../release directory.

9. Allow yourself as an ordinary user to use the USB ports:

  sudo adduser $USER dialout

10. In order for step 9 to take effect, you must log out and log back in.

11. Download this file and place it in the directory /etc/udev/rules.d:

  sudo cp rigexpert-usb.rules /etc/udev/rules.d

12. Finally, you can execute the software, which is in the .../build/release directory:

  ./AntScope2

13. On my systems, this causes the following to appear:


Note the large black rectangle, which flashes into and out of existence as one moves the cursor, and also the menu window at bottom left that extends beyond border of window. These appear to be bugs in the software.

2020-07-27

Cleaned and Augmented Logs for ARRL DX CW and SSB contests, 2018 to 2020

Raw logs


The raw logs for the ARRL DX CW and SSB contests are now available for 2018, 2019 and 2020 in this directory.
 

Cleaned Logs


Links to the cleaned logs may be followed here.

The cleaned logs are the result of processing the QSO: lines from the entrants' submitted Cabrillo files (as [gratuitously] modified by the ARRL) to ensure that all fields contain valid values and all the data match the column-specific standard format for this contest.

Any line containing illegal data in a field has simply been removed. Also, only the QSO: lines are retained, so that each line in the file can be processed easily. All QTH multipliers are rendered as two letters, and the power is rendered as four digits, regardless of how the submitted log recorded these two fields; this should simplify processing the logs by scripts or programs, as should the use of fixed-length records in these cleaned files.

Augmented Logs


Links to the augmented logs may be followed here.

The augmented logs for the ARRL DX contests contain the same information as the cleaned logs, but with the addition of some useful (derived) information on each line. The information added to each line comprises:
  1. The sequence of four characters that are the same for each entry in a particular log:
    •  a. letter "A" or "U" indicating "assisted" or "unassisted"
    •  b. letter "Q", "L", "H" or "U", indicating respectively QRP, low power, high power or unknown power level
    •  c. letter "S", "M", "C" or "U", indicating respectively a single-operator, multi-operator, checklog or unknown operator category 
    •  d. character "1", "2", "+" or "U", indicating respectively that the number of transmitters is one, two, unlimited or unknown
  2. A four-digit number representing the time if the contact in minutes measured from the start of the contest. (I realise that this can be calculated from the other information on the line, but it saves subsequent processors of the file considerable time to have the number readily available in the file without having to calculate it each time.)
  3. Band
  4. A set of fourteen flags, each -- apart from column k and column n -- encoded as T/F: 
    • a. QSO is confirmed by a log from the second party 
    • b. QSO is a reverse bust (i.e., the second party appears to have bust the call of the first party) 
    • c. QSO is an ordinary bust (i.e., the first party appears to have bust the call of the second party) 
    • d. the call of the second party is unique 
    • e. QSO appears to be a NIL 
    • f. QSO is with a station that did not send in a log, but who did make 20 or more QSOs in the contest 
    • g. QSO appears to be a country mult (may be T for W/VE stations only)
    • h. QSO appears to be a state/province mult (may be T for DX stations only)
    • i. QSO is an exchange bust (i.e., the received exchange appears to be a bust)
    • j. QSO is a reverse exchange bust (i.e. the second party appears to have bust the exchange of the first party)
    • k. This entry has three possible values rather than just T/F:
      • T: QSO appears to be made during a run by the first party
      • F: QSO appears not to be made during a run by the first party
      • U: the run status is unknown because insufficient frequency information is available in the first party's log
    • l. QSO is a dupe
    • m. QSO is a dupe in the second party's log
    • n. RBN information (see below)
  5. If the QSO is a reverse bust, the call logged by the second party; otherwise, the placeholder "-"
  6. If the QSO is an ordinary bust, the correct call that should have been logged by the first party; otherwise, the placeholder "-"
  7. If the QSO is a reverse exchange bust, the exchange logged by the second party; otherwise, the placeholder "-"
  8.  If the QSO is an ordinary exchange bust, the correct exchange that should have been logged by the first party; otherwise, the placeholder "-"

RBN Information


In CW contests from 2009 onwards, the RBN has been active, automatically spotting the frequency at which any station calling CQ was transmitting. To reflect possible use of RBN information, the augmented files include a fourteenth column. For the sake of uniformity, this column is present in all the augmented files, regardless of whether the RBN actually contributed useful information to a particular contest.

Each QSO has one of several characters in the fourteenth column of flags. These characters should be interpreted as follows:

'-'
  No useful RBN-derived information is available for this QSO.

'0'
  The worked station (i.e., the second call on the log line) appears to have begun to CQ on this frequency within (roughly) 60 seconds prior to the QSO.

'A' to 'Z'
  For the nth letter of the alphabet: the worked station appears to have been CQing on this frequency for (roughly) n minutes prior to the QSO.

'+'
  The worked station appears to have been CQing for more than 26 minutes on this frequency.

'<'
  Because the the RBN is distributed, and because each contest entrant station has its own clock, there is generally a skew between the reading of the clock of the station making the QSO and the timestamp from the RBN at which it believes a posting was made (indeed, it's unclear from the RBN's [lack of] documentation exactly how the timestamp on an individual RBN posting is to be interpreted). If the character '<' appears in the the RBN column, it indicates that the raw values of the clocks suggest that the QSO took place up to two minutes before the RBN reported the worked station commencing to CQ at this frequency. When this occurs, the most likely interpretation is that there is non-negligible skew between the two clocks, and the station was actually worked almost as soon as a CQ was posted by the RBN. But it might also mean that the entrant was simply lucky and found the CQing station just as it fired up on a new frequency.

Notes:
  • The encoding of some of the flags requires subjective decisions to be made as to whether the flag should be true or false; consequently, and because the ARRL has yet to understand the importance of making the scoring code public, the value of a flag for a specific QSO line in some circumstances might not match the value that the ARRL has assigned. (Also, the ARRL has additional, non-public, data available.)
  • I made no attempt to deduce or infer the run status of a QSO in the second party's log (if such exists), regardless of the status in the first party's log. This allows one cleanly to perform correct statistical analyses anent the number of QSOs made by running stations merely by excluding QSOs marked with a U in column k.
  • No attempt is made to detect the case in which both participants of a QSO bust the other station's call. This is a problematic situation because of the relatively high probability of a false positive unless both stations log the frequency as opposed to the band. (Also, on bands on which split-frequency QSOs are common, the absence of both transmit and receive frequency is a problem.) Because of the likelihood of false positives, it seems better, given the presumed rarity of double-bust QSOs, that no attempt be made to mark them.
  • The entries for the exchanges in the case of exchange or reverse exchange busts are normalised to two-letter or four-digit values in the same manner as described above for the exchanges in the cleaned logs.

2020-07-03

Reverse NILs in CQ WW: 2019; 2010 to 2019

The basic notion of reverse NILs (rNILs; or, I suppose, RNILs) is described here, along with a description of a simple script for calculating rNILs for CQ WW contests and the result of applying that code to the contests for 2005. See also the comments at the end of that post.

We can also look at the results for periods of ten years at a time; the only difference in the way that these decadal tables are calculated is that the minimum number of rQSOs is raised from 50 to 250 for tables pertaining to all QSOs and from 25 to 125 for those pertaining to intra-W QSOs. (That is, the value of the variable MIN_QSOs is changed from 50 to 250.)

Here, without further comment, are the results for 2019 and for the period from 2010 to 2019:

2019 SSB:

Callsign Total rQSOs Total rNILs
EA2DMH 1628 1607
NP3LY 852 831
UT1UL 521 483
EA8DDS 391 387
OE5CWO/P 336 335
N9SE 352 315
EF8R 12106 234
D4C 10856 229
CN3A 9784 213
PJ4K 8171 193


Callsign Total rQSOs Total rNILs % rNILs
OE5CWO/P 336 335 99.7
EA8DDS 391 387 99.0
EA2DMH 1628 1607 98.7
KB9RDS 139 137 98.6
NP3LY 852 831 97.5
G0AKF 50 48 96.0
PY2BN 94 89 94.7
UT1UL 521 483 92.7
N9SE 352 315 89.5
WP4QHW 125 101 80.8


Callsign Total rQSOs with Ws rNILs against Ws
KV0Q 56 37
N7DD 62 36
K3LR 475 13
K5TR 236 11
W3LPL 369 9
K3EST 104 8
NV9L 135 7
W3PP 51 5
N2IC 37 5
K5GN 248 5


Callsign Total rQSOs with Ws Total rNILs against Ws % rNILs against Ws
KV0Q 56 37 66.1
N7DD 62 36 58.1
N2IC 37 5 13.5
AA9A 25 3 12.0
W3PP 51 5 9.8
W3UA 45 4 8.9
KJ4QHL 50 4 8.0
K3PP 26 2 7.7
K3EST 104 8 7.7
K1KI 26 2 7.7

2019 CW:

Callsign Total rQSOs Total rNILs
RC3W 1464 591
IK2FIR 704 339
MW2I 928 260
EF8R 14340 243
CN3A 11697 235
D4C 7870 203
FR4SC 1042 197
PZ5W 7634 183
TI7W 8734 179
PJ4K 10048 178


Callsign Total rQSOs Total rNILs % rNILs
DK1MIR 142 134 94.4
F5PHY 179 137 76.5
JF2WXS 61 43 70.5
UR4QR 131 92 70.2
RZ9A 227 126 55.5
HL3AMO 257 131 51.0
KO8Z 130 63 48.5
IK2FIR 704 339 48.2
JH2KKW 87 41 47.1
KG9N 112 52 46.4


Callsign Total rQSOs with Ws rNILs against Ws
N7DD 61 45
K0RF 256 25
K3LR 376 11
K1MT 27 11
W3LPL 398 10
KC1XX 180 9
K5TR 202 9
N6RO 292 7
W2FU 75 7
K8AZ 51 7


Callsign Total rQSOs with Ws Total rNILs against Ws % rNILs against Ws
N7DD 61 45 73.8
K1MT 27 11 40.7
AA9A 26 5 19.2
KV2K 33 6 18.2
K8AZ 51 7 13.7
K2QMF 44 6 13.6
K1GU 40 5 12.5
K8CX 25 3 12.0
N3RS 37 4 10.8
N2SR 38 4 10.5

2010 to 2019 SSB:

Callsign Total rQSOs Total rNILs
CN3A 90064 1808
JT5DX 17781 1701
OK1KZ 2268 1657
OT5A 71017 1653
EA2DMH 3034 1622
JR4GPA 3752 1531
LZ9W 87001 1474
A73A 67220 1409
D4C 60004 1406
PJ2T 73306 1387


Callsign Total rQSOs Total rNILs % rNILs
UT1ML 265 264 99.6
IR1I 578 575 99.5
KP4ROS 657 653 99.4
YL2014W 1105 1098 99.4
VU2SWS 261 259 99.2
YY4HAH 493 489 99.2
CU4AT 274 270 98.5
ZZ5Z 297 292 98.3
XE2WWW 302 293 97.0
EE5W 349 338 96.8


Callsign Total rQSOs with Ws rNILs against Ws
N7DD 592 347
KV0Q 629 310
N9RV 781 139
K3LR 4668 111
NR5M 750 103
N2IC 745 97
W3LPL 3039 89
W4QNW 165 76
W0AIH 1699 60
K5TR 2064 57


Callsign Total rQSOs with Ws Total rNILs against Ws % rNILs against Ws
N7DD 592 347 58.6
KV0Q 629 310 49.3
W4QNW 165 76 46.1
N9RV 781 139 17.8
NR5M 750 103 13.7
N2IC 745 97 13.0
K7ZSD 199 24 12.1
WA2HIP 145 17 11.7
N3AD 171 20 11.7
AB4B 164 19 11.6

CW 2010 to 2019:

Callsign Total rQSOs Total rNILs
OK1KZ 2699 2248
PJ2T 96418 1518
LZ9W 100972 1444
D4C 65535 1429
9A1A 106176 1392
JR4GPA 6639 1374
P33W 86049 1224
PJ4A 72237 1189
UA1CEC 5234 1172
8P5A 42282 1143


Callsign Total rQSOs Total rNILs % rNILs
I1XSG 534 527 98.7
OK1KZ 2699 2248 83.3
WB0CFF 432 313 72.5
TM0T 983 632 64.3
RA3ATE 1547 911 58.9
RA9KY 801 461 57.6
N2VM 391 225 57.5
AB3UM 276 153 55.4
XF1IM 702 385 54.8
RW9JD 1689 888 52.6


Callsign Total rQSOs with Ws rNILs against Ws
NR5M 1834 244
N7DD 365 165
N9RV 612 129
K0RF 2060 120
KV0Q 246 78
N0NI 1091 77
W3LPL 3023 75
KV2K 283 75
NR4M 1919 69
N7AT 1505 61


Callsign Total rQSOs with Ws Total rNILs against Ws % rNILs against Ws
N7DD 365 165 45.2
KV0Q 246 78 31.7
KZ5D 175 47 26.9
KV2K 283 75 26.5
NE3F 230 53 23.0
N9RV 612 129 21.1
NR5M 1834 244 13.3
W1WEF 300 33 11.0
KU2C 126 13 10.3
W0QQG 301 31 10.3