<?php
namespace App\Amadeus\FileParser;

/**
 * Parser for the CCR(car) lines
 * @author Lucian
 */
class Line_U_09 extends \App\Amadeus\FileParser\Line_U_08
{
	/**
	 * 4.35. U- Automated Car Segment
	 * see page 107(149)
	 *
	 * Used with a car segment that is booked through the system
	 */
	protected $structure_09 = [
		['name'=> 'MSGTAG',           'val' => 'U-',    'type' => 'AN',   'req' => 'M',                                      'len' => 2,],                          // 1 : Message Tag (U-)
		['name'=> 'TTONBR',                             'type' => 'N',    'req' => 'M',                                      'len' => 3,],                          // 2 : Tattoo Number in the PNR
		['name'=> 'DATAMODI',                           'type' => 'AN',                                                      'len' => 1,],                          // 3 : Modification indicator.N = segment/element newly created,M = segment/element modified,U = segment/element unchangedX = modification indicator not available for the segment/element
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 4 : Delimiter (Constant value of ';')
		['name'=> 'SEGNBR',                             'type' => 'N',    'req' => 'M',                                      'len' => 3,],                          // 5 : Segment number in the PNR
		['name'=> 'SEGID',            'val' => 'CCR',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 6 : Segment Identifier Tag (Constant value of 'CCR')
		['name'=> 'DELIM',            'val' => ' ',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 7 : Delimiter (Constant value of blank)
		['name'=> 'AIRCDE',                             'type' => 'AN',   'req' => 'M',                                      'len_min' => 2,   'len_max' => 4,],    // 8 : Airline Code/Supplier Code.
		['name'=> 'DELIM',            'val' => ' ',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 9 : Delimiter (Constant value of blank)
		['name'=> 'STATUS',                             'type' => 'AN',   'req' => 'M',                                      'len' => 2,],                          // 10 : Status Code
		['name'=> 'NBRCARS',                            'type' => 'N',    'req' => 'M',                                      'len' => 2,],                          // 11 : Number of cars.
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 12 : Delimiter (Constant value of ';')
		['name'=> 'PNRSTAT',                            'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 13 : PNR Status Code and Number of Cars
		['name'=> 'DELIM',            'val' => ' ',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 14 : Delimiter (Constant value of blank)
		['name'=> 'PICKUP',                             'type' => 'D:DDMMMYYYY|DDMMM:PNRDTE','req' => 'M',],                                                       // 15 : Pick Up Date (DDMMM)
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 16 : Delimiter (Constant value of ';')
		['name'=> 'DROP',                               'type' => 'D:DDMMMYYYY|DDMMM:PNRDTE','req' => 'M',],                                                       // 17 : Drop Off Date (DDMMM)
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 18 : Delimiter (Constant value of ';')
		['name'=> 'AIRPT',                              'type' => 'AN',   'req' => 'M',                                      'len_min' => 3,   'len_max' => 5,],    // 19 : Airport Code/City Code
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 20 : Delimiter (Constant value of ';')
		['name'=> 'CDETRAN',                            'type' => 'AN',],                                                                                           // 21 : Airport/City Code Translation
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 22 : Delimiter (Constant value of ';')
		['name'=> 'CAR',                                'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 23 : Car Code
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 24 : Delimiter (Constant value of ';')
		['name'=> 'CARTRANS',                           'type' => 'AN',   'req' => 'M',                                      'len_min' => 4,   'len_max' => 22,],   // 25 : Car Type Translation
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 26 : Delimiter (Constant value of ';')
		['name'=> 'ARRID',            'val' => 'ARR-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 27 : Arrival Indicator (Constant value of 'ARR-')
		['name'=> 'ARROPT',                             'type' => 'AN',   'req' => 'M',                                      'len_min' => 2,   'len_max' => 36,],   // 28 : Arrival Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 29 : Delimiter (Constant value of ';')
		['name'=> 'RTID',             'val' => 'RT-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 30 : Return Indicator (Constant value of 'RT-')
		['name'=> 'RTTME',                              'type' => 'HR',   'req' => 'M',                                      'len_min' => 1,   'len_max' => 6,],    // 31 : Return time
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 32 : Delimiter (Constant value of ';')
		['name'=> 'BAID',             'val' => 'BA-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 33 : Booking Agent Indicator (Constant value of 'BA-')
		['name'=> 'BAOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 12,],   // 34 : Booking Agent Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 35 : Delimiter (Constant value of ';')
		['name'=> 'BNID',             'val' => 'BN-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 36 : Billing Number Indicator (Constant value of 'BN-')
		['name'=> 'BNOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 25,],   // 37 : Billing Number Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 38 : Delimiter (Constant value of ';')
		['name'=> 'BRID',             'val' => 'BR-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 39 : Billing Reference Indicator (Constant value of 'BR-')
		['name'=> 'BROPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 24,],   // 40 : Billing Reference Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 41 : Delimiter (Constant value of ';')
		['name'=> 'BKGID',            'val' => 'BS-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 42 : Booking Agency Field ID (Constant value of 'BS-')
		['name'=> 'AIRIATA',                            'type' => 'AN',   'req' => 'M',                                      'len_min' => 2,   'len_max' => 8,],    // 43 : Airline Code or IATA Number. If an airline code this will be a maximum of three characters, and if an IATA number it will always be 8 characters.
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 44 : Delimiter (Constant value of ';')
		['name'=> 'CDID',             'val' => 'CD-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 45 : Corporate ID Indicator (Constant value of 'CD-')
		['name'=> 'CDOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 20,],   // 46 : Corporate ID Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 47 : Delimiter (Constant value of ';')
		['name'=> 'CONFID',           'val' => 'CF-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 48 : Confirmation Number Field ID (Constant value of 'CF-')
		['name'=> 'CONFNBR',                            'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 16,],   // 49 : Confirmation Number
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 50 : Delimiter (Constant value of ';')
		['name'=> 'CKID',             'val' => 'CK-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 51 : Car Voucher Acknowledgement Indicator(Constant value of 'CK-')
		['name'=> 'CKOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 20,],   // 52 : Car Voucher Acknowledgement Number
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 53 : Delimiter (Constant value of ';')
		['name'=> 'EVOPT',            'val' => 'EV-',   'type' => 'AN',                                                      'len' => 3,],                          // 54 : E-Voucher Number indicator (Constant value of 'EV-') . Tag mandatory if data requested with Customisation Key.
		['name'=> 'EVID',                               'type' => 'AN',                  'requires' => ['EVOPT',],           'len_min' => 1,   'len_max' => 20,],   // 55 : E- Voucher number
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',                                                      'len' => 1,],                          // 56 : Delimiter (Constant value of ';')
		['name'=> 'DCID',             'val' => 'DC-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 57 : Drop Charge Indicator (Constant value of 'DC-')
		['name'=> 'DCOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 16,],   // 58 : Drop Charge
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 59 : Delimiter (Constant value of ';')
		['name'=> 'DOID',             'val' => 'DO-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 60 : Drop Off Indicator (Constant value of 'DO-')
		['name'=> 'DOOPT',                              'type' => 'AN',                                                      'len_min' => 3,   'len_max' => 60,],   // 61 : Drop Off Information. Drop Off location code + * + Drop off location address.
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 62 : Delimiter (Constant value of ';')
		['name'=> 'FPID',             'val' => 'FP-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 63 : Form of Payment Indicator (Constant value of 'FP-')
		['name'=> 'FPOPT',                              'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 44,],   // 64 : Form of Payment
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 65 : Delimiter (Constant value of ';')
		['name'=> 'FTID',             'val' => 'FT-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 66 : Frequent Traveller Indicator (Constant value of 'FT-')
		['name'=> 'FTOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 28,],   // 67 : Frequent Traveller Number
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 68 : Delimiter (Constant value of ';')
		['name'=> 'GID',              'val' => 'G-',    'type' => 'AN',   'req' => 'M',                                      'len' => 2,],                          // 69 : Guarantee Indicator (Constant value of 'G-')
		['name'=> 'GOPT',                               'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 42,],   // 70 : Guarantee Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 71 : Delimiter (Constant value of ';')
		['name'=> 'IDID',             'val' => 'ID-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 72 : Customer ID Indicator (Constant value of 'ID-')
		['name'=> 'IDOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 20,],   // 73 : Customer ID Number
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 74 : Delimiter (Constant value of ';')
		['name'=> 'ITID',             'val' => 'IT-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 75 : Inclusive Tour Indicator (Constant value of 'IT-')
		['name'=> 'ITOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 20,],   // 76 : Inclusive Tour Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 77 : Delimiter (Constant value of ';')
		['name'=> 'LCID',             'val' => 'LC-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 78 : Location Code Indicator (Constant value of 'LC-')
		['name'=> 'LCOPT',                              'type' => 'AN',                                                      'len_min' => 3,   'len_max' => 6,],    // 79 : Location Code Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 80 : Delimiter (Constant value of ';')
		['name'=> 'MKID',             'val' => 'MK-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 81 : Intercity Distance Indicator (Constant value of 'MK-')
		['name'=> 'MKOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 6,],    // 82 : Intercity Distance Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 83 : Delimiter (Constant value of ';')
		['name'=> 'NMID',             'val' => 'NM-',   'type' => 'AN',                                                      'len' => 3,],                          // 84 : Name Indicator (Constant value of 'NM-')
		['name'=> 'NMOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 25,],   // 85 : Reservation Name. (Conditional on the existence of NMID)
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 86 : Delimiter (Constant value of ';')
		['name'=> 'PUPID',            'val' => 'PUP-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 87 : Pick Up Indicator (Constant value of 'PUP-')
		['name'=> 'PUPOPT',                             'type' => 'AN',                                                      'len_min' => 3,   'len_max' => 60,],   // 88 : Pick Up Information. Pick up location code + * + Pick up location address..
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 89 : Delimiter (Constant value of ';')
		['name'=> 'PCID',             'val' => 'PC-',   'type' => 'AN',                                                      'len' => 3,],                          // 90 : Promotional code indicator (Constant value of 'PC-') . Tag mandatory if data requested with Customisation Key.
		['name'=> 'PRMCDE',                             'type' => 'AN',                  'requires' => ['PCID',],],                                          // 91 : Promotional code
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',  'requires' => ['PCID',],            'len' => 1,],                          // 92 : Delimiter (Constant value of ';')
		['name'=> 'RBID',             'val' => 'RB-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 93 : Base Rate Indicator (Constant value of 'RB-')
		['name'=> 'RBOPT',                              'type' => 'AN',                                                      'len_min' => 6,   'len_max' => 24,],   // 94 : Base Rate Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 95 : Delimiter (Constant value of ';')
		['name'=> 'RCID',             'val' => 'RC-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 96 : Rate Code Indicator (Constant value of 'RC-')
		['name'=> 'RCOPT',                              'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 9,],    // 97 : Rate Code
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 98 : Delimiter (Constant value of ';')
		['name'=> 'RGID',             'val' => 'RG-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 99 : Rate Guaranteed Indicator (Constant value of 'RG-')
		['name'=> 'RGOPT',                              'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 59,],   // 100 : Rate Guaranteed Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 101 : Delimiter (Constant value of ';')
		['name'=> 'RQID',             'val' => 'RQ-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 102 : Rate Quoted Indicator (Constant value of 'RQ-')
		['name'=> 'RQOPT',                              'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 59,],   // 103 : Rate Quoted Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 104 : Delimiter (Constant value of ';')
		['name'=> 'ESID',             'val' => 'ES-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 105 : Estimated Total Rate Indicator (Constant value 'ES-')
		['name' => 'ESTTLRTE',                          'type' =>'composite',                                                                                       // 106 COMPOSITE ELEMENT
		 'childs' => [
		   ['name'=> 'ESCUCDE',                         'type' => 'AN',                                                      'len' => 3,],                          // 107 : Estimated Total Rate Currency
		   ['name'=> 'ESTTLAMT',                        'type' => 'N',                   'requires' => ['ESCUCDE',],],                                      // 108 : Estimated Total Rate Amount
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['ESTTLAMT'],   'len' => 1,],                          // 109 : Delimiter (Constant value of '+')
		   ['name'=> 'ESNBDY',                          'type' => 'AN',                  'requires' => ['ESTTLAMT',],],                                      // 110 : Number of Days, followed by 'D'
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['ESNBDY'],     'len' => 1,],                          // 111 : Delimiter (Constant value of '+')
		   ['name'=> 'ESNBHR',                          'type' => 'AN',                  'requires' => ['ESNBDY',],],                                        // 112 : Number of Hours, followed by 'H'
		 ]],                                                                                                                                                               // 113 COMPOSITE ELEMENT
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 114 : Delimiter (Constant value of ';')

		['name'=> 'ESBKDWN_',                           'type' => 'AN',],                          //

		/*
		Array( 'name' => 'ESBKDWN',                           'type' =>'composite',                                                'rep' => 99,                           // 115 COMPOSITE ELEMENT
		 'childs' => Array(
		   Array( 'name'=> 'ESAMNT',                          'type' => 'NS',),                                                                                           // 116 : Rate, Tax or Surcharge amount.
		   Array( 'name'=> 'DELIM',         'val' => '/',     'type' => 'AN',                                                      'len' => 1,),                          // 117 : Delimiter (Constant value of '/' )
		   Array( 'name'=> 'ESINFO',                          'type' => 'AN',                  'requires' => Array( 'ESAMNT', ),   'len_min' => 2,   'len_max' => 72,),   // 118 : Rate, Tax or Surcharge description
		   Array( 'name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => Array( 'ESINFO'),     'len' => 1,),                          // 119 : Delimiter (Constant value of '+'). (No delimiter follows the last occurrence).
		)),
		*/                                                                                                                                                            // 120 COMPOSITE ELEMENT
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 121 : Delimiter (Constant value of ';')
		['name'=> 'TSFID',            'val' => 'TSF-',  'type' => 'AN',                                                      'len' => 4,],                          // 122 : TSF Indicator (Constant value of 'TSF-') . Tag mandatory if data requested with Customisation Key.
		['name' => 'CARTSF',                            'type' =>'composite',            'requires' => ['CARTSF'],                                            // 123 COMPOSITE ELEMENT
		 'childs' => [
		   ['name'=> 'TSFRT',                           'type' => 'AN',                                                      'len' => 3,],                          // 124 : TSF Revenue Type
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                                                      'len' => 1,],                          // 125 : Delimiter (Constant value of '+')
		   ['name'=> 'TSFAMT',                          'type' => 'N',                   'requires' => ['TSFRT',],],                                         // 127 : TSF Amount
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['TSFAMT'],     'len' => 1,],                          // 128 : Delimiter (Constant value of '+')
		   ['name'=> 'TSFCUR',                          'type' => 'AN',                  'requires' => ['TSFAMT',],   'len' => 3,],                          // 129 : TSF Currency code
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['TSFCUR'],     'len' => 1,],                          // 130 : Delimiter (Constant value of '+')
		   ['name'=> 'TSFPRCNB',                        'type' => 'AN',                  'requires' => ['TSFCUR',],   'len_min' => 8,   'len_max' => 9,],    // 131 : TSF Pricing Number
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['TSFPRCNB'],   'len' => 1,],                          // 132 : Delimiter (Constant value of '+')
		   ['name'=> 'TSFVATIND',                       'type' => 'AN',                  'requires' => ['TSFPRCNB',], 'len' => 1,],                          // 133 : TSF VAT inclusive flag - I = Included - N = Not Included
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['TSFVATIND'],  'len' => 1,],                          // 134 : Delimiter (Constant value of '+')
		   ['name'=> 'TSFVATAMT',                       'type' => 'N',                   'requires' => ['TSFVATIND',],],                                     // 136 : TSF VAT amount
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['TSFVATAMT'],  'len' => 1,],                          // 137 : Delimiter (Constant value of '+'). (No delimiter follows the last occurrence).
		 ]],                                                                                                                                                               // 138 COMPOSITE ELEMENT
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',                                                      'len' => 1,],                          // 139 : Delimiter (Constant value of ';')
		['name'=> 'SIID',             'val' => 'SI-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 140 : Supplementary Information Indicator (Constant value of 'SI-')
		['name'=> 'SIOPT',                              'type' => 'AN',                                                      'len_min' => 3,   'len_max' => 90,],   // 141 : Supplementary Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 142 : Delimiter (Constant value of ';')
		['name'=> 'SQID',             'val' => 'SQ-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 143 : Special Request Indicator (Constant value of 'SQ-')
		['name'=> 'SQOPT',                              'type' => 'AN',                                                      'len_min' => 3,   'len_max' => 15,],   // 144 : Special Request Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 145 : Delimiter (Constant value of ';')
		['name'=> 'TKID',             'val' => 'TK-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 146 : Tracking Field Indicator (Constant value of 'TK-')
		['name'=> 'TKOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 25,],   // 147 : Tracking Field Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 148 : Delimiter (Constant value of ';')
		['name'=> 'VVID',             'val' => 'VV-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 149 : Voucher Value Indicator (Constant value of 'VV-')
		['name'=> 'VVOPT',                              'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 16,],   // 150 : Voucher Value Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 151 : Delimiter (Constant value of ';')
		['name'=> 'ACID',             'val' => '**-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 152 : Accounting Information Indicator (Constant value of '**-')
		['name'=> 'ACOPT',                              'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 25,],   // 153 : Accounting Information Freeflow
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 154 : Delimiter (Constant value of ';')
		['name'=> 'ROID',             'val' => 'RO-',   'type' => 'AN',   'req' => 'M',                                      'len' => 3,],                          // 155 : Rate Override Indicator (Constant value of 'RO-')
		['name'=> 'ROOPT',                              'type' => 'AN',                                                      'len_min' => 2,   'len_max' => 59,],   // 156 : Rate Override Information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 157 : Delimiter (Constant value of ';')
		['name'=> 'DELID',            'val' => 'DEL-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 158 : Delivery Indicator (Constant value of 'DEL-')
		['name'=> 'DELOPT',                             'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 60,],   // 159 : Delivery information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 160 : Delimiter (Constant value of ';')
		['name'=> 'COLID',            'val' => 'COL-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 161 : Collection Indicator (Constant value of 'COL-')
		['name'=> 'COLOPT',                             'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 60,],   // 162 : Collection information
		['name'=> 'DELIM',            'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 163 : Delimiter (Constant value of ';')
		['name'=> 'TAXINFOT',         'val' => 'TAX-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 164 : Tax Information. (Constant value of 'TAX-') This is a composite element
		['name' => 'TAXINFO',                           'type' =>'composite',                                                                                       // 165 COMPOSITE ELEMENT
		 'childs' => [
		   ['name'=> 'TAXVALUE',                        'type' => 'NF',                                                      'len_min' => 1,   'len_max' => 15,],   // 166 : Tax amount
		   ['name'=> 'DELIM',         'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 167 : Delimiter (Constant value of ';')
		   ['name'=> 'TAXPCENT',                        'type' => 'AN',   'req' => 'M',                                      'len' => 7,],                          // 168 : Tax amount unit (constant of 'PERCENT')
		   ['name'=> 'DELIM',         'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 169 : Delimiter (Constant value of ';')
		   ['name'=> 'TAXNAME',                         'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 15,],   // 170 : Tax name
		   ['name'=> 'DELIM',         'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 171 : Delimiter (Constant value of ';')
		   ['name'=> 'TAXINCLU',                        'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 172 : Tax Inclusion :I = IncludedN = Not Included
		   ['name'=> 'DELIM',         'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 173 : Delimiter (Constant value of ';')
		 ]],                                                                                                                                                               // 174 COMPOSITE ELEMENT
		['name'=> 'SURCID',           'val' => 'SUR-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 175 : Surcharge Information identifier. (Constant value of 'SUR-').
		['name' => 'SURCINFO',                          'type' =>'composite',            'requires' => ['SURCID',],   'rep' => 20,                              // 176 COMPOSITE ELEMENT
		 'childs' => [
		   ['name'=> 'SURNAME',                         'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 40,],   // 177 : Surcharge Name
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                                                      'len' => 1,],                          // 178 : Delimiter (Constant value of '+')
		   ['name'=> 'SURVALUE',                        'type' => 'AN',                  'requires' => ['SURNAME',],  'len_min' => 0,   'len_max' => 10,],   // 179 : Surcharge amount or percent value
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['SURVALUE'],   'len' => 1,],                          // 180 : Delimiter (Constant value of '+')
		   ['name'=> 'SURCURR',                         'type' => 'AN',                  'requires' => ['SURVALUE',], 'len_min' => 0,   'len_max' => 7,],    // 181 : Surcharge currency or percent
		   // @see RO, Happy/2013-08-30_163617_81.12.140.206__AIR_0270.txt . The 2013-08-30_163617_81.12.140.206__AIR_0270.txt  field should not depend on the prev fields
		   // the same case is tested in uTests, test_AMA_line_U_09->t_type_09_real03()
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => [],    'len' => 1,],                          // 182 : Delimiter (Constant value of '+')
		   ['name'=> 'SURDURAT',                        'type' => 'AN',                  'requires' => [],  'len' => 2,],                          // 183 : Surcharge duration :PD = Per DayPW = Per WeekPM = Per MonthPR = Per Rental
		   ['name'=> 'DELIM',         'val' => '+',     'type' => 'AN',                  'requires' => ['SURDURAT'],   'len' => 1,],                          // 184 : Delimiter (Constant value of '+')
		   ['name'=> 'SURMAXVA',                        'type' => 'AN',                  'requires' => ['SURDURAT',], 'len_min' => 0,   'len_max' => 25,],   // 185 : Surcharge maximum values
		   ['name'=> 'DELIM',         'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 186 : Delimiter (Constant value of ';')
		 ]],                                                                                                                                                               // 187 COMPOSITE ELEMENT
		['name'=> 'COVID',            'val' => 'COV-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 188 : Coverage Information Identifier (constant value of 'COV-').
		['name' => 'COVINFO',                           'type' =>'composite',            'requires' => ['COVID',],    'rep' => 9,                            // 189 COVERAGE INFORMATION
	    'childs' => [
	      ['name'=> 'COVTYPE',                      'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 5,],    // 191 : Coverage Type
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                  'requires' => ['COVTYPE'],    'len' => 1,],                          // 192 : Delimiter (Constant value of '+')
	      ['name'=> 'COVNAME',                      'type' => 'AN',                  'requires' => ['COVTYPE',],  'len_min' => 0,   'len_max' => 41,],   // 193 : Coverage type name
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                  'requires' => ['COVTYPE'],    'len' => 1,],                          // 194 : Delimiter (Constant value of '+')
	      ['name'=> 'COVVALUE',                     'type' => 'AN',                  'requires' => ['COVTYPE',],  'len_min' => 0,   'len_max' => 10,],   // 195 : Coverage amount
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                  'requires' => ['COVTYPE'],    'len' => 1,],                          // 196 : Delimiter (Constant value of '+')
	      ['name'=> 'COVCURR',                      'type' => 'AN',                  'requires' => ['COVTYPE',],  'len' => 3,],                          // 197 : Coverage amount currency
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                  'requires' => ['COVTYPE'],    'len' => 1,],                          // 198 : Delimiter (Constant value of '+')
	      ['name'=> 'COVDURAT',                     'type' => 'AN',                  'requires' => ['COVTYPE',],  'len' => 2,],                          // 199 : Coverage Duration : PD = Per DayPW = Per WeekPM = Per MonthPR = Per Rental
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                  'requires' => ['COVTYPE'],    'len' => 1,],                          // 200 : Delimiter (Constant value of '+')
	      ['name'=> 'COVEXCID',   'val' => 'EXC-',  'type' => 'AN',                  'requires' => ['COVTYPE'],    'len' => 4,],                          // 201 : Excess identifier (Constant value of 'EXC-')
	      ['name'=> 'COVEXCVA',                     'type' => 'AN',                                                      'len_min' => 0,   'len_max' => 12,],   // 202 : Excess value
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                                                      'len' => 1,],                          // 203 : Delimiter (Constant value of '+')
	      ['name'=> 'COVEXCCU',                     'type' => 'AN',                                                      'len' => 3,],                          // 204 : Excess value currency
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                                                      'len' => 1,],                          // 205 : Delimiter (Constant value of '+')
	      ['name'=> '_stuff',                       'type' => 'AN',],
	      // this tag only exists in the great manual of AMA(v6.20, 01 sep 2011), not in real-life...
// 	      Array( 'name'=> 'COVLIAID',   'val' => 'LIA-',  'type' => 'AN',                  'requires' => Array( 'COVTYPE'),    'len' => 4,),                          // 206 : Liability identifier (constant value of "LIA-")
	      ['name'=> 'COVLIALA',                     'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 12,],   // 207 : Liability Label
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                                                      'len' => 1,],                          // 208 : Delimiter (Constant value of '+')
	      ['name'=> 'COVLIAVA',                     'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 12,],   // 209 : Liability value amount
	      ['name'=> 'DELIM',      'val' => '+',     'type' => 'AN',                                                      'len' => 1,],                          // 210 : Delimiter (Constant value of '+')
	      ['name'=> 'COVLIACU',                     'type' => 'AN',                                                      'len' => 3,],                          // 211 : Liability value currency
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 212 : Delimiter (Constant value of ';')
		]],                                                                                                                                                            // 213 END OF COMPOSITE ELEMENT
		['name'=> 'VEHINFOT',      'val' => 'VEH-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 214 : Vehicle Information (constant value of "VEH-"). This is a composite element.
		['name' => 'VEHINFO',                        'type' =>'composite',                                                                                       // 215 COMPOSITE ELEMENT
	    'childs' => [
	      ['name'=> 'VEHMAKE',                      'type' => 'AN',                                                      'len_min' => 1,   'len_max' => 55,],   // 216 : Vehicle make model
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 217 : Delimiter (Constant value of ';')
	      ['name'=> 'VEHGRPID',   'val' => 'GRP-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 218 : Car group identifier (Constant value of "GRP-")
	      ['name'=> 'VEHGRP',                       'type' => 'AN',                                                      'len' => 1,],                          // 219 : Car group.
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 220 : Delimiter (Constant value of ';')
	      ['name'=> 'DOORSID',    'val' => 'DRS-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 221 : Number of doors Identifier (constant value of "DRS-")
	      ['name'=> 'NBDOORS',                      'type' => 'N',                                                       'len' => 1,],                          // 222 : Number of doors.
	      ['name'=> 'DOORDELI',   'val' => '/',     'type' => 'AN',                                                      'len' => 1,],                          // 223 : Number of doors delimiter (constant value of '/')
	      ['name'=> 'MAXDOORS',                     'type' => 'N',                                                       'len' => 1,],                          // 224 : Maximum number of doors.
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 225 : Delimiter (Constant value of ';')
	      ['name'=> 'SEATSID',    'val' => 'SEA-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 226 : Number of seats Identifier (constant value of "SEA-")
	      ['name'=> 'NBSEATS',                      'type' => 'N',                                                       'len_min' => 1,   'len_max' => 2,],    // 227 : Number of seats.
	      ['name'=> 'SEATSDELI',  'val' => '/',     'type' => 'AN',                                                      'len' => 1,],                          // 228 : Number of seats delimiter (constant value of '/')
	      ['name'=> 'MAXSEATS',                     'type' => 'N',                                                       'len_min' => 1,   'len_max' => 2,],    // 229 : Maximum number of seats.
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 230 : Delimiter (Constant value of ';')
	      ['name'=> 'BAGSID',     'val' => 'BAG-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 231 : Number of bags identifier (constant value of "BAG-")
	      ['name'=> 'NBBAGS',                       'type' => 'N',                                                       'len' => 1,],                          // 232 : Number of bags
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 233 : Delimiter (Constant value of ';')
	      ['name'=> 'BOOTID',     'val' => 'BOO-',  'type' => 'AN',   'req' => 'M',                                      'len' => 4,],                          // 234 : Boot's volume identifier (constant value of "BOO-"
	      ['name'=> 'BOOTVOL',                      'type' => 'AN',],                                                                                           // 235 : Volume of the boot.
	      ['name'=> 'DELIM',      'val' => ';',     'type' => 'AN',   'req' => 'M',                                      'len' => 1,],                          // 236 : Delimiter (Constant value of ';')
		]],                                                                                                                                                               // 237 END OF COMPOSITE ELEMENT
	['name' => 'CARLEI',                         'type' =>'composite',                                                                                       // 238 COMPOSITE ELEMENT
	    'childs' => [
	       ['name'=> 'LEIID',      'val' => 'LEI-',  'type' => 'AN',                                                 'len' => 4,],                          // 218 : Car group identifier (Constant value of "GRP-")
	       ['name'=> 'value',                        'type' => 'AN',             'requires' => ['LEIID',],],                          // 219 : Car group.
		]],
	   ['name'=> 'DELIM',         'val' => ';',     'type' => 'AN',                                                      'len' => 1,],
	   ['name'=> 'FLNTAG',                          'type' => 'AN',                                                      'len' => 4,],                          // 253 : FLWN' (flown/past date segment tag when present in the PNR)
	   ['name'=> 'PSGASS',        'val' => ';P',    'type' => 'ASSOC',],
	];

	/**
	 * (non-PHPdoc)
	 * @see \App\Amadeus\FileParser\Line_U_08::postParse()
	 */
	protected function postParse()
	{
		parent::postParse();

		if($this->tree['_type'] == '09'){	// car
			$ESBKDWNArr = explode("+", $this->tree['ESBKDWN_']);
			foreach($ESBKDWNArr as $idx=>$ESBKDWN) {
				$matches = [];
				preg_match("/^(?P<ESAMNT>[0-9\.]*)\/(?P<ESINFO>.+)$/", $ESBKDWN, $matches);
				$this->tree['ESBKDWN'][$idx]['ESAMNT'] = ($matches['ESAMNT']?(float)$matches['ESAMNT']:null);
				$this->tree['ESBKDWN'][$idx]['ESINFO'] = $matches['ESINFO'];
			}
			$this->tree['ESBKDWN'] = 	self::rtrimArrDeep($this->tree['ESBKDWN'], 1);


			$this->tree['SURCINFO'] = 	self::rtrimArrDeep($this->tree['SURCINFO'], 1);
			$this->tree['COVINFO'] = 	self::rtrimArrDeep($this->tree['COVINFO'], 1);

			// CCCA123422XX24551234EXP1029
			if ($this->tree['GOPT']) {
				$fopHelper = new \App\Utils\BaseParser\Utils\FormOfPaymentExtractor();
				$this->tree['GOPT_'] = $fopHelper->extractSimpleFormats($this->tree['GOPT'], 'return:partial');
			}

			// see MAIL:RGOPT, RQOPT for details
			// *ZI*EUR41.50DY UNL FM XH 41.50 UNL FM
			// EUR 41.00- .00 UNL DY 41.00- UNL XD
			$rateInfo = [];
			preg_match("/^(\*(?P<supplierCode>[A-Z]{2})\*)?(?P<dailyCurrency>[A-Z]{3})[\s]*(?P<dailyRate>[0-9\.]+)/", $this->tree['RGOPT'], $matches);
			$rateInfo['supplierCode'] = 	$matches['supplierCode'];
			$rateInfo['dailyCurrency'] = 	$matches['dailyCurrency'];
			$rateInfo['dailyRate'] = 		$matches['dailyRate'];
			$rateInfo['_format'] = 			'1.0';

			$this->tree['RGOPT_'] = $rateInfo;

			// *ZI*EUR41.50DY UNL FM XH 41.50 UNL FM
			// EUR 41.00- .00 UNL DY 41.00- UNL XD
			$rateInfo = [];
			preg_match("/^(\*(?P<supplierCode>[A-Z]{2})\*)(?P<dailyCurrency>[A-Z]{3})[\s]*(?P<dailyRate>[0-9\.]+)/", $this->tree['RQOPT'], $matches);
			if ($matches) {
				$rateInfo['format_'] = 			'1.0';
				$rateInfo['supplierCode'] = 	$matches['supplierCode'];
				$rateInfo['dailyCurrency'] = 	$matches['dailyCurrency'];
				$rateInfo['dailyRate'] = 		$matches['dailyRate'];
			}
			preg_match("/^(?P<totalCurrency>[A-Z]{3})(?P<totalRate>[0-9\.]+)$/", $this->tree['RQOPT'], $matches);
			if ($matches) {
				$rateInfo['format_'] = 			'2.0';
				$rateInfo['totalCurrency'] = 	$matches['totalCurrency'];
				$rateInfo['totalRate'] = 		$matches['totalRate'];
			}

			$this->tree['RQOPT_'] = $rateInfo;


			// custom-parsing
			if($this->tree['ARROPT']){
				$ARROPT = \App\Amadeus\FileParser\LineAbstract::extractHour($this->tree['ARROPT'], 'auto');
				if(!$ARROPT){
					preg_match("/^(.+)-(?P<ARROPT>[0-9]{4})$/", $this->tree['ARROPT'], $matches);
					$ARROPT = \App\Amadeus\FileParser\LineAbstract::extractHour($matches['ARROPT'], 'auto');
				}
				$this->tree['ARROPT'] = $ARROPT;
			}

			if ($this->tree['CARLEI']['LEIID']) {
				list($this->tree['CARLEI']['LEIFLG'],
					$this->tree['CARLEI']['CANPRN'],
					$this->tree['CARLEI']['XSREFD'],
					$this->tree['CARLEI']['PRPIND'],
					$this->tree['CARLEI']['DRVAGE'],
					$this->tree['CARLEI']['EMLADR'], ) = 	explode("+", $this->tree['CARLEI']['value']);
			}
		}
	}

}
