echi-converter 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +5 -0
- data/License.txt +456 -0
- data/Manifest.txt +29 -0
- data/README.txt +33 -0
- data/Rakefile +143 -0
- data/bin/echi-converter-create +76 -0
- data/config/application.yml +33 -0
- data/config/database.yml +6 -0
- data/config/extended_version12.yml +234 -0
- data/db/migrate/001_create_echi_records.rb +25 -0
- data/db/migrate/002_create_echi_logs.rb +15 -0
- data/echi-converter +8 -0
- data/examples/extended_version12/chr0003 +0 -0
- data/examples/extended_version12/chr0003.txt +14619 -0
- data/lib/database.rb +5 -0
- data/lib/echi-converter.rb +214 -0
- data/lib/echi-converter/version.rb +9 -0
- data/lib/main.rb +56 -0
- data/scripts/txt2html +67 -0
- data/setup.rb +1585 -0
- data/test/test_echi-converter.rb +11 -0
- data/test/test_helper.rb +2 -0
- data/website/index.html +217 -0
- data/website/index.txt +118 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +79 -0
data/Manifest.txt
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
History.txt
|
2
|
+
License.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
echi-converter
|
7
|
+
lib/main.rb
|
8
|
+
lib/echi-converter/version.rb
|
9
|
+
lib/database.rb
|
10
|
+
lib/main.rb
|
11
|
+
lib/echi-converter.rb
|
12
|
+
scripts/txt2html
|
13
|
+
setup.rb
|
14
|
+
test/test_echi-converter.rb
|
15
|
+
test/test_helper.rb
|
16
|
+
website/index.html
|
17
|
+
website/index.txt
|
18
|
+
website/javascripts/rounded_corners_lite.inc.js
|
19
|
+
website/stylesheets/screen.css
|
20
|
+
website/template.rhtml
|
21
|
+
config/application.yml
|
22
|
+
config/database.yml
|
23
|
+
config/extended_version12.yml
|
24
|
+
db/migrate/001_create_echi_records.rb
|
25
|
+
db/migrate/002_create_echi_logs.rb
|
26
|
+
bin/echi-converter-create
|
27
|
+
examples/extended_version12/chr0003
|
28
|
+
examples/extended_version12/chr0003.txt
|
29
|
+
|
data/README.txt
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
README for echi_converter
|
2
|
+
==========================
|
3
|
+
ECHI Converter - The Binary to ASCII converter for Avaya CMS External Call History files
|
4
|
+
|
5
|
+
--- background ---
|
6
|
+
|
7
|
+
See more info on the Avaya ECHI format here (note, these overviews are version specific):
|
8
|
+
|
9
|
+
http://support.avaya.com/elmodocs2/cms/R12/ECHI.pdf
|
10
|
+
|
11
|
+
--- command ---
|
12
|
+
|
13
|
+
Usage: ruby echi-converter-daemon.rb <command> <options> -- <application options>
|
14
|
+
|
15
|
+
* where <command> is one of:
|
16
|
+
start start an instance of the application
|
17
|
+
stop stop all instances of the application
|
18
|
+
restart stop all instances and restart them afterwards
|
19
|
+
run start the application and stay on top
|
20
|
+
zap set the application to a stopped state
|
21
|
+
|
22
|
+
* and where <options> may contain several of the following:
|
23
|
+
|
24
|
+
-t, --ontop Stay on top (does not daemonize)
|
25
|
+
-f, --force Force operation
|
26
|
+
|
27
|
+
Common options:
|
28
|
+
-h, --help Show this message
|
29
|
+
--version Show version
|
30
|
+
|
31
|
+
--- overview ---
|
32
|
+
|
33
|
+
Blah, blah here
|
data/Rakefile
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/testtask'
|
5
|
+
require 'rake/packagetask'
|
6
|
+
require 'rake/gempackagetask'
|
7
|
+
require 'rake/rdoctask'
|
8
|
+
require 'rake/contrib/rubyforgepublisher'
|
9
|
+
require 'fileutils'
|
10
|
+
require 'hoe'
|
11
|
+
require 'active_record'
|
12
|
+
require 'yaml'
|
13
|
+
|
14
|
+
include FileUtils
|
15
|
+
require File.join(File.dirname(__FILE__), 'lib', 'echi-converter', 'version')
|
16
|
+
|
17
|
+
AUTHOR = 'Jason Goecke' # can also be an array of Authors
|
18
|
+
EMAIL = "jason [at] goecke.net"
|
19
|
+
DESCRIPTION = "ECHI Conversion Utility - Provides a utility to fetch Avaya CMS / ECHI binary files, convert them and insert into a database table via ActiveRecord"
|
20
|
+
GEM_NAME = 'echi-converter' # what ppl will type to install your gem
|
21
|
+
|
22
|
+
@config_file = "~/.rubyforge/user-config.yml"
|
23
|
+
@config = nil
|
24
|
+
def rubyforge_username
|
25
|
+
unless @config
|
26
|
+
begin
|
27
|
+
@config = YAML.load(File.read(File.expand_path(@config_file)))
|
28
|
+
rescue
|
29
|
+
puts <<-EOS
|
30
|
+
ERROR: No rubyforge config file found: #{@config_file}"
|
31
|
+
Run 'rubyforge setup' to prepare your env for access to Rubyforge
|
32
|
+
- See http://newgem.rubyforge.org/rubyforge.html for more details
|
33
|
+
EOS
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
end
|
37
|
+
@rubyforge_username ||= @config["username"]
|
38
|
+
end
|
39
|
+
|
40
|
+
RUBYFORGE_PROJECT = 'echi-converter' # The unix name for your project
|
41
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
42
|
+
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
43
|
+
|
44
|
+
NAME = "echi-converter"
|
45
|
+
REV = nil
|
46
|
+
# UNCOMMENT IF REQUIRED:
|
47
|
+
# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
|
48
|
+
VERS = EchiConverter::VERSION::STRING + (REV ? ".#{REV}" : "")
|
49
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']
|
50
|
+
RDOC_OPTS = ['--quiet', '--title', 'echi-converter documentation',
|
51
|
+
"--opname", "index.html",
|
52
|
+
"--line-numbers",
|
53
|
+
"--main", "README",
|
54
|
+
"--inline-source"]
|
55
|
+
|
56
|
+
class Hoe
|
57
|
+
def extra_deps
|
58
|
+
@extra_deps.reject { |x| Array(x).first == 'hoe' }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Generate all the Rake tasks
|
63
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
64
|
+
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
65
|
+
p.author = AUTHOR
|
66
|
+
p.description = DESCRIPTION
|
67
|
+
p.email = EMAIL
|
68
|
+
p.summary = DESCRIPTION
|
69
|
+
p.url = HOMEPATH
|
70
|
+
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
71
|
+
p.test_globs = ["test/**/test_*.rb"]
|
72
|
+
p.clean_globs |= CLEAN #An array of file patterns to delete on clean.
|
73
|
+
|
74
|
+
# == Optional
|
75
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
76
|
+
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
77
|
+
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
78
|
+
end
|
79
|
+
|
80
|
+
CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\n\n")
|
81
|
+
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
82
|
+
hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
|
83
|
+
|
84
|
+
desc 'Generate website files'
|
85
|
+
task :website_generate do
|
86
|
+
Dir['website/**/*.txt'].each do |txt|
|
87
|
+
sh %{ ruby scripts/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
desc 'Upload website files to rubyforge'
|
92
|
+
task :website_upload do
|
93
|
+
host = "#{rubyforge_username}@rubyforge.org"
|
94
|
+
remote_dir = "/var/www/gforge-projects/#{PATH}/"
|
95
|
+
local_dir = 'website'
|
96
|
+
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
97
|
+
end
|
98
|
+
|
99
|
+
desc 'Generate and upload website files'
|
100
|
+
task :website => [:website_generate, :website_upload, :publish_docs]
|
101
|
+
|
102
|
+
desc 'Release the website and new gem version'
|
103
|
+
task :deploy => [:check_version, :website, :release] do
|
104
|
+
puts "Remember to create SVN tag:"
|
105
|
+
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
106
|
+
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
107
|
+
puts "Suggested comment:"
|
108
|
+
puts "Tagging release #{CHANGES}"
|
109
|
+
end
|
110
|
+
|
111
|
+
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
112
|
+
task :local_deploy => [:website_generate, :install_gem]
|
113
|
+
|
114
|
+
task :check_version do
|
115
|
+
unless ENV['VERSION']
|
116
|
+
puts 'Must pass a VERSION=x.y.z release version'
|
117
|
+
exit
|
118
|
+
end
|
119
|
+
unless ENV['VERSION'] == VERS
|
120
|
+
puts "Please update your version.rb to match the release version, currently #{VERS}"
|
121
|
+
exit
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
##Add the ability to use ActiveRecord Migrations to create the database
|
126
|
+
desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x"
|
127
|
+
task :migrate => :environment do
|
128
|
+
#Load the working directoy and configuration file
|
129
|
+
workingdirectory = File.expand_path(File.dirname(__FILE__))
|
130
|
+
configfile = workingdirectory + '/config/application.yml'
|
131
|
+
config = YAML::load(File.open(configfile))
|
132
|
+
|
133
|
+
#Load the configured schema
|
134
|
+
schemafile = workingdirectory + "/config/" + config["echi_schema"]
|
135
|
+
@@echi_schema = YAML::load(File.open(schemafile))
|
136
|
+
|
137
|
+
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
|
138
|
+
end
|
139
|
+
|
140
|
+
task :environment do
|
141
|
+
ActiveRecord::Base.establish_connection(YAML::load(File.open('config/database.yml')))
|
142
|
+
ActiveRecord::Base.logger = Logger.new(File.open('log/database.log', 'a'))
|
143
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'yaml'
|
4
|
+
require 'fileutils'
|
5
|
+
include FileUtils
|
6
|
+
|
7
|
+
usage = "Usage: echi-converter-create /path/to/directory"
|
8
|
+
|
9
|
+
if ARGV[0] == nil
|
10
|
+
puts usage
|
11
|
+
puts "You must specify a directory name"
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
dest_dir_relative = ARGV[0] || Dir.pwd
|
16
|
+
dest_dir = File.expand_path dest_dir_relative
|
17
|
+
base_dir = File.expand_path File.dirname(__FILE__)
|
18
|
+
|
19
|
+
if RUBY_PLATFORM =~ /mswin32/
|
20
|
+
slash = "\ ".rstrip!
|
21
|
+
puts 'Windows'
|
22
|
+
else
|
23
|
+
puts 'Linux/OSX'
|
24
|
+
slash = "/"
|
25
|
+
end
|
26
|
+
|
27
|
+
#Obtain the details of which Gem is installed
|
28
|
+
gem_details = base_dir.split(slash)
|
29
|
+
location = gem_details.length - 2
|
30
|
+
puts 'Creating new ' + gem_details[location] + ' directory tree in ' + dest_dir
|
31
|
+
puts ' '
|
32
|
+
|
33
|
+
#Now, create the directory, must be a new 'fresh' one
|
34
|
+
begin
|
35
|
+
result = FileUtils.mkdir dest_dir_relative
|
36
|
+
puts 'Created diretory "' + result.to_s + '"'
|
37
|
+
rescue => err
|
38
|
+
puts 'ERROR: ' + err
|
39
|
+
puts 'Failed, exiting...'
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
|
43
|
+
#Now create various directories
|
44
|
+
logdir = dest_dir + slash +'log'
|
45
|
+
filesdir = dest_dir + slash + 'files'
|
46
|
+
csvdir = filesdir + slash + 'csv'
|
47
|
+
processeddir = filesdir + slash + 'processed'
|
48
|
+
toprocessdir = filesdir + slash + 'to_process'
|
49
|
+
begin
|
50
|
+
FileUtils.mkdir logdir
|
51
|
+
FileUtils.mkdir filesdir
|
52
|
+
FileUtils.mkdir csvdir
|
53
|
+
FileUtils.mkdir processeddir
|
54
|
+
FileUtils.mkdir toprocessdir
|
55
|
+
rescue => err
|
56
|
+
puts 'ERROR: ' + err
|
57
|
+
puts 'Failed, exiting...'
|
58
|
+
exit
|
59
|
+
end
|
60
|
+
|
61
|
+
#Now, start copying project files files
|
62
|
+
substitute = slash + '.'
|
63
|
+
base_dir = base_dir.sub('/bin', substitute)
|
64
|
+
new_dest_dir = dest_dir + slash + '.'
|
65
|
+
exe_file = dest_dir + slash + 'echi-converter'
|
66
|
+
begin
|
67
|
+
FileUtils.cp_r base_dir, new_dest_dir
|
68
|
+
FileUtils.chmod 0755, exe_file
|
69
|
+
rescue => err
|
70
|
+
puts 'ERROR: ' + err
|
71
|
+
puts 'Failed, exiting...'
|
72
|
+
exit
|
73
|
+
end
|
74
|
+
|
75
|
+
puts ' '
|
76
|
+
puts 'ECHI Conveter directory created! Now ready for use.'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#Configuration details for the application
|
2
|
+
|
3
|
+
#Connection details for the Avaya CMS/ECHI host
|
4
|
+
echi_host: localhost
|
5
|
+
echi_port: 22
|
6
|
+
echi_username: jsgoecke
|
7
|
+
echi_password: sanfran2007!
|
8
|
+
echi_connect_type: ftp #only ftp supported now, possible for ssh in the future
|
9
|
+
echi_ftp_directory: /Users/ftp/anonymous
|
10
|
+
echi_ftp_retry: 3
|
11
|
+
echi_schema: extended_version12.yml
|
12
|
+
|
13
|
+
#Currently only ftp supported, but may want to add UUCP/Serial later
|
14
|
+
echi_xfer_type: ftp
|
15
|
+
|
16
|
+
#How frequently to fetch records off of the Avaya CMS ftp server
|
17
|
+
fetch_interval: 60 #in seconds
|
18
|
+
|
19
|
+
#Whether or not to insert into a database, into a csv file or both
|
20
|
+
export_type: database
|
21
|
+
|
22
|
+
#Options are:
|
23
|
+
#FATAL: an unhandleable error that results in a program crash
|
24
|
+
#ERROR: a handleable error condition
|
25
|
+
#WARN: a warning
|
26
|
+
#INFO: generic (useful) information about system operation
|
27
|
+
#DEBUG: low-level information for developers
|
28
|
+
#NONE: turn off logging
|
29
|
+
log_level: DEBUG
|
30
|
+
#How many log files to create and the length before cycling through
|
31
|
+
log_number: 10
|
32
|
+
#The size of each individual log file
|
33
|
+
log_length: 10240000
|
data/config/database.yml
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
#ECH File construct, order is important, as the application sequentially reads the file
|
2
|
+
#Version 12 - Extended Schema
|
3
|
+
fields:
|
4
|
+
- name: callid
|
5
|
+
type: int
|
6
|
+
length: 4
|
7
|
+
- name: acwtime
|
8
|
+
type: int
|
9
|
+
length: 4
|
10
|
+
- name: onholdtime
|
11
|
+
type: int
|
12
|
+
length: 4
|
13
|
+
- name: consulttime
|
14
|
+
type: int
|
15
|
+
length: 4
|
16
|
+
- name: disptime
|
17
|
+
type: int
|
18
|
+
length: 4
|
19
|
+
- name: duration
|
20
|
+
type: int
|
21
|
+
length: 4
|
22
|
+
- name: segstart
|
23
|
+
type: datetime
|
24
|
+
length: 4
|
25
|
+
- name: segstop
|
26
|
+
type: datetime
|
27
|
+
length: 4
|
28
|
+
- name: talktime
|
29
|
+
type: int
|
30
|
+
length: 4
|
31
|
+
- name: netintime
|
32
|
+
type: int
|
33
|
+
length: 4
|
34
|
+
- name: origholdtime
|
35
|
+
type: int
|
36
|
+
length: 4
|
37
|
+
- name: queuetime
|
38
|
+
type: int
|
39
|
+
length: 4
|
40
|
+
- name: ringtime
|
41
|
+
type: int
|
42
|
+
length: 4
|
43
|
+
- name: dispivector
|
44
|
+
type: int
|
45
|
+
length: 2
|
46
|
+
- name: dispsplit
|
47
|
+
type: int
|
48
|
+
length: 2
|
49
|
+
- name: firstivector
|
50
|
+
type: int
|
51
|
+
length: 2
|
52
|
+
- name: split1
|
53
|
+
type: int
|
54
|
+
length: 2
|
55
|
+
- name: split2
|
56
|
+
type: int
|
57
|
+
length: 2
|
58
|
+
- name: split3
|
59
|
+
type: int
|
60
|
+
length: 2
|
61
|
+
- name: trunkgroup
|
62
|
+
type: int
|
63
|
+
length: 2
|
64
|
+
- name: tk_locid
|
65
|
+
type: int
|
66
|
+
length: 2
|
67
|
+
- name: orig_locid
|
68
|
+
type: int
|
69
|
+
length: 2
|
70
|
+
- name: answer_locid
|
71
|
+
type: int
|
72
|
+
length: 2
|
73
|
+
- name: obs_locid
|
74
|
+
type: int
|
75
|
+
length: 2
|
76
|
+
- name: uui_len
|
77
|
+
type: int
|
78
|
+
length: 2
|
79
|
+
- name: assist
|
80
|
+
type: bool
|
81
|
+
length: 1
|
82
|
+
- name: audio_difficulty
|
83
|
+
type: bool
|
84
|
+
length: 1
|
85
|
+
- name: conference
|
86
|
+
type: bool
|
87
|
+
length: 1
|
88
|
+
- name: da_queued
|
89
|
+
type: bool
|
90
|
+
length: 1
|
91
|
+
- name: hold_abn
|
92
|
+
type: bool
|
93
|
+
length: 1
|
94
|
+
- name: malicious
|
95
|
+
type: bool
|
96
|
+
length: 1
|
97
|
+
- name: observing_call
|
98
|
+
type: bool
|
99
|
+
length: 1
|
100
|
+
- name: transferred
|
101
|
+
type: bool
|
102
|
+
length: 1
|
103
|
+
- name: agent_released
|
104
|
+
type: bool_int
|
105
|
+
length: 1
|
106
|
+
- name: acdnum
|
107
|
+
type: int
|
108
|
+
length: 1
|
109
|
+
- name: call_disp
|
110
|
+
type: int
|
111
|
+
length: 1
|
112
|
+
- name: disppriority
|
113
|
+
type: int
|
114
|
+
length: 1
|
115
|
+
- name: holds
|
116
|
+
type: int
|
117
|
+
length: 1
|
118
|
+
- name: segment
|
119
|
+
type: int
|
120
|
+
length: 1
|
121
|
+
- name: ansreason
|
122
|
+
type: int
|
123
|
+
length: 1
|
124
|
+
- name: origreason
|
125
|
+
type: int
|
126
|
+
length: 1
|
127
|
+
- name: dispsklevel
|
128
|
+
type: int
|
129
|
+
length: 1
|
130
|
+
- name: events0
|
131
|
+
type: int
|
132
|
+
length: 1
|
133
|
+
- name: events1
|
134
|
+
type: int
|
135
|
+
length: 1
|
136
|
+
- name: events2
|
137
|
+
type: int
|
138
|
+
length: 1
|
139
|
+
- name: events3
|
140
|
+
type: int
|
141
|
+
length: 1
|
142
|
+
- name: events4
|
143
|
+
type: int
|
144
|
+
length: 1
|
145
|
+
- name: events5
|
146
|
+
type: int
|
147
|
+
length: 1
|
148
|
+
- name: events6
|
149
|
+
type: int
|
150
|
+
length: 1
|
151
|
+
- name: events7
|
152
|
+
type: int
|
153
|
+
length: 1
|
154
|
+
- name: events8
|
155
|
+
type: int
|
156
|
+
length: 1
|
157
|
+
- name: ucid
|
158
|
+
type: str
|
159
|
+
length: 21
|
160
|
+
- name: dispvdn
|
161
|
+
type: str
|
162
|
+
length: 8
|
163
|
+
- name: eqloc
|
164
|
+
type: str
|
165
|
+
length: 10
|
166
|
+
- name: firstvdn
|
167
|
+
type: str
|
168
|
+
length: 8
|
169
|
+
- name: orig_logid
|
170
|
+
type: str
|
171
|
+
length: 10
|
172
|
+
- name: ans_logid
|
173
|
+
type: str
|
174
|
+
length: 10
|
175
|
+
- name: last_observer
|
176
|
+
type: str
|
177
|
+
length: 10
|
178
|
+
- name: dialed_number
|
179
|
+
type: str
|
180
|
+
length: 25
|
181
|
+
- name: calling_party
|
182
|
+
type: str
|
183
|
+
length: 13
|
184
|
+
- name: collect_digits
|
185
|
+
type: str
|
186
|
+
length: 17
|
187
|
+
- name: cwc_digits
|
188
|
+
type: str
|
189
|
+
length: 17
|
190
|
+
- name: calling_II
|
191
|
+
type: str
|
192
|
+
length: 3
|
193
|
+
- name: cwcs0
|
194
|
+
type: str
|
195
|
+
length: 17
|
196
|
+
- name: cwcs1
|
197
|
+
type: str
|
198
|
+
length: 17
|
199
|
+
- name: cwcs2
|
200
|
+
type: str
|
201
|
+
length: 17
|
202
|
+
- name: cwcs3
|
203
|
+
type: str
|
204
|
+
length: 17
|
205
|
+
- name: cwcs4
|
206
|
+
type: str
|
207
|
+
length: 17
|
208
|
+
- name: vdn2
|
209
|
+
type: str
|
210
|
+
length: 8
|
211
|
+
- name: vdn3
|
212
|
+
type: str
|
213
|
+
length: 8
|
214
|
+
- name: vdn4
|
215
|
+
type: str
|
216
|
+
length: 8
|
217
|
+
- name: vdn5
|
218
|
+
type: str
|
219
|
+
length: 8
|
220
|
+
- name: vdn6
|
221
|
+
type: str
|
222
|
+
length: 8
|
223
|
+
- name: vdn7
|
224
|
+
type: str
|
225
|
+
length: 8
|
226
|
+
- name: vdn8
|
227
|
+
type: str
|
228
|
+
length: 8
|
229
|
+
- name: vdn9
|
230
|
+
type: str
|
231
|
+
length: 8
|
232
|
+
- name: asaiuui
|
233
|
+
type: str
|
234
|
+
length: 96
|