blob: c2bc8737b4481646052684f58711e51365b83ed0 [file] [log] [blame]
Finn Williamsb454c5c2021-02-09 15:56:23 +00001//
2// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "../Serializer.hpp"
7#include "SerializerTestUtils.hpp"
8
9#include <armnn/Descriptors.hpp>
10#include <armnn/INetwork.hpp>
11#include <armnn/IRuntime.hpp>
12#include <armnnDeserializer/IDeserializer.hpp>
13#include <armnn/utility/IgnoreUnused.hpp>
14#include <armnn/LstmParams.hpp>
15#include <armnn/QuantizedLstmParams.hpp>
16
Sadik Armagan1625efc2021-06-10 18:24:34 +010017#include <doctest/doctest.h>
Finn Williamsb454c5c2021-02-09 15:56:23 +000018#include <fmt/format.h>
19
20
Sadik Armagan1625efc2021-06-10 18:24:34 +010021TEST_SUITE("SerializerTests")
22{
Finn Williamsb454c5c2021-02-09 15:56:23 +000023template<typename Descriptor>
24armnn::LstmInputParams ConstantVector2LstmInputParams(const std::vector<armnn::ConstTensor>& constants,
25 Descriptor& descriptor)
26{
27 armnn::LstmInputParams lstmInputParams;
28 size_t i = 0;
29
30 // Inserting basic paramters
31 lstmInputParams.m_InputToForgetWeights = &constants[i++];
32 lstmInputParams.m_InputToCellWeights = &constants[i++];
33 lstmInputParams.m_InputToOutputWeights = &constants[i++];
34 lstmInputParams.m_RecurrentToForgetWeights = &constants[i++];
35 lstmInputParams.m_RecurrentToCellWeights = &constants[i++];
36 lstmInputParams.m_RecurrentToOutputWeights = &constants[i++];
37 lstmInputParams.m_ForgetGateBias = &constants[i++];
38 lstmInputParams.m_CellBias = &constants[i++];
39 lstmInputParams.m_OutputGateBias = &constants[i++];
40 if (!descriptor.m_CifgEnabled)
41 {
42 lstmInputParams.m_InputToInputWeights = &constants[i++];
43 lstmInputParams.m_RecurrentToInputWeights = &constants[i++];
44 lstmInputParams.m_InputGateBias = &constants[i++];
45 }
46
47 if (descriptor.m_PeepholeEnabled)
48 {
49 if (!descriptor.m_CifgEnabled)
50 {
51 lstmInputParams.m_CellToInputWeights = &constants[i++];
52 }
53 lstmInputParams.m_CellToForgetWeights = &constants[i++];
54 lstmInputParams.m_CellToOutputWeights = &constants[i++];
55 }
56
57 if (descriptor.m_ProjectionEnabled)
58 {
59 lstmInputParams.m_ProjectionWeights = &constants[i++];
60 lstmInputParams.m_ProjectionBias = &constants[i++];
61 }
62
63 if (descriptor.m_LayerNormEnabled)
64 {
65 if (!descriptor.m_CifgEnabled)
66 {
67 lstmInputParams.m_InputLayerNormWeights = &constants[i++];
68 }
69 lstmInputParams.m_ForgetLayerNormWeights = &constants[i++];
70 lstmInputParams.m_CellLayerNormWeights = &constants[i++];
71 lstmInputParams.m_OutputLayerNormWeights = &constants[i++];
72 }
73
74 return lstmInputParams;
75}
76
77// Works for Lstm and QLstm (QuantizedLstm uses different parameters)
78template<typename Descriptor>
79class VerifyLstmLayer : public LayerVerifierBaseWithDescriptor<Descriptor>
80{
81public:
82 VerifyLstmLayer(const std::string& layerName,
83 const std::vector<armnn::TensorInfo>& inputInfos,
84 const std::vector<armnn::TensorInfo>& outputInfos,
85 const Descriptor& descriptor,
86 const armnn::LstmInputParams& inputParams)
87 : LayerVerifierBaseWithDescriptor<Descriptor>(layerName, inputInfos, outputInfos, descriptor)
88 , m_InputParams(inputParams) {}
89
90 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
91 const armnn::BaseDescriptor& descriptor,
92 const std::vector<armnn::ConstTensor>& constants,
93 const char* name,
94 const armnn::LayerBindingId id = 0) override
95 {
96 armnn::IgnoreUnused(constants, id);
97 switch (layer->GetType())
98 {
99 case armnn::LayerType::Input: break;
100 case armnn::LayerType::Output: break;
101 case armnn::LayerType::Lstm:
102 {
103 this->VerifyNameAndConnections(layer, name);
104 const Descriptor& internalDescriptor = static_cast<const Descriptor&>(descriptor);
105 this->VerifyDescriptor(internalDescriptor);
106 armnn::LstmInputParams lstmParams = ConstantVector2LstmInputParams(constants, internalDescriptor);
107 VerifyInputParameters(lstmParams);
108 break;
109 }
110 case armnn::LayerType::QLstm:
111 {
112 this->VerifyNameAndConnections(layer, name);
113 const Descriptor& internalDescriptor = static_cast<const Descriptor&>(descriptor);
114 this->VerifyDescriptor(internalDescriptor);
115 armnn::LstmInputParams lstmParams = ConstantVector2LstmInputParams(constants, internalDescriptor);
116 VerifyInputParameters(lstmParams);
117 break;
118 }
119 default:
120 {
121 throw armnn::Exception("Unexpected layer type in Lstm test model");
122 }
123 }
124 }
125
126protected:
127 void VerifyInputParameters(const armnn::LstmInputParams& params)
128 {
129 this->VerifyConstTensors(
130 "m_InputToInputWeights", m_InputParams.m_InputToInputWeights, params.m_InputToInputWeights);
131 this->VerifyConstTensors(
132 "m_InputToForgetWeights", m_InputParams.m_InputToForgetWeights, params.m_InputToForgetWeights);
133 this->VerifyConstTensors(
134 "m_InputToCellWeights", m_InputParams.m_InputToCellWeights, params.m_InputToCellWeights);
135 this->VerifyConstTensors(
136 "m_InputToOutputWeights", m_InputParams.m_InputToOutputWeights, params.m_InputToOutputWeights);
137 this->VerifyConstTensors(
138 "m_RecurrentToInputWeights", m_InputParams.m_RecurrentToInputWeights, params.m_RecurrentToInputWeights);
139 this->VerifyConstTensors(
140 "m_RecurrentToForgetWeights", m_InputParams.m_RecurrentToForgetWeights, params.m_RecurrentToForgetWeights);
141 this->VerifyConstTensors(
142 "m_RecurrentToCellWeights", m_InputParams.m_RecurrentToCellWeights, params.m_RecurrentToCellWeights);
143 this->VerifyConstTensors(
144 "m_RecurrentToOutputWeights", m_InputParams.m_RecurrentToOutputWeights, params.m_RecurrentToOutputWeights);
145 this->VerifyConstTensors(
146 "m_CellToInputWeights", m_InputParams.m_CellToInputWeights, params.m_CellToInputWeights);
147 this->VerifyConstTensors(
148 "m_CellToForgetWeights", m_InputParams.m_CellToForgetWeights, params.m_CellToForgetWeights);
149 this->VerifyConstTensors(
150 "m_CellToOutputWeights", m_InputParams.m_CellToOutputWeights, params.m_CellToOutputWeights);
151 this->VerifyConstTensors(
152 "m_InputGateBias", m_InputParams.m_InputGateBias, params.m_InputGateBias);
153 this->VerifyConstTensors(
154 "m_ForgetGateBias", m_InputParams.m_ForgetGateBias, params.m_ForgetGateBias);
155 this->VerifyConstTensors(
156 "m_CellBias", m_InputParams.m_CellBias, params.m_CellBias);
157 this->VerifyConstTensors(
158 "m_OutputGateBias", m_InputParams.m_OutputGateBias, params.m_OutputGateBias);
159 this->VerifyConstTensors(
160 "m_ProjectionWeights", m_InputParams.m_ProjectionWeights, params.m_ProjectionWeights);
161 this->VerifyConstTensors(
162 "m_ProjectionBias", m_InputParams.m_ProjectionBias, params.m_ProjectionBias);
163 this->VerifyConstTensors(
164 "m_InputLayerNormWeights", m_InputParams.m_InputLayerNormWeights, params.m_InputLayerNormWeights);
165 this->VerifyConstTensors(
166 "m_ForgetLayerNormWeights", m_InputParams.m_ForgetLayerNormWeights, params.m_ForgetLayerNormWeights);
167 this->VerifyConstTensors(
168 "m_CellLayerNormWeights", m_InputParams.m_CellLayerNormWeights, params.m_CellLayerNormWeights);
169 this->VerifyConstTensors(
170 "m_OutputLayerNormWeights", m_InputParams.m_OutputLayerNormWeights, params.m_OutputLayerNormWeights);
171 }
172
173private:
174 armnn::LstmInputParams m_InputParams;
175};
176
Sadik Armagan1625efc2021-06-10 18:24:34 +0100177TEST_CASE("SerializeDeserializeLstmCifgPeepholeNoProjection")
Finn Williamsb454c5c2021-02-09 15:56:23 +0000178{
179 armnn::LstmDescriptor descriptor;
180 descriptor.m_ActivationFunc = 4;
181 descriptor.m_ClippingThresProj = 0.0f;
182 descriptor.m_ClippingThresCell = 0.0f;
183 descriptor.m_CifgEnabled = true; // if this is true then we DON'T need to set the OptCifgParams
184 descriptor.m_ProjectionEnabled = false;
185 descriptor.m_PeepholeEnabled = true;
186
187 const uint32_t batchSize = 1;
188 const uint32_t inputSize = 2;
189 const uint32_t numUnits = 4;
190 const uint32_t outputSize = numUnits;
191
192 armnn::TensorInfo inputWeightsInfo1({numUnits, inputSize}, armnn::DataType::Float32);
193 std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
194 armnn::ConstTensor inputToForgetWeights(inputWeightsInfo1, inputToForgetWeightsData);
195
196 std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
197 armnn::ConstTensor inputToCellWeights(inputWeightsInfo1, inputToCellWeightsData);
198
199 std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo1.GetNumElements());
200 armnn::ConstTensor inputToOutputWeights(inputWeightsInfo1, inputToOutputWeightsData);
201
202 armnn::TensorInfo inputWeightsInfo2({numUnits, outputSize}, armnn::DataType::Float32);
203 std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
204 armnn::ConstTensor recurrentToForgetWeights(inputWeightsInfo2, recurrentToForgetWeightsData);
205
206 std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
207 armnn::ConstTensor recurrentToCellWeights(inputWeightsInfo2, recurrentToCellWeightsData);
208
209 std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo2.GetNumElements());
210 armnn::ConstTensor recurrentToOutputWeights(inputWeightsInfo2, recurrentToOutputWeightsData);
211
212 armnn::TensorInfo inputWeightsInfo3({numUnits}, armnn::DataType::Float32);
213 std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
214 armnn::ConstTensor cellToForgetWeights(inputWeightsInfo3, cellToForgetWeightsData);
215
216 std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(inputWeightsInfo3.GetNumElements());
217 armnn::ConstTensor cellToOutputWeights(inputWeightsInfo3, cellToOutputWeightsData);
218
219 std::vector<float> forgetGateBiasData(numUnits, 1.0f);
220 armnn::ConstTensor forgetGateBias(inputWeightsInfo3, forgetGateBiasData);
221
222 std::vector<float> cellBiasData(numUnits, 0.0f);
223 armnn::ConstTensor cellBias(inputWeightsInfo3, cellBiasData);
224
225 std::vector<float> outputGateBiasData(numUnits, 0.0f);
226 armnn::ConstTensor outputGateBias(inputWeightsInfo3, outputGateBiasData);
227
228 armnn::LstmInputParams params;
229 params.m_InputToForgetWeights = &inputToForgetWeights;
230 params.m_InputToCellWeights = &inputToCellWeights;
231 params.m_InputToOutputWeights = &inputToOutputWeights;
232 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
233 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
234 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
235 params.m_ForgetGateBias = &forgetGateBias;
236 params.m_CellBias = &cellBias;
237 params.m_OutputGateBias = &outputGateBias;
238 params.m_CellToForgetWeights = &cellToForgetWeights;
239 params.m_CellToOutputWeights = &cellToOutputWeights;
240
241 armnn::INetworkPtr network = armnn::INetwork::Create();
242 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
243 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
244 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
245 const std::string layerName("lstm");
246 armnn::IConnectableLayer* const lstmLayer = network->AddLstmLayer(descriptor, params, layerName.c_str());
247 armnn::IConnectableLayer* const scratchBuffer = network->AddOutputLayer(0);
248 armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(1);
249 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(2);
250 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(3);
251
252 // connect up
253 armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
254 armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
255 armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
256 armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 3 }, armnn::DataType::Float32);
257
258 inputLayer->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(0));
259 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
260
261 outputStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(1));
262 outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
263
264 cellStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(2));
265 cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
266
267 lstmLayer->GetOutputSlot(0).Connect(scratchBuffer->GetInputSlot(0));
268 lstmLayer->GetOutputSlot(0).SetTensorInfo(lstmTensorInfoScratchBuff);
269
270 lstmLayer->GetOutputSlot(1).Connect(outputStateOut->GetInputSlot(0));
271 lstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
272
273 lstmLayer->GetOutputSlot(2).Connect(cellStateOut->GetInputSlot(0));
274 lstmLayer->GetOutputSlot(2).SetTensorInfo(cellStateTensorInfo);
275
276 lstmLayer->GetOutputSlot(3).Connect(outputLayer->GetInputSlot(0));
277 lstmLayer->GetOutputSlot(3).SetTensorInfo(outputStateTensorInfo);
278
279 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100280 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000281
282 VerifyLstmLayer<armnn::LstmDescriptor> checker(
283 layerName,
284 {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
285 {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
286 descriptor,
287 params);
288 deserializedNetwork->ExecuteStrategy(checker);
289}
290
Sadik Armagan1625efc2021-06-10 18:24:34 +0100291TEST_CASE("SerializeDeserializeLstmNoCifgWithPeepholeAndProjection")
Finn Williamsb454c5c2021-02-09 15:56:23 +0000292{
293 armnn::LstmDescriptor descriptor;
294 descriptor.m_ActivationFunc = 4;
295 descriptor.m_ClippingThresProj = 0.0f;
296 descriptor.m_ClippingThresCell = 0.0f;
297 descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
298 descriptor.m_ProjectionEnabled = true;
299 descriptor.m_PeepholeEnabled = true;
300
301 const uint32_t batchSize = 2;
302 const uint32_t inputSize = 5;
303 const uint32_t numUnits = 20;
304 const uint32_t outputSize = 16;
305
306 armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32);
307 std::vector<float> inputToInputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
308 armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
309
310 std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
311 armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
312
313 std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
314 armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
315
316 std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
317 armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
318
319 armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32);
320 std::vector<float> inputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
321 armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
322
323 std::vector<float> forgetGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
324 armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
325
326 std::vector<float> cellBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
327 armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
328
329 std::vector<float> outputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
330 armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
331
332 armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32);
333 std::vector<float> recurrentToInputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
334 armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
335
336 std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
337 armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
338
339 std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
340 armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
341
342 std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
343 armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
344
345 std::vector<float> cellToInputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
346 armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
347
348 std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
349 armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
350
351 std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
352 armnn::ConstTensor cellToOutputWeights(tensorInfo20, cellToOutputWeightsData);
353
354 armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32);
355 std::vector<float> projectionWeightsData = GenerateRandomData<float>(tensorInfo16x20.GetNumElements());
356 armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
357
358 armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32);
359 std::vector<float> projectionBiasData(outputSize, 0.f);
360 armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
361
362 armnn::LstmInputParams params;
363 params.m_InputToForgetWeights = &inputToForgetWeights;
364 params.m_InputToCellWeights = &inputToCellWeights;
365 params.m_InputToOutputWeights = &inputToOutputWeights;
366 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
367 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
368 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
369 params.m_ForgetGateBias = &forgetGateBias;
370 params.m_CellBias = &cellBias;
371 params.m_OutputGateBias = &outputGateBias;
372
373 // additional params because: descriptor.m_CifgEnabled = false
374 params.m_InputToInputWeights = &inputToInputWeights;
375 params.m_RecurrentToInputWeights = &recurrentToInputWeights;
376 params.m_CellToInputWeights = &cellToInputWeights;
377 params.m_InputGateBias = &inputGateBias;
378
379 // additional params because: descriptor.m_ProjectionEnabled = true
380 params.m_ProjectionWeights = &projectionWeights;
381 params.m_ProjectionBias = &projectionBias;
382
383 // additional params because: descriptor.m_PeepholeEnabled = true
384 params.m_CellToForgetWeights = &cellToForgetWeights;
385 params.m_CellToOutputWeights = &cellToOutputWeights;
386
387 armnn::INetworkPtr network = armnn::INetwork::Create();
388 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
389 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
390 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
391 const std::string layerName("lstm");
392 armnn::IConnectableLayer* const lstmLayer = network->AddLstmLayer(descriptor, params, layerName.c_str());
393 armnn::IConnectableLayer* const scratchBuffer = network->AddOutputLayer(0);
394 armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(1);
395 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(2);
396 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(3);
397
398 // connect up
399 armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
400 armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
401 armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
402 armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 4 }, armnn::DataType::Float32);
403
404 inputLayer->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(0));
405 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
406
407 outputStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(1));
408 outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
409
410 cellStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(2));
411 cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
412
413 lstmLayer->GetOutputSlot(0).Connect(scratchBuffer->GetInputSlot(0));
414 lstmLayer->GetOutputSlot(0).SetTensorInfo(lstmTensorInfoScratchBuff);
415
416 lstmLayer->GetOutputSlot(1).Connect(outputStateOut->GetInputSlot(0));
417 lstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
418
419 lstmLayer->GetOutputSlot(2).Connect(cellStateOut->GetInputSlot(0));
420 lstmLayer->GetOutputSlot(2).SetTensorInfo(cellStateTensorInfo);
421
422 lstmLayer->GetOutputSlot(3).Connect(outputLayer->GetInputSlot(0));
423 lstmLayer->GetOutputSlot(3).SetTensorInfo(outputStateTensorInfo);
424
425 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100426 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000427
428 VerifyLstmLayer<armnn::LstmDescriptor> checker(
429 layerName,
430 {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
431 {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
432 descriptor,
433 params);
434 deserializedNetwork->ExecuteStrategy(checker);
435}
436
Sadik Armagan1625efc2021-06-10 18:24:34 +0100437TEST_CASE("SerializeDeserializeLstmNoCifgWithPeepholeWithProjectionWithLayerNorm")
Finn Williamsb454c5c2021-02-09 15:56:23 +0000438{
439 armnn::LstmDescriptor descriptor;
440 descriptor.m_ActivationFunc = 4;
441 descriptor.m_ClippingThresProj = 0.0f;
442 descriptor.m_ClippingThresCell = 0.0f;
443 descriptor.m_CifgEnabled = false; // if this is true then we DON'T need to set the OptCifgParams
444 descriptor.m_ProjectionEnabled = true;
445 descriptor.m_PeepholeEnabled = true;
446 descriptor.m_LayerNormEnabled = true;
447
448 const uint32_t batchSize = 2;
449 const uint32_t inputSize = 5;
450 const uint32_t numUnits = 20;
451 const uint32_t outputSize = 16;
452
453 armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32);
454 std::vector<float> inputToInputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
455 armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
456
457 std::vector<float> inputToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
458 armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
459
460 std::vector<float> inputToCellWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
461 armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
462
463 std::vector<float> inputToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x5.GetNumElements());
464 armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
465
466 armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32);
467 std::vector<float> inputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
468 armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
469
470 std::vector<float> forgetGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
471 armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
472
473 std::vector<float> cellBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
474 armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
475
476 std::vector<float> outputGateBiasData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
477 armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
478
479 armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32);
480 std::vector<float> recurrentToInputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
481 armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
482
483 std::vector<float> recurrentToForgetWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
484 armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
485
486 std::vector<float> recurrentToCellWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
487 armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
488
489 std::vector<float> recurrentToOutputWeightsData = GenerateRandomData<float>(tensorInfo20x16.GetNumElements());
490 armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
491
492 std::vector<float> cellToInputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
493 armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
494
495 std::vector<float> cellToForgetWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
496 armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
497
498 std::vector<float> cellToOutputWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
499 armnn::ConstTensor cellToOutputWeights(tensorInfo20, cellToOutputWeightsData);
500
501 armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32);
502 std::vector<float> projectionWeightsData = GenerateRandomData<float>(tensorInfo16x20.GetNumElements());
503 armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
504
505 armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32);
506 std::vector<float> projectionBiasData(outputSize, 0.f);
507 armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
508
509 std::vector<float> inputLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
510 armnn::ConstTensor inputLayerNormWeights(tensorInfo20, forgetGateBiasData);
511
512 std::vector<float> forgetLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
513 armnn::ConstTensor forgetLayerNormWeights(tensorInfo20, forgetGateBiasData);
514
515 std::vector<float> cellLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
516 armnn::ConstTensor cellLayerNormWeights(tensorInfo20, forgetGateBiasData);
517
518 std::vector<float> outLayerNormWeightsData = GenerateRandomData<float>(tensorInfo20.GetNumElements());
519 armnn::ConstTensor outLayerNormWeights(tensorInfo20, forgetGateBiasData);
520
521 armnn::LstmInputParams params;
522 params.m_InputToForgetWeights = &inputToForgetWeights;
523 params.m_InputToCellWeights = &inputToCellWeights;
524 params.m_InputToOutputWeights = &inputToOutputWeights;
525 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
526 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
527 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
528 params.m_ForgetGateBias = &forgetGateBias;
529 params.m_CellBias = &cellBias;
530 params.m_OutputGateBias = &outputGateBias;
531
532 // additional params because: descriptor.m_CifgEnabled = false
533 params.m_InputToInputWeights = &inputToInputWeights;
534 params.m_RecurrentToInputWeights = &recurrentToInputWeights;
535 params.m_CellToInputWeights = &cellToInputWeights;
536 params.m_InputGateBias = &inputGateBias;
537
538 // additional params because: descriptor.m_ProjectionEnabled = true
539 params.m_ProjectionWeights = &projectionWeights;
540 params.m_ProjectionBias = &projectionBias;
541
542 // additional params because: descriptor.m_PeepholeEnabled = true
543 params.m_CellToForgetWeights = &cellToForgetWeights;
544 params.m_CellToOutputWeights = &cellToOutputWeights;
545
546 // additional params because: despriptor.m_LayerNormEnabled = true
547 params.m_InputLayerNormWeights = &inputLayerNormWeights;
548 params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
549 params.m_CellLayerNormWeights = &cellLayerNormWeights;
550 params.m_OutputLayerNormWeights = &outLayerNormWeights;
551
552 armnn::INetworkPtr network = armnn::INetwork::Create();
553 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
554 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
555 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
556 const std::string layerName("lstm");
557 armnn::IConnectableLayer* const lstmLayer = network->AddLstmLayer(descriptor, params, layerName.c_str());
558 armnn::IConnectableLayer* const scratchBuffer = network->AddOutputLayer(0);
559 armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(1);
560 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(2);
561 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(3);
562
563 // connect up
564 armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
565 armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
566 armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
567 armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 4 }, armnn::DataType::Float32);
568
569 inputLayer->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(0));
570 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
571
572 outputStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(1));
573 outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
574
575 cellStateIn->GetOutputSlot(0).Connect(lstmLayer->GetInputSlot(2));
576 cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
577
578 lstmLayer->GetOutputSlot(0).Connect(scratchBuffer->GetInputSlot(0));
579 lstmLayer->GetOutputSlot(0).SetTensorInfo(lstmTensorInfoScratchBuff);
580
581 lstmLayer->GetOutputSlot(1).Connect(outputStateOut->GetInputSlot(0));
582 lstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
583
584 lstmLayer->GetOutputSlot(2).Connect(cellStateOut->GetInputSlot(0));
585 lstmLayer->GetOutputSlot(2).SetTensorInfo(cellStateTensorInfo);
586
587 lstmLayer->GetOutputSlot(3).Connect(outputLayer->GetInputSlot(0));
588 lstmLayer->GetOutputSlot(3).SetTensorInfo(outputStateTensorInfo);
589
590 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +0100591 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +0000592
593 VerifyLstmLayer<armnn::LstmDescriptor> checker(
594 layerName,
595 {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
596 {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
597 descriptor,
598 params);
599 deserializedNetwork->ExecuteStrategy(checker);
600}
601
Sadik Armagan1625efc2021-06-10 18:24:34 +0100602TEST_CASE("EnsureLstmLayersBackwardCompatibility")
Finn Williamsb454c5c2021-02-09 15:56:23 +0000603{
604 // The hex data below is a flat buffer containing a lstm layer with no Cifg, with peephole and projection
605 // enabled. That data was obtained before additional layer normalization parameters where added to the
606 // lstm serializer. That way it can be tested if a lstm model with the old parameter configuration can
607 // still be loaded
608 const std::vector<uint8_t> lstmNoCifgWithPeepholeAndProjectionModel =
609 {
610 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00,
611 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
612 0xDC, 0x29, 0x00, 0x00, 0x38, 0x29, 0x00, 0x00, 0xB4, 0x28, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x3C, 0x01,
613 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
614 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00,
615 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0xD6, 0xFF, 0xFF,
616 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x06, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x88, 0xD7,
617 0xFF, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xF6, 0xD6, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00,
618 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
619 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620 0xE8, 0xD7, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC8, 0xD6, 0xFF, 0xFF, 0x00, 0x00,
621 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x5E, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xE0, 0xD7, 0xFF, 0xFF,
622 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0xD7, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00,
623 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD8,
625 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0xD7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B,
626 0x04, 0x00, 0x00, 0x00, 0xB6, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x38, 0xD8, 0xFF, 0xFF, 0x08, 0x00,
627 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xA6, 0xD7, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
628 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xD8, 0xFF, 0xFF,
630 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0xD7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0x04, 0x00,
631 0x00, 0x00, 0x0E, 0xD8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x16, 0xD8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00,
632 0xFA, 0xD7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00,
633 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
634 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD8, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
635 0x00, 0x00, 0x6C, 0xD8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00,
636 0x12, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xE0, 0x25, 0x00, 0x00, 0xD0, 0x25,
637 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x48, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00,
638 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2C, 0x00, 0x30, 0x00,
639 0x34, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x44, 0x00, 0x26, 0x00, 0x00, 0x00, 0xC4, 0x23, 0x00, 0x00,
640 0xF8, 0x21, 0x00, 0x00, 0x2C, 0x20, 0x00, 0x00, 0xF0, 0x1A, 0x00, 0x00, 0xB4, 0x15, 0x00, 0x00, 0x78, 0x10,
641 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x68, 0x0F, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0x00, 0x14, 0x0D, 0x00, 0x00,
642 0xD8, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0xC8, 0x06, 0x00, 0x00, 0x8C, 0x01, 0x00, 0x00, 0x14, 0x01,
643 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xEE, 0xD7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03,
644 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFE, 0xD8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00,
645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xD8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01,
650 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x72, 0xD8,
651 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x82, 0xD9, 0xFF, 0xFF,
652 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xD8,
657 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
658 0x14, 0x00, 0x00, 0x00, 0xF6, 0xD8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x54, 0x00, 0x00, 0x00, 0x04, 0x00,
659 0x00, 0x00, 0x06, 0xDA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
661 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
662 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xD9, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
664 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x6A, 0xD9, 0xFF, 0xFF, 0x00, 0x00,
665 0x00, 0x03, 0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7A, 0xDA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00,
666 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
672 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
675 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
679 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
682 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
683 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
690 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
707 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
711 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
712 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
715 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
716 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
720 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
722 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
723 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
724 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
727 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
731 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
732 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
736 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xDE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
738 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xA2, 0xDE,
739 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB2, 0xDF, 0xFF, 0xFF,
740 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
742 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
744 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xDF,
745 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
746 0x14, 0x00, 0x00, 0x00, 0x26, 0xDF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00,
747 0x00, 0x00, 0x36, 0xE0, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
749 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
752 0x00, 0x00, 0x00, 0x00, 0x92, 0xDF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xAA, 0xDF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03,
754 0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xBA, 0xE0, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01,
755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
756 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
763 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
765 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
773 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
792 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
794 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
823 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0x00, 0xC6, 0xE4, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xE2, 0xE4, 0xFF, 0xFF,
828 0x00, 0x00, 0x00, 0x03, 0xA4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xE5, 0xFF, 0xFF, 0x04, 0x00,
829 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xE6, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01,
852 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00,
853 0x00, 0x00, 0xAA, 0xE6, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
854 0xBA, 0xE7, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
859 0x00, 0x00, 0x16, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
860 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x2E, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x64, 0x00,
861 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0xE8, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
863 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xE7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xB2, 0xE7, 0xFF, 0xFF,
868 0x00, 0x00, 0x00, 0x03, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xC2, 0xE8, 0xFF, 0xFF, 0x04, 0x00,
869 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xE8, 0xFF, 0xFF,
874 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00,
875 0x00, 0x00, 0x36, 0xE8, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
876 0x46, 0xE9, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
892 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
895 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
896 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
897 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
898 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
920 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
931 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
946 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
947 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xED, 0xFF, 0xFF,
948 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00,
949 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x6E, 0xED, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x14, 0x05, 0x00, 0x00,
950 0x04, 0x00, 0x00, 0x00, 0x7E, 0xEE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00,
951 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
952 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
954 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
983 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
989 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
994 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
997 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
998 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
999 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1000 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1001 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1002 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1003 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1016 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1018 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1022 0x8A, 0xF2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
1023 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xA6, 0xF2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03,
1024 0x14, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xB6, 0xF3, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x40, 0x01,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1026 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1044 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1045 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1054 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1060 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1074 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1080 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x00, 0xC2, 0xF7, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1097 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xDE, 0xF7, 0xFF, 0xFF,
1098 0x00, 0x00, 0x00, 0x03, 0xA4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xEE, 0xF8, 0xFF, 0xFF, 0x04, 0x00,
1099 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xF9, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01,
1122 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00,
1123 0x00, 0x00, 0xA6, 0xF9, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xA4, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1124 0xB6, 0xFA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFB,
1147 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1148 0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x6E, 0xFB, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xA4, 0x01,
1149 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7E, 0xFC, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1173 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00,
1174 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1175 0x01, 0x01, 0x04, 0x00, 0x00, 0x00, 0x2E, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1176 0x22, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6C, 0x73,
1177 0x74, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00,
1178 0xB4, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x30, 0x00,
1179 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1180 0xA6, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
1181 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1182 0x04, 0x00, 0x00, 0x00, 0xCE, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
1184 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xF6, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1186 0xB4, 0xFE, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x1A, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
1187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
1188 0xF0, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
1189 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
1190 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
1192 0x7E, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00,
1193 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x76, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00,
1194 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1196 0x68, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0xCE, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00,
1197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1198 0x08, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00,
1199 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
1200 0x08, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00,
1202 0x0E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
1203 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1205 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6E, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00,
1207 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
1208 0xF6, 0xFF, 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x06, 0x00,
1209 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1210 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
1211 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
1213 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0C, 0x00,
1214 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
1215 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00
1216 };
1217
1218 armnn::INetworkPtr deserializedNetwork =
1219 DeserializeNetwork(std::string(lstmNoCifgWithPeepholeAndProjectionModel.begin(),
1220 lstmNoCifgWithPeepholeAndProjectionModel.end()));
1221
Sadik Armagan1625efc2021-06-10 18:24:34 +01001222 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001223
1224 // generating the same model parameters which where used to serialize the model (Layer norm is not specified)
1225 armnn::LstmDescriptor descriptor;
1226 descriptor.m_ActivationFunc = 4;
1227 descriptor.m_ClippingThresProj = 0.0f;
1228 descriptor.m_ClippingThresCell = 0.0f;
1229 descriptor.m_CifgEnabled = false;
1230 descriptor.m_ProjectionEnabled = true;
1231 descriptor.m_PeepholeEnabled = true;
1232
1233 const uint32_t batchSize = 2u;
1234 const uint32_t inputSize = 5u;
1235 const uint32_t numUnits = 20u;
1236 const uint32_t outputSize = 16u;
1237
1238 armnn::TensorInfo tensorInfo20x5({numUnits, inputSize}, armnn::DataType::Float32);
1239 std::vector<float> inputToInputWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1240 armnn::ConstTensor inputToInputWeights(tensorInfo20x5, inputToInputWeightsData);
1241
1242 std::vector<float> inputToForgetWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1243 armnn::ConstTensor inputToForgetWeights(tensorInfo20x5, inputToForgetWeightsData);
1244
1245 std::vector<float> inputToCellWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1246 armnn::ConstTensor inputToCellWeights(tensorInfo20x5, inputToCellWeightsData);
1247
1248 std::vector<float> inputToOutputWeightsData(tensorInfo20x5.GetNumElements(), 0.0f);
1249 armnn::ConstTensor inputToOutputWeights(tensorInfo20x5, inputToOutputWeightsData);
1250
1251 armnn::TensorInfo tensorInfo20({numUnits}, armnn::DataType::Float32);
1252 std::vector<float> inputGateBiasData(tensorInfo20.GetNumElements(), 0.0f);
1253 armnn::ConstTensor inputGateBias(tensorInfo20, inputGateBiasData);
1254
1255 std::vector<float> forgetGateBiasData(tensorInfo20.GetNumElements(), 0.0f);
1256 armnn::ConstTensor forgetGateBias(tensorInfo20, forgetGateBiasData);
1257
1258 std::vector<float> cellBiasData(tensorInfo20.GetNumElements(), 0.0f);
1259 armnn::ConstTensor cellBias(tensorInfo20, cellBiasData);
1260
1261 std::vector<float> outputGateBiasData(tensorInfo20.GetNumElements(), 0.0f);
1262 armnn::ConstTensor outputGateBias(tensorInfo20, outputGateBiasData);
1263
1264 armnn::TensorInfo tensorInfo20x16({numUnits, outputSize}, armnn::DataType::Float32);
1265 std::vector<float> recurrentToInputWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1266 armnn::ConstTensor recurrentToInputWeights(tensorInfo20x16, recurrentToInputWeightsData);
1267
1268 std::vector<float> recurrentToForgetWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1269 armnn::ConstTensor recurrentToForgetWeights(tensorInfo20x16, recurrentToForgetWeightsData);
1270
1271 std::vector<float> recurrentToCellWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1272 armnn::ConstTensor recurrentToCellWeights(tensorInfo20x16, recurrentToCellWeightsData);
1273
1274 std::vector<float> recurrentToOutputWeightsData(tensorInfo20x16.GetNumElements(), 0.0f);
1275 armnn::ConstTensor recurrentToOutputWeights(tensorInfo20x16, recurrentToOutputWeightsData);
1276
1277 std::vector<float> cellToInputWeightsData(tensorInfo20.GetNumElements(), 0.0f);
1278 armnn::ConstTensor cellToInputWeights(tensorInfo20, cellToInputWeightsData);
1279
1280 std::vector<float> cellToForgetWeightsData(tensorInfo20.GetNumElements(), 0.0f);
1281 armnn::ConstTensor cellToForgetWeights(tensorInfo20, cellToForgetWeightsData);
1282
1283 std::vector<float> cellToOutputWeightsData(tensorInfo20.GetNumElements(), 0.0f);
1284 armnn::ConstTensor cellToOutputWeights(tensorInfo20, cellToOutputWeightsData);
1285
1286 armnn::TensorInfo tensorInfo16x20({outputSize, numUnits}, armnn::DataType::Float32);
1287 std::vector<float> projectionWeightsData(tensorInfo16x20.GetNumElements(), 0.0f);
1288 armnn::ConstTensor projectionWeights(tensorInfo16x20, projectionWeightsData);
1289
1290 armnn::TensorInfo tensorInfo16({outputSize}, armnn::DataType::Float32);
1291 std::vector<float> projectionBiasData(outputSize, 0.0f);
1292 armnn::ConstTensor projectionBias(tensorInfo16, projectionBiasData);
1293
1294 armnn::LstmInputParams params;
1295 params.m_InputToForgetWeights = &inputToForgetWeights;
1296 params.m_InputToCellWeights = &inputToCellWeights;
1297 params.m_InputToOutputWeights = &inputToOutputWeights;
1298 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1299 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1300 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1301 params.m_ForgetGateBias = &forgetGateBias;
1302 params.m_CellBias = &cellBias;
1303 params.m_OutputGateBias = &outputGateBias;
1304
1305 // additional params because: descriptor.m_CifgEnabled = false
1306 params.m_InputToInputWeights = &inputToInputWeights;
1307 params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1308 params.m_CellToInputWeights = &cellToInputWeights;
1309 params.m_InputGateBias = &inputGateBias;
1310
1311 // additional params because: descriptor.m_ProjectionEnabled = true
1312 params.m_ProjectionWeights = &projectionWeights;
1313 params.m_ProjectionBias = &projectionBias;
1314
1315 // additional params because: descriptor.m_PeepholeEnabled = true
1316 params.m_CellToForgetWeights = &cellToForgetWeights;
1317 params.m_CellToOutputWeights = &cellToOutputWeights;
1318
1319 const std::string layerName("lstm");
1320 armnn::TensorInfo inputTensorInfo({ batchSize, inputSize }, armnn::DataType::Float32);
1321 armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits}, armnn::DataType::Float32);
1322 armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize }, armnn::DataType::Float32);
1323 armnn::TensorInfo lstmTensorInfoScratchBuff({ batchSize, numUnits * 4 }, armnn::DataType::Float32);
1324
1325 VerifyLstmLayer<armnn::LstmDescriptor> checker(
1326 layerName,
1327 {inputTensorInfo, outputStateTensorInfo, cellStateTensorInfo},
1328 {lstmTensorInfoScratchBuff, outputStateTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
1329 descriptor,
1330 params);
1331 deserializedNetwork->ExecuteStrategy(checker);
1332}
1333
1334armnn::QuantizedLstmInputParams ConstantsVector2QuantizedLstmInputParams(
1335 const std::vector<armnn::ConstTensor>& constants)
1336{
1337 armnn::QuantizedLstmInputParams params;
1338
1339 // index for constants vector
1340 size_t i = 0;
1341
1342 // Get input parameters
1343 params.m_InputToInputWeights = &constants[i++];
1344 params.m_InputToForgetWeights = &constants[i++];
1345 params.m_InputToCellWeights = &constants[i++];
1346 params.m_InputToOutputWeights = &constants[i++];
1347
1348 params.m_RecurrentToInputWeights = &constants[i++];
1349 params.m_RecurrentToForgetWeights = &constants[i++];
1350 params.m_RecurrentToCellWeights = &constants[i++];
1351 params.m_RecurrentToOutputWeights = &constants[i++];
1352
1353 params.m_InputGateBias = &constants[i++];
1354 params.m_ForgetGateBias = &constants[i++];
1355 params.m_CellBias = &constants[i++];
1356 params.m_OutputGateBias = &constants[i++];
1357
1358 return params;
1359}
1360
1361class VerifyQuantizedLstmLayer : public LayerVerifierBase
1362{
1363
1364public:
1365 VerifyQuantizedLstmLayer(const std::string& layerName,
1366 const std::vector<armnn::TensorInfo>& inputInfos,
1367 const std::vector<armnn::TensorInfo>& outputInfos,
1368 const armnn::QuantizedLstmInputParams& inputParams)
1369 : LayerVerifierBase(layerName, inputInfos, outputInfos), m_InputParams(inputParams) {}
1370
1371 void ExecuteStrategy(const armnn::IConnectableLayer* layer,
1372 const armnn::BaseDescriptor& descriptor,
1373 const std::vector<armnn::ConstTensor>& constants,
1374 const char* name,
1375 const armnn::LayerBindingId id = 0) override
1376 {
1377 armnn::IgnoreUnused(descriptor, constants, id);
1378 switch (layer->GetType())
1379 {
1380 case armnn::LayerType::Input: break;
1381 case armnn::LayerType::Output: break;
1382 case armnn::LayerType::QuantizedLstm:
1383 {
1384 VerifyNameAndConnections(layer, name);
1385 armnn::QuantizedLstmInputParams params = ConstantsVector2QuantizedLstmInputParams(constants);
1386 VerifyInputParameters(params);
1387 break;
1388 }
1389 default:
1390 {
1391 throw armnn::Exception(fmt::format("Unexpected layer type in QuantizedLstm test model:",
1392 layer->GetName()));
1393 }
1394 }
1395 }
1396
1397protected:
1398 void VerifyInputParameters(const armnn::QuantizedLstmInputParams& params)
1399 {
1400 VerifyConstTensors("m_InputToInputWeights",
1401 m_InputParams.m_InputToInputWeights, params.m_InputToInputWeights);
1402 VerifyConstTensors("m_InputToForgetWeights",
1403 m_InputParams.m_InputToForgetWeights, params.m_InputToForgetWeights);
1404 VerifyConstTensors("m_InputToCellWeights",
1405 m_InputParams.m_InputToCellWeights, params.m_InputToCellWeights);
1406 VerifyConstTensors("m_InputToOutputWeights",
1407 m_InputParams.m_InputToOutputWeights, params.m_InputToOutputWeights);
1408 VerifyConstTensors("m_RecurrentToInputWeights",
1409 m_InputParams.m_RecurrentToInputWeights, params.m_RecurrentToInputWeights);
1410 VerifyConstTensors("m_RecurrentToForgetWeights",
1411 m_InputParams.m_RecurrentToForgetWeights, params.m_RecurrentToForgetWeights);
1412 VerifyConstTensors("m_RecurrentToCellWeights",
1413 m_InputParams.m_RecurrentToCellWeights, params.m_RecurrentToCellWeights);
1414 VerifyConstTensors("m_RecurrentToOutputWeights",
1415 m_InputParams.m_RecurrentToOutputWeights, params.m_RecurrentToOutputWeights);
1416 VerifyConstTensors("m_InputGateBias",
1417 m_InputParams.m_InputGateBias, params.m_InputGateBias);
1418 VerifyConstTensors("m_ForgetGateBias",
1419 m_InputParams.m_ForgetGateBias, params.m_ForgetGateBias);
1420 VerifyConstTensors("m_CellBias",
1421 m_InputParams.m_CellBias, params.m_CellBias);
1422 VerifyConstTensors("m_OutputGateBias",
1423 m_InputParams.m_OutputGateBias, params.m_OutputGateBias);
1424 }
1425
1426private:
1427 armnn::QuantizedLstmInputParams m_InputParams;
1428};
1429
Sadik Armagan1625efc2021-06-10 18:24:34 +01001430TEST_CASE("SerializeDeserializeQuantizedLstm")
Finn Williamsb454c5c2021-02-09 15:56:23 +00001431{
1432 const uint32_t batchSize = 1;
1433 const uint32_t inputSize = 2;
1434 const uint32_t numUnits = 4;
1435 const uint32_t outputSize = numUnits;
1436
1437 // Scale/Offset for input/output, cellState In/Out, weights, bias
1438 float inputOutputScale = 0.0078125f;
1439 int32_t inputOutputOffset = 128;
1440
1441 float cellStateScale = 0.00048828125f;
1442 int32_t cellStateOffset = 0;
1443
1444 float weightsScale = 0.00408021f;
1445 int32_t weightsOffset = 100;
1446
1447 float biasScale = 3.1876640625e-05f;
1448 int32_t biasOffset = 0;
1449
1450 // The shape of weight data is {outputSize, inputSize} = {4, 2}
1451 armnn::TensorShape inputToInputWeightsShape = {4, 2};
1452 std::vector<uint8_t> inputToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1453 armnn::TensorInfo inputToInputWeightsInfo(inputToInputWeightsShape,
1454 armnn::DataType::QAsymmU8,
1455 weightsScale,
1456 weightsOffset);
1457 armnn::ConstTensor inputToInputWeights(inputToInputWeightsInfo, inputToInputWeightsData);
1458
1459 armnn::TensorShape inputToForgetWeightsShape = {4, 2};
1460 std::vector<uint8_t> inputToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1461 armnn::TensorInfo inputToForgetWeightsInfo(inputToForgetWeightsShape,
1462 armnn::DataType::QAsymmU8,
1463 weightsScale,
1464 weightsOffset);
1465 armnn::ConstTensor inputToForgetWeights(inputToForgetWeightsInfo, inputToForgetWeightsData);
1466
1467 armnn::TensorShape inputToCellWeightsShape = {4, 2};
1468 std::vector<uint8_t> inputToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1469 armnn::TensorInfo inputToCellWeightsInfo(inputToCellWeightsShape,
1470 armnn::DataType::QAsymmU8,
1471 weightsScale,
1472 weightsOffset);
1473 armnn::ConstTensor inputToCellWeights(inputToCellWeightsInfo, inputToCellWeightsData);
1474
1475 armnn::TensorShape inputToOutputWeightsShape = {4, 2};
1476 std::vector<uint8_t> inputToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8};
1477 armnn::TensorInfo inputToOutputWeightsInfo(inputToOutputWeightsShape,
1478 armnn::DataType::QAsymmU8,
1479 weightsScale,
1480 weightsOffset);
1481 armnn::ConstTensor inputToOutputWeights(inputToOutputWeightsInfo, inputToOutputWeightsData);
1482
1483 // The shape of recurrent weight data is {outputSize, outputSize} = {4, 4}
1484 armnn::TensorShape recurrentToInputWeightsShape = {4, 4};
1485 std::vector<uint8_t> recurrentToInputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1486 armnn::TensorInfo recurrentToInputWeightsInfo(recurrentToInputWeightsShape,
1487 armnn::DataType::QAsymmU8,
1488 weightsScale,
1489 weightsOffset);
1490 armnn::ConstTensor recurrentToInputWeights(recurrentToInputWeightsInfo, recurrentToInputWeightsData);
1491
1492 armnn::TensorShape recurrentToForgetWeightsShape = {4, 4};
1493 std::vector<uint8_t> recurrentToForgetWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1494 armnn::TensorInfo recurrentToForgetWeightsInfo(recurrentToForgetWeightsShape,
1495 armnn::DataType::QAsymmU8,
1496 weightsScale,
1497 weightsOffset);
1498 armnn::ConstTensor recurrentToForgetWeights(recurrentToForgetWeightsInfo, recurrentToForgetWeightsData);
1499
1500 armnn::TensorShape recurrentToCellWeightsShape = {4, 4};
1501 std::vector<uint8_t> recurrentToCellWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1502 armnn::TensorInfo recurrentToCellWeightsInfo(recurrentToCellWeightsShape,
1503 armnn::DataType::QAsymmU8,
1504 weightsScale,
1505 weightsOffset);
1506 armnn::ConstTensor recurrentToCellWeights(recurrentToCellWeightsInfo, recurrentToCellWeightsData);
1507
1508 armnn::TensorShape recurrentToOutputWeightsShape = {4, 4};
1509 std::vector<uint8_t> recurrentToOutputWeightsData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
1510 armnn::TensorInfo recurrentToOutputWeightsInfo(recurrentToOutputWeightsShape,
1511 armnn::DataType::QAsymmU8,
1512 weightsScale,
1513 weightsOffset);
1514 armnn::ConstTensor recurrentToOutputWeights(recurrentToOutputWeightsInfo, recurrentToOutputWeightsData);
1515
1516 // The shape of bias data is {outputSize} = {4}
1517 armnn::TensorShape inputGateBiasShape = {4};
1518 std::vector<int32_t> inputGateBiasData = {1, 2, 3, 4};
1519 armnn::TensorInfo inputGateBiasInfo(inputGateBiasShape,
1520 armnn::DataType::Signed32,
1521 biasScale,
1522 biasOffset);
1523 armnn::ConstTensor inputGateBias(inputGateBiasInfo, inputGateBiasData);
1524
1525 armnn::TensorShape forgetGateBiasShape = {4};
1526 std::vector<int32_t> forgetGateBiasData = {1, 2, 3, 4};
1527 armnn::TensorInfo forgetGateBiasInfo(forgetGateBiasShape,
1528 armnn::DataType::Signed32,
1529 biasScale,
1530 biasOffset);
1531 armnn::ConstTensor forgetGateBias(forgetGateBiasInfo, forgetGateBiasData);
1532
1533 armnn::TensorShape cellBiasShape = {4};
1534 std::vector<int32_t> cellBiasData = {1, 2, 3, 4};
1535 armnn::TensorInfo cellBiasInfo(cellBiasShape,
1536 armnn::DataType::Signed32,
1537 biasScale,
1538 biasOffset);
1539 armnn::ConstTensor cellBias(cellBiasInfo, cellBiasData);
1540
1541 armnn::TensorShape outputGateBiasShape = {4};
1542 std::vector<int32_t> outputGateBiasData = {1, 2, 3, 4};
1543 armnn::TensorInfo outputGateBiasInfo(outputGateBiasShape,
1544 armnn::DataType::Signed32,
1545 biasScale,
1546 biasOffset);
1547 armnn::ConstTensor outputGateBias(outputGateBiasInfo, outputGateBiasData);
1548
1549 armnn::QuantizedLstmInputParams params;
1550 params.m_InputToInputWeights = &inputToInputWeights;
1551 params.m_InputToForgetWeights = &inputToForgetWeights;
1552 params.m_InputToCellWeights = &inputToCellWeights;
1553 params.m_InputToOutputWeights = &inputToOutputWeights;
1554 params.m_RecurrentToInputWeights = &recurrentToInputWeights;
1555 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1556 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1557 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1558 params.m_InputGateBias = &inputGateBias;
1559 params.m_ForgetGateBias = &forgetGateBias;
1560 params.m_CellBias = &cellBias;
1561 params.m_OutputGateBias = &outputGateBias;
1562
1563 armnn::INetworkPtr network = armnn::INetwork::Create();
1564 armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
1565 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(1);
1566 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(2);
1567 const std::string layerName("QuantizedLstm");
1568 armnn::IConnectableLayer* const quantizedLstmLayer = network->AddQuantizedLstmLayer(params, layerName.c_str());
1569 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(0);
1570 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(1);
1571
1572 // Connect up
1573 armnn::TensorInfo inputTensorInfo({ batchSize, inputSize },
1574 armnn::DataType::QAsymmU8,
1575 inputOutputScale,
1576 inputOutputOffset);
1577 armnn::TensorInfo cellStateTensorInfo({ batchSize, numUnits },
1578 armnn::DataType::QSymmS16,
1579 cellStateScale,
1580 cellStateOffset);
1581 armnn::TensorInfo outputStateTensorInfo({ batchSize, outputSize },
1582 armnn::DataType::QAsymmU8,
1583 inputOutputScale,
1584 inputOutputOffset);
1585
1586 inputLayer->GetOutputSlot(0).Connect(quantizedLstmLayer->GetInputSlot(0));
1587 inputLayer->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
1588
1589 cellStateIn->GetOutputSlot(0).Connect(quantizedLstmLayer->GetInputSlot(1));
1590 cellStateIn->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
1591
1592 outputStateIn->GetOutputSlot(0).Connect(quantizedLstmLayer->GetInputSlot(2));
1593 outputStateIn->GetOutputSlot(0).SetTensorInfo(outputStateTensorInfo);
1594
1595 quantizedLstmLayer->GetOutputSlot(0).Connect(cellStateOut->GetInputSlot(0));
1596 quantizedLstmLayer->GetOutputSlot(0).SetTensorInfo(cellStateTensorInfo);
1597
1598 quantizedLstmLayer->GetOutputSlot(1).Connect(outputLayer->GetInputSlot(0));
1599 quantizedLstmLayer->GetOutputSlot(1).SetTensorInfo(outputStateTensorInfo);
1600
1601 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001602 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001603
1604 VerifyQuantizedLstmLayer checker(layerName,
1605 {inputTensorInfo, cellStateTensorInfo, outputStateTensorInfo},
1606 {cellStateTensorInfo, outputStateTensorInfo},
1607 params);
1608
1609 deserializedNetwork->ExecuteStrategy(checker);
1610}
1611
Sadik Armagan1625efc2021-06-10 18:24:34 +01001612TEST_CASE("SerializeDeserializeQLstmBasic")
Finn Williamsb454c5c2021-02-09 15:56:23 +00001613{
1614 armnn::QLstmDescriptor descriptor;
1615
1616 descriptor.m_CifgEnabled = true;
1617 descriptor.m_ProjectionEnabled = false;
1618 descriptor.m_PeepholeEnabled = false;
1619 descriptor.m_LayerNormEnabled = false;
1620
1621 descriptor.m_CellClip = 0.0f;
1622 descriptor.m_ProjectionClip = 0.0f;
1623
1624 descriptor.m_InputIntermediateScale = 0.00001f;
1625 descriptor.m_ForgetIntermediateScale = 0.00001f;
1626 descriptor.m_CellIntermediateScale = 0.00001f;
1627 descriptor.m_OutputIntermediateScale = 0.00001f;
1628
1629 descriptor.m_HiddenStateScale = 0.07f;
1630 descriptor.m_HiddenStateZeroPoint = 0;
1631
1632 const unsigned int numBatches = 2;
1633 const unsigned int inputSize = 5;
1634 const unsigned int outputSize = 4;
1635 const unsigned int numUnits = 4;
1636
1637 // Scale/Offset quantization info
1638 float inputScale = 0.0078f;
1639 int32_t inputOffset = 0;
1640
1641 float outputScale = 0.0078f;
1642 int32_t outputOffset = 0;
1643
1644 float cellStateScale = 3.5002e-05f;
1645 int32_t cellStateOffset = 0;
1646
1647 float weightsScale = 0.007f;
1648 int32_t weightsOffset = 0;
1649
1650 float biasScale = 3.5002e-05f / 1024;
1651 int32_t biasOffset = 0;
1652
1653 // Weights and bias tensor and quantization info
1654 armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
1655 armnn::DataType::QSymmS8,
1656 weightsScale,
1657 weightsOffset);
1658
1659 armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
1660 armnn::DataType::QSymmS8,
1661 weightsScale,
1662 weightsOffset);
1663
1664 armnn::TensorInfo biasInfo({numUnits}, armnn::DataType::Signed32, biasScale, biasOffset);
1665
1666 std::vector<int8_t> inputToForgetWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1667 std::vector<int8_t> inputToCellWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1668 std::vector<int8_t> inputToOutputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1669
1670 armnn::ConstTensor inputToForgetWeights(inputWeightsInfo, inputToForgetWeightsData);
1671 armnn::ConstTensor inputToCellWeights(inputWeightsInfo, inputToCellWeightsData);
1672 armnn::ConstTensor inputToOutputWeights(inputWeightsInfo, inputToOutputWeightsData);
1673
1674 std::vector<int8_t> recurrentToForgetWeightsData =
1675 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1676 std::vector<int8_t> recurrentToCellWeightsData =
1677 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1678 std::vector<int8_t> recurrentToOutputWeightsData =
1679 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1680
1681 armnn::ConstTensor recurrentToForgetWeights(recurrentWeightsInfo, recurrentToForgetWeightsData);
1682 armnn::ConstTensor recurrentToCellWeights(recurrentWeightsInfo, recurrentToCellWeightsData);
1683 armnn::ConstTensor recurrentToOutputWeights(recurrentWeightsInfo, recurrentToOutputWeightsData);
1684
1685 std::vector<int32_t> forgetGateBiasData(numUnits, 1);
1686 std::vector<int32_t> cellBiasData(numUnits, 0);
1687 std::vector<int32_t> outputGateBiasData(numUnits, 0);
1688
1689 armnn::ConstTensor forgetGateBias(biasInfo, forgetGateBiasData);
1690 armnn::ConstTensor cellBias(biasInfo, cellBiasData);
1691 armnn::ConstTensor outputGateBias(biasInfo, outputGateBiasData);
1692
1693 // Set up params
1694 armnn::LstmInputParams params;
1695 params.m_InputToForgetWeights = &inputToForgetWeights;
1696 params.m_InputToCellWeights = &inputToCellWeights;
1697 params.m_InputToOutputWeights = &inputToOutputWeights;
1698
1699 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1700 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1701 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1702
1703 params.m_ForgetGateBias = &forgetGateBias;
1704 params.m_CellBias = &cellBias;
1705 params.m_OutputGateBias = &outputGateBias;
1706
1707 // Create network
1708 armnn::INetworkPtr network = armnn::INetwork::Create();
1709 const std::string layerName("qLstm");
1710
1711 armnn::IConnectableLayer* const input = network->AddInputLayer(0);
1712 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(1);
1713 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(2);
1714
1715 armnn::IConnectableLayer* const qLstmLayer = network->AddQLstmLayer(descriptor, params, layerName.c_str());
1716
1717 armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(0);
1718 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(1);
1719 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(2);
1720
1721 // Input/Output tensor info
1722 armnn::TensorInfo inputInfo({numBatches , inputSize},
1723 armnn::DataType::QAsymmS8,
1724 inputScale,
1725 inputOffset);
1726
1727 armnn::TensorInfo cellStateInfo({numBatches , numUnits},
1728 armnn::DataType::QSymmS16,
1729 cellStateScale,
1730 cellStateOffset);
1731
1732 armnn::TensorInfo outputStateInfo({numBatches , outputSize},
1733 armnn::DataType::QAsymmS8,
1734 outputScale,
1735 outputOffset);
1736
1737 // Connect input/output slots
1738 input->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(0));
1739 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
1740
1741 outputStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(1));
1742 outputStateIn->GetOutputSlot(0).SetTensorInfo(cellStateInfo);
1743
1744 cellStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(2));
1745 cellStateIn->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1746
1747 qLstmLayer->GetOutputSlot(0).Connect(outputStateOut->GetInputSlot(0));
1748 qLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1749
1750 qLstmLayer->GetOutputSlot(1).Connect(cellStateOut->GetInputSlot(0));
1751 qLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateInfo);
1752
1753 qLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
1754 qLstmLayer->GetOutputSlot(2).SetTensorInfo(outputStateInfo);
1755
1756 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001757 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001758
1759 VerifyLstmLayer<armnn::QLstmDescriptor> checker(
1760 layerName,
1761 {inputInfo, cellStateInfo, outputStateInfo},
1762 {outputStateInfo, cellStateInfo, outputStateInfo},
1763 descriptor,
1764 params);
1765
1766 deserializedNetwork->ExecuteStrategy(checker);
1767}
1768
Sadik Armagan1625efc2021-06-10 18:24:34 +01001769TEST_CASE("SerializeDeserializeQLstmCifgLayerNorm")
Finn Williamsb454c5c2021-02-09 15:56:23 +00001770{
1771 armnn::QLstmDescriptor descriptor;
1772
1773 // CIFG params are used when CIFG is disabled
1774 descriptor.m_CifgEnabled = true;
1775 descriptor.m_ProjectionEnabled = false;
1776 descriptor.m_PeepholeEnabled = false;
1777 descriptor.m_LayerNormEnabled = true;
1778
1779 descriptor.m_CellClip = 0.0f;
1780 descriptor.m_ProjectionClip = 0.0f;
1781
1782 descriptor.m_InputIntermediateScale = 0.00001f;
1783 descriptor.m_ForgetIntermediateScale = 0.00001f;
1784 descriptor.m_CellIntermediateScale = 0.00001f;
1785 descriptor.m_OutputIntermediateScale = 0.00001f;
1786
1787 descriptor.m_HiddenStateScale = 0.07f;
1788 descriptor.m_HiddenStateZeroPoint = 0;
1789
1790 const unsigned int numBatches = 2;
1791 const unsigned int inputSize = 5;
1792 const unsigned int outputSize = 4;
1793 const unsigned int numUnits = 4;
1794
1795 // Scale/Offset quantization info
1796 float inputScale = 0.0078f;
1797 int32_t inputOffset = 0;
1798
1799 float outputScale = 0.0078f;
1800 int32_t outputOffset = 0;
1801
1802 float cellStateScale = 3.5002e-05f;
1803 int32_t cellStateOffset = 0;
1804
1805 float weightsScale = 0.007f;
1806 int32_t weightsOffset = 0;
1807
1808 float layerNormScale = 3.5002e-05f;
1809 int32_t layerNormOffset = 0;
1810
1811 float biasScale = layerNormScale / 1024;
1812 int32_t biasOffset = 0;
1813
1814 // Weights and bias tensor and quantization info
1815 armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
1816 armnn::DataType::QSymmS8,
1817 weightsScale,
1818 weightsOffset);
1819
1820 armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
1821 armnn::DataType::QSymmS8,
1822 weightsScale,
1823 weightsOffset);
1824
1825 armnn::TensorInfo biasInfo({numUnits},
1826 armnn::DataType::Signed32,
1827 biasScale,
1828 biasOffset);
1829
1830 armnn::TensorInfo layerNormWeightsInfo({numUnits},
1831 armnn::DataType::QSymmS16,
1832 layerNormScale,
1833 layerNormOffset);
1834
1835 // Mandatory params
1836 std::vector<int8_t> inputToForgetWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1837 std::vector<int8_t> inputToCellWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1838 std::vector<int8_t> inputToOutputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
1839
1840 armnn::ConstTensor inputToForgetWeights(inputWeightsInfo, inputToForgetWeightsData);
1841 armnn::ConstTensor inputToCellWeights(inputWeightsInfo, inputToCellWeightsData);
1842 armnn::ConstTensor inputToOutputWeights(inputWeightsInfo, inputToOutputWeightsData);
1843
1844 std::vector<int8_t> recurrentToForgetWeightsData =
1845 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1846 std::vector<int8_t> recurrentToCellWeightsData =
1847 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1848 std::vector<int8_t> recurrentToOutputWeightsData =
1849 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
1850
1851 armnn::ConstTensor recurrentToForgetWeights(recurrentWeightsInfo, recurrentToForgetWeightsData);
1852 armnn::ConstTensor recurrentToCellWeights(recurrentWeightsInfo, recurrentToCellWeightsData);
1853 armnn::ConstTensor recurrentToOutputWeights(recurrentWeightsInfo, recurrentToOutputWeightsData);
1854
1855 std::vector<int32_t> forgetGateBiasData(numUnits, 1);
1856 std::vector<int32_t> cellBiasData(numUnits, 0);
1857 std::vector<int32_t> outputGateBiasData(numUnits, 0);
1858
1859 armnn::ConstTensor forgetGateBias(biasInfo, forgetGateBiasData);
1860 armnn::ConstTensor cellBias(biasInfo, cellBiasData);
1861 armnn::ConstTensor outputGateBias(biasInfo, outputGateBiasData);
1862
1863 // Layer Norm
1864 std::vector<int16_t> forgetLayerNormWeightsData =
1865 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
1866 std::vector<int16_t> cellLayerNormWeightsData =
1867 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
1868 std::vector<int16_t> outputLayerNormWeightsData =
1869 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
1870
1871 armnn::ConstTensor forgetLayerNormWeights(layerNormWeightsInfo, forgetLayerNormWeightsData);
1872 armnn::ConstTensor cellLayerNormWeights(layerNormWeightsInfo, cellLayerNormWeightsData);
1873 armnn::ConstTensor outputLayerNormWeights(layerNormWeightsInfo, outputLayerNormWeightsData);
1874
1875 // Set up params
1876 armnn::LstmInputParams params;
1877
1878 // Mandatory params
1879 params.m_InputToForgetWeights = &inputToForgetWeights;
1880 params.m_InputToCellWeights = &inputToCellWeights;
1881 params.m_InputToOutputWeights = &inputToOutputWeights;
1882
1883 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1884 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
1885 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1886
1887 params.m_ForgetGateBias = &forgetGateBias;
1888 params.m_CellBias = &cellBias;
1889 params.m_OutputGateBias = &outputGateBias;
1890
1891 // Layer Norm
1892 params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
1893 params.m_CellLayerNormWeights = &cellLayerNormWeights;
1894 params.m_OutputLayerNormWeights = &outputLayerNormWeights;
1895
1896 // Create network
1897 armnn::INetworkPtr network = armnn::INetwork::Create();
1898 const std::string layerName("qLstm");
1899
1900 armnn::IConnectableLayer* const input = network->AddInputLayer(0);
1901 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(1);
1902 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(2);
1903
1904 armnn::IConnectableLayer* const qLstmLayer = network->AddQLstmLayer(descriptor, params, layerName.c_str());
1905
1906 armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(0);
1907 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(1);
1908 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(2);
1909
1910 // Input/Output tensor info
1911 armnn::TensorInfo inputInfo({numBatches , inputSize},
1912 armnn::DataType::QAsymmS8,
1913 inputScale,
1914 inputOffset);
1915
1916 armnn::TensorInfo cellStateInfo({numBatches , numUnits},
1917 armnn::DataType::QSymmS16,
1918 cellStateScale,
1919 cellStateOffset);
1920
1921 armnn::TensorInfo outputStateInfo({numBatches , outputSize},
1922 armnn::DataType::QAsymmS8,
1923 outputScale,
1924 outputOffset);
1925
1926 // Connect input/output slots
1927 input->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(0));
1928 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
1929
1930 outputStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(1));
1931 outputStateIn->GetOutputSlot(0).SetTensorInfo(cellStateInfo);
1932
1933 cellStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(2));
1934 cellStateIn->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1935
1936 qLstmLayer->GetOutputSlot(0).Connect(outputStateOut->GetInputSlot(0));
1937 qLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
1938
1939 qLstmLayer->GetOutputSlot(1).Connect(cellStateOut->GetInputSlot(0));
1940 qLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateInfo);
1941
1942 qLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
1943 qLstmLayer->GetOutputSlot(2).SetTensorInfo(outputStateInfo);
1944
1945 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01001946 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +00001947
1948 VerifyLstmLayer<armnn::QLstmDescriptor> checker(layerName,
1949 {inputInfo, cellStateInfo, outputStateInfo},
1950 {outputStateInfo, cellStateInfo, outputStateInfo},
1951 descriptor,
1952 params);
1953
1954 deserializedNetwork->ExecuteStrategy(checker);
1955}
1956
Sadik Armagan1625efc2021-06-10 18:24:34 +01001957TEST_CASE("SerializeDeserializeQLstmAdvanced")
Finn Williamsb454c5c2021-02-09 15:56:23 +00001958{
1959 armnn::QLstmDescriptor descriptor;
1960
1961 descriptor.m_CifgEnabled = false;
1962 descriptor.m_ProjectionEnabled = true;
1963 descriptor.m_PeepholeEnabled = true;
1964 descriptor.m_LayerNormEnabled = true;
1965
1966 descriptor.m_CellClip = 0.1f;
1967 descriptor.m_ProjectionClip = 0.1f;
1968
1969 descriptor.m_InputIntermediateScale = 0.00001f;
1970 descriptor.m_ForgetIntermediateScale = 0.00001f;
1971 descriptor.m_CellIntermediateScale = 0.00001f;
1972 descriptor.m_OutputIntermediateScale = 0.00001f;
1973
1974 descriptor.m_HiddenStateScale = 0.07f;
1975 descriptor.m_HiddenStateZeroPoint = 0;
1976
1977 const unsigned int numBatches = 2;
1978 const unsigned int inputSize = 5;
1979 const unsigned int outputSize = 4;
1980 const unsigned int numUnits = 4;
1981
1982 // Scale/Offset quantization info
1983 float inputScale = 0.0078f;
1984 int32_t inputOffset = 0;
1985
1986 float outputScale = 0.0078f;
1987 int32_t outputOffset = 0;
1988
1989 float cellStateScale = 3.5002e-05f;
1990 int32_t cellStateOffset = 0;
1991
1992 float weightsScale = 0.007f;
1993 int32_t weightsOffset = 0;
1994
1995 float layerNormScale = 3.5002e-05f;
1996 int32_t layerNormOffset = 0;
1997
1998 float biasScale = layerNormScale / 1024;
1999 int32_t biasOffset = 0;
2000
2001 // Weights and bias tensor and quantization info
2002 armnn::TensorInfo inputWeightsInfo({numUnits, inputSize},
2003 armnn::DataType::QSymmS8,
2004 weightsScale,
2005 weightsOffset);
2006
2007 armnn::TensorInfo recurrentWeightsInfo({numUnits, outputSize},
2008 armnn::DataType::QSymmS8,
2009 weightsScale,
2010 weightsOffset);
2011
2012 armnn::TensorInfo biasInfo({numUnits},
2013 armnn::DataType::Signed32,
2014 biasScale,
2015 biasOffset);
2016
2017 armnn::TensorInfo peepholeWeightsInfo({numUnits},
2018 armnn::DataType::QSymmS16,
2019 weightsScale,
2020 weightsOffset);
2021
2022 armnn::TensorInfo layerNormWeightsInfo({numUnits},
2023 armnn::DataType::QSymmS16,
2024 layerNormScale,
2025 layerNormOffset);
2026
2027 armnn::TensorInfo projectionWeightsInfo({outputSize, numUnits},
2028 armnn::DataType::QSymmS8,
2029 weightsScale,
2030 weightsOffset);
2031
2032 // Mandatory params
2033 std::vector<int8_t> inputToForgetWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2034 std::vector<int8_t> inputToCellWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2035 std::vector<int8_t> inputToOutputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2036
2037 armnn::ConstTensor inputToForgetWeights(inputWeightsInfo, inputToForgetWeightsData);
2038 armnn::ConstTensor inputToCellWeights(inputWeightsInfo, inputToCellWeightsData);
2039 armnn::ConstTensor inputToOutputWeights(inputWeightsInfo, inputToOutputWeightsData);
2040
2041 std::vector<int8_t> recurrentToForgetWeightsData =
2042 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2043 std::vector<int8_t> recurrentToCellWeightsData =
2044 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2045 std::vector<int8_t> recurrentToOutputWeightsData =
2046 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2047
2048 armnn::ConstTensor recurrentToForgetWeights(recurrentWeightsInfo, recurrentToForgetWeightsData);
2049 armnn::ConstTensor recurrentToCellWeights(recurrentWeightsInfo, recurrentToCellWeightsData);
2050 armnn::ConstTensor recurrentToOutputWeights(recurrentWeightsInfo, recurrentToOutputWeightsData);
2051
2052 std::vector<int32_t> forgetGateBiasData(numUnits, 1);
2053 std::vector<int32_t> cellBiasData(numUnits, 0);
2054 std::vector<int32_t> outputGateBiasData(numUnits, 0);
2055
2056 armnn::ConstTensor forgetGateBias(biasInfo, forgetGateBiasData);
2057 armnn::ConstTensor cellBias(biasInfo, cellBiasData);
2058 armnn::ConstTensor outputGateBias(biasInfo, outputGateBiasData);
2059
2060 // CIFG
2061 std::vector<int8_t> inputToInputWeightsData = GenerateRandomData<int8_t>(inputWeightsInfo.GetNumElements());
2062 std::vector<int8_t> recurrentToInputWeightsData =
2063 GenerateRandomData<int8_t>(recurrentWeightsInfo.GetNumElements());
2064 std::vector<int32_t> inputGateBiasData(numUnits, 1);
2065
2066 armnn::ConstTensor inputToInputWeights(inputWeightsInfo, inputToInputWeightsData);
2067 armnn::ConstTensor recurrentToInputWeights(recurrentWeightsInfo, recurrentToInputWeightsData);
2068 armnn::ConstTensor inputGateBias(biasInfo, inputGateBiasData);
2069
2070 // Peephole
2071 std::vector<int16_t> cellToInputWeightsData = GenerateRandomData<int16_t>(peepholeWeightsInfo.GetNumElements());
2072 std::vector<int16_t> cellToForgetWeightsData = GenerateRandomData<int16_t>(peepholeWeightsInfo.GetNumElements());
2073 std::vector<int16_t> cellToOutputWeightsData = GenerateRandomData<int16_t>(peepholeWeightsInfo.GetNumElements());
2074
2075 armnn::ConstTensor cellToInputWeights(peepholeWeightsInfo, cellToInputWeightsData);
2076 armnn::ConstTensor cellToForgetWeights(peepholeWeightsInfo, cellToForgetWeightsData);
2077 armnn::ConstTensor cellToOutputWeights(peepholeWeightsInfo, cellToOutputWeightsData);
2078
2079 // Projection
2080 std::vector<int8_t> projectionWeightsData = GenerateRandomData<int8_t>(projectionWeightsInfo.GetNumElements());
2081 std::vector<int32_t> projectionBiasData(outputSize, 1);
2082
2083 armnn::ConstTensor projectionWeights(projectionWeightsInfo, projectionWeightsData);
2084 armnn::ConstTensor projectionBias(biasInfo, projectionBiasData);
2085
2086 // Layer Norm
2087 std::vector<int16_t> inputLayerNormWeightsData =
2088 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2089 std::vector<int16_t> forgetLayerNormWeightsData =
2090 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2091 std::vector<int16_t> cellLayerNormWeightsData =
2092 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2093 std::vector<int16_t> outputLayerNormWeightsData =
2094 GenerateRandomData<int16_t>(layerNormWeightsInfo.GetNumElements());
2095
2096 armnn::ConstTensor inputLayerNormWeights(layerNormWeightsInfo, inputLayerNormWeightsData);
2097 armnn::ConstTensor forgetLayerNormWeights(layerNormWeightsInfo, forgetLayerNormWeightsData);
2098 armnn::ConstTensor cellLayerNormWeights(layerNormWeightsInfo, cellLayerNormWeightsData);
2099 armnn::ConstTensor outputLayerNormWeights(layerNormWeightsInfo, outputLayerNormWeightsData);
2100
2101 // Set up params
2102 armnn::LstmInputParams params;
2103
2104 // Mandatory params
2105 params.m_InputToForgetWeights = &inputToForgetWeights;
2106 params.m_InputToCellWeights = &inputToCellWeights;
2107 params.m_InputToOutputWeights = &inputToOutputWeights;
2108
2109 params.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
2110 params.m_RecurrentToCellWeights = &recurrentToCellWeights;
2111 params.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
2112
2113 params.m_ForgetGateBias = &forgetGateBias;
2114 params.m_CellBias = &cellBias;
2115 params.m_OutputGateBias = &outputGateBias;
2116
2117 // CIFG
2118 params.m_InputToInputWeights = &inputToInputWeights;
2119 params.m_RecurrentToInputWeights = &recurrentToInputWeights;
2120 params.m_InputGateBias = &inputGateBias;
2121
2122 // Peephole
2123 params.m_CellToInputWeights = &cellToInputWeights;
2124 params.m_CellToForgetWeights = &cellToForgetWeights;
2125 params.m_CellToOutputWeights = &cellToOutputWeights;
2126
2127 // Projection
2128 params.m_ProjectionWeights = &projectionWeights;
2129 params.m_ProjectionBias = &projectionBias;
2130
2131 // Layer Norm
2132 params.m_InputLayerNormWeights = &inputLayerNormWeights;
2133 params.m_ForgetLayerNormWeights = &forgetLayerNormWeights;
2134 params.m_CellLayerNormWeights = &cellLayerNormWeights;
2135 params.m_OutputLayerNormWeights = &outputLayerNormWeights;
2136
2137 // Create network
2138 armnn::INetworkPtr network = armnn::INetwork::Create();
2139 const std::string layerName("qLstm");
2140
2141 armnn::IConnectableLayer* const input = network->AddInputLayer(0);
2142 armnn::IConnectableLayer* const outputStateIn = network->AddInputLayer(1);
2143 armnn::IConnectableLayer* const cellStateIn = network->AddInputLayer(2);
2144
2145 armnn::IConnectableLayer* const qLstmLayer = network->AddQLstmLayer(descriptor, params, layerName.c_str());
2146
2147 armnn::IConnectableLayer* const outputStateOut = network->AddOutputLayer(0);
2148 armnn::IConnectableLayer* const cellStateOut = network->AddOutputLayer(1);
2149 armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(2);
2150
2151 // Input/Output tensor info
2152 armnn::TensorInfo inputInfo({numBatches , inputSize},
2153 armnn::DataType::QAsymmS8,
2154 inputScale,
2155 inputOffset);
2156
2157 armnn::TensorInfo cellStateInfo({numBatches , numUnits},
2158 armnn::DataType::QSymmS16,
2159 cellStateScale,
2160 cellStateOffset);
2161
2162 armnn::TensorInfo outputStateInfo({numBatches , outputSize},
2163 armnn::DataType::QAsymmS8,
2164 outputScale,
2165 outputOffset);
2166
2167 // Connect input/output slots
2168 input->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(0));
2169 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
2170
2171 outputStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(1));
2172 outputStateIn->GetOutputSlot(0).SetTensorInfo(cellStateInfo);
2173
2174 cellStateIn->GetOutputSlot(0).Connect(qLstmLayer->GetInputSlot(2));
2175 cellStateIn->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
2176
2177 qLstmLayer->GetOutputSlot(0).Connect(outputStateOut->GetInputSlot(0));
2178 qLstmLayer->GetOutputSlot(0).SetTensorInfo(outputStateInfo);
2179
2180 qLstmLayer->GetOutputSlot(1).Connect(cellStateOut->GetInputSlot(0));
2181 qLstmLayer->GetOutputSlot(1).SetTensorInfo(cellStateInfo);
2182
2183 qLstmLayer->GetOutputSlot(2).Connect(outputLayer->GetInputSlot(0));
2184 qLstmLayer->GetOutputSlot(2).SetTensorInfo(outputStateInfo);
2185
2186 armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
Sadik Armagan1625efc2021-06-10 18:24:34 +01002187 CHECK(deserializedNetwork);
Finn Williamsb454c5c2021-02-09 15:56:23 +00002188
2189 VerifyLstmLayer<armnn::QLstmDescriptor> checker(layerName,
2190 {inputInfo, cellStateInfo, outputStateInfo},
2191 {outputStateInfo, cellStateInfo, outputStateInfo},
2192 descriptor,
2193 params);
2194
2195 deserializedNetwork->ExecuteStrategy(checker);
2196}
2197
Sadik Armagan1625efc2021-06-10 18:24:34 +01002198}