ecutools 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@ module ECUTools
5
5
  $stderr.puts "Getting ROM ID..." if verbose
6
6
  @rom_id = read_bytes("5002a", 4).join
7
7
  end
8
-
8
+
9
9
  def read_bytes(address, number)
10
10
  bytes = []
11
11
  start = from_hex address
@@ -15,7 +15,7 @@ module ECUTools
15
15
  end
16
16
  bytes
17
17
  end
18
-
18
+
19
19
  def instruction_at(address, strict = false)
20
20
  address = from_hex address
21
21
  if strict and (address % 4) > 0
@@ -23,7 +23,7 @@ module ECUTools
23
23
  end
24
24
  @assembly[(address - (address % 4)) / 4]
25
25
  end
26
-
26
+
27
27
  def from_hex(address)
28
28
  if address.is_a? String
29
29
  address.to_i(16)
@@ -31,7 +31,7 @@ module ECUTools
31
31
  address.to_i
32
32
  end
33
33
  end
34
-
34
+
35
35
  def base_address
36
36
  return @base_address if @base_address
37
37
  $stderr.puts "Getting base address..." if verbose
@@ -45,40 +45,77 @@ module ECUTools
45
45
  end
46
46
  end
47
47
  end
48
-
48
+
49
49
  $stderr.puts "WARNING: Base address unknown! Setting to 0 (THIS IS WRONG!)" if verbose
50
50
  @base_address = 0
51
51
  end
52
-
52
+
53
53
  def absolute_address(relative_address)
54
54
  (base_address.to_i(16) + relative_address).to_s(16)
55
55
  end
56
-
56
+
57
57
  def address_descriptions
58
58
  return @address_descriptions if @address_descriptions
59
59
  @address_descriptions = {}
60
- xml = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/ram/#{rom_id}.xml"))
61
- xml.xpath('/EvoScanDataLogger/vehicle/ecu/Mode2/DataListItem').each do |node|
62
- @address_descriptions[node.attr('RequestID')[2..-1]] = node.attr('Display')
60
+ begin
61
+ xml = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/ram/#{rom_id}.xml"))
62
+ xml.xpath('/EvoScanDataLogger/vehicle/ecu/Mode2/DataListItem').each do |node|
63
+ @address_descriptions[node.attr('RequestID')[2..-1]] = node.attr('Display')
64
+ end
65
+ rescue
66
+ $stderr.puts "No RAM map found for this rom, skipping subroutine identification." if verbose
63
67
  end
64
68
 
65
69
  @address_descriptions
66
70
  end
67
-
71
+
68
72
  def subroutine_descriptions
69
73
  return @subroutine_descriptions if @subroutine_descriptions
70
74
  @subroutine_descriptions = {}
71
- xml = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/code/#{rom_id}.xml"))
72
- xml.xpath('/rom/routine').each do |node|
73
- @subroutine_descriptions[node.attr('address')] = node.attr('name')
75
+ begin
76
+ xml = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/code/#{rom_id}.xml"))
77
+ xml.xpath('/rom/routine').each do |node|
78
+ @subroutine_descriptions[node.attr('address')] = node.attr('name')
79
+ end
80
+ rescue
81
+ $stderr.puts "No subroutine map found for this rom, skipping subroutine identification." if verbose
74
82
  end
75
83
 
76
84
  @subroutine_descriptions
77
85
  end
78
-
86
+
79
87
  def rom_xml
80
88
  return @rom_xml if @rom_xml
81
- @rom_xml = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/rom/#{rom_id}.xml"))
89
+ @rom_xml = load_rom_xml(rom_id)
90
+
91
+ @rom_xml
92
+ end
93
+
94
+ def load_rom_xml(rom_number)
95
+
96
+ load_rom = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/rom/#{rom_number}.xml"))
97
+
98
+ load_rom.xpath('/rom/include').each do |include_tag|
99
+
100
+ include_rom = Nokogiri::XML(File.open(File.dirname(__FILE__) + "/../xml/rom/#{include_tag.text}.xml"))
101
+
102
+ # import scalings
103
+ include_rom.xpath('/rom/scaling').each do |scaling|
104
+ if load_rom.xpath("/rom/scaling[@name='#{scaling.attr('name')}']").count == 0
105
+ load_rom.xpath('/rom')[0].add_child(scaling)
106
+ end
107
+ end
108
+
109
+ #import tables
110
+ include_rom.xpath('/rom/table').each do |table|
111
+ if load_rom.xpath("/rom/table[@name='#{table.attr('name')}']").count == 0
112
+ load_rom.xpath('/rom')[0].add_child(table)
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ load_rom
82
119
  end
83
120
  end
84
121
  end
@@ -1,3 +1,3 @@
1
1
  module ECUTools
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
Binary file
@@ -0,0 +1,45 @@
1
+ <?xml version="1.0"?>
2
+ <EvoScanDataLogger>
3
+ <vehicle name="EcuTools Mitsubishi Evo X" LastUpdated="28th May 2011" LastAuthor="Hamish Ahern" LastAuthorContact="http://www.evoscan.com/help-and-support">
4
+ <ecu name="52690022">
5
+ <Mode2 name="Mode2" type="Data List Items">
6
+ <DataListItem DataLog="Y" Color="" Display="RPM" LogReference="RPM" RequestID="23808746" Eval="3.90625*x" Unit="rpm" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="8000" ChartMin="0" ChartMax="8000" ScalingFactor="0.01" Notes="" Priority="1" Visible="False" />
7
+ <DataListItem DataLog="Y" Color="" Display="Speed" LogReference="Speed" RequestID="238087E7" Eval="1.26*x" Unit="mph" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
8
+ <DataListItem DataLog="Y" Color="" Display="Load (Fuel)" LogReference="Load" RequestID="2380876E" Eval="x*10/32" Unit="load" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="340" ChartMin="0" ChartMax="340" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
9
+ <DataListItem DataLog="N" Color="" Display="Barometer" LogReference="Baro" RequestID="2380A909" Eval="x/2" Unit="bar" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Used for Fuel compensation for differences in altitude above sea level. " Priority="1" Visible="False" />
10
+ <DataListItem DataLog="Y" Color="#4b0000" Display="Boost" LogReference="Boost" RequestID="2380871A" Eval="(x/4*0.19347)-14.5" Unit="PSIG" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
11
+ <DataListItem DataLog="Y" Color="" Display="Injector Pulse Width (IPW)" LogReference="IPW" RequestID="2380A944" Eval="x/1000" Unit="ms" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Injector Pulse Width (Fuel utilisation)&#xD;&#xA;Length of time the injectors are open using fuel." Priority="1" Visible="False" />
12
+ <DataListItem DataLog="Y" Color="#ff002d" Display="Knock Sum" LogReference="KnockSum" RequestID="23808A4B" Eval="x" Unit="count" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
13
+ <DataListItem DataLog="N" Color="#90ff00" Display="External Wideband A/F Ratio" LogReference="WideBandAF" RequestID="WDB" Eval="x" Unit="a/f ratio" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="20" ChartMin="0" ChartMax="20" ScalingFactor="1" Notes="Plug in your serial port from your wideband oxygen sensor if you have one." Priority="1" Visible="False" />
14
+ <DataListItem DataLog="Y" Color="" Display="Timing Advance" LogReference="TimingAdv" RequestID="23808A07" Eval="x-20" Unit="deg" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="-15" GaugeMax="50" ChartMin="-15" ChartMax="50" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
15
+ <DataListItem DataLog="Y" Color="" Display="Throttle Position (TPS)" LogReference="TPS" RequestID="238086F9" Eval="(x-32)*129/255" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
16
+ <DataListItem DataLog="N" Color="" Display="Transmission Temp" LogReference="Trans_Temp" RequestID="CAN28-0" Eval="1.8*x-50" Unit="Deg F" MetricEval="x-50" MetricUnit="Deg C" ResponseBytes="1" GaugeMin="0" GaugeMax="1000" ChartMin="0" ChartMax="1000" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
17
+ <DataListItem DataLog="Y" Color="" Display="Intake Air Temp (IAT)" LogReference="IAT" RequestID="23808659" Eval="1.8*x-40" Unit="Deg F" MetricEval="x-40" MetricUnit="Deg C" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
18
+ <DataListItem DataLog="Y" Color="" Display="Manifold Air Temp (MAT)" LogReference="MAT" RequestID="2380865F" Eval="1.8*x-40" Unit="Deg F" MetricEval="x-40" MetricUnit="Deg C" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
19
+ <DataListItem DataLog="Y" Color="" Display="Octane" LogReference="Octane" RequestID="2380459F" Eval="x*100/255" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="The Octane Level will start at 100% and decrease if there is persistant knock sum present. the Octane Level % is used as part of adjustment to the Timing (% between Low Octane Timing ecu map and High Octane Timing ecu map) to help protect the engine from excessive knock, normally caused by lean fuel conditions (excessive heat), or bad octane fuel." Priority="1" Visible="False" />
20
+ <DataListItem DataLog="Y" Color="" Display="Fuel Trim (STFT)" LogReference="STFT" RequestID="23808898" Eval="(0.1953125*x)-25" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Short Term Fuel Trim" Priority="1" Visible="False" />
21
+ <DataListItem DataLog="Y" Color="" Display="Fuel Trim Idle/Low (LTFT)" LogReference="LTFT_Idle" RequestID="23804573" Eval="(0.1953125*x)-25" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Long Term Fuel Trim" Priority="1" Visible="False" />
22
+ <DataListItem DataLog="Y" Color="" Display="Fuel Trim Cruise/Mid (LTFT)" LogReference="LTFT_Cruise" RequestID="23804575" Eval="(0.1953125*x)-25" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Long Term Fuel Trim Cruise" Priority="1" Visible="False" />
23
+ <DataListItem DataLog="Y" Color="" Display="Fuel Trim High (LTFT)" LogReference="LTFT_High" RequestID="23804577" Eval="(0.1953125*x)-25" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Long Term Fuel Trim Cruise" Priority="1" Visible="False" />
24
+ <DataListItem DataLog="Y" Color="" Display="Engine Coolant Temp (ECT)" LogReference="ECT" RequestID="2380863F" Eval="1.8*x-40" Unit="Deg F" MetricEval="x-40" MetricUnit="Deg C" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Water coolant temp." Priority="1" Visible="False" />
25
+ <DataListItem DataLog="N" Color="" Display="Injector Duty Cycle (IDC)" LogReference="IDC" RequestID="23808746" Eval="[IPW]*3.90625*x/1200" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="100" ChartMin="0" ChartMax="100" ScalingFactor="1" Notes="Injector Duty Cycle. A percentage of injector utilisation." Priority="1" Visible="False" />
26
+ <DataListItem DataLog="Y" Color="" Display="Active WasteGateDuty (WGDC)" LogReference="ActiveWGDC" RequestID="23808B53" Eval="x/2" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Active Wastegate Duty Cycle" Priority="1" Visible="False" />
27
+ <DataListItem DataLog="Y" Color="" Display="Passive WasteGateDuty (WGDC)" LogReference="PassiveWGDC" RequestID="2380A53F" Eval="x/2" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Passive Wastegate Duty Cycle" Priority="1" Visible="False" />
28
+ <DataListItem DataLog="Y" Color="" Display="Active WGDC Correction" LogReference="ActiveWGDCC" RequestID="23808B51" Eval="0.5*x-64" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Active Wastegate Duty Cycle Correction" Priority="1" Visible="False" />
29
+ <DataListItem DataLog="Y" Color="" Display="Boost Error Correction" LogReference="BoostError" RequestID="23808B50" Eval="(x-128)/2" Unit="unit" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
30
+ <DataListItem DataLog="Y" Color="" Display="AFRMAP" LogReference="AFRMAP" RequestID="238088F5" Eval="14.7*128/x" Unit="AFR" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="ECU ROM Fuel Map Target AFR (Air Fuel Ratio)" Priority="1" Visible="False" />
31
+ <DataListItem DataLog="Y" Color="" Display="MAF Volts" LogReference="MAFVolts" RequestID="23808F50" Eval="x/1024*5" Unit="V" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="Intake Manifold Air Flow Sensor voltage." Priority="1" Visible="False" />
32
+ <DataListItem DataLog="Y" Color="" Display="Load (MIVEC) and (Timing if IAT GT 75F)" LogReference="LoadMIVEC" RequestID="23808774" Eval="x*10/32" Unit="load" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="340" ChartMin="0" ChartMax="340" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
33
+ <DataListItem DataLog="Y" Color="" Display="Load (Timing if IAT LE 75F)" LogReference="LoadLowIATTiming" RequestID="23808F70" Eval="x*10/32" Unit="load" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="340" ChartMin="0" ChartMax="340" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
34
+ <DataListItem DataLog="Y" Color="" Display="InVVT (target)" LogReference="InVVTtarget" RequestID="2380942E" Eval="(x-4096)*-0.01953125" Unit="Deg" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="-40" GaugeMax="50" ChartMin="-40" ChartMax="50" ScalingFactor="1" Notes="Intake Variable Valve Timing" Priority="1" Visible="False" />
35
+ <DataListItem DataLog="Y" Color="" Display="ExVVT (target)" LogReference="ExVVTtarget" RequestID="2380943A" Eval="(x-4096)*-0.01953125" Unit="Deg" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="-40" GaugeMax="50" ChartMin="-40" ChartMax="50" ScalingFactor="1" Notes="Exhaust Variable Valve Timing" Priority="1" Visible="False" />
36
+ <DataListItem DataLog="Y" Color="" Display="InVVT (actual)" LogReference="InVVTactual" RequestID="23809466" Eval="(x-4096)*-0.01953125" Unit="Deg" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="-40" GaugeMax="50" ChartMin="-40" ChartMax="50" ScalingFactor="1" Notes="Intake Variable Valve Timing" Priority="1" Visible="False" />
37
+ <DataListItem DataLog="Y" Color="" Display="ExVVT (actual)" LogReference="ExVVTactual" RequestID="23809472" Eval="(x-4096)*-0.01953125" Unit="Deg" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="-40" GaugeMax="50" ChartMin="-40" ChartMax="50" ScalingFactor="1" Notes="Exhaust Variable Valve Timing" Priority="1" Visible="False" />
38
+ <DataListItem DataLog="Y" Color="" Display="Accel Pedal Position" LogReference="APP" RequestID="23809505" Eval="(x-32)*129/255" Unit="%" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
39
+ <DataListItem DataLog="N" Color="" Display="Gear in use" LogReference="Gear" RequestID="2380886E" Eval="x/22.6" Unit="Gear" MetricEval="" MetricUnit="" ResponseBytes="2" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
40
+ <DataListItem DataLog="N" Color="" Display="Battery" LogReference="Battery" RequestID="238086EF" Eval="x*18.75/255" Unit="V" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="0" GaugeMax="255" ChartMin="0" ChartMax="255" ScalingFactor="1" Notes="" Priority="1" Visible="False" />
41
+ <DataListItem DataLog="N" Color="" Display="LC-1 AFR " LogReference="LC1AFR" RequestID="2380934E" Eval="(x/1023*5.99)+10" Unit="afr" MetricEval="" MetricUnit="" ResponseBytes="1" GaugeMin="10" GaugeMax="16" ChartMin="10" ChartMax="16" ScalingFactor="1" Notes="Innovate LC-1 Air Fuel Ratio when connected directly to the ecu pin.&#xD;&#xA;Rear 02 Sensor ecu pin used for LC-1 volts output." Priority="1" Visible="False" />
42
+ </Mode2>
43
+ </ecu>
44
+ </vehicle>
45
+ </EvoScanDataLogger>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecutools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-18 00:00:00.000000000Z
12
+ date: 2012-03-19 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &2153437900 !ruby/object:Gem::Requirement
16
+ requirement: &2160472380 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.14'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2153437900
24
+ version_requirements: *2160472380
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &2153437380 !ruby/object:Gem::Requirement
27
+ requirement: &2160471600 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.5'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2153437380
35
+ version_requirements: *2160471600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: thor
38
- requirement: &2153436800 !ruby/object:Gem::Requirement
38
+ requirement: &2160471020 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0.14'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2153436800
46
+ version_requirements: *2160471020
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: nokogiri
49
- requirement: &2153436220 !ruby/object:Gem::Requirement
49
+ requirement: &2160470400 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '1.5'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2153436220
57
+ version_requirements: *2160470400
58
58
  description: Toolkit for ECU disassembly and analysis
59
59
  email: javier@granicus.com
60
60
  executables:
@@ -76,8 +76,10 @@ files:
76
76
  - lib/version.rb
77
77
  - tests/52690021.asm
78
78
  - tests/52690021.hex
79
+ - tests/52690022.hex
79
80
  - xml/code/52690021.xml
80
81
  - xml/ram/52690021.xml
82
+ - xml/ram/52690022.xml
81
83
  - xml/rom/52370023.xml
82
84
  - xml/rom/52370024.xml
83
85
  - xml/rom/52690019.xml