Subversion Repositories eFlore/Applications.cel

Rev

Rev 1655 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1652 raphael 1
<?php
2
 
3
// Include the main TCPDF library (search for installation path).
4
date_default_timezone_set("Europe/Paris");
5
require_once('tcpdf_config.php');
6
require_once('tcpdf/tcpdf.php');
7
 
8
Class GenerateurPDF {
9
 
10
	public $pdf;
11
 
12
	function GenerateurPDF($utilisateur = NULL) {
13
		// create new PDF document
14
		$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
15
 
16
		// set document information
17
		$pdf->SetCreator(PDF_CREATOR);
18
		$pdf->SetAuthor($utilisateur ? $utilisateur['prenom'] . ' ' . $utilisateur['nom'] : 'CEL - Tela Botanica');
19
		$pdf->SetTitle('Observations en étiquettes');
20
		$pdf->SetSubject('Étiquettes des observations');
21
		$pdf->SetKeywords('botaniques, observations, étiquettes, cel, tela-botanica');
22
 
23
		// set default header data
24
		// $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 005', PDF_HEADER_STRING);
25
 
26
		// set header and footer fonts
27
		// $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
28
		// $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
29
 
30
		// set default monospaced font
31
		$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
32
 
33
		// set margins
34
		$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
35
		$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
36
		$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
37
 
38
		// set auto page breaks
39
		// $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
40
		$pdf->SetAutoPageBreak(FALSE, PDF_MARGIN_BOTTOM);
41
 
1655 raphael 42
		$pdf->SetFont('times', '', 11);
1652 raphael 43
		$pdf->setCellPaddings(1, 1, 1, 1);
44
		$pdf->setCellMargins(1, 1, 1, 1);
45
 
1655 raphael 46
		$pdf->AddPage();
47
		$pdf->setEqualColumns(2);
48
 
1652 raphael 49
		$this->pdf = $pdf;
50
	}
51
 
52
 
53
 
54
	function export($obs) {
55
		$pdf = &$this->pdf;
56
 
57
		$i = 0;
58
		while($i < count($obs)) {
59
			$pdf->selectColumn(0);
60
			// Multicell test
1655 raphael 61
			$this->doHTMLcell($obs[$i++]); if(!isset($obs[$i])) break;
1652 raphael 62
			$pdf->Ln();
1655 raphael 63
			$this->doHTMLcell($obs[$i++]);  if(!isset($obs[$i])) break;
1652 raphael 64
			$pdf->Ln();
1655 raphael 65
			$this->doHTMLcell($obs[$i++]); if(!isset($obs[$i])) break;
1652 raphael 66
			/*$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 1, 1, '', '', true);
67
			  $pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 1, 1, '', '', true);*/
68
 
69
			$pdf->selectColumn(1);
1655 raphael 70
			$this->doHTMLcell($obs[$i++]); if(!isset($obs[$i])) break;
1652 raphael 71
			$pdf->Ln();
1655 raphael 72
			$this->doHTMLcell($obs[$i++]); if(!isset($obs[$i])) break;
1652 raphael 73
			$pdf->Ln();
1655 raphael 74
			$this->doHTMLcell($obs[$i++]); if(!isset($obs[$i])) break;
1652 raphael 75
			/*$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 0, 1, '', '', true);
76
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 0, 1, '', '', true);
77
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 0, 1, '', '', true);*/
78
 
79
			if(isset($obs[$i])) $pdf->AddPage();
80
		}
81
	}
82
 
1655 raphael 83
	function getlinenb4($txt) {
84
		// store current object
85
		$this->pdf->startTransaction();
86
		// store starting values
87
		$start_y = $this->pdf->GetY();
88
		$start_page = $this->pdf->getPage();
89
 
90
		$this->pdf->MultiCell($this->column_width, $h=0, $txt, $border=0, $align='L', $fill=false, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0);
91
		$end_y = $this->pdf->GetY();
92
		$end_page = $this->pdf->getPage();
93
		// calculate height
94
		$height = 0;
95
		if ($end_page == $start_page) {
96
			$height = $end_y - $start_y;
97
		} else {
98
			for ($page=$start_page; $page <= $end_page; ++$page) {
99
				$this->setPage($page);
100
				if ($page == $start_page) {
101
					// first page
102
					$height = $this->pdf->h - $start_y - $this->pdf->bMargin;
103
				} elseif ($page == $end_page) {
104
					// last page
105
					$height = $end_y - $this->pdf->tMargin;
106
				} else {
107
					$height = $this->pdf->h - $this->pdf->tMargin - $this->bMargin;
108
				}
109
			}
110
		}
111
		// restore previous object
112
		$this->pdf = $this->pdf->rollbackTransaction();
113
		return $height;
114
	}
115
 
116
	function getlinenb3($txt) {
117
		return $this->pdf->getStringHeight($this->column_width, $txt);
118
	}
119
 
120
	function getlinenb2($txt) {
121
		//var_dump($line, $this->pdf->GetStringWidth($line));
122
		return ceil($this->pdf->GetStringWidth($txt)  / $this->column_width);
123
	}
124
 
125
	function getlinenb($txt) {
126
		return $this->pdf->getStringHeight('', $txt) / ($this->pdf->getFontSize() * $this->pdf->getCellHeightRatio());
127
	}
128
 
129
	// singe la propriété CSS3 "text-overflow" : "ellipsis"
130
	function elude($txt, $limite_lignes = 3) {
131
		// echo strlen($txt) . ' '.  $this->getlinenb($txt) . ' ' . $limite_lignes . "\n";
132
 
133
		$marge = $this->pdf->getCellPaddings()['T'] + $this->pdf->getCellPaddings()['B'];
134
		$line_height = $this->pdf->getStringHeight($this->column_width, "a") - $marge;
135
		if($limite_lignes > 1) {
136
			$lim = $line_height * $limite_lignes + $marge; // $line_height + ($line_height - $marge) * ($limite_lignes - 1);
137
		} else {
138
			$lim = $line_height + $marge;
139
		}
140
 
141
		while(strlen($txt) > 4 && ($nb = $this->getlinenb3(strip_tags($txt))) > $lim) {
142
			//echo "$nb / $line_height: $txt\n";
143
			// TODO: mb_internal_encoding()
144
			$txt = mb_substr($txt, 0, -4, 'UTF-8') . '…';
145
		}
146
		//echo "$txt: $nb / $limite_lignes \n";
147
		return $txt;
148
	}
149
 
150
 
151
	// TODO: affichage pays dans "localité"
1652 raphael 152
	// ORDER BY id_observation
153
	// italique pour nom d'espèce, mais pas auteur
1655 raphael 154
	function doHTMLcell($obs) {
155
		$this->pdf->setCellMargins(0,0,0,0);
156
		$width = $this->column_width = 98;
157
 
158
		//echo "cell_padding['T']: " . $this->pdf->getCellPaddings()['T'] . ", cell_padding['B']: " . $this->pdf->getCellPaddings()['B'] . "\n";
159
 
160
		$lh = $this->pdf->getFontSize() * $this->pdf->getCellHeightRatio();
161
		//$lh = $this->pdf->GetLineWidth();
162
 
163
		/*
164
		var_dump($this->pdf->GetLineWidth(),
165
				 $this->pdf->GetCharWidth("a"),
166
				 $this->pdf->getStringHeight(60, "Ê"),
167
				 $this->pdf->getHTMLFontUnits("plop"),
168
				 $this->pdf->GetStringWidth("aa"),
169
				 $lh,
170
 
171
				 5,
172
				 $this->getlinenb4("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum..."),
173
				 $this->elude("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum...", 5),
174
 
175
				 4,
176
				 $this->getlinenb4("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor"),
177
				 $this->elude("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum...", 4),
178
 
179
				 3,
180
				 $this->getlinenb4("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet"),
181
				 $this->elude("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum...", 3),
182
 
183
				 2,
184
				 $this->getlinenb4("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore"),
185
				 $this->elude("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum...", 2),
186
 
187
				 1,
188
				 $this->getlinenb4("Observation : Lorem ipsum dolor sit amet, consectetur"),
189
				 $this->elude("Observation : Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum...", 1)
190
		);
191
		die;
192
		*/
193
 
194
 
195
		/*		$str = '<strong>Observation</strong> : ' . $obs['commentaire'];
196
		echo $this->getlinenb(strip_tags($str)) . "\n";
197
		echo $this->getlinenb2(strip_tags($str)) . "\n";
198
		echo $this->pdf->getStringHeight($width, strip_tags($str)) . "\n";
199
		echo $this->pdf->getStringHeight($width, "a") . "\n";
200
		echo ( $this->pdf->getStringHeight($width, strip_tags($str)) / $this->pdf->getStringHeight($width, "a")) . "\n";
201
 
202
		die;*/
203
 
204
		// 3ème paramètre = '' equivalent à $this->pdf->getX()
205
		// 4ème paramètre = '' equivalent à $this->pdf->getY()
206
		// famille
207
		$this->pdf->writeHTMLCell($w = $width - 20, '', '', '',
208
								  $html = '<strong>Famille</strong> : ' . $obs['famille'],
209
								  $border = 'LT', $ln = 0, $fill = false, $reset = true, $align = 'L', $autopadding = true);
210
 
211
 
212
		// N°: TODO: writeHTMLCell() semble bugger
213
		$this->pdf->Cell($w = 20, '',
214
						 $txt = 'N° : ' . $obs['id_observation'], //. sprintf("%04d", $obs['ordre'])
215
						 $border = 'TR', $ln = 1, $align = 'L', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
216
		/*$this->pdf->writeHTMLCell($w = 20, '', '', '',
217
								  $html = '<strong>N°</strong> : ' . $obs['id_observation'], //. sprintf("%04d", $obs['ordre']),
218
								  $border = 'TR', $ln = 1, $fill = true, $reset = true, $align = 'R', $autopadding = true);*/
219
 
220
		// espece
221
		$this->pdf->writeHTMLCell($w = $width, $lh * 2.5, '',  '',
222
								  //$html = '<strong>Espèce</strong> : ' . self::elude('Espèce : ', $obs['nom_ret'], 2),
223
								  $html = $this->elude('<strong>Espèce</strong> : ' . $obs['nom_ret'], 2),
224
								  $border = 'RL', $ln = 1, $fill = false, $reset = true, $align = 'L', $autopadding = true);
225
 
226
		// collecteur
227
		$this->pdf->writeHTMLCell($w = $width, '', '', '',
228
								  $html = '<strong>Collecteur</strong> : ' . $obs['prenom_utilisateur'] . ' ' . $obs['nom_utilisateur'],
229
								  $border = 'RL', $ln = 1, $fill = false, $reset = true, $align = 'L', $autopadding = true);
230
 
231
		// localité
232
		$this->pdf->writeHTMLCell($w = $width, $lh * 3.5, '', '',
233
								  //$html = "<strong>Localité</strong> : " .
234
								  //self::elude('Localité : ', sprintf("%s (%s)\n%s, %s [%s]", $obs['zone_geo'], $obs['ce_zone_geo'], $obs['lieudit'], $obs['station'], $obs['milieu'] ), 3),
235
								  // $html = self::elude(sprintf("<strong>Localité</strong> : %s (%s)\n%s, %s [%s]", $obs['zone_geo'], $obs['ce_zone_geo'], $obs['lieudit'], $obs['station'], $obs['milieu']), 3),
236
								  $html = $this->elude(sprintf("<strong>Localité</strong> : %s (%s)", $obs['zone_geo'], $obs['ce_zone_geo']), 2) . "\n" .
237
								  $this->elude(sprintf("%s, %s [%s]", $obs['lieudit'], $obs['station'], $obs['milieu']), 2),
238
								  $border = 'RL', $ln = 1, $fill = false, $reset = true, $align = 'L', $autopadding = true);
239
 
240
		// lon/lat
241
		$this->pdf->writeHTMLCell($w = $width, '', '', '',
242
								  $html = sprintf("<strong>Latitude / Longitude</strong> : %s  /  %s", $obs['latitude'], $obs['longitude']),
243
								  $border = 'RL', $ln = 1, $fill = false, $reset = true, $align = 'L', $autopadding = true);
244
 
245
		// commentaire
246
		$this->pdf->writeHTMLCell($w = $width, $lh * 4.5, '', '',
247
								  //$html = '<strong>Observation</strong> : ' . self::elude('Observation : ', $obs['commentaire']),
248
								  $html = self::elude('<strong>Observation</strong> : ' . $obs['commentaire'], 4),
249
								  $border = 'RL', $ln = 1, $fill = false, $reset = true, $align = 'L', $autopadding = true);
250
 
251
		// date
252
		$this->pdf->writeHTMLCell($w = $width, '', '', '',
253
								  $html = '<strong>Date</strong> : ' . strftime("%d/%m/%Y", strtotime($obs['date_observation'])),
254
								  $border = 'LBR', $ln = 1, $fill = false, $reset = true, $align = 'R', $autopadding = true);
255
 
256
	}
257
 
1652 raphael 258
	function docell($obs) {
259
		$this->pdf->setCellMargins(0,0,0,0);
260
 
261
		$this->pdf->Cell($w = 60, '',
262
						 $txt = 'Famille : ' . $obs['famille'],
1655 raphael 263
						 $border = 'LT', $ln = 0, $align = 'L', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
1652 raphael 264
 
265
		$this->pdf->Cell($w = 20, '',
266
						 $txt = 'N° : ' . $obs['id_observation'] /*. sprintf("%04d", $obs['ordre']) */,
1655 raphael 267
						 $border = 'TR', $ln = 1, $align = 'L', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
1652 raphael 268
 
269
		$this->pdf->Cell($w = 80, '',
270
						 $txt = 'Espèce : ' . $obs['nom_ret'],
1655 raphael 271
						 $border = 'RL', $ln = 1, $align = 'L', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
1652 raphael 272
 
273
		$this->pdf->Cell($w = 80, '',
274
						 $txt = 'Collecteur : ' . $obs['prenom_utilisateur'] . ' ' . $obs['nom_utilisateur'],
1655 raphael 275
						 $border = 'RL', $ln = 1, $align = 'L', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
1652 raphael 276
 
277
		$this->pdf->MultiCell(80, 20,
1655 raphael 278
							  $txt = sprintf("Localité : %s (%s)\n%s, %s", $obs['zone_geo'], $obs['ce_zone_geo'], $obs['lieudit'], $obs['station']),
279
							  $border = 'RL', 'L', 0, 1, '', '', true);
1652 raphael 280
 
281
		$this->pdf->Cell($w = 80, '',
282
						 $txt = sprintf("Latitude, Longitude : %s  /  %s", $obs['latitude'], $obs['longitude']),
1655 raphael 283
						 $border = 'RL', $ln = 1, $align = 'L', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
1652 raphael 284
 
285
		$this->pdf->MultiCell(80, 20,
1655 raphael 286
							  $txt = 'Observation : ' . self::elude('Observation : ', $obs['commentaire']),
287
							  $border = 'RL', 'L', 0, 1, '', '', true);
1652 raphael 288
 
289
		$this->pdf->Cell($w = 80, '',
290
						 $txt = 'Date : ' . strftime("%d/%m/%Y", strtotime($obs['date_observation'])),
1655 raphael 291
						 $border = 'LBR', $ln = 1, $align = 'R', $fill = false, $link = false, $stretch = 1, $ignore_min_height = false, $calign = 'T', $valign = 'M');
1652 raphael 292
	}
293
 
294
 
1655 raphael 295
	// singe la propriété CSS3 "text-overflow" : "ellipsis"
296
	function elude_bis($intitule, $commentaire, $lignes = 3) {
1652 raphael 297
		// TODO: GetLineWidth, GetCharWidth()
1655 raphael 298
		$limite = $lignes /* lignes */ * 43 /* caractères */ - strlen($intitule);
299
		if(mb_strlen($commentaire) < $limite) return $commentaire;
300
		return mb_substr($commentaire, 0, $limite - 2) . '…';
1652 raphael 301
	}
302
 
303
 
304
	function export1($observations) {
305
		$pdf = &$this->pdf;
306
		// MultiCell($w, $h, $txt, $border=0, $align='J', $fill=0, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0)
307
 
308
		$pdf->setEqualColumns(2);
309
 
310
		$i = 0;
311
		while($i < count($observations)) {
312
			$obs = $observations[$i];
313
 
314
			$pdf->selectColumn(0);
315
			// Multicell test
316
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 1, 1, '', '', true);
317
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 1, 1, '', '', true);
318
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 1, 1, '', '', true);
319
			$pdf->Ln();
320
 
321
			$pdf->selectColumn(1);
322
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 0, 1, '', '', true);
323
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 0, 1, '', '', true);
324
			$pdf->MultiCell(0, 25, self::doTemplate($obs), 1, 'L', 0, 1, '', '', true);
325
 
326
			$i += 6;
327
			if(isset($observations[$i])) $pdf->AddPage();
328
		}
329
	}
330
 
331
	static function doTemplate($obs) {
332
		$pattern =
333
<<<EOF
334
Famille: %s (%d)
335
Espèce: %s
336
Collecteur: %s
337
Localité: %s
338
Observation: %s	 Date: %s
339
EOF;
340
		return sprintf($pattern,
341
 
342
					   $obs['famille'],
343
					   $obs['ordre'],
344
					   $obs['nom_ret'],
345
					   $obs['prenom_utilisateur'] . ' ' . $obs['nom_utilisateur'],
346
					   $obs['zone_geo'],
347
					   $obs['commentaire'],
348
					   strftime("%Y-%m-%d", strtotime($obs['date_observation']))
349
		);
350
 
351
	}
352
 
353
 
354
 
355
	function export2($observations) {
356
		$pdf = &$this->pdf;
357
 
358
		$pdf->setEqualColumns(2);
359
 
360
		$i = 0;
361
		$y = $pdf->getY();
362
		$x = $pdf->getX();
363
		while($i < count($observations)) {
364
			$obs = $observations[$i++];
365
 
366
			$pdf->selectColumn(0);
367
			// Multicell test
368
			$pdf->writeHTMLCell(0, 25, $x, $y + 25 * 0, self::doHTMLTemplate($obs), 1, 0, 0, true);
369
			$pdf->writeHTMLCell(0, 25, $x, $y + 25 * 1, self::doHTMLTemplate($obs), 1, 0, 0, true);
370
			$pdf->writeHTMLCell(0, 25, $x, $y + 25 * 2, self::doHTMLTemplate($obs), 1, 0, 0, true);
371
			//$pdf->Ln();
372
 
373
			$pdf->selectColumn(1);
374
			$pdf->writeHTMLCell(0, 25, $x, $y + 25 * 0, self::doHTMLTemplate($obs), 1, 1, 1, true);
375
			$pdf->writeHTMLCell(0, 25, $x, $y + 25 * 1, self::doHTMLTemplate($obs), 1, 1, 1, true);
376
			$pdf->writeHTMLCell(0, 25, $x, $y + 25 * 2, self::doHTMLTemplate($obs), 1, 1, 1, true);
377
 
378
			$i += 6;
379
			if(isset($observations[$i])) $pdf->AddPage();
380
		}
381
	}
382
 
383
	static function doHTMLTemplate($obs) {
384
		$pattern =
385
<<<EOF
386
<p>Famille: %s <span style="text-align: right">(%d)</span><br/>
387
Espèce: %s<br/>
388
Collecteur: %s<br/>
389
Localité: %s<br/>
390
Observation: %s	 Date: %s</p>
391
EOF;
392
		return sprintf($pattern,
393
 
394
					   $obs['famille'],
395
					   $obs['ordre'],
396
					   $obs['nom_ret'],
397
					   $obs['prenom_utilisateur'] . ' ' . $obs['nom_utilisateur'],
398
					   $obs['zone_geo'],
399
					   $obs['commentaire'],
400
					   strftime("%Y-%m-%d", strtotime($obs['date_observation']))
401
		);
402
 
403
	}
404
 
405
}