hardsploit_gui 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/Hardsploit_gui.rb +4 -5
- data/lib/class/Chip_clone.rb +70 -0
- data/lib/class/Chip_editor.rb +1 -0
- data/lib/class/Chip_management.rb +73 -52
- data/lib/class/ErrorMsg.rb +1 -0
- data/lib/class/Firmware.rb +1 -1
- data/lib/class/Progress_bar.rb +1 -1
- data/lib/class/Wire_helper.rb +6 -3
- data/lib/class/{I2C → i2c}/I2c_command.rb +0 -0
- data/lib/class/{I2C/I2c_export.rb → i2c/I2c_read.rb} +15 -15
- data/lib/class/{I2C → i2c}/I2c_scanner.rb +2 -1
- data/lib/class/{I2C → i2c}/I2c_settings.rb +1 -0
- data/lib/class/{I2C/I2c_import.rb → i2c/I2c_write.rb} +13 -12
- data/lib/class/{PARALLEL/Parallel_export.rb → parallel/Parallel_read.rb} +17 -18
- data/lib/class/{PARALLEL → parallel}/Parallel_settings.rb +0 -0
- data/lib/class/{PARALLEL/Parallel_import.rb → parallel/Parallel_write.rb} +11 -10
- data/lib/class/{SPI/Spi_export.rb → spi/Spi_read.rb} +15 -15
- data/lib/class/{SPI → spi}/Spi_settings.rb +0 -0
- data/lib/class/{SPI → spi}/Spi_sniffer.rb +2 -1
- data/lib/class/{SPI/Spi_import.rb → spi/Spi_write.rb} +13 -12
- data/lib/class/swd/Swd.rb +10 -10
- data/lib/class/swd/Swd_scanner.rb +2 -1
- data/lib/class/uart/Uart_baudrate.rb +1 -1
- data/lib/class/uart/Uart_console.rb +1 -1
- data/lib/class/uart/Uart_settings.rb +1 -0
- data/lib/db/development.sqlite3 +0 -0
- data/lib/gui/gui_chip_clone.rb +87 -0
- data/lib/gui/gui_chip_editor.rb +349 -349
- data/lib/gui/gui_chip_management.rb +378 -377
- data/lib/gui/gui_command_editor.rb +219 -219
- data/lib/gui/gui_export.rb +132 -132
- data/lib/gui/gui_export_manager.rb +93 -93
- data/lib/gui/gui_generic_commands.rb +202 -202
- data/lib/gui/gui_generic_read.rb +185 -0
- data/lib/gui/gui_generic_write.rb +142 -0
- data/lib/gui/gui_i2c_command.rb +116 -116
- data/lib/gui/gui_i2c_settings.rb +242 -230
- data/lib/gui/gui_import.rb +131 -131
- data/lib/gui/gui_parallel_settings.rb +195 -195
- data/lib/gui/gui_progress_bar.rb +85 -85
- data/lib/gui/gui_signal_mapper.rb +121 -121
- data/lib/gui/gui_signal_scanner.rb +146 -146
- data/lib/gui/gui_spi_settings.rb +313 -313
- data/lib/gui/gui_spi_sniffer.rb +112 -112
- data/lib/gui/gui_swd_settings.rb +166 -166
- data/lib/gui/gui_uart_baudrate.rb +114 -114
- data/lib/gui/gui_uart_console.rb +164 -164
- data/lib/gui/gui_uart_settings.rb +243 -243
- data/lib/gui/gui_wire_helper.rb +99 -99
- data/lib/gui_designer/compile_to_ruby.sh +14 -0
- data/lib/gui_designer/gui_chip_clone.ui +96 -0
- data/lib/gui_designer/gui_chip_management.ui +25 -22
- data/lib/gui_designer/{gui_generic_export.ui → gui_generic_read.ui} +152 -72
- data/lib/gui_designer/{gui_generic_import.ui → gui_generic_write.ui} +47 -47
- data/lib/gui_designer/gui_i2c_settings.ui +68 -60
- data/lib/hardsploit-api/Examples/swdProgrammer.rb +76 -0
- data/lib/hardsploit-api/Examples/testI2C.rb +183 -0
- data/lib/hardsploit-api/Examples/testNRF24L01.rb +122 -0
- data/lib/hardsploit-api/Examples/testParralel.rb +84 -0
- data/lib/hardsploit-api/Examples/testSPI.rb +113 -0
- data/lib/hardsploit-api/Examples/testSPISniffer.rb +91 -0
- data/lib/hardsploit-api/Examples/testSWD.rb +224 -0
- data/lib/hardsploit-api/Examples/testUARTBufferOverflow.rb +113 -0
- data/lib/hardsploit-api/Examples/testUARTConsole.rb +74 -0
- data/lib/hardsploit-api/Examples/testUARTFuzzer.rb +109 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/FPGA/VersionFPGA.rb +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
- data/lib/{Firmwares → hardsploit-api/Firmwares}/UC/VersionUC.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Core/HardsploitAPI.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Core/HardsploitAPI_CONSTANT.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Core/HardsploitAPI_ERROR.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Core/HardsploitAPI_FIRMWARE.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Core/HardsploitAPI_PROGRESS.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Core/HardsploitAPI_USB_COMMUNICATION.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/I2C/HardsploitAPI_I2C.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/SPI/HardsploitAPI_SPI.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/SWD/HardsploitAPI_SWD.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/SWD/HardsploitAPI_SWD_STM32.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/TEST/HardsploitAPI_TEST_INTERACT.rb +0 -0
- data/lib/{HardsploitAPI → hardsploit-api/HardsploitAPI}/Modules/UART/HardsploitAPI_UART.rb +0 -0
- data/lib/hardsploit-api/LICENSE.txt +674 -0
- data/lib/hardsploit-api/README.md +22 -0
- data/lib/hardsploit-api/TRADEMARK +3 -0
- data/lib/logs/error.log +80 -0
- metadata +65 -49
- data/lib/gui/gui_generic_export.rb +0 -164
- data/lib/gui/gui_generic_import.rb +0 -142
- data/lib/gui/gui_spi_import.rb +0 -126
@@ -1,219 +1,219 @@
|
|
1
|
-
=begin
|
2
|
-
** Form generated from reading ui file 'gui_command_editor.ui'
|
3
|
-
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.8.
|
6
|
-
**
|
7
|
-
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
|
-
=end
|
9
|
-
|
10
|
-
class Ui_Command_editor
|
11
|
-
attr_reader :gridLayout
|
12
|
-
attr_reader :vl
|
13
|
-
attr_reader :vl2
|
14
|
-
attr_reader :fl
|
15
|
-
attr_reader :lbl_chip
|
16
|
-
attr_reader :lbl_chip_val
|
17
|
-
attr_reader :lbl_cmd
|
18
|
-
attr_reader :lbl_cmd_val
|
19
|
-
attr_reader :lbl_name
|
20
|
-
attr_reader :lie_name
|
21
|
-
attr_reader :lbl_description
|
22
|
-
attr_reader :lie_description
|
23
|
-
attr_reader :vl3
|
24
|
-
attr_reader :label
|
25
|
-
attr_reader :tbl_bytes
|
26
|
-
attr_reader :hl2
|
27
|
-
attr_reader :btn_clone
|
28
|
-
attr_reader :btn_remove
|
29
|
-
attr_reader :btn_add_row
|
30
|
-
attr_reader :lie_text_2_bytes
|
31
|
-
attr_reader :horizontalSpacer
|
32
|
-
attr_reader :hl
|
33
|
-
attr_reader :hs
|
34
|
-
attr_reader :btn_cancel
|
35
|
-
attr_reader :btn_validate
|
36
|
-
|
37
|
-
def setupUi(command_editor)
|
38
|
-
if command_editor.objectName.nil?
|
39
|
-
command_editor.objectName = "command_editor"
|
40
|
-
end
|
41
|
-
command_editor.windowModality = Qt::ApplicationModal
|
42
|
-
command_editor.resize(540, 440)
|
43
|
-
@gridLayout = Qt::GridLayout.new(command_editor)
|
44
|
-
@gridLayout.objectName = "gridLayout"
|
45
|
-
@vl = Qt::VBoxLayout.new()
|
46
|
-
@vl.objectName = "vl"
|
47
|
-
@vl2 = Qt::VBoxLayout.new()
|
48
|
-
@vl2.objectName = "vl2"
|
49
|
-
@fl = Qt::FormLayout.new()
|
50
|
-
@fl.objectName = "fl"
|
51
|
-
@lbl_chip = Qt::Label.new(command_editor)
|
52
|
-
@lbl_chip.objectName = "lbl_chip"
|
53
|
-
|
54
|
-
@fl.setWidget(2, Qt::FormLayout::LabelRole, @lbl_chip)
|
55
|
-
|
56
|
-
@lbl_chip_val = Qt::Label.new(command_editor)
|
57
|
-
@lbl_chip_val.objectName = "lbl_chip_val"
|
58
|
-
|
59
|
-
@fl.setWidget(2, Qt::FormLayout::FieldRole, @lbl_chip_val)
|
60
|
-
|
61
|
-
@lbl_cmd = Qt::Label.new(command_editor)
|
62
|
-
@lbl_cmd.objectName = "lbl_cmd"
|
63
|
-
|
64
|
-
@fl.setWidget(3, Qt::FormLayout::LabelRole, @lbl_cmd)
|
65
|
-
|
66
|
-
@lbl_cmd_val = Qt::Label.new(command_editor)
|
67
|
-
@lbl_cmd_val.objectName = "lbl_cmd_val"
|
68
|
-
|
69
|
-
@fl.setWidget(3, Qt::FormLayout::FieldRole, @lbl_cmd_val)
|
70
|
-
|
71
|
-
@lbl_name = Qt::Label.new(command_editor)
|
72
|
-
@lbl_name.objectName = "lbl_name"
|
73
|
-
|
74
|
-
@fl.setWidget(6, Qt::FormLayout::LabelRole, @lbl_name)
|
75
|
-
|
76
|
-
@lie_name = Qt::LineEdit.new(command_editor)
|
77
|
-
@lie_name.objectName = "lie_name"
|
78
|
-
@lie_name.maximumSize = Qt::Size.new(300, 16777215)
|
79
|
-
@lie_name.maxLength = 25
|
80
|
-
|
81
|
-
@fl.setWidget(6, Qt::FormLayout::FieldRole, @lie_name)
|
82
|
-
|
83
|
-
@lbl_description = Qt::Label.new(command_editor)
|
84
|
-
@lbl_description.objectName = "lbl_description"
|
85
|
-
|
86
|
-
@fl.setWidget(7, Qt::FormLayout::LabelRole, @lbl_description)
|
87
|
-
|
88
|
-
@lie_description = Qt::LineEdit.new(command_editor)
|
89
|
-
@lie_description.objectName = "lie_description"
|
90
|
-
@lie_description.maximumSize = Qt::Size.new(300, 16777215)
|
91
|
-
@lie_description.maxLength = 200
|
92
|
-
|
93
|
-
@fl.setWidget(7, Qt::FormLayout::FieldRole, @lie_description)
|
94
|
-
|
95
|
-
|
96
|
-
@vl2.addLayout(@fl)
|
97
|
-
|
98
|
-
@vl3 = Qt::VBoxLayout.new()
|
99
|
-
@vl3.objectName = "vl3"
|
100
|
-
@label = Qt::Label.new(command_editor)
|
101
|
-
@label.objectName = "label"
|
102
|
-
|
103
|
-
@vl3.addWidget(@label)
|
104
|
-
|
105
|
-
@tbl_bytes = Qt::TableWidget.new(command_editor)
|
106
|
-
@tbl_bytes.objectName = "tbl_bytes"
|
107
|
-
@font = Qt::Font.new
|
108
|
-
@font.family = "Arial"
|
109
|
-
@tbl_bytes.font = @font
|
110
|
-
@tbl_bytes.sortingEnabled = true
|
111
|
-
|
112
|
-
@vl3.addWidget(@tbl_bytes)
|
113
|
-
|
114
|
-
@hl2 = Qt::HBoxLayout.new()
|
115
|
-
@hl2.objectName = "hl2"
|
116
|
-
@btn_clone = Qt::PushButton.new(command_editor)
|
117
|
-
@btn_clone.objectName = "btn_clone"
|
118
|
-
@btn_clone.minimumSize = Qt::Size.new(0, 0)
|
119
|
-
@btn_clone.maximumSize = Qt::Size.new(16777215, 16777215)
|
120
|
-
|
121
|
-
@hl2.addWidget(@btn_clone)
|
122
|
-
|
123
|
-
@btn_remove = Qt::PushButton.new(command_editor)
|
124
|
-
@btn_remove.objectName = "btn_remove"
|
125
|
-
@btn_remove.maximumSize = Qt::Size.new(30, 16777215)
|
126
|
-
|
127
|
-
@hl2.addWidget(@btn_remove)
|
128
|
-
|
129
|
-
@btn_add_row = Qt::PushButton.new(command_editor)
|
130
|
-
@btn_add_row.objectName = "btn_add_row"
|
131
|
-
@btn_add_row.maximumSize = Qt::Size.new(30, 16777215)
|
132
|
-
|
133
|
-
@hl2.addWidget(@btn_add_row)
|
134
|
-
|
135
|
-
@lie_text_2_bytes = Qt::LineEdit.new(command_editor)
|
136
|
-
@lie_text_2_bytes.objectName = "lie_text_2_bytes"
|
137
|
-
@lie_text_2_bytes.maxLength = 200
|
138
|
-
|
139
|
-
@hl2.addWidget(@lie_text_2_bytes)
|
140
|
-
|
141
|
-
@horizontalSpacer = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
142
|
-
|
143
|
-
@hl2.addItem(@horizontalSpacer)
|
144
|
-
|
145
|
-
|
146
|
-
@vl3.addLayout(@hl2)
|
147
|
-
|
148
|
-
|
149
|
-
@vl2.addLayout(@vl3)
|
150
|
-
|
151
|
-
|
152
|
-
@vl.addLayout(@vl2)
|
153
|
-
|
154
|
-
@hl = Qt::HBoxLayout.new()
|
155
|
-
@hl.objectName = "hl"
|
156
|
-
@hs = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
157
|
-
|
158
|
-
@hl.addItem(@hs)
|
159
|
-
|
160
|
-
@btn_cancel = Qt::PushButton.new(command_editor)
|
161
|
-
@btn_cancel.objectName = "btn_cancel"
|
162
|
-
|
163
|
-
@hl.addWidget(@btn_cancel)
|
164
|
-
|
165
|
-
@btn_validate = Qt::PushButton.new(command_editor)
|
166
|
-
@btn_validate.objectName = "btn_validate"
|
167
|
-
|
168
|
-
@hl.addWidget(@btn_validate)
|
169
|
-
|
170
|
-
|
171
|
-
@vl.addLayout(@hl)
|
172
|
-
|
173
|
-
|
174
|
-
@gridLayout.addLayout(@vl, 0, 0, 1, 1)
|
175
|
-
|
176
|
-
|
177
|
-
retranslateUi(command_editor)
|
178
|
-
Qt::Object.connect(@btn_cancel, SIGNAL('clicked()'), command_editor, SLOT('close()'))
|
179
|
-
Qt::Object.connect(@btn_clone, SIGNAL('clicked()'), command_editor, SLOT('clone_row()'))
|
180
|
-
Qt::Object.connect(@btn_remove, SIGNAL('clicked()'), command_editor, SLOT('remove_row()'))
|
181
|
-
Qt::Object.connect(@btn_add_row, SIGNAL('clicked()'), command_editor, SLOT('add_row()'))
|
182
|
-
Qt::Object.connect(@tbl_bytes, SIGNAL('itemChanged(QTableWidgetItem*)'), command_editor, SLOT('check_cell_content(QTableWidgetItem*)'))
|
183
|
-
|
184
|
-
Qt::MetaObject.connectSlotsByName(command_editor)
|
185
|
-
end # setupUi
|
186
|
-
|
187
|
-
def setup_ui(command_editor)
|
188
|
-
setupUi(command_editor)
|
189
|
-
end
|
190
|
-
|
191
|
-
def retranslateUi(command_editor)
|
192
|
-
command_editor.windowTitle = Qt::Application.translate("Command_editor", "Hardsploit - Command editor", nil, Qt::Application::UnicodeUTF8)
|
193
|
-
@lbl_chip.text = Qt::Application.translate("Command_editor", "Current chip:", nil, Qt::Application::UnicodeUTF8)
|
194
|
-
@lbl_chip_val.text = Qt::Application.translate("Command_editor", "[CHIP]", nil, Qt::Application::UnicodeUTF8)
|
195
|
-
@lbl_cmd.text = Qt::Application.translate("Command_editor", "Current command:", nil, Qt::Application::UnicodeUTF8)
|
196
|
-
@lbl_cmd_val.text = Qt::Application.translate("Command_editor", "[CMD]", nil, Qt::Application::UnicodeUTF8)
|
197
|
-
@lbl_name.text = Qt::Application.translate("Command_editor", "Name:", nil, Qt::Application::UnicodeUTF8)
|
198
|
-
@lie_name.inputMask = ''
|
199
|
-
@lbl_description.text = Qt::Application.translate("Command_editor", "Description:", nil, Qt::Application::UnicodeUTF8)
|
200
|
-
@label.text = Qt::Application.translate("Command_editor", "Command bytes array:", nil, Qt::Application::UnicodeUTF8)
|
201
|
-
@btn_clone.text = Qt::Application.translate("Command_editor", "Clone", nil, Qt::Application::UnicodeUTF8)
|
202
|
-
@btn_remove.text = Qt::Application.translate("Command_editor", "-", nil, Qt::Application::UnicodeUTF8)
|
203
|
-
@btn_add_row.text = Qt::Application.translate("Command_editor", "+", nil, Qt::Application::UnicodeUTF8)
|
204
|
-
@lie_text_2_bytes.placeholderText = Qt::Application.translate("Command_editor", "Text to command bytes", nil, Qt::Application::UnicodeUTF8)
|
205
|
-
@btn_cancel.text = Qt::Application.translate("Command_editor", "Cancel", nil, Qt::Application::UnicodeUTF8)
|
206
|
-
@btn_validate.text = Qt::Application.translate("Command_editor", "Add", nil, Qt::Application::UnicodeUTF8)
|
207
|
-
end # retranslateUi
|
208
|
-
|
209
|
-
def retranslate_ui(command_editor)
|
210
|
-
retranslateUi(command_editor)
|
211
|
-
end
|
212
|
-
|
213
|
-
end
|
214
|
-
|
215
|
-
module Ui
|
216
|
-
class Command_editor < Ui_Command_editor
|
217
|
-
end
|
218
|
-
end # module Ui
|
219
|
-
|
1
|
+
=begin
|
2
|
+
** Form generated from reading ui file 'gui_command_editor.ui'
|
3
|
+
**
|
4
|
+
** Created: mer. mars 8 11:15:03 2017
|
5
|
+
** by: Qt User Interface Compiler version 4.8.7
|
6
|
+
**
|
7
|
+
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
|
+
=end
|
9
|
+
|
10
|
+
class Ui_Command_editor
|
11
|
+
attr_reader :gridLayout
|
12
|
+
attr_reader :vl
|
13
|
+
attr_reader :vl2
|
14
|
+
attr_reader :fl
|
15
|
+
attr_reader :lbl_chip
|
16
|
+
attr_reader :lbl_chip_val
|
17
|
+
attr_reader :lbl_cmd
|
18
|
+
attr_reader :lbl_cmd_val
|
19
|
+
attr_reader :lbl_name
|
20
|
+
attr_reader :lie_name
|
21
|
+
attr_reader :lbl_description
|
22
|
+
attr_reader :lie_description
|
23
|
+
attr_reader :vl3
|
24
|
+
attr_reader :label
|
25
|
+
attr_reader :tbl_bytes
|
26
|
+
attr_reader :hl2
|
27
|
+
attr_reader :btn_clone
|
28
|
+
attr_reader :btn_remove
|
29
|
+
attr_reader :btn_add_row
|
30
|
+
attr_reader :lie_text_2_bytes
|
31
|
+
attr_reader :horizontalSpacer
|
32
|
+
attr_reader :hl
|
33
|
+
attr_reader :hs
|
34
|
+
attr_reader :btn_cancel
|
35
|
+
attr_reader :btn_validate
|
36
|
+
|
37
|
+
def setupUi(command_editor)
|
38
|
+
if command_editor.objectName.nil?
|
39
|
+
command_editor.objectName = "command_editor"
|
40
|
+
end
|
41
|
+
command_editor.windowModality = Qt::ApplicationModal
|
42
|
+
command_editor.resize(540, 440)
|
43
|
+
@gridLayout = Qt::GridLayout.new(command_editor)
|
44
|
+
@gridLayout.objectName = "gridLayout"
|
45
|
+
@vl = Qt::VBoxLayout.new()
|
46
|
+
@vl.objectName = "vl"
|
47
|
+
@vl2 = Qt::VBoxLayout.new()
|
48
|
+
@vl2.objectName = "vl2"
|
49
|
+
@fl = Qt::FormLayout.new()
|
50
|
+
@fl.objectName = "fl"
|
51
|
+
@lbl_chip = Qt::Label.new(command_editor)
|
52
|
+
@lbl_chip.objectName = "lbl_chip"
|
53
|
+
|
54
|
+
@fl.setWidget(2, Qt::FormLayout::LabelRole, @lbl_chip)
|
55
|
+
|
56
|
+
@lbl_chip_val = Qt::Label.new(command_editor)
|
57
|
+
@lbl_chip_val.objectName = "lbl_chip_val"
|
58
|
+
|
59
|
+
@fl.setWidget(2, Qt::FormLayout::FieldRole, @lbl_chip_val)
|
60
|
+
|
61
|
+
@lbl_cmd = Qt::Label.new(command_editor)
|
62
|
+
@lbl_cmd.objectName = "lbl_cmd"
|
63
|
+
|
64
|
+
@fl.setWidget(3, Qt::FormLayout::LabelRole, @lbl_cmd)
|
65
|
+
|
66
|
+
@lbl_cmd_val = Qt::Label.new(command_editor)
|
67
|
+
@lbl_cmd_val.objectName = "lbl_cmd_val"
|
68
|
+
|
69
|
+
@fl.setWidget(3, Qt::FormLayout::FieldRole, @lbl_cmd_val)
|
70
|
+
|
71
|
+
@lbl_name = Qt::Label.new(command_editor)
|
72
|
+
@lbl_name.objectName = "lbl_name"
|
73
|
+
|
74
|
+
@fl.setWidget(6, Qt::FormLayout::LabelRole, @lbl_name)
|
75
|
+
|
76
|
+
@lie_name = Qt::LineEdit.new(command_editor)
|
77
|
+
@lie_name.objectName = "lie_name"
|
78
|
+
@lie_name.maximumSize = Qt::Size.new(300, 16777215)
|
79
|
+
@lie_name.maxLength = 25
|
80
|
+
|
81
|
+
@fl.setWidget(6, Qt::FormLayout::FieldRole, @lie_name)
|
82
|
+
|
83
|
+
@lbl_description = Qt::Label.new(command_editor)
|
84
|
+
@lbl_description.objectName = "lbl_description"
|
85
|
+
|
86
|
+
@fl.setWidget(7, Qt::FormLayout::LabelRole, @lbl_description)
|
87
|
+
|
88
|
+
@lie_description = Qt::LineEdit.new(command_editor)
|
89
|
+
@lie_description.objectName = "lie_description"
|
90
|
+
@lie_description.maximumSize = Qt::Size.new(300, 16777215)
|
91
|
+
@lie_description.maxLength = 200
|
92
|
+
|
93
|
+
@fl.setWidget(7, Qt::FormLayout::FieldRole, @lie_description)
|
94
|
+
|
95
|
+
|
96
|
+
@vl2.addLayout(@fl)
|
97
|
+
|
98
|
+
@vl3 = Qt::VBoxLayout.new()
|
99
|
+
@vl3.objectName = "vl3"
|
100
|
+
@label = Qt::Label.new(command_editor)
|
101
|
+
@label.objectName = "label"
|
102
|
+
|
103
|
+
@vl3.addWidget(@label)
|
104
|
+
|
105
|
+
@tbl_bytes = Qt::TableWidget.new(command_editor)
|
106
|
+
@tbl_bytes.objectName = "tbl_bytes"
|
107
|
+
@font = Qt::Font.new
|
108
|
+
@font.family = "Arial"
|
109
|
+
@tbl_bytes.font = @font
|
110
|
+
@tbl_bytes.sortingEnabled = true
|
111
|
+
|
112
|
+
@vl3.addWidget(@tbl_bytes)
|
113
|
+
|
114
|
+
@hl2 = Qt::HBoxLayout.new()
|
115
|
+
@hl2.objectName = "hl2"
|
116
|
+
@btn_clone = Qt::PushButton.new(command_editor)
|
117
|
+
@btn_clone.objectName = "btn_clone"
|
118
|
+
@btn_clone.minimumSize = Qt::Size.new(0, 0)
|
119
|
+
@btn_clone.maximumSize = Qt::Size.new(16777215, 16777215)
|
120
|
+
|
121
|
+
@hl2.addWidget(@btn_clone)
|
122
|
+
|
123
|
+
@btn_remove = Qt::PushButton.new(command_editor)
|
124
|
+
@btn_remove.objectName = "btn_remove"
|
125
|
+
@btn_remove.maximumSize = Qt::Size.new(30, 16777215)
|
126
|
+
|
127
|
+
@hl2.addWidget(@btn_remove)
|
128
|
+
|
129
|
+
@btn_add_row = Qt::PushButton.new(command_editor)
|
130
|
+
@btn_add_row.objectName = "btn_add_row"
|
131
|
+
@btn_add_row.maximumSize = Qt::Size.new(30, 16777215)
|
132
|
+
|
133
|
+
@hl2.addWidget(@btn_add_row)
|
134
|
+
|
135
|
+
@lie_text_2_bytes = Qt::LineEdit.new(command_editor)
|
136
|
+
@lie_text_2_bytes.objectName = "lie_text_2_bytes"
|
137
|
+
@lie_text_2_bytes.maxLength = 200
|
138
|
+
|
139
|
+
@hl2.addWidget(@lie_text_2_bytes)
|
140
|
+
|
141
|
+
@horizontalSpacer = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
142
|
+
|
143
|
+
@hl2.addItem(@horizontalSpacer)
|
144
|
+
|
145
|
+
|
146
|
+
@vl3.addLayout(@hl2)
|
147
|
+
|
148
|
+
|
149
|
+
@vl2.addLayout(@vl3)
|
150
|
+
|
151
|
+
|
152
|
+
@vl.addLayout(@vl2)
|
153
|
+
|
154
|
+
@hl = Qt::HBoxLayout.new()
|
155
|
+
@hl.objectName = "hl"
|
156
|
+
@hs = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
157
|
+
|
158
|
+
@hl.addItem(@hs)
|
159
|
+
|
160
|
+
@btn_cancel = Qt::PushButton.new(command_editor)
|
161
|
+
@btn_cancel.objectName = "btn_cancel"
|
162
|
+
|
163
|
+
@hl.addWidget(@btn_cancel)
|
164
|
+
|
165
|
+
@btn_validate = Qt::PushButton.new(command_editor)
|
166
|
+
@btn_validate.objectName = "btn_validate"
|
167
|
+
|
168
|
+
@hl.addWidget(@btn_validate)
|
169
|
+
|
170
|
+
|
171
|
+
@vl.addLayout(@hl)
|
172
|
+
|
173
|
+
|
174
|
+
@gridLayout.addLayout(@vl, 0, 0, 1, 1)
|
175
|
+
|
176
|
+
|
177
|
+
retranslateUi(command_editor)
|
178
|
+
Qt::Object.connect(@btn_cancel, SIGNAL('clicked()'), command_editor, SLOT('close()'))
|
179
|
+
Qt::Object.connect(@btn_clone, SIGNAL('clicked()'), command_editor, SLOT('clone_row()'))
|
180
|
+
Qt::Object.connect(@btn_remove, SIGNAL('clicked()'), command_editor, SLOT('remove_row()'))
|
181
|
+
Qt::Object.connect(@btn_add_row, SIGNAL('clicked()'), command_editor, SLOT('add_row()'))
|
182
|
+
Qt::Object.connect(@tbl_bytes, SIGNAL('itemChanged(QTableWidgetItem*)'), command_editor, SLOT('check_cell_content(QTableWidgetItem*)'))
|
183
|
+
|
184
|
+
Qt::MetaObject.connectSlotsByName(command_editor)
|
185
|
+
end # setupUi
|
186
|
+
|
187
|
+
def setup_ui(command_editor)
|
188
|
+
setupUi(command_editor)
|
189
|
+
end
|
190
|
+
|
191
|
+
def retranslateUi(command_editor)
|
192
|
+
command_editor.windowTitle = Qt::Application.translate("Command_editor", "Hardsploit - Command editor", nil, Qt::Application::UnicodeUTF8)
|
193
|
+
@lbl_chip.text = Qt::Application.translate("Command_editor", "Current chip:", nil, Qt::Application::UnicodeUTF8)
|
194
|
+
@lbl_chip_val.text = Qt::Application.translate("Command_editor", "[CHIP]", nil, Qt::Application::UnicodeUTF8)
|
195
|
+
@lbl_cmd.text = Qt::Application.translate("Command_editor", "Current command:", nil, Qt::Application::UnicodeUTF8)
|
196
|
+
@lbl_cmd_val.text = Qt::Application.translate("Command_editor", "[CMD]", nil, Qt::Application::UnicodeUTF8)
|
197
|
+
@lbl_name.text = Qt::Application.translate("Command_editor", "Name:", nil, Qt::Application::UnicodeUTF8)
|
198
|
+
@lie_name.inputMask = ''
|
199
|
+
@lbl_description.text = Qt::Application.translate("Command_editor", "Description:", nil, Qt::Application::UnicodeUTF8)
|
200
|
+
@label.text = Qt::Application.translate("Command_editor", "Command bytes array:", nil, Qt::Application::UnicodeUTF8)
|
201
|
+
@btn_clone.text = Qt::Application.translate("Command_editor", "Clone", nil, Qt::Application::UnicodeUTF8)
|
202
|
+
@btn_remove.text = Qt::Application.translate("Command_editor", "-", nil, Qt::Application::UnicodeUTF8)
|
203
|
+
@btn_add_row.text = Qt::Application.translate("Command_editor", "+", nil, Qt::Application::UnicodeUTF8)
|
204
|
+
@lie_text_2_bytes.placeholderText = Qt::Application.translate("Command_editor", "Text to command bytes", nil, Qt::Application::UnicodeUTF8)
|
205
|
+
@btn_cancel.text = Qt::Application.translate("Command_editor", "Cancel", nil, Qt::Application::UnicodeUTF8)
|
206
|
+
@btn_validate.text = Qt::Application.translate("Command_editor", "Add", nil, Qt::Application::UnicodeUTF8)
|
207
|
+
end # retranslateUi
|
208
|
+
|
209
|
+
def retranslate_ui(command_editor)
|
210
|
+
retranslateUi(command_editor)
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
module Ui
|
216
|
+
class Command_editor < Ui_Command_editor
|
217
|
+
end
|
218
|
+
end # module Ui
|
219
|
+
|
data/lib/gui/gui_export.rb
CHANGED
@@ -1,132 +1,132 @@
|
|
1
|
-
=begin
|
2
|
-
** Form generated from reading ui file 'gui_export.ui'
|
3
|
-
**
|
4
|
-
** Created: mer.
|
5
|
-
** by: Qt User Interface Compiler version 4.8.
|
6
|
-
**
|
7
|
-
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
|
-
=end
|
9
|
-
|
10
|
-
class Ui_Export
|
11
|
-
attr_reader :gridLayout
|
12
|
-
attr_reader :vl
|
13
|
-
attr_reader :lbl_export
|
14
|
-
attr_reader :hl2
|
15
|
-
attr_reader :rbn_comp
|
16
|
-
attr_reader :rbn_cmds
|
17
|
-
attr_reader :rbn_both
|
18
|
-
attr_reader :hl3
|
19
|
-
attr_reader :btn_file
|
20
|
-
attr_reader :hs2
|
21
|
-
attr_reader :hl
|
22
|
-
attr_reader :hs
|
23
|
-
attr_reader :btn_cancel
|
24
|
-
attr_reader :btn_export
|
25
|
-
|
26
|
-
def setupUi(export)
|
27
|
-
if export.objectName.nil?
|
28
|
-
export.objectName = "export"
|
29
|
-
end
|
30
|
-
export.resize(303, 120)
|
31
|
-
@gridLayout = Qt::GridLayout.new(export)
|
32
|
-
@gridLayout.objectName = "gridLayout"
|
33
|
-
@vl = Qt::VBoxLayout.new()
|
34
|
-
@vl.objectName = "vl"
|
35
|
-
@lbl_export = Qt::Label.new(export)
|
36
|
-
@lbl_export.objectName = "lbl_export"
|
37
|
-
|
38
|
-
@vl.addWidget(@lbl_export)
|
39
|
-
|
40
|
-
@hl2 = Qt::HBoxLayout.new()
|
41
|
-
@hl2.objectName = "hl2"
|
42
|
-
@rbn_comp = Qt::RadioButton.new(export)
|
43
|
-
@rbn_comp.objectName = "rbn_comp"
|
44
|
-
@rbn_comp.checked = true
|
45
|
-
|
46
|
-
@hl2.addWidget(@rbn_comp)
|
47
|
-
|
48
|
-
@rbn_cmds = Qt::RadioButton.new(export)
|
49
|
-
@rbn_cmds.objectName = "rbn_cmds"
|
50
|
-
|
51
|
-
@hl2.addWidget(@rbn_cmds)
|
52
|
-
|
53
|
-
@rbn_both = Qt::RadioButton.new(export)
|
54
|
-
@rbn_both.objectName = "rbn_both"
|
55
|
-
@rbn_both.checked = false
|
56
|
-
|
57
|
-
@hl2.addWidget(@rbn_both)
|
58
|
-
|
59
|
-
|
60
|
-
@vl.addLayout(@hl2)
|
61
|
-
|
62
|
-
@hl3 = Qt::HBoxLayout.new()
|
63
|
-
@hl3.objectName = "hl3"
|
64
|
-
@btn_file = Qt::PushButton.new(export)
|
65
|
-
@btn_file.objectName = "btn_file"
|
66
|
-
|
67
|
-
@hl3.addWidget(@btn_file)
|
68
|
-
|
69
|
-
@hs2 = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
70
|
-
|
71
|
-
@hl3.addItem(@hs2)
|
72
|
-
|
73
|
-
|
74
|
-
@vl.addLayout(@hl3)
|
75
|
-
|
76
|
-
@hl = Qt::HBoxLayout.new()
|
77
|
-
@hl.objectName = "hl"
|
78
|
-
@hs = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
79
|
-
|
80
|
-
@hl.addItem(@hs)
|
81
|
-
|
82
|
-
@btn_cancel = Qt::PushButton.new(export)
|
83
|
-
@btn_cancel.objectName = "btn_cancel"
|
84
|
-
|
85
|
-
@hl.addWidget(@btn_cancel)
|
86
|
-
|
87
|
-
@btn_export = Qt::PushButton.new(export)
|
88
|
-
@btn_export.objectName = "btn_export"
|
89
|
-
|
90
|
-
@hl.addWidget(@btn_export)
|
91
|
-
|
92
|
-
|
93
|
-
@vl.addLayout(@hl)
|
94
|
-
|
95
|
-
|
96
|
-
@gridLayout.addLayout(@vl, 0, 0, 1, 1)
|
97
|
-
|
98
|
-
|
99
|
-
retranslateUi(export)
|
100
|
-
Qt::Object.connect(@btn_cancel, SIGNAL('clicked()'), export, SLOT('close()'))
|
101
|
-
Qt::Object.connect(@btn_export, SIGNAL('clicked()'), export, SLOT('export()'))
|
102
|
-
Qt::Object.connect(@btn_file, SIGNAL('clicked()'), export, SLOT('export_file()'))
|
103
|
-
|
104
|
-
Qt::MetaObject.connectSlotsByName(export)
|
105
|
-
end # setupUi
|
106
|
-
|
107
|
-
def setup_ui(export)
|
108
|
-
setupUi(export)
|
109
|
-
end
|
110
|
-
|
111
|
-
def retranslateUi(export)
|
112
|
-
export.windowTitle = Qt::Application.translate("Export", "Export", nil, Qt::Application::UnicodeUTF8)
|
113
|
-
@lbl_export.text = Qt::Application.translate("Export", "
|
114
|
-
@rbn_comp.text = Qt::Application.translate("Export", "Component", nil, Qt::Application::UnicodeUTF8)
|
115
|
-
@rbn_cmds.text = Qt::Application.translate("Export", "Commands", nil, Qt::Application::UnicodeUTF8)
|
116
|
-
@rbn_both.text = Qt::Application.translate("Export", "Both", nil, Qt::Application::UnicodeUTF8)
|
117
|
-
@btn_file.text = Qt::Application.translate("Export", "File...", nil, Qt::Application::UnicodeUTF8)
|
118
|
-
@btn_cancel.text = Qt::Application.translate("Export", "Cancel", nil, Qt::Application::UnicodeUTF8)
|
119
|
-
@btn_export.text = Qt::Application.translate("Export", "Export", nil, Qt::Application::UnicodeUTF8)
|
120
|
-
end # retranslateUi
|
121
|
-
|
122
|
-
def retranslate_ui(export)
|
123
|
-
retranslateUi(export)
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
module Ui
|
129
|
-
class Export < Ui_Export
|
130
|
-
end
|
131
|
-
end # module Ui
|
132
|
-
|
1
|
+
=begin
|
2
|
+
** Form generated from reading ui file 'gui_export.ui'
|
3
|
+
**
|
4
|
+
** Created: mer. mars 8 11:15:03 2017
|
5
|
+
** by: Qt User Interface Compiler version 4.8.7
|
6
|
+
**
|
7
|
+
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
|
+
=end
|
9
|
+
|
10
|
+
class Ui_Export
|
11
|
+
attr_reader :gridLayout
|
12
|
+
attr_reader :vl
|
13
|
+
attr_reader :lbl_export
|
14
|
+
attr_reader :hl2
|
15
|
+
attr_reader :rbn_comp
|
16
|
+
attr_reader :rbn_cmds
|
17
|
+
attr_reader :rbn_both
|
18
|
+
attr_reader :hl3
|
19
|
+
attr_reader :btn_file
|
20
|
+
attr_reader :hs2
|
21
|
+
attr_reader :hl
|
22
|
+
attr_reader :hs
|
23
|
+
attr_reader :btn_cancel
|
24
|
+
attr_reader :btn_export
|
25
|
+
|
26
|
+
def setupUi(export)
|
27
|
+
if export.objectName.nil?
|
28
|
+
export.objectName = "export"
|
29
|
+
end
|
30
|
+
export.resize(303, 120)
|
31
|
+
@gridLayout = Qt::GridLayout.new(export)
|
32
|
+
@gridLayout.objectName = "gridLayout"
|
33
|
+
@vl = Qt::VBoxLayout.new()
|
34
|
+
@vl.objectName = "vl"
|
35
|
+
@lbl_export = Qt::Label.new(export)
|
36
|
+
@lbl_export.objectName = "lbl_export"
|
37
|
+
|
38
|
+
@vl.addWidget(@lbl_export)
|
39
|
+
|
40
|
+
@hl2 = Qt::HBoxLayout.new()
|
41
|
+
@hl2.objectName = "hl2"
|
42
|
+
@rbn_comp = Qt::RadioButton.new(export)
|
43
|
+
@rbn_comp.objectName = "rbn_comp"
|
44
|
+
@rbn_comp.checked = true
|
45
|
+
|
46
|
+
@hl2.addWidget(@rbn_comp)
|
47
|
+
|
48
|
+
@rbn_cmds = Qt::RadioButton.new(export)
|
49
|
+
@rbn_cmds.objectName = "rbn_cmds"
|
50
|
+
|
51
|
+
@hl2.addWidget(@rbn_cmds)
|
52
|
+
|
53
|
+
@rbn_both = Qt::RadioButton.new(export)
|
54
|
+
@rbn_both.objectName = "rbn_both"
|
55
|
+
@rbn_both.checked = false
|
56
|
+
|
57
|
+
@hl2.addWidget(@rbn_both)
|
58
|
+
|
59
|
+
|
60
|
+
@vl.addLayout(@hl2)
|
61
|
+
|
62
|
+
@hl3 = Qt::HBoxLayout.new()
|
63
|
+
@hl3.objectName = "hl3"
|
64
|
+
@btn_file = Qt::PushButton.new(export)
|
65
|
+
@btn_file.objectName = "btn_file"
|
66
|
+
|
67
|
+
@hl3.addWidget(@btn_file)
|
68
|
+
|
69
|
+
@hs2 = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
70
|
+
|
71
|
+
@hl3.addItem(@hs2)
|
72
|
+
|
73
|
+
|
74
|
+
@vl.addLayout(@hl3)
|
75
|
+
|
76
|
+
@hl = Qt::HBoxLayout.new()
|
77
|
+
@hl.objectName = "hl"
|
78
|
+
@hs = Qt::SpacerItem.new(40, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
|
79
|
+
|
80
|
+
@hl.addItem(@hs)
|
81
|
+
|
82
|
+
@btn_cancel = Qt::PushButton.new(export)
|
83
|
+
@btn_cancel.objectName = "btn_cancel"
|
84
|
+
|
85
|
+
@hl.addWidget(@btn_cancel)
|
86
|
+
|
87
|
+
@btn_export = Qt::PushButton.new(export)
|
88
|
+
@btn_export.objectName = "btn_export"
|
89
|
+
|
90
|
+
@hl.addWidget(@btn_export)
|
91
|
+
|
92
|
+
|
93
|
+
@vl.addLayout(@hl)
|
94
|
+
|
95
|
+
|
96
|
+
@gridLayout.addLayout(@vl, 0, 0, 1, 1)
|
97
|
+
|
98
|
+
|
99
|
+
retranslateUi(export)
|
100
|
+
Qt::Object.connect(@btn_cancel, SIGNAL('clicked()'), export, SLOT('close()'))
|
101
|
+
Qt::Object.connect(@btn_export, SIGNAL('clicked()'), export, SLOT('export()'))
|
102
|
+
Qt::Object.connect(@btn_file, SIGNAL('clicked()'), export, SLOT('export_file()'))
|
103
|
+
|
104
|
+
Qt::MetaObject.connectSlotsByName(export)
|
105
|
+
end # setupUi
|
106
|
+
|
107
|
+
def setup_ui(export)
|
108
|
+
setupUi(export)
|
109
|
+
end
|
110
|
+
|
111
|
+
def retranslateUi(export)
|
112
|
+
export.windowTitle = Qt::Application.translate("Export", "Export", nil, Qt::Application::UnicodeUTF8)
|
113
|
+
@lbl_export.text = Qt::Application.translate("Export", "Export:", nil, Qt::Application::UnicodeUTF8)
|
114
|
+
@rbn_comp.text = Qt::Application.translate("Export", "Component", nil, Qt::Application::UnicodeUTF8)
|
115
|
+
@rbn_cmds.text = Qt::Application.translate("Export", "Commands", nil, Qt::Application::UnicodeUTF8)
|
116
|
+
@rbn_both.text = Qt::Application.translate("Export", "Both", nil, Qt::Application::UnicodeUTF8)
|
117
|
+
@btn_file.text = Qt::Application.translate("Export", "File...", nil, Qt::Application::UnicodeUTF8)
|
118
|
+
@btn_cancel.text = Qt::Application.translate("Export", "Cancel", nil, Qt::Application::UnicodeUTF8)
|
119
|
+
@btn_export.text = Qt::Application.translate("Export", "Export", nil, Qt::Application::UnicodeUTF8)
|
120
|
+
end # retranslateUi
|
121
|
+
|
122
|
+
def retranslate_ui(export)
|
123
|
+
retranslateUi(export)
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
module Ui
|
129
|
+
class Export < Ui_Export
|
130
|
+
end
|
131
|
+
end # module Ui
|
132
|
+
|