1 | /******************************************************************************* | |
2 | * Copyhacked (H) 2012-2020. | |
3 | * This program and the accompanying materials | |
4 | * are made available under no term at all, use it like | |
5 | * you want, but share and discuss about it | |
6 | * every time possible with every body. | |
7 | * | |
8 | * Contributors: | |
9 | * ron190 at ymail dot com - initial implementation | |
10 | ******************************************************************************/ | |
11 | package com.jsql.view.swing.manager; | |
12 | ||
13 | import com.jsql.util.I18nUtil; | |
14 | import com.jsql.view.swing.manager.util.ActionBruteForce; | |
15 | import com.jsql.view.swing.manager.util.JButtonStateful; | |
16 | import com.jsql.view.swing.scrollpane.LightScrollPane; | |
17 | import com.jsql.view.swing.text.JPopupTextField; | |
18 | import com.jsql.view.swing.text.JPopupTextPane; | |
19 | import com.jsql.view.swing.ui.FlatButtonMouseAdapter; | |
20 | import com.jsql.view.swing.util.I18nViewUtil; | |
21 | import com.jsql.view.swing.util.UiUtil; | |
22 | import org.apache.commons.lang3.StringUtils; | |
23 | ||
24 | import javax.swing.*; | |
25 | import java.awt.*; | |
26 | ||
27 | /** | |
28 | * Manager to brute force a hash of various types. | |
29 | */ | |
30 | public class ManagerBruteForce extends JPanel implements Manager { | |
31 | | |
32 | /** | |
33 | * Button running the attack. | |
34 | */ | |
35 | private JButtonStateful run; | |
36 | | |
37 | /** | |
38 | * Input for hash to brute force. | |
39 | */ | |
40 | private JTextField hash; | |
41 | | |
42 | /** | |
43 | * Combobox of hashing methods. | |
44 | */ | |
45 | private JComboBox<String> hashTypes; | |
46 | | |
47 | /** | |
48 | * Enable injection of lowercase characters. | |
49 | */ | |
50 | private JCheckBox lowerCaseCharacters; | |
51 | | |
52 | /** | |
53 | * Enable injection of uppercase characters. | |
54 | */ | |
55 | private JCheckBox upperCaseCharacters; | |
56 | | |
57 | /** | |
58 | * Enable injection of numeric characters. | |
59 | */ | |
60 | private JCheckBox numericCharacters; | |
61 | | |
62 | /** | |
63 | * Enable injection of special characters. | |
64 | */ | |
65 | private JCheckBox specialCharacters; | |
66 | | |
67 | /** | |
68 | * List of characters to exclude from the attack. | |
69 | */ | |
70 | private JTextField exclude; | |
71 | | |
72 | /** | |
73 | * Minimum length of string to attack. | |
74 | */ | |
75 | private JSpinner minimumLength; | |
76 | | |
77 | /** | |
78 | * Maximum length of string to attack. | |
79 | */ | |
80 | private JSpinner maximumLength; | |
81 | | |
82 | /** | |
83 | * Textarea displaying result. | |
84 | */ | |
85 | private final JTextPane result; | |
86 | | |
87 | /** | |
88 | * Animated GIF displayed during attack. | |
89 | */ | |
90 | private JLabel loader; | |
91 | ||
92 | /** | |
93 | * Create a panel to run brute force attack. | |
94 | */ | |
95 | public ManagerBruteForce() { | |
96 | | |
97 | super(new BorderLayout()); | |
98 | ||
99 | JPanel panelOptions = this.initializeOptionsPanel(); | |
100 |
1
1. <init> : removed call to com/jsql/view/swing/manager/ManagerBruteForce::add → NO_COVERAGE |
this.add(panelOptions, BorderLayout.NORTH); |
101 | ||
102 | this.result = new JPopupTextPane("Result of brute force processing").getProxy(); | |
103 |
1
1. <init> : removed call to com/jsql/view/swing/manager/ManagerBruteForce::add → NO_COVERAGE |
this.add(new LightScrollPane(1, 0, 0, 0, this.result), BorderLayout.CENTER); |
104 | | |
105 |
1
1. <init> : removed call to javax/swing/JTextPane::setName → NO_COVERAGE |
this.result.setName("managerBruterResult"); |
106 | | |
107 | JPanel panelButton = this.initializePanelButton(); | |
108 |
1
1. <init> : removed call to com/jsql/view/swing/manager/ManagerBruteForce::add → NO_COVERAGE |
this.add(panelButton, BorderLayout.SOUTH); |
109 | } | |
110 | ||
111 | private JPanel initializePanelButton() { | |
112 | | |
113 | var lastLine = new JPanel(); | |
114 | | |
115 |
1
1. initializePanelButton : removed call to javax/swing/JPanel::setOpaque → NO_COVERAGE |
lastLine.setOpaque(false); |
116 |
1
1. initializePanelButton : removed call to javax/swing/JPanel::setLayout → NO_COVERAGE |
lastLine.setLayout(new BoxLayout(lastLine, BoxLayout.X_AXIS)); |
117 |
1
1. initializePanelButton : removed call to javax/swing/JPanel::setPreferredSize → NO_COVERAGE |
lastLine.setPreferredSize(new Dimension(0, 26)); |
118 | ||
119 |
1
1. initializePanelButton : removed call to javax/swing/JPanel::setBorder → NO_COVERAGE |
lastLine.setBorder( |
120 | BorderFactory.createCompoundBorder( | |
121 | BorderFactory.createMatteBorder(0, 0, 0, 0, UiUtil.COLOR_COMPONENT_BORDER), | |
122 | BorderFactory.createEmptyBorder(1, 0, 1, 1) | |
123 | ) | |
124 | ); | |
125 | | |
126 | this.run = new JButtonStateful("BRUTEFORCE_RUN_BUTTON_LABEL"); | |
127 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE |
I18nViewUtil.addComponentForKey("BRUTEFORCE_RUN_BUTTON_LABEL", this.run); |
128 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setToolTipText → NO_COVERAGE |
this.run.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_RUN_BUTTON_TOOLTIP")); |
129 | | |
130 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setName → NO_COVERAGE |
this.run.setName("managerBruterRun"); |
131 | | |
132 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setContentAreaFilled → NO_COVERAGE |
this.run.setContentAreaFilled(false); |
133 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setBorder → NO_COVERAGE |
this.run.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8)); |
134 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setBackground → NO_COVERAGE |
this.run.setBackground(UiUtil.COLOR_FOCUS_GAINED); |
135 | | |
136 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::addMouseListener → NO_COVERAGE |
this.run.addMouseListener(new FlatButtonMouseAdapter(this.run)); |
137 | | |
138 |
1
1. initializePanelButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::addActionListener → NO_COVERAGE |
this.run.addActionListener(new ActionBruteForce(this)); |
139 | ||
140 | this.loader = new JLabel(UiUtil.ICON_LOADER_GIF); | |
141 |
1
1. initializePanelButton : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
this.loader.setVisible(false); |
142 | ||
143 | lastLine.add(Box.createHorizontalGlue()); | |
144 | lastLine.add(this.loader); | |
145 | lastLine.add(Box.createRigidArea(new Dimension(5, 0))); | |
146 | lastLine.add(this.run); | |
147 | | |
148 |
1
1. initializePanelButton : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::initializePanelButton → NO_COVERAGE |
return lastLine; |
149 | } | |
150 | ||
151 | private JPanel initializeOptionsPanel() { | |
152 | | |
153 | var options = new JPanel(new BorderLayout()); | |
154 | JPanel firstLine = this.initializeFirstLine(); | |
155 | ||
156 | final JPanel secondLine = this.initializeSecondLine(); | |
157 | JPanel thirdLine = this.initializeThirdLine(); | |
158 | | |
159 | final var secondAndThirdLine = new JPanel(new BorderLayout()); | |
160 |
1
1. initializeOptionsPanel : removed call to javax/swing/JPanel::add → NO_COVERAGE |
secondAndThirdLine.add(secondLine, BorderLayout.NORTH); |
161 |
1
1. initializeOptionsPanel : removed call to javax/swing/JPanel::add → NO_COVERAGE |
secondAndThirdLine.add(thirdLine, BorderLayout.SOUTH); |
162 | ||
163 |
1
1. initializeOptionsPanel : removed call to javax/swing/JPanel::add → NO_COVERAGE |
options.add(firstLine, BorderLayout.NORTH); |
164 |
1
1. initializeOptionsPanel : removed call to javax/swing/JPanel::add → NO_COVERAGE |
options.add(secondAndThirdLine, BorderLayout.SOUTH); |
165 | | |
166 |
1
1. initializeOptionsPanel : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::initializeOptionsPanel → NO_COVERAGE |
return options; |
167 | } | |
168 | ||
169 | private JPanel initializeFirstLine() { | |
170 | | |
171 | var firstLine = new JPanel(new BorderLayout()); | |
172 | ||
173 | this.hash = new JPopupTextField(I18nUtil.valueByKey("BRUTEFORCE_HASH_LABEL")).getProxy(); | |
174 |
1
1. initializeFirstLine : removed call to javax/swing/JTextField::setName → NO_COVERAGE |
this.hash.setName("managerBruterHash"); |
175 |
1
1. initializeFirstLine : removed call to javax/swing/JTextField::setToolTipText → NO_COVERAGE |
this.hash.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_HASH_TOOLTIP")); |
176 | | |
177 |
1
1. initializeFirstLine : removed call to javax/swing/JPanel::add → NO_COVERAGE |
firstLine.add(this.hash, BorderLayout.CENTER); |
178 | | |
179 |
1
1. initializeFirstLine : removed call to javax/swing/JTextField::setBorder → NO_COVERAGE |
this.hash.setBorder( |
180 | BorderFactory.createCompoundBorder( | |
181 | BorderFactory.createMatteBorder(1, 1, 1, 1, UiUtil.COLOR_DEFAULT_BACKGROUND), | |
182 | UiUtil.BORDER_BLU | |
183 | ) | |
184 | ); | |
185 | | |
186 |
1
1. initializeFirstLine : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::initializeFirstLine → NO_COVERAGE |
return firstLine; |
187 | } | |
188 | ||
189 | private JPanel initializeSecondLine() { | |
190 | | |
191 | final var secondLine = new JPanel(); | |
192 |
1
1. initializeSecondLine : removed call to javax/swing/JPanel::setLayout → NO_COVERAGE |
secondLine.setLayout(new BoxLayout(secondLine, BoxLayout.X_AXIS)); |
193 |
1
1. initializeSecondLine : removed call to javax/swing/JPanel::setBorder → NO_COVERAGE |
secondLine.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, UiUtil.COLOR_DEFAULT_BACKGROUND)); |
194 | | |
195 | this.lowerCaseCharacters = new JCheckBox("a-z", true); | |
196 | this.upperCaseCharacters = new JCheckBox("A-Z", true); | |
197 | this.numericCharacters = new JCheckBox("0-9", true); | |
198 | this.specialCharacters = new JCheckBox("Special", true); | |
199 | ||
200 | this.hashTypes = new JComboBox<>( | |
201 | new String[]{ | |
202 | "Adler32", "Crc16", "Crc32", "Crc64", "Md2", "Md4", | |
203 | "Md5", "Sha-1", "Sha-256", "Sha-384", "Sha-512", "mysql" | |
204 | } | |
205 | ); | |
206 | | |
207 |
1
1. initializeSecondLine : removed call to javax/swing/JComboBox::setSelectedIndex → NO_COVERAGE |
this.hashTypes.setSelectedIndex(6); |
208 |
1
1. initializeSecondLine : removed call to javax/swing/JComboBox::setToolTipText → NO_COVERAGE |
this.hashTypes.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_HASH_TYPE_TOOLTIP")); |
209 | ||
210 | secondLine.add(this.hashTypes); | |
211 | secondLine.add(this.lowerCaseCharacters); | |
212 | secondLine.add(this.upperCaseCharacters); | |
213 | secondLine.add(this.numericCharacters); | |
214 | secondLine.add(this.specialCharacters); | |
215 | ||
216 |
1
1. initializeSecondLine : removed call to javax/swing/JCheckBox::setToolTipText → NO_COVERAGE |
this.lowerCaseCharacters.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_LCASE_TOOLTIP")); |
217 |
1
1. initializeSecondLine : removed call to javax/swing/JCheckBox::setToolTipText → NO_COVERAGE |
this.upperCaseCharacters.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_UCASE_TOOLTIP")); |
218 |
1
1. initializeSecondLine : removed call to javax/swing/JCheckBox::setToolTipText → NO_COVERAGE |
this.numericCharacters.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_NUM_TOOLTIP")); |
219 |
1
1. initializeSecondLine : removed call to javax/swing/JCheckBox::setToolTipText → NO_COVERAGE |
this.specialCharacters.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_SPEC_TOOLTIP")); |
220 | | |
221 |
1
1. initializeSecondLine : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::initializeSecondLine → NO_COVERAGE |
return secondLine; |
222 | } | |
223 | ||
224 | private JPanel initializeThirdLine() { | |
225 | | |
226 | var thirdLine = new JPanel(); | |
227 |
1
1. initializeThirdLine : removed call to javax/swing/JPanel::setLayout → NO_COVERAGE |
thirdLine.setLayout(new BoxLayout(thirdLine, BoxLayout.X_AXIS)); |
228 |
1
1. initializeThirdLine : removed call to javax/swing/JPanel::setBorder → NO_COVERAGE |
thirdLine.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, UiUtil.COLOR_DEFAULT_BACKGROUND)); |
229 | | |
230 | this.exclude = new JPopupTextField(I18nUtil.valueByKey("BRUTEFORCE_EXCLUDE_LABEL")).getProxy(); | |
231 |
1
1. initializeThirdLine : removed call to javax/swing/JTextField::setToolTipText → NO_COVERAGE |
this.exclude.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_EXCLUDE_TOOLTIP")); |
232 |
1
1. initializeThirdLine : removed call to javax/swing/JTextField::setBorder → NO_COVERAGE |
this.exclude.setBorder( |
233 | BorderFactory.createCompoundBorder( | |
234 | BorderFactory.createMatteBorder(1, 0, 1, 1, UiUtil.COLOR_DEFAULT_BACKGROUND), | |
235 | UiUtil.BORDER_BLU | |
236 | ) | |
237 | ); | |
238 | thirdLine.add(this.exclude); | |
239 | ||
240 | this.minimumLength = new JSpinner(); | |
241 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setModel → NO_COVERAGE |
this.minimumLength.setModel(new SpinnerNumberModel(1, 1, 10000, 1)); |
242 | | |
243 | this.maximumLength = new JSpinner(); | |
244 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setModel → NO_COVERAGE |
this.maximumLength.setModel(new SpinnerNumberModel(5, 1, 10000, 1)); |
245 | | |
246 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setToolTipText → NO_COVERAGE |
this.minimumLength.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_MIN_TOOLTIP")); |
247 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setToolTipText → NO_COVERAGE |
this.maximumLength.setToolTipText(I18nUtil.valueByKey("BRUTEFORCE_MAX_TOOLTIP")); |
248 | | |
249 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setPreferredSize → NO_COVERAGE |
this.minimumLength.setPreferredSize(new Dimension(38, (int) this.minimumLength.getPreferredSize().getHeight())); |
250 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setPreferredSize → NO_COVERAGE |
this.maximumLength.setPreferredSize(new Dimension(38, (int) this.maximumLength.getPreferredSize().getHeight())); |
251 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setMaximumSize → NO_COVERAGE |
this.minimumLength.setMaximumSize(new Dimension(38, (int) this.minimumLength.getPreferredSize().getHeight())); |
252 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setMaximumSize → NO_COVERAGE |
this.maximumLength.setMaximumSize(new Dimension(38, (int) this.maximumLength.getPreferredSize().getHeight())); |
253 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setMinimumSize → NO_COVERAGE |
this.minimumLength.setMinimumSize(new Dimension(38, (int) this.minimumLength.getPreferredSize().getHeight())); |
254 |
1
1. initializeThirdLine : removed call to javax/swing/JSpinner::setMinimumSize → NO_COVERAGE |
this.maximumLength.setMinimumSize(new Dimension(38, (int) this.maximumLength.getPreferredSize().getHeight())); |
255 | ||
256 | var labelMin = new JLabel(StringUtils.SPACE + I18nUtil.valueByKey("BRUTEFORCE_MIN_LABEL"), SwingConstants.RIGHT); | |
257 | thirdLine.add(labelMin); | |
258 |
1
1. initializeThirdLine : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE |
I18nViewUtil.addComponentForKey("BRUTEFORCE_MIN_LABEL", labelMin); |
259 | thirdLine.add(this.minimumLength); | |
260 | var labelMax = new JLabel(StringUtils.SPACE + I18nUtil.valueByKey("BRUTEFORCE_MAX_LABEL"), SwingConstants.RIGHT); | |
261 | thirdLine.add(labelMax); | |
262 |
1
1. initializeThirdLine : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE |
I18nViewUtil.addComponentForKey("BRUTEFORCE_MAX_LABEL", labelMax); |
263 | thirdLine.add(this.maximumLength); | |
264 | | |
265 |
1
1. initializeThirdLine : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::initializeThirdLine → NO_COVERAGE |
return thirdLine; |
266 | } | |
267 | ||
268 | | |
269 | // Getter and setter | |
270 | ||
271 | public JButtonStateful getRun() { | |
272 |
1
1. getRun : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getRun → NO_COVERAGE |
return this.run; |
273 | } | |
274 | ||
275 | public JTextField getHash() { | |
276 |
1
1. getHash : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getHash → NO_COVERAGE |
return this.hash; |
277 | } | |
278 | ||
279 | public JComboBox<String> getHashTypes() { | |
280 |
1
1. getHashTypes : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getHashTypes → NO_COVERAGE |
return this.hashTypes; |
281 | } | |
282 | ||
283 | public JCheckBox getLowerCaseCharacters() { | |
284 |
1
1. getLowerCaseCharacters : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getLowerCaseCharacters → NO_COVERAGE |
return this.lowerCaseCharacters; |
285 | } | |
286 | ||
287 | public JCheckBox getUpperCaseCharacters() { | |
288 |
1
1. getUpperCaseCharacters : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getUpperCaseCharacters → NO_COVERAGE |
return this.upperCaseCharacters; |
289 | } | |
290 | ||
291 | public JCheckBox getNumericCharacters() { | |
292 |
1
1. getNumericCharacters : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getNumericCharacters → NO_COVERAGE |
return this.numericCharacters; |
293 | } | |
294 | ||
295 | public JCheckBox getSpecialCharacters() { | |
296 |
1
1. getSpecialCharacters : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getSpecialCharacters → NO_COVERAGE |
return this.specialCharacters; |
297 | } | |
298 | ||
299 | public JTextField getExclude() { | |
300 |
1
1. getExclude : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getExclude → NO_COVERAGE |
return this.exclude; |
301 | } | |
302 | ||
303 | public JSpinner getMinimumLength() { | |
304 |
1
1. getMinimumLength : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getMinimumLength → NO_COVERAGE |
return this.minimumLength; |
305 | } | |
306 | ||
307 | public JSpinner getMaximumLength() { | |
308 |
1
1. getMaximumLength : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getMaximumLength → NO_COVERAGE |
return this.maximumLength; |
309 | } | |
310 | ||
311 | public JTextPane getResult() { | |
312 |
1
1. getResult : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getResult → NO_COVERAGE |
return this.result; |
313 | } | |
314 | ||
315 | public JLabel getLoader() { | |
316 |
1
1. getLoader : replaced return value with null for com/jsql/view/swing/manager/ManagerBruteForce::getLoader → NO_COVERAGE |
return this.loader; |
317 | } | |
318 | } | |
Mutations | ||
100 |
1.1 |
|
103 |
1.1 |
|
105 |
1.1 |
|
108 |
1.1 |
|
115 |
1.1 |
|
116 |
1.1 |
|
117 |
1.1 |
|
119 |
1.1 |
|
127 |
1.1 |
|
128 |
1.1 |
|
130 |
1.1 |
|
132 |
1.1 |
|
133 |
1.1 |
|
134 |
1.1 |
|
136 |
1.1 |
|
138 |
1.1 |
|
141 |
1.1 |
|
148 |
1.1 |
|
160 |
1.1 |
|
161 |
1.1 |
|
163 |
1.1 |
|
164 |
1.1 |
|
166 |
1.1 |
|
174 |
1.1 |
|
175 |
1.1 |
|
177 |
1.1 |
|
179 |
1.1 |
|
186 |
1.1 |
|
192 |
1.1 |
|
193 |
1.1 |
|
207 |
1.1 |
|
208 |
1.1 |
|
216 |
1.1 |
|
217 |
1.1 |
|
218 |
1.1 |
|
219 |
1.1 |
|
221 |
1.1 |
|
227 |
1.1 |
|
228 |
1.1 |
|
231 |
1.1 |
|
232 |
1.1 |
|
241 |
1.1 |
|
244 |
1.1 |
|
246 |
1.1 |
|
247 |
1.1 |
|
249 |
1.1 |
|
250 |
1.1 |
|
251 |
1.1 |
|
252 |
1.1 |
|
253 |
1.1 |
|
254 |
1.1 |
|
258 |
1.1 |
|
262 |
1.1 |
|
265 |
1.1 |
|
272 |
1.1 |
|
276 |
1.1 |
|
280 |
1.1 |
|
284 |
1.1 |
|
288 |
1.1 |
|
292 |
1.1 |
|
296 |
1.1 |
|
300 |
1.1 |
|
304 |
1.1 |
|
308 |
1.1 |
|
312 |
1.1 |
|
316 |
1.1 |