 	///
 	/// - Parameter dedicatedFile: Absolute path to dedicated file without the MF Identifier
 	func select(dedicatedFile file: [UInt8], handler reply: @escaping (Error?)->Void) {
-		self.transmit(Data(bytes: selectFile + [UInt8(file.count)] + file)) { (selectFileReply, error) in
+		let packet = Data(
+			bytes: [
+				0x00,
+				0xA4,
+				0x08,
+				0x0C,
+				UInt8(file.count)
+				] + file
+		)
+		self.transmit(packet) { (selectFileReply, error) in
 			if let error = error {
 				reply(error)
 			} else if let selectFileReply = selectFileReply {

let photoFile:     [UInt8] = [0xDF, 0x01, 0x40, 0x35]
let addressFile:   [UInt8] = [0xDF, 0x01, 0x40, 0x33]
let basicInfoFile: [UInt8] = [0xDF, 0x01, 0x40, 0x31]
let selectFile:    [UInt8] = [0,    0xA4, 0x08, 0x0C]
let readBinary:    [UInt8] = [0,    0xB0]

let geocoder = CLGeocoder()


	///   - length: number of bytes to read (Le)
	///   - offset: number of bytes to skip (15-bit unsigned integer, ranging from 0 to 32 767)
	///   - handler: function to execute after completion
	func readBytes(length: UInt8, offset: UInt16 = 0, handler: @escaping (_ response: ReadResponse) -> Void) {
		let packet = Data(
			bytes: [
				0x00, // Commmand header: CLA (Class byte)
				0xB0,                  // INS (Instruction byte: READ BINARY)
				UInt8(offset >> 8),    // P1  (Parameter byte: offset's high byte)
				UInt8(offset & 0xff),  // P2  (Parameter byte: offset's  low byte)
				
				length // Length of the file
			]
		)
		transmit(packet) { (binaryReply, error) in
			if let error = error {
				handler(.error(error))
			} else if let binaryReply = binaryReply {
				let statusBytes = (binaryReply[binaryReply.endIndex-2], binaryReply.last!)
				switch statusBytes {
