inlaweb-lib-dynamodb 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,14 +5,14 @@ export declare class DynamoLib {
5
5
  private readonly logger;
6
6
  constructor();
7
7
  putItem(tableName: string, item: KeyValue): Promise<void>;
8
- getItem<T>(tableName: string, key: KeyValue, projectionExpression?: string): Promise<T | undefined>;
8
+ getItem<T>(tableName: string, key: KeyValue, projectionExpression?: string): Promise<T>;
9
9
  updateItem(params: InputUpdate): Promise<boolean>;
10
10
  query<T>(params: {
11
11
  tableName: string;
12
12
  searchParameters: SearchParameters;
13
13
  permission?: string;
14
14
  username?: string;
15
- }): Promise<T[] | undefined>;
15
+ }): Promise<T[]>;
16
16
  private buildQueryParams;
17
17
  private buildExpressions;
18
18
  private buildFilterExpression;
@@ -20,41 +20,56 @@ class DynamoLib {
20
20
  this.logger = new logger_1.Logger();
21
21
  }
22
22
  async putItem(tableName, item) {
23
- const params = {
24
- TableName: tableName,
25
- Item: item,
26
- ReturnItemCollectionMetrics: "SIZE",
27
- ReturnConsumedCapacity: "TOTAL",
28
- };
29
- this.logger.debug(`PutItem: ${JSON.stringify(params)}`);
30
- const result = await this.docClient.send(new lib_dynamodb_1.PutCommand(params));
31
- this.logger.debug(`PutItem Result: ${JSON.stringify(result)}`);
23
+ try {
24
+ const params = {
25
+ TableName: tableName,
26
+ Item: item,
27
+ ReturnItemCollectionMetrics: "SIZE",
28
+ ReturnConsumedCapacity: "TOTAL",
29
+ };
30
+ this.logger.debug(`PutItem: ${JSON.stringify(params)}`);
31
+ const result = await this.docClient.send(new lib_dynamodb_1.PutCommand(params));
32
+ this.logger.debug(`PutItem Result: ${JSON.stringify(result)}`);
33
+ }
34
+ catch (error) {
35
+ this.logger.error(error.message);
36
+ throw error;
37
+ }
32
38
  }
33
39
  async getItem(tableName, key, projectionExpression) {
34
- const params = {
35
- TableName: tableName,
36
- Key: key,
37
- ReturnConsumedCapacity: "TOTAL",
38
- };
39
- const projection = this.buildProjectionExpression(projectionExpression);
40
- if (projection) {
41
- params.ProjectionExpression = projection.projectionExpression;
42
- params.ExpressionAttributeNames = projection.expressionAttributeNames;
43
- }
44
- this.logger.debug(`GetItem: ${JSON.stringify(params)}`);
45
- const response = await this.docClient.send(new lib_dynamodb_1.GetCommand(params));
46
- this.logger.debug(`GetItem Result: ${JSON.stringify(response)}`);
47
- if (response.Item) {
40
+ try {
41
+ const params = {
42
+ TableName: tableName,
43
+ Key: key,
44
+ ReturnConsumedCapacity: "TOTAL",
45
+ };
46
+ const projection = this.buildProjectionExpression(projectionExpression);
47
+ if (projection) {
48
+ params.ProjectionExpression = projection.projectionExpression;
49
+ params.ExpressionAttributeNames = projection.expressionAttributeNames;
50
+ }
51
+ this.logger.debug(`GetItem: ${JSON.stringify(params)}`);
52
+ const response = await this.docClient.send(new lib_dynamodb_1.GetCommand(params));
53
+ this.logger.debug(`GetItem Result: ${JSON.stringify(response)}`);
48
54
  return response.Item;
49
55
  }
50
- return undefined;
56
+ catch (error) {
57
+ this.logger.error(error.message);
58
+ throw error;
59
+ }
51
60
  }
52
61
  async updateItem(params) {
53
- const itemUpdate = this.createUpdateParams(params);
54
- this.logger.debug(`UpdateItem: ${JSON.stringify(itemUpdate.Update)}`);
55
- const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(itemUpdate.Update));
56
- this.logger.debug(`UpdateItem Result: ${JSON.stringify(result)}`);
57
- return true;
62
+ try {
63
+ const itemUpdate = this.createUpdateParams(params);
64
+ this.logger.debug(`UpdateItem: ${JSON.stringify(itemUpdate.Update)}`);
65
+ const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(itemUpdate.Update));
66
+ this.logger.debug(`UpdateItem Result: ${JSON.stringify(result)}`);
67
+ return true;
68
+ }
69
+ catch (error) {
70
+ this.logger.error(error.message);
71
+ throw error;
72
+ }
58
73
  }
59
74
  async query(params) {
60
75
  try {
@@ -62,10 +77,7 @@ class DynamoLib {
62
77
  this.logger.debug(`Query: ${JSON.stringify(parameters)}`);
63
78
  const response = await this.docClient.send(new lib_dynamodb_1.QueryCommand(parameters));
64
79
  this.logger.debug(`Query Result: ${JSON.stringify(response)}`);
65
- if (response.Items) {
66
- return response.Items;
67
- }
68
- return;
80
+ return response.Items;
69
81
  }
70
82
  catch (error) {
71
83
  this.logger.error(error.message);
@@ -78,8 +90,11 @@ class DynamoLib {
78
90
  TableName: params.tableName,
79
91
  KeyConditionExpression: "",
80
92
  ExpressionAttributeNames: projection?.expressionAttributeNames || {},
81
- ExpressionAttributeValues: {}
93
+ ExpressionAttributeValues: {},
82
94
  };
95
+ if (projection) {
96
+ parameters.ProjectionExpression = projection.projectionExpression;
97
+ }
83
98
  if (params.searchParameters.exclusiveStartKey) {
84
99
  parameters.ExclusiveStartKey = params.searchParameters.exclusiveStartKey;
85
100
  }
@@ -114,7 +129,8 @@ class DynamoLib {
114
129
  break;
115
130
  case "BETWEEN":
116
131
  params.KeyConditionExpression += `#key${index} ${searchParameter.operator} :value${index} AND :value1${index}`;
117
- params.ExpressionAttributeValues[`:value1${index}`] = searchParameter.value1;
132
+ params.ExpressionAttributeValues[`:value1${index}`] =
133
+ searchParameter.value1;
118
134
  break;
119
135
  case "FILTER":
120
136
  this.buildFilterExpression(searchParameter, index, params);
@@ -128,14 +144,14 @@ class DynamoLib {
128
144
  }
129
145
  buildFilterExpression(searchParameter, index, params) {
130
146
  if (params.FilterExpression)
131
- params.FilterExpression += ' and ';
147
+ params.FilterExpression += " and ";
132
148
  else
133
- params.FilterExpression = '';
149
+ params.FilterExpression = "";
134
150
  switch (searchParameter.filterOperator) {
135
- case 'contains':
151
+ case "contains":
136
152
  params.FilterExpression += `contains (#key${index}, :value${index})`;
137
153
  break;
138
- case 'begins_with':
154
+ case "begins_with":
139
155
  params.FilterExpression += `${searchParameter.filterOperator}(#key${index}, :value${index})`;
140
156
  break;
141
157
  case "attribute_not_exists":
@@ -166,19 +182,25 @@ class DynamoLib {
166
182
  }
167
183
  }
168
184
  async saveBatch(table, items) {
169
- const executions = this.createBatch(items);
170
- for (let i = 0; i < executions.length; i++) {
171
- const params = {
172
- RequestItems: {
173
- [table]: executions[i]
174
- },
175
- ReturnConsumedCapacity: "TOTAL",
176
- };
177
- this.logger.debug(`BatchWrite: ${JSON.stringify(params)}`);
178
- const response = await this.docClient.send(new lib_dynamodb_1.BatchWriteCommand(params));
179
- this.logger.debug(`BatchWrite Result: ${JSON.stringify(response)}`);
185
+ try {
186
+ const executions = this.createBatch(items);
187
+ for (let i = 0; i < executions.length; i++) {
188
+ const params = {
189
+ RequestItems: {
190
+ [table]: executions[i],
191
+ },
192
+ ReturnConsumedCapacity: "TOTAL",
193
+ };
194
+ this.logger.debug(`BatchWrite: ${JSON.stringify(params)}`);
195
+ const response = await this.docClient.send(new lib_dynamodb_1.BatchWriteCommand(params));
196
+ this.logger.debug(`BatchWrite Result: ${JSON.stringify(response)}`);
197
+ }
198
+ return true;
199
+ }
200
+ catch (error) {
201
+ this.logger.error(error.message);
202
+ throw error;
180
203
  }
181
- return true;
182
204
  }
183
205
  createBatch(items) {
184
206
  const executions = [];
@@ -193,17 +215,23 @@ class DynamoLib {
193
215
  return executions;
194
216
  }
195
217
  async writeTransactions(items, limit) {
196
- const executions = this.createWriteTransactions(items, limit);
197
- for (let i = 0; i < executions.length; i++) {
198
- const params = {
199
- TransactItems: executions[i],
200
- ReturnConsumedCapacity: "TOTAL",
201
- };
202
- this.logger.debug(`TransactWrite: ${JSON.stringify(params)}`);
203
- const response = await this.docClient.send(new lib_dynamodb_1.TransactWriteCommand(params));
204
- this.logger.debug(`TransactWrite Result: ${JSON.stringify(response)}`);
218
+ try {
219
+ const executions = this.createWriteTransactions(items, limit);
220
+ for (let i = 0; i < executions.length; i++) {
221
+ const params = {
222
+ TransactItems: executions[i],
223
+ ReturnConsumedCapacity: "TOTAL",
224
+ };
225
+ this.logger.debug(`TransactWrite: ${JSON.stringify(params)}`);
226
+ const response = await this.docClient.send(new lib_dynamodb_1.TransactWriteCommand(params));
227
+ this.logger.debug(`TransactWrite Result: ${JSON.stringify(response)}`);
228
+ }
229
+ return true;
230
+ }
231
+ catch (error) {
232
+ this.logger.error(error.message);
233
+ throw error;
205
234
  }
206
- return true;
207
235
  }
208
236
  createWriteTransactions(items, limit) {
209
237
  const executions = [];
@@ -218,10 +246,12 @@ class DynamoLib {
218
246
  return executions;
219
247
  }
220
248
  createUpdateParams(params) {
221
- const { table, PK, SK, item, setAttributes, addAttributes, removeAttributes, username } = params;
249
+ const { table, PK, SK, item, setAttributes, addAttributes, removeAttributes, username, } = params;
222
250
  // Se agregan los datos de auditoría para la actualización
223
251
  item.updateUser = username;
224
- item.updateDate = moment_timezone_1.default.tz(new Date(), "America/Bogota").format("YYYY-MM-DD");
252
+ item.updateDate = moment_timezone_1.default
253
+ .tz(new Date(), "America/Bogota")
254
+ .format("YYYY-MM-DD");
225
255
  if (!setAttributes.includes("updateUser"))
226
256
  setAttributes.push("updateUser");
227
257
  if (!setAttributes.includes("updateDate"))
@@ -250,7 +280,8 @@ class DynamoLib {
250
280
  this.formatUpdateExpressionRemove(itemUpdate, removeAttributes);
251
281
  }
252
282
  // Se remueve el espacio al final de la expresión
253
- itemUpdate.Update.UpdateExpression = itemUpdate.Update.UpdateExpression.slice(0, -1);
283
+ itemUpdate.Update.UpdateExpression =
284
+ itemUpdate.Update.UpdateExpression.slice(0, -1);
254
285
  return itemUpdate;
255
286
  }
256
287
  formatUpdateExpression(operation, updateObject, item, atributes) {
@@ -260,14 +291,18 @@ class DynamoLib {
260
291
  let operationTemplate = templatesUpdateExpresion[operation];
261
292
  // Se añaden los items afectados por la operación.
262
293
  for (let atribute of atributes) {
263
- if (typeof item[atribute] === "boolean" || typeof item[atribute] === "number" || item[atribute]) {
294
+ if (typeof item[atribute] === "boolean" ||
295
+ typeof item[atribute] === "number" ||
296
+ item[atribute]) {
264
297
  updateObject.Update.UpdateExpression += operationTemplate(atribute);
265
298
  updateObject.Update.ExpressionAttributeNames[`#${atribute}`] = atribute;
266
- updateObject.Update.ExpressionAttributeValues[`:${atribute}`] = item[atribute];
299
+ updateObject.Update.ExpressionAttributeValues[`:${atribute}`] =
300
+ item[atribute];
267
301
  }
268
302
  }
269
303
  // Se remueve la coma final para evitar errores con el SDK.
270
- updateObject.Update.UpdateExpression = updateObject.Update.UpdateExpression.slice(0, -1);
304
+ updateObject.Update.UpdateExpression =
305
+ updateObject.Update.UpdateExpression.slice(0, -1);
271
306
  // Se añade un espacio para poder agregar nuevas operaciones.
272
307
  updateObject.Update.UpdateExpression += " ";
273
308
  }
@@ -283,53 +318,75 @@ class DynamoLib {
283
318
  updateObject.Update.ExpressionAttributeNames[`#${atribute}`] = atribute;
284
319
  }
285
320
  // Se remueve la coma final para evitar errores con el SDK.
286
- updateObject.Update.UpdateExpression = updateObject.Update.UpdateExpression.slice(0, -1);
321
+ updateObject.Update.UpdateExpression =
322
+ updateObject.Update.UpdateExpression.slice(0, -1);
287
323
  // Se añade un espacio para poder agregar nuevas operaciones.
288
324
  updateObject.Update.UpdateExpression += " ";
289
325
  }
290
326
  async getId(table, entity, username, quantity) {
291
- let item = await this.getItem(table, { PK: "COUN", SK: entity }, "order");
292
- if (!item) {
293
- item = {
294
- PK: "COUN",
295
- SK: entity,
296
- entity: "COUN",
297
- order: 0,
298
- creationUser: username,
299
- creationDate: moment_timezone_1.default.tz(new Date(), "America/Bogota").format("YYYY-MM-DD"),
327
+ try {
328
+ let item = await this.getItem(table, { PK: "COUN", SK: entity }, "order");
329
+ if (!item) {
330
+ item = {
331
+ PK: "COUN",
332
+ SK: entity,
333
+ entity: "COUN",
334
+ order: 0,
335
+ creationUser: username,
336
+ creationDate: moment_timezone_1.default
337
+ .tz(new Date(), "America/Bogota")
338
+ .format("YYYY-MM-DD"),
339
+ };
340
+ await this.putItem(table, item);
341
+ }
342
+ const params = {
343
+ TableName: table,
344
+ Key: { PK: "COUN", SK: entity },
345
+ UpdateExpression: `SET #id = #id + :increment`,
346
+ ExpressionAttributeNames: { "#id": "order" },
347
+ ExpressionAttributeValues: { ":increment": quantity || 1 },
348
+ ReturnValues: "UPDATED_OLD",
300
349
  };
301
- await this.putItem(table, item);
302
- }
303
- const params = {
304
- TableName: table,
305
- Key: { PK: "COUN", SK: entity },
306
- UpdateExpression: `SET #id = #id + :increment`,
307
- ExpressionAttributeNames: { "#id": "order" },
308
- ExpressionAttributeValues: { ":increment": quantity || 1 },
309
- ReturnValues: "UPDATED_OLD"
310
- };
311
- this.logger.debug(`GetId: ${JSON.stringify(params)}`);
312
- const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(params));
313
- this.logger.debug(`GetId Result: ${JSON.stringify(result)}`);
314
- if (result.Attributes)
315
- return result.Attributes.order + 1;
316
- return 1;
350
+ this.logger.debug(`GetId: ${JSON.stringify(params)}`);
351
+ const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(params));
352
+ this.logger.debug(`GetId Result: ${JSON.stringify(result)}`);
353
+ if (result.Attributes)
354
+ return result.Attributes.order + 1;
355
+ return 1;
356
+ }
357
+ catch (error) {
358
+ this.logger.error(error.message);
359
+ throw error;
360
+ }
317
361
  }
318
362
  async validatePermission(table, entity, action, profile) {
319
- let result;
320
- let searchParameters = {
321
- indexName: "GSI2",
322
- parameters: [
323
- { name: "entity", value: "PERM", operator: "=" },
324
- { name: "relation2", value: `${profile}|${entity}|${action}`, operator: "=" },
325
- ],
326
- };
327
- let permissionQuery = await this.query({ tableName: table, searchParameters });
328
- if (permissionQuery && permissionQuery.length > 0) {
329
- result = permissionQuery[0];
330
- return result.type === "ALL" ? "ALL" : "OWNS";
363
+ try {
364
+ let result;
365
+ let searchParameters = {
366
+ indexName: "GSI2",
367
+ parameters: [
368
+ { name: "entity", value: "PERM", operator: "=" },
369
+ {
370
+ name: "relation2",
371
+ value: `${profile}|${entity}|${action}`,
372
+ operator: "=",
373
+ },
374
+ ],
375
+ };
376
+ let permissionQuery = await this.query({
377
+ tableName: table,
378
+ searchParameters,
379
+ });
380
+ if (permissionQuery && permissionQuery.length > 0) {
381
+ result = permissionQuery[0];
382
+ return result.type === "ALL" ? "ALL" : "OWNS";
383
+ }
384
+ throw new Error("UNAUTHORIZE_REQUEST");
385
+ }
386
+ catch (error) {
387
+ this.logger.error(error.message);
388
+ throw error;
331
389
  }
332
- throw new Error("UNAUTHORIZE_REQUEST");
333
390
  }
334
391
  }
335
392
  exports.DynamoLib = DynamoLib;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inlaweb-lib-dynamodb",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "scripts": {
@@ -1,22 +0,0 @@
1
- {
2
- "configurations": [
3
- {
4
- "type": "node",
5
- "request": "launch",
6
- "name": "Launch Program",
7
- "program": "${workspaceFolder}/${input:programPath}",
8
- "preLaunchTask": "build"
9
- }
10
- ],
11
- "inputs": [
12
- {
13
- "type": "pickString",
14
- "id": "programPath",
15
- "description": "Select the entry point for your program",
16
- "options": [
17
- "dist/index.js",
18
- "src/index.ts"
19
- ]
20
- }
21
- ]
22
- }
package/.vscode/task.json DELETED
@@ -1,13 +0,0 @@
1
- {
2
- "tasks": [
3
- {
4
- "type": "shell",
5
- "label": "build",
6
- "command": "npm",
7
- "args": [
8
- "run",
9
- "build"
10
- ]
11
- }
12
- ]
13
- }
@@ -1,180 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <coverage generated="1742306457851" clover="3.2.0">
3
- <project timestamp="1742306457851" name="All files">
4
- <metrics statements="171" coveredstatements="171" conditionals="52" coveredconditionals="52" methods="25" coveredmethods="25" elements="248" coveredelements="248" complexity="0" loc="171" ncloc="171" packages="1" files="1" classes="1"/>
5
- <file name="index.ts" path="/media/jfmedinae/9E32FD7232FD502F/Windows/Proyectos/Commons/inlaweb-lib-dynamodb/src/index.ts">
6
- <metrics statements="171" coveredstatements="171" conditionals="52" coveredconditionals="52" methods="25" coveredmethods="25"/>
7
- <line num="1" count="1" type="stmt"/>
8
- <line num="2" count="1" type="stmt"/>
9
- <line num="3" count="1" type="stmt"/>
10
- <line num="5" count="1" type="stmt"/>
11
- <line num="7" count="1" type="stmt"/>
12
- <line num="8" count="6" type="stmt"/>
13
- <line num="9" count="1" type="stmt"/>
14
- <line num="10" count="1" type="stmt"/>
15
- <line num="13" count="1" type="stmt"/>
16
- <line num="19" count="20" type="stmt"/>
17
- <line num="20" count="20" type="stmt"/>
18
- <line num="21" count="20" type="stmt"/>
19
- <line num="25" count="1" type="stmt"/>
20
- <line num="31" count="1" type="stmt"/>
21
- <line num="32" count="1" type="stmt"/>
22
- <line num="33" count="1" type="stmt"/>
23
- <line num="37" count="2" type="stmt"/>
24
- <line num="42" count="2" type="stmt"/>
25
- <line num="43" count="2" type="cond" truecount="1" falsecount="0"/>
26
- <line num="44" count="1" type="stmt"/>
27
- <line num="45" count="1" type="stmt"/>
28
- <line num="47" count="2" type="stmt"/>
29
- <line num="48" count="2" type="stmt"/>
30
- <line num="49" count="2" type="stmt"/>
31
- <line num="50" count="2" type="cond" truecount="1" falsecount="0"/>
32
- <line num="51" count="1" type="stmt"/>
33
- <line num="53" count="1" type="stmt"/>
34
- <line num="57" count="1" type="stmt"/>
35
- <line num="58" count="1" type="stmt"/>
36
- <line num="59" count="1" type="stmt"/>
37
- <line num="60" count="1" type="stmt"/>
38
- <line num="61" count="1" type="stmt"/>
39
- <line num="65" count="8" type="stmt"/>
40
- <line num="66" count="8" type="stmt"/>
41
- <line num="67" count="8" type="stmt"/>
42
- <line num="68" count="8" type="stmt"/>
43
- <line num="69" count="7" type="stmt"/>
44
- <line num="70" count="7" type="cond" truecount="1" falsecount="0"/>
45
- <line num="71" count="6" type="stmt"/>
46
- <line num="73" count="1" type="stmt"/>
47
- <line num="75" count="1" type="stmt"/>
48
- <line num="76" count="1" type="stmt"/>
49
- <line num="82" count="8" type="stmt"/>
50
- <line num="84" count="8" type="stmt"/>
51
- <line num="91" count="8" type="cond" truecount="1" falsecount="0"/>
52
- <line num="92" count="3" type="stmt"/>
53
- <line num="94" count="8" type="cond" truecount="1" falsecount="0"/>
54
- <line num="95" count="3" type="stmt"/>
55
- <line num="97" count="8" type="cond" truecount="1" falsecount="0"/>
56
- <line num="98" count="3" type="stmt"/>
57
- <line num="100" count="8" type="cond" truecount="1" falsecount="0"/>
58
- <line num="101" count="8" type="stmt"/>
59
- <line num="104" count="8" type="cond" truecount="3" falsecount="0"/>
60
- <line num="105" count="1" type="stmt"/>
61
- <line num="113" count="8" type="stmt"/>
62
- <line num="114" count="15" type="stmt"/>
63
- <line num="117" count="8" type="stmt"/>
64
- <line num="125" count="15" type="cond" truecount="3" falsecount="0"/>
65
- <line num="127" count="15" type="cond" truecount="4" falsecount="0"/>
66
- <line num="129" count="1" type="stmt"/>
67
- <line num="130" count="1" type="stmt"/>
68
- <line num="132" count="1" type="stmt"/>
69
- <line num="133" count="1" type="stmt"/>
70
- <line num="134" count="1" type="stmt"/>
71
- <line num="136" count="6" type="stmt"/>
72
- <line num="137" count="6" type="stmt"/>
73
- <line num="139" count="7" type="stmt"/>
74
- <line num="140" count="7" type="stmt"/>
75
- <line num="143" count="15" type="stmt"/>
76
- <line num="144" count="15" type="stmt"/>
77
- <line num="152" count="6" type="cond" truecount="2" falsecount="0"/>
78
- <line num="153" count="2" type="stmt"/>
79
- <line num="155" count="6" type="cond" truecount="5" falsecount="0"/>
80
- <line num="157" count="1" type="stmt"/>
81
- <line num="158" count="1" type="stmt"/>
82
- <line num="160" count="1" type="stmt"/>
83
- <line num="161" count="1" type="stmt"/>
84
- <line num="163" count="1" type="stmt"/>
85
- <line num="164" count="1" type="stmt"/>
86
- <line num="166" count="1" type="stmt"/>
87
- <line num="167" count="1" type="stmt"/>
88
- <line num="169" count="2" type="stmt"/>
89
- <line num="170" count="2" type="stmt"/>
90
- <line num="175" count="10" type="cond" truecount="1" falsecount="0"/>
91
- <line num="176" count="9" type="stmt"/>
92
- <line num="178" count="1" type="stmt"/>
93
- <line num="179" count="1" type="cond" truecount="1" falsecount="0"/>
94
- <line num="180" count="1" type="stmt"/>
95
- <line num="181" count="1" type="stmt"/>
96
- <line num="182" count="1" type="stmt"/>
97
- <line num="183" count="2" type="stmt"/>
98
- <line num="184" count="2" type="stmt"/>
99
- <line num="186" count="1" type="stmt"/>
100
- <line num="187" count="1" type="stmt"/>
101
- <line num="192" count="1" type="stmt"/>
102
- <line num="193" count="1" type="stmt"/>
103
- <line num="194" count="1" type="stmt"/>
104
- <line num="200" count="1" type="stmt"/>
105
- <line num="201" count="1" type="stmt"/>
106
- <line num="202" count="1" type="stmt"/>
107
- <line num="204" count="1" type="stmt"/>
108
- <line num="208" count="1" type="stmt"/>
109
- <line num="209" count="1" type="stmt"/>
110
- <line num="210" count="1" type="stmt"/>
111
- <line num="211" count="1" type="stmt"/>
112
- <line num="213" count="1" type="stmt"/>
113
- <line num="214" count="2" type="stmt"/>
114
- <line num="215" count="2" type="stmt"/>
115
- <line num="217" count="1" type="stmt"/>
116
- <line num="221" count="1" type="stmt"/>
117
- <line num="222" count="1" type="stmt"/>
118
- <line num="223" count="1" type="stmt"/>
119
- <line num="227" count="1" type="stmt"/>
120
- <line num="228" count="1" type="stmt"/>
121
- <line num="229" count="1" type="stmt"/>
122
- <line num="231" count="1" type="stmt"/>
123
- <line num="235" count="1" type="stmt"/>
124
- <line num="236" count="1" type="stmt"/>
125
- <line num="237" count="1" type="stmt"/>
126
- <line num="238" count="1" type="stmt"/>
127
- <line num="240" count="1" type="stmt"/>
128
- <line num="241" count="2" type="stmt"/>
129
- <line num="242" count="2" type="stmt"/>
130
- <line num="244" count="1" type="stmt"/>
131
- <line num="248" count="2" type="stmt"/>
132
- <line num="250" count="2" type="stmt"/>
133
- <line num="251" count="2" type="stmt"/>
134
- <line num="252" count="2" type="cond" truecount="1" falsecount="0"/>
135
- <line num="253" count="2" type="cond" truecount="1" falsecount="0"/>
136
- <line num="255" count="2" type="stmt"/>
137
- <line num="266" count="2" type="cond" truecount="3" falsecount="0"/>
138
- <line num="267" count="2" type="stmt"/>
139
- <line num="270" count="2" type="cond" truecount="3" falsecount="0"/>
140
- <line num="271" count="1" type="stmt"/>
141
- <line num="274" count="2" type="cond" truecount="3" falsecount="0"/>
142
- <line num="275" count="1" type="stmt"/>
143
- <line num="278" count="2" type="stmt"/>
144
- <line num="279" count="2" type="stmt"/>
145
- <line num="284" count="3" type="stmt"/>
146
- <line num="286" count="3" type="stmt"/>
147
- <line num="288" count="3" type="stmt"/>
148
- <line num="289" count="7" type="cond" truecount="4" falsecount="0"/>
149
- <line num="290" count="7" type="stmt"/>
150
- <line num="291" count="7" type="stmt"/>
151
- <line num="292" count="7" type="stmt"/>
152
- <line num="296" count="3" type="stmt"/>
153
- <line num="298" count="3" type="stmt"/>
154
- <line num="302" count="1" type="stmt"/>
155
- <line num="304" count="1" type="stmt"/>
156
- <line num="306" count="1" type="stmt"/>
157
- <line num="308" count="1" type="stmt"/>
158
- <line num="309" count="1" type="stmt"/>
159
- <line num="310" count="1" type="stmt"/>
160
- <line num="313" count="1" type="stmt"/>
161
- <line num="315" count="1" type="stmt"/>
162
- <line num="319" count="2" type="stmt"/>
163
- <line num="320" count="2" type="cond" truecount="1" falsecount="0"/>
164
- <line num="321" count="2" type="stmt"/>
165
- <line num="329" count="2" type="stmt"/>
166
- <line num="331" count="2" type="stmt"/>
167
- <line num="339" count="2" type="stmt"/>
168
- <line num="340" count="2" type="stmt"/>
169
- <line num="341" count="2" type="stmt"/>
170
- <line num="342" count="2" type="cond" truecount="1" falsecount="0"/>
171
- <line num="343" count="1" type="stmt"/>
172
- <line num="349" count="3" type="stmt"/>
173
- <line num="356" count="3" type="stmt"/>
174
- <line num="357" count="3" type="cond" truecount="3" falsecount="0"/>
175
- <line num="358" count="2" type="stmt"/>
176
- <line num="359" count="2" type="cond" truecount="2" falsecount="0"/>
177
- <line num="361" count="1" type="stmt"/>
178
- </file>
179
- </project>
180
- </coverage>