diff --git a/TraccarClient.xcodeproj/project.pbxproj b/TraccarClient.xcodeproj/project.pbxproj
index 495d1676dc11b7c9ca7097ef62cf3fb882d634cb..f57835edeb6b4c0b30f3cae68bd9806b507bf426 100644
--- a/TraccarClient.xcodeproj/project.pbxproj
+++ b/TraccarClient.xcodeproj/project.pbxproj
@@ -7,6 +7,63 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		5326833C2AE9175900A364C0 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326833A2AE9175900A364C0 /* LoginViewController.swift */; };
+		5326833D2AE9175900A364C0 /* LoginViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5326833B2AE9175900A364C0 /* LoginViewController.xib */; };
+		532683512AE91A6F00A364C0 /* Montserrat-ExtraLightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326833F2AE91A6E00A364C0 /* Montserrat-ExtraLightItalic.ttf */; };
+		532683522AE91A6F00A364C0 /* Montserrat-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683402AE91A6E00A364C0 /* Montserrat-Light.ttf */; };
+		532683532AE91A6F00A364C0 /* Montserrat-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683412AE91A6E00A364C0 /* Montserrat-ExtraBold.ttf */; };
+		532683542AE91A6F00A364C0 /* Montserrat-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683422AE91A6E00A364C0 /* Montserrat-LightItalic.ttf */; };
+		532683552AE91A6F00A364C0 /* Montserrat-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683432AE91A6E00A364C0 /* Montserrat-Italic.ttf */; };
+		532683562AE91A6F00A364C0 /* Montserrat-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683442AE91A6E00A364C0 /* Montserrat-MediumItalic.ttf */; };
+		532683572AE91A6F00A364C0 /* Montserrat-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683452AE91A6E00A364C0 /* Montserrat-BoldItalic.ttf */; };
+		532683582AE91A6F00A364C0 /* Montserrat-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683462AE91A6F00A364C0 /* Montserrat-SemiBoldItalic.ttf */; };
+		532683592AE91A6F00A364C0 /* Montserrat-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683472AE91A6F00A364C0 /* Montserrat-SemiBold.ttf */; };
+		5326835A2AE91A6F00A364C0 /* Montserrat-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683482AE91A6F00A364C0 /* Montserrat-Thin.ttf */; };
+		5326835B2AE91A6F00A364C0 /* Montserrat-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683492AE91A6F00A364C0 /* Montserrat-BlackItalic.ttf */; };
+		5326835C2AE91A6F00A364C0 /* Montserrat-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326834A2AE91A6F00A364C0 /* Montserrat-ThinItalic.ttf */; };
+		5326835D2AE91A6F00A364C0 /* Montserrat-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326834B2AE91A6F00A364C0 /* Montserrat-Bold.ttf */; };
+		5326835E2AE91A6F00A364C0 /* Montserrat-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326834C2AE91A6F00A364C0 /* Montserrat-Regular.ttf */; };
+		5326835F2AE91A6F00A364C0 /* Montserrat-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326834D2AE91A6F00A364C0 /* Montserrat-Black.ttf */; };
+		532683602AE91A6F00A364C0 /* Montserrat-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326834E2AE91A6F00A364C0 /* Montserrat-Medium.ttf */; };
+		532683612AE91A6F00A364C0 /* Montserrat-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5326834F2AE91A6F00A364C0 /* Montserrat-ExtraLight.ttf */; };
+		532683622AE91A6F00A364C0 /* Montserrat-ExtraBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 532683502AE91A6F00A364C0 /* Montserrat-ExtraBoldItalic.ttf */; };
+		532683652AE91D0800A364C0 /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683642AE91D0800A364C0 /* UIFont.swift */; };
+		532683742AE923A500A364C0 /* KNTextFieldView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 532683672AE923A500A364C0 /* KNTextFieldView.xib */; };
+		532683752AE923A500A364C0 /* KNTextFieldView+Protocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683682AE923A500A364C0 /* KNTextFieldView+Protocols.swift */; };
+		532683762AE923A500A364C0 /* KNTextFieldViewHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683692AE923A500A364C0 /* KNTextFieldViewHelper.swift */; };
+		532683772AE923A500A364C0 /* KNTextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326836A2AE923A500A364C0 /* KNTextFieldView.swift */; };
+		532683782AE923A500A364C0 /* FieldTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5326836C2AE923A500A364C0 /* FieldTableViewCell.xib */; };
+		532683792AE923A500A364C0 /* FieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326836D2AE923A500A364C0 /* FieldTableViewCell.swift */; };
+		5326837A2AE923A500A364C0 /* KNFieldDropDownAddressObjectProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326836F2AE923A500A364C0 /* KNFieldDropDownAddressObjectProtocol.swift */; };
+		5326837B2AE923A500A364C0 /* KNFieldType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683702AE923A500A364C0 /* KNFieldType.swift */; };
+		5326837C2AE923A500A364C0 /* KNField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683712AE923A500A364C0 /* KNField.swift */; };
+		5326837D2AE923A500A364C0 /* KNFieldBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683722AE923A500A364C0 /* KNFieldBuilder.swift */; };
+		5326837E2AE923A500A364C0 /* KNFieldDropdownObjectProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683732AE923A500A364C0 /* KNFieldDropdownObjectProtocol.swift */; };
+		532683812AE923DE00A364C0 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 532683802AE923DE00A364C0 /* Alamofire */; };
+		532683832AE928F900A364C0 /* KNTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683822AE928F900A364C0 /* KNTableViewCell.swift */; };
+		532683852AE9293200A364C0 /* KNComponentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683842AE9293200A364C0 /* KNComponentView.swift */; };
+		532683872AE9295500A364C0 /* Nameable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683862AE9295500A364C0 /* Nameable.swift */; };
+		532683892AE92B6800A364C0 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683882AE92B6800A364C0 /* Observable.swift */; };
+		5326838B2AE92CA500A364C0 /* JSONField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326838A2AE92CA500A364C0 /* JSONField.swift */; };
+		5326838D2AE92D9900A364C0 /* CGFLoat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326838C2AE92D9900A364C0 /* CGFLoat.swift */; };
+		532683962AE9482300A364C0 /* Network+Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5326838F2AE9482200A364C0 /* Network+Endpoint.swift */; };
+		532683972AE9482300A364C0 /* Network+Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683902AE9482200A364C0 /* Network+Result.swift */; };
+		532683992AE9482300A364C0 /* Network+Rechability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683922AE9482300A364C0 /* Network+Rechability.swift */; };
+		5326839A2AE9482300A364C0 /* Network+Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683932AE9482300A364C0 /* Network+Types.swift */; };
+		5326839B2AE9482300A364C0 /* NetworkRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683942AE9482300A364C0 /* NetworkRequest.swift */; };
+		5326839C2AE9482300A364C0 /* Network+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683952AE9482300A364C0 /* Network+Error.swift */; };
+		5326839F2AE9489C00A364C0 /* Reachability in Frameworks */ = {isa = PBXBuildFile; productRef = 5326839E2AE9489C00A364C0 /* Reachability */; };
+		532683A12AE948FF00A364C0 /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683A02AE948FF00A364C0 /* AppManager.swift */; };
+		532683A32AE9497100A364C0 /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683A22AE9497100A364C0 /* Keys.swift */; };
+		532683A52AE94A3500A364C0 /* KNTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683A42AE94A3500A364C0 /* KNTextField.swift */; };
+		532683A72AE94ADC00A364C0 /* KNObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683A62AE94ADC00A364C0 /* KNObject.swift */; };
+		532683A92AE94B1300A364C0 /* UIInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683A82AE94B1300A364C0 /* UIInt.swift */; };
+		532683AB2AE94BA500A364C0 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683AA2AE94BA500A364C0 /* UIView.swift */; };
+		532683AD2AE94BFC00A364C0 /* Logs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683AC2AE94BFC00A364C0 /* Logs.swift */; };
+		532683AF2AE94C2F00A364C0 /* NSLayoutConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683AE2AE94C2F00A364C0 /* NSLayoutConstraints.swift */; };
+		532683B12AE94C9400A364C0 /* Dictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683B02AE94C9400A364C0 /* Dictionary.swift */; };
+		532683B32AE98D0000A364C0 /* UILabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683B22AE98D0000A364C0 /* UILabel.swift */; };
+		532683B52AE98FB600A364C0 /* UIString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532683B42AE98FB600A364C0 /* UIString.swift */; };
 		5E394EBE28A9CC7600396F33 /* BatteryStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E394EBD28A9CC7600396F33 /* BatteryStatus.swift */; };
 		5E716A271F63A0B100A2DBC3 /* DistanceCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A261F63A0B100A2DBC3 /* DistanceCalculator.swift */; };
 		5E716A291F63A45A00A2DBC3 /* RequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E716A281F63A45A00A2DBC3 /* RequestManager.swift */; };
@@ -65,6 +122,61 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		5326833A2AE9175900A364C0 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = "<group>"; };
+		5326833B2AE9175900A364C0 /* LoginViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LoginViewController.xib; sourceTree = "<group>"; };
+		5326833F2AE91A6E00A364C0 /* Montserrat-ExtraLightItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-ExtraLightItalic.ttf"; sourceTree = "<group>"; };
+		532683402AE91A6E00A364C0 /* Montserrat-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Light.ttf"; sourceTree = "<group>"; };
+		532683412AE91A6E00A364C0 /* Montserrat-ExtraBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-ExtraBold.ttf"; sourceTree = "<group>"; };
+		532683422AE91A6E00A364C0 /* Montserrat-LightItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-LightItalic.ttf"; sourceTree = "<group>"; };
+		532683432AE91A6E00A364C0 /* Montserrat-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Italic.ttf"; sourceTree = "<group>"; };
+		532683442AE91A6E00A364C0 /* Montserrat-MediumItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-MediumItalic.ttf"; sourceTree = "<group>"; };
+		532683452AE91A6E00A364C0 /* Montserrat-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-BoldItalic.ttf"; sourceTree = "<group>"; };
+		532683462AE91A6F00A364C0 /* Montserrat-SemiBoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-SemiBoldItalic.ttf"; sourceTree = "<group>"; };
+		532683472AE91A6F00A364C0 /* Montserrat-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-SemiBold.ttf"; sourceTree = "<group>"; };
+		532683482AE91A6F00A364C0 /* Montserrat-Thin.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Thin.ttf"; sourceTree = "<group>"; };
+		532683492AE91A6F00A364C0 /* Montserrat-BlackItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-BlackItalic.ttf"; sourceTree = "<group>"; };
+		5326834A2AE91A6F00A364C0 /* Montserrat-ThinItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-ThinItalic.ttf"; sourceTree = "<group>"; };
+		5326834B2AE91A6F00A364C0 /* Montserrat-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Bold.ttf"; sourceTree = "<group>"; };
+		5326834C2AE91A6F00A364C0 /* Montserrat-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Regular.ttf"; sourceTree = "<group>"; };
+		5326834D2AE91A6F00A364C0 /* Montserrat-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Black.ttf"; sourceTree = "<group>"; };
+		5326834E2AE91A6F00A364C0 /* Montserrat-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-Medium.ttf"; sourceTree = "<group>"; };
+		5326834F2AE91A6F00A364C0 /* Montserrat-ExtraLight.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-ExtraLight.ttf"; sourceTree = "<group>"; };
+		532683502AE91A6F00A364C0 /* Montserrat-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Montserrat-ExtraBoldItalic.ttf"; sourceTree = "<group>"; };
+		532683642AE91D0800A364C0 /* UIFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = "<group>"; };
+		532683672AE923A500A364C0 /* KNTextFieldView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KNTextFieldView.xib; sourceTree = "<group>"; };
+		532683682AE923A500A364C0 /* KNTextFieldView+Protocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "KNTextFieldView+Protocols.swift"; sourceTree = "<group>"; };
+		532683692AE923A500A364C0 /* KNTextFieldViewHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNTextFieldViewHelper.swift; sourceTree = "<group>"; };
+		5326836A2AE923A500A364C0 /* KNTextFieldView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNTextFieldView.swift; sourceTree = "<group>"; };
+		5326836C2AE923A500A364C0 /* FieldTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FieldTableViewCell.xib; sourceTree = "<group>"; };
+		5326836D2AE923A500A364C0 /* FieldTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FieldTableViewCell.swift; sourceTree = "<group>"; };
+		5326836F2AE923A500A364C0 /* KNFieldDropDownAddressObjectProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNFieldDropDownAddressObjectProtocol.swift; sourceTree = "<group>"; };
+		532683702AE923A500A364C0 /* KNFieldType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNFieldType.swift; sourceTree = "<group>"; };
+		532683712AE923A500A364C0 /* KNField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNField.swift; sourceTree = "<group>"; };
+		532683722AE923A500A364C0 /* KNFieldBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNFieldBuilder.swift; sourceTree = "<group>"; };
+		532683732AE923A500A364C0 /* KNFieldDropdownObjectProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KNFieldDropdownObjectProtocol.swift; sourceTree = "<group>"; };
+		532683822AE928F900A364C0 /* KNTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KNTableViewCell.swift; sourceTree = "<group>"; };
+		532683842AE9293200A364C0 /* KNComponentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KNComponentView.swift; sourceTree = "<group>"; };
+		532683862AE9295500A364C0 /* Nameable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Nameable.swift; sourceTree = "<group>"; };
+		532683882AE92B6800A364C0 /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = "<group>"; };
+		5326838A2AE92CA500A364C0 /* JSONField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONField.swift; sourceTree = "<group>"; };
+		5326838C2AE92D9900A364C0 /* CGFLoat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGFLoat.swift; sourceTree = "<group>"; };
+		5326838F2AE9482200A364C0 /* Network+Endpoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Network+Endpoint.swift"; sourceTree = "<group>"; };
+		532683902AE9482200A364C0 /* Network+Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Network+Result.swift"; sourceTree = "<group>"; };
+		532683922AE9482300A364C0 /* Network+Rechability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Network+Rechability.swift"; sourceTree = "<group>"; };
+		532683932AE9482300A364C0 /* Network+Types.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Network+Types.swift"; sourceTree = "<group>"; };
+		532683942AE9482300A364C0 /* NetworkRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkRequest.swift; sourceTree = "<group>"; };
+		532683952AE9482300A364C0 /* Network+Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Network+Error.swift"; sourceTree = "<group>"; };
+		532683A02AE948FF00A364C0 /* AppManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = "<group>"; };
+		532683A22AE9497100A364C0 /* Keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = "<group>"; };
+		532683A42AE94A3500A364C0 /* KNTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KNTextField.swift; sourceTree = "<group>"; };
+		532683A62AE94ADC00A364C0 /* KNObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KNObject.swift; sourceTree = "<group>"; };
+		532683A82AE94B1300A364C0 /* UIInt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIInt.swift; sourceTree = "<group>"; };
+		532683AA2AE94BA500A364C0 /* UIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = "<group>"; };
+		532683AC2AE94BFC00A364C0 /* Logs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logs.swift; sourceTree = "<group>"; };
+		532683AE2AE94C2F00A364C0 /* NSLayoutConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraints.swift; sourceTree = "<group>"; };
+		532683B02AE94C9400A364C0 /* Dictionary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dictionary.swift; sourceTree = "<group>"; };
+		532683B22AE98D0000A364C0 /* UILabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILabel.swift; sourceTree = "<group>"; };
+		532683B42AE98FB600A364C0 /* UIString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIString.swift; sourceTree = "<group>"; };
 		5E394EBD28A9CC7600396F33 /* BatteryStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryStatus.swift; sourceTree = "<group>"; };
 		5E716A261F63A0B100A2DBC3 /* DistanceCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DistanceCalculator.swift; sourceTree = "<group>"; };
 		5E716A281F63A45A00A2DBC3 /* RequestManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestManager.swift; sourceTree = "<group>"; };
@@ -132,10 +244,12 @@
 			buildActionMask = 2147483647;
 			files = (
 				CBDEEB8A1B8EB6A4006BC126 /* SystemConfiguration.framework in Frameworks */,
+				5326839F2AE9489C00A364C0 /* Reachability in Frameworks */,
 				CBCE82EF1B8D253600A7318B /* CoreData.framework in Frameworks */,
 				5EE3CA342998948F002C86E4 /* FirebaseAnalytics in Frameworks */,
 				CEDB048717ED50C1000E7EDF /* CoreLocation.framework in Frameworks */,
 				CED4879917DB1DF4007FCF57 /* MessageUI.framework in Frameworks */,
+				532683812AE923DE00A364C0 /* Alamofire in Frameworks */,
 				CED4871C17DB1BF6007FCF57 /* UIKit.framework in Frameworks */,
 				5EE3CA362998948F002C86E4 /* FirebaseCrashlytics in Frameworks */,
 				5EE3CA39299894B9002C86E4 /* InAppSettingsKit in Frameworks */,
@@ -154,6 +268,114 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		532683392AE9174700A364C0 /* Views */ = {
+			isa = PBXGroup;
+			children = (
+				532683822AE928F900A364C0 /* KNTableViewCell.swift */,
+				532683662AE923A500A364C0 /* BMTextFieldView */,
+				5326833A2AE9175900A364C0 /* LoginViewController.swift */,
+				5326833B2AE9175900A364C0 /* LoginViewController.xib */,
+				532683842AE9293200A364C0 /* KNComponentView.swift */,
+			);
+			name = Views;
+			sourceTree = "<group>";
+		};
+		5326833E2AE91A6200A364C0 /* Fonts */ = {
+			isa = PBXGroup;
+			children = (
+				5326834D2AE91A6F00A364C0 /* Montserrat-Black.ttf */,
+				532683492AE91A6F00A364C0 /* Montserrat-BlackItalic.ttf */,
+				5326834B2AE91A6F00A364C0 /* Montserrat-Bold.ttf */,
+				532683452AE91A6E00A364C0 /* Montserrat-BoldItalic.ttf */,
+				532683412AE91A6E00A364C0 /* Montserrat-ExtraBold.ttf */,
+				532683502AE91A6F00A364C0 /* Montserrat-ExtraBoldItalic.ttf */,
+				5326834F2AE91A6F00A364C0 /* Montserrat-ExtraLight.ttf */,
+				5326833F2AE91A6E00A364C0 /* Montserrat-ExtraLightItalic.ttf */,
+				532683432AE91A6E00A364C0 /* Montserrat-Italic.ttf */,
+				532683402AE91A6E00A364C0 /* Montserrat-Light.ttf */,
+				532683422AE91A6E00A364C0 /* Montserrat-LightItalic.ttf */,
+				5326834E2AE91A6F00A364C0 /* Montserrat-Medium.ttf */,
+				532683442AE91A6E00A364C0 /* Montserrat-MediumItalic.ttf */,
+				5326834C2AE91A6F00A364C0 /* Montserrat-Regular.ttf */,
+				532683472AE91A6F00A364C0 /* Montserrat-SemiBold.ttf */,
+				532683462AE91A6F00A364C0 /* Montserrat-SemiBoldItalic.ttf */,
+				532683482AE91A6F00A364C0 /* Montserrat-Thin.ttf */,
+				5326834A2AE91A6F00A364C0 /* Montserrat-ThinItalic.ttf */,
+			);
+			name = Fonts;
+			sourceTree = "<group>";
+		};
+		532683632AE91CAC00A364C0 /* helpers */ = {
+			isa = PBXGroup;
+			children = (
+				5326838E2AE947D900A364C0 /* Network */,
+				532683642AE91D0800A364C0 /* UIFont.swift */,
+				5326838C2AE92D9900A364C0 /* CGFLoat.swift */,
+				532683862AE9295500A364C0 /* Nameable.swift */,
+				532683A02AE948FF00A364C0 /* AppManager.swift */,
+				532683A22AE9497100A364C0 /* Keys.swift */,
+				532683A42AE94A3500A364C0 /* KNTextField.swift */,
+				532683A62AE94ADC00A364C0 /* KNObject.swift */,
+				532683A82AE94B1300A364C0 /* UIInt.swift */,
+				532683AA2AE94BA500A364C0 /* UIView.swift */,
+				532683AC2AE94BFC00A364C0 /* Logs.swift */,
+				532683AE2AE94C2F00A364C0 /* NSLayoutConstraints.swift */,
+				532683B02AE94C9400A364C0 /* Dictionary.swift */,
+				532683B22AE98D0000A364C0 /* UILabel.swift */,
+			);
+			name = helpers;
+			sourceTree = "<group>";
+		};
+		532683662AE923A500A364C0 /* BMTextFieldView */ = {
+			isa = PBXGroup;
+			children = (
+				532683672AE923A500A364C0 /* KNTextFieldView.xib */,
+				532683682AE923A500A364C0 /* KNTextFieldView+Protocols.swift */,
+				532683692AE923A500A364C0 /* KNTextFieldViewHelper.swift */,
+				5326836A2AE923A500A364C0 /* KNTextFieldView.swift */,
+				5326836B2AE923A500A364C0 /* Cell */,
+				5326836E2AE923A500A364C0 /* Model */,
+			);
+			path = BMTextFieldView;
+			sourceTree = "<group>";
+		};
+		5326836B2AE923A500A364C0 /* Cell */ = {
+			isa = PBXGroup;
+			children = (
+				5326836C2AE923A500A364C0 /* FieldTableViewCell.xib */,
+				5326836D2AE923A500A364C0 /* FieldTableViewCell.swift */,
+			);
+			path = Cell;
+			sourceTree = "<group>";
+		};
+		5326836E2AE923A500A364C0 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				5326836F2AE923A500A364C0 /* KNFieldDropDownAddressObjectProtocol.swift */,
+				532683702AE923A500A364C0 /* KNFieldType.swift */,
+				532683712AE923A500A364C0 /* KNField.swift */,
+				532683722AE923A500A364C0 /* KNFieldBuilder.swift */,
+				532683732AE923A500A364C0 /* KNFieldDropdownObjectProtocol.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		5326838E2AE947D900A364C0 /* Network */ = {
+			isa = PBXGroup;
+			children = (
+				532683882AE92B6800A364C0 /* Observable.swift */,
+				5326838F2AE9482200A364C0 /* Network+Endpoint.swift */,
+				532683952AE9482300A364C0 /* Network+Error.swift */,
+				532683922AE9482300A364C0 /* Network+Rechability.swift */,
+				532683902AE9482200A364C0 /* Network+Result.swift */,
+				532683932AE9482300A364C0 /* Network+Types.swift */,
+				532683942AE9482300A364C0 /* NetworkRequest.swift */,
+				5326838A2AE92CA500A364C0 /* JSONField.swift */,
+				532683B42AE98FB600A364C0 /* UIString.swift */,
+			);
+			name = Network;
+			sourceTree = "<group>";
+		};
 		CED4870F17DB1BF6007FCF57 = {
 			isa = PBXGroup;
 			children = (
@@ -190,10 +412,12 @@
 		CED4872117DB1BF6007FCF57 /* TraccarClient */ = {
 			isa = PBXGroup;
 			children = (
+				532683632AE91CAC00A364C0 /* helpers */,
 				CE5899C71B115C9100ED70D2 /* Images.xcassets */,
 				CED4873317DB1BF6007FCF57 /* MainStoryboard.storyboard */,
 				CEF643241B919FFA00195CEA /* LaunchScreen.xib */,
 				CEF643371B91A94600195CEA /* Localizable.strings */,
+				532683392AE9174700A364C0 /* Views */,
 				CED4872217DB1BF6007FCF57 /* Supporting Files */,
 				CB7ED0831F662BAF00A33FCF /* AppDelegate.swift */,
 				CB4197921F674A3E008F301C /* DatabaseHelper.swift */,
@@ -214,6 +438,7 @@
 		CED4872217DB1BF6007FCF57 /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
+				5326833E2AE91A6200A364C0 /* Fonts */,
 				CED4872317DB1BF6007FCF57 /* TraccarClient-Info.plist */,
 				CED4872917DB1BF6007FCF57 /* TraccarClient-Prefix.pch */,
 				CBCE82F01B8D265800A7318B /* TraccarClient.xcdatamodeld */,
@@ -264,6 +489,8 @@
 				5EE3CA332998948F002C86E4 /* FirebaseAnalytics */,
 				5EE3CA352998948F002C86E4 /* FirebaseCrashlytics */,
 				5EE3CA38299894B9002C86E4 /* InAppSettingsKit */,
+				532683802AE923DE00A364C0 /* Alamofire */,
+				5326839E2AE9489C00A364C0 /* Reachability */,
 			);
 			productName = TraccarClient;
 			productReference = CED4871817DB1BF6007FCF57 /* TraccarClient.app */;
@@ -330,6 +557,8 @@
 			packageReferences = (
 				5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
 				5EE3CA37299894B9002C86E4 /* XCRemoteSwiftPackageReference "InAppSettingsKit" */,
+				5326837F2AE923DE00A364C0 /* XCRemoteSwiftPackageReference "Alamofire" */,
+				5326839D2AE9489C00A364C0 /* XCRemoteSwiftPackageReference "Reachability" */,
 			);
 			productRefGroup = CED4871917DB1BF6007FCF57 /* Products */;
 			projectDirPath = "";
@@ -346,11 +575,32 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				532683582AE91A6F00A364C0 /* Montserrat-SemiBoldItalic.ttf in Resources */,
+				532683572AE91A6F00A364C0 /* Montserrat-BoldItalic.ttf in Resources */,
 				CEF6433C1B91AA9400195CEA /* MainStoryboard.storyboard in Resources */,
+				5326835B2AE91A6F00A364C0 /* Montserrat-BlackItalic.ttf in Resources */,
 				CEF6433D1B91AA9400195CEA /* Localizable.strings in Resources */,
+				532683552AE91A6F00A364C0 /* Montserrat-Italic.ttf in Resources */,
+				5326833D2AE9175900A364C0 /* LoginViewController.xib in Resources */,
 				CE5899C81B115C9100ED70D2 /* Images.xcassets in Resources */,
+				5326835F2AE91A6F00A364C0 /* Montserrat-Black.ttf in Resources */,
+				532683742AE923A500A364C0 /* KNTextFieldView.xib in Resources */,
+				532683622AE91A6F00A364C0 /* Montserrat-ExtraBoldItalic.ttf in Resources */,
+				5326835E2AE91A6F00A364C0 /* Montserrat-Regular.ttf in Resources */,
+				532683522AE91A6F00A364C0 /* Montserrat-Light.ttf in Resources */,
 				CEF643271B919FFA00195CEA /* LaunchScreen.xib in Resources */,
+				532683592AE91A6F00A364C0 /* Montserrat-SemiBold.ttf in Resources */,
 				CED4879B17DB1E61007FCF57 /* InAppSettings.bundle in Resources */,
+				532683532AE91A6F00A364C0 /* Montserrat-ExtraBold.ttf in Resources */,
+				532683612AE91A6F00A364C0 /* Montserrat-ExtraLight.ttf in Resources */,
+				532683782AE923A500A364C0 /* FieldTableViewCell.xib in Resources */,
+				5326835D2AE91A6F00A364C0 /* Montserrat-Bold.ttf in Resources */,
+				532683542AE91A6F00A364C0 /* Montserrat-LightItalic.ttf in Resources */,
+				5326835C2AE91A6F00A364C0 /* Montserrat-ThinItalic.ttf in Resources */,
+				532683562AE91A6F00A364C0 /* Montserrat-MediumItalic.ttf in Resources */,
+				5326835A2AE91A6F00A364C0 /* Montserrat-Thin.ttf in Resources */,
+				532683602AE91A6F00A364C0 /* Montserrat-Medium.ttf in Resources */,
+				532683512AE91A6F00A364C0 /* Montserrat-ExtraLightItalic.ttf in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -386,18 +636,52 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				5326833C2AE9175900A364C0 /* LoginViewController.swift in Sources */,
+				532683962AE9482300A364C0 /* Network+Endpoint.swift in Sources */,
 				CB7ED0801F6602CD00A33FCF /* Position.swift in Sources */,
+				532683972AE9482300A364C0 /* Network+Result.swift in Sources */,
+				5326837A2AE923A500A364C0 /* KNFieldDropDownAddressObjectProtocol.swift in Sources */,
 				CBAA0F7F1F68E807008BBBBE /* MainViewController.swift in Sources */,
+				532683B52AE98FB600A364C0 /* UIString.swift in Sources */,
+				5326839C2AE9482300A364C0 /* Network+Error.swift in Sources */,
+				532683AF2AE94C2F00A364C0 /* NSLayoutConstraints.swift in Sources */,
 				CB7ED0821F661B4F00A33FCF /* PositionProvider.swift in Sources */,
+				532683832AE928F900A364C0 /* KNTableViewCell.swift in Sources */,
+				5326837C2AE923A500A364C0 /* KNField.swift in Sources */,
+				532683AB2AE94BA500A364C0 /* UIView.swift in Sources */,
+				5326839A2AE9482300A364C0 /* Network+Types.swift in Sources */,
 				CB4197991F67724F008F301C /* NetworkManager.swift in Sources */,
+				532683B32AE98D0000A364C0 /* UILabel.swift in Sources */,
+				5326838D2AE92D9900A364C0 /* CGFLoat.swift in Sources */,
 				CB7ED0841F662BAF00A33FCF /* AppDelegate.swift in Sources */,
+				532683AD2AE94BFC00A364C0 /* Logs.swift in Sources */,
 				5E394EBE28A9CC7600396F33 /* BatteryStatus.swift in Sources */,
+				532683872AE9295500A364C0 /* Nameable.swift in Sources */,
+				5326837E2AE923A500A364C0 /* KNFieldDropdownObjectProtocol.swift in Sources */,
+				532683752AE923A500A364C0 /* KNTextFieldView+Protocols.swift in Sources */,
+				532683A52AE94A3500A364C0 /* KNTextField.swift in Sources */,
 				5E716A2B1F63A60800A2DBC3 /* ProtocolFormatter.swift in Sources */,
+				532683772AE923A500A364C0 /* KNTextFieldView.swift in Sources */,
+				532683652AE91D0800A364C0 /* UIFont.swift in Sources */,
 				CBCE82F21B8D265800A7318B /* TraccarClient.xcdatamodeld in Sources */,
+				532683762AE923A500A364C0 /* KNTextFieldViewHelper.swift in Sources */,
 				CBAA0F7D1F68E14C008BBBBE /* StatusViewController.swift in Sources */,
+				532683A72AE94ADC00A364C0 /* KNObject.swift in Sources */,
+				532683A12AE948FF00A364C0 /* AppManager.swift in Sources */,
+				532683A32AE9497100A364C0 /* Keys.swift in Sources */,
+				532683A92AE94B1300A364C0 /* UIInt.swift in Sources */,
+				5326837D2AE923A500A364C0 /* KNFieldBuilder.swift in Sources */,
+				532683852AE9293200A364C0 /* KNComponentView.swift in Sources */,
 				CBAA0F811F68EB62008BBBBE /* TrackingController.swift in Sources */,
+				532683992AE9482300A364C0 /* Network+Rechability.swift in Sources */,
 				5E716A271F63A0B100A2DBC3 /* DistanceCalculator.swift in Sources */,
+				532683792AE923A500A364C0 /* FieldTableViewCell.swift in Sources */,
+				5326838B2AE92CA500A364C0 /* JSONField.swift in Sources */,
+				532683892AE92B6800A364C0 /* Observable.swift in Sources */,
+				5326837B2AE923A500A364C0 /* KNFieldType.swift in Sources */,
+				532683B12AE94C9400A364C0 /* Dictionary.swift in Sources */,
 				5E716A291F63A45A00A2DBC3 /* RequestManager.swift in Sources */,
+				5326839B2AE9482300A364C0 /* NetworkRequest.swift in Sources */,
 				CB4197931F674A3E008F301C /* DatabaseHelper.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -867,6 +1151,22 @@
 /* End XCConfigurationList section */
 
 /* Begin XCRemoteSwiftPackageReference section */
+		5326837F2AE923DE00A364C0 /* XCRemoteSwiftPackageReference "Alamofire" */ = {
+			isa = XCRemoteSwiftPackageReference;
+			repositoryURL = "https://github.com/Alamofire/Alamofire";
+			requirement = {
+				kind = upToNextMajorVersion;
+				minimumVersion = 5.8.0;
+			};
+		};
+		5326839D2AE9489C00A364C0 /* XCRemoteSwiftPackageReference "Reachability" */ = {
+			isa = XCRemoteSwiftPackageReference;
+			repositoryURL = "https://github.com/ashleymills/Reachability.swift";
+			requirement = {
+				branch = master;
+				kind = branch;
+			};
+		};
 		5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
 			isa = XCRemoteSwiftPackageReference;
 			repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
@@ -886,6 +1186,16 @@
 /* End XCRemoteSwiftPackageReference section */
 
 /* Begin XCSwiftPackageProductDependency section */
+		532683802AE923DE00A364C0 /* Alamofire */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = 5326837F2AE923DE00A364C0 /* XCRemoteSwiftPackageReference "Alamofire" */;
+			productName = Alamofire;
+		};
+		5326839E2AE9489C00A364C0 /* Reachability */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = 5326839D2AE9489C00A364C0 /* XCRemoteSwiftPackageReference "Reachability" */;
+			productName = Reachability;
+		};
 		5EE3CA332998948F002C86E4 /* FirebaseAnalytics */ = {
 			isa = XCSwiftPackageProductDependency;
 			package = 5EE3CA322998948F002C86E4 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
diff --git a/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index a0a0de81c028f65b3a72df38a63d6de08c28d2c3..d5843b2df106c54f5924be5431ba7da11dc596b9 100644
--- a/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/TraccarClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -9,6 +9,15 @@
         "version" : "0.20220203.2"
       }
     },
+    {
+      "identity" : "alamofire",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/Alamofire/Alamofire",
+      "state" : {
+        "revision" : "b2fa556e4e48cbf06cf8c63def138c98f4b811fa",
+        "version" : "5.8.0"
+      }
+    },
     {
       "identity" : "boringssl-swiftpm",
       "kind" : "remoteSourceControl",
@@ -108,6 +117,15 @@
         "version" : "2.3.1"
       }
     },
+    {
+      "identity" : "reachability.swift",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/ashleymills/Reachability.swift",
+      "state" : {
+        "branch" : "master",
+        "revision" : "a81b7367f2c46875f29577e03a60c39cdfad0c8d"
+      }
+    },
     {
       "identity" : "swift-protobuf",
       "kind" : "remoteSourceControl",
diff --git a/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate b/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate
index b2d758c245a287f08b5ba9e4e4628cff98a6159a..6dbcabd5844afbb03adf75842a087fbf84e62c43 100644
Binary files a/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate and b/TraccarClient.xcodeproj/project.xcworkspace/xcuserdata/g.makhoul.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 0000000000000000000000000000000000000000..5e0af6ed2164476a5d793154de204bef86e03ecf
--- /dev/null
+++ b/TraccarClient.xcodeproj/xcuserdata/g.makhoul.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   uuid = "C69DA6DD-5592-40A4-92DB-D8BF97EDB011"
+   type = "1"
+   version = "2.0">
+</Bucket>
diff --git a/TraccarClient/AppManager.swift b/TraccarClient/AppManager.swift
new file mode 100644
index 0000000000000000000000000000000000000000..182c0601b3b98fa604ca7ca3835ced6d3de111a3
--- /dev/null
+++ b/TraccarClient/AppManager.swift
@@ -0,0 +1,93 @@
+//
+//  AppManager.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+
+let app = AppManager.si
+
+enum KNEnvironment {
+    case sandbox
+    case development
+    case production
+}
+
+final class AppManager {
+    
+    // MARK: - Init
+    static let si = AppManager()
+    
+    private init() {
+        //
+    }
+    
+    // MARK: - Logs
+    var logsAreEnabled: Bool {
+        environment == .production ? true : true
+    }
+    
+    // MARK: - Request
+    var useShortLogsForRequests = false //true
+    var logRequest: [Endpoint] = [
+        .all,
+        .signin,
+        .signup,
+        .companySignup,
+        .signupPassword,
+        .companySignupPassword,
+        .signupVerifyCode,
+        .addresses,
+        .bankAccount,
+        .contactus,
+        .upload_Media,
+        .product_builder_step_information_media,
+        .documents,
+        .favorite,
+        .product_builder_step_shipping,
+        .variant,
+        .salesOrders,
+        .salesOrderDetails,
+        .checkout_shipping_methods,
+        .sales_summary,
+        .checkout_payment_methods,
+        .checkout_add_coupon,
+        .checkout_remove_coupon
+    ]
+    
+    // MARK: - Data
+    var environment: KNEnvironment = .sandbox
+    var delegate: AppDelegate!
+    var isUpdatingProfile: Bool = false
+    var isLoggedIn: Bool {
+        if let _ = UserDefaults.standard.string(forKey: Keys.User.access_token) {
+            return true
+            
+        } else if let _ = UserDefaults.standard.string(forKey: Keys.guestToken) {
+            return true
+        }
+        return false
+    }
+    
+//    func saveToUserDefaults(model: UserModel) {
+//        let ud = UserDefaults.standard
+//        
+//        ud.set(model.id, forKey: Keys.User.id)
+//        ud.set(model.user_type, forKey: Keys.User.user_type)
+//        ud.set(model.access_token, forKey: Keys.User.access_token)
+//        ud.set(model.refresh_token, forKey: Keys.User.refresh_token)
+//        ud.set(model.picture, forKey: Keys.User.picture)
+//        ud.set(model.full_name, forKey: Keys.User.fullName)
+//        ud.set(model.phone, forKey: Keys.User.phone)
+//        ud.set(model.prefix, forKey: Keys.User.prefix)
+//        ud.set(model.is_document_completed, forKey: Keys.User.is_document_completed)
+//        ud.set(model.is_bank_completed, forKey: Keys.User.is_bank_completed)
+//        ud.set(model.is_warehouse_added, forKey: Keys.User.is_warehouse_added)
+//        ud.set(model.is_account_type_pending, forKey: Keys.User.is_account_type_pending)
+//        ud.set(model.account_type, forKey: Keys.User.account_type)
+//    }
+}
diff --git a/TraccarClient/BMTextFieldView/Cell/FieldTableViewCell.swift b/TraccarClient/BMTextFieldView/Cell/FieldTableViewCell.swift
new file mode 100644
index 0000000000000000000000000000000000000000..c19728a09e6ddab580811e80331bfa88442c86c9
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Cell/FieldTableViewCell.swift
@@ -0,0 +1,75 @@
+//
+//  FieldTableViewCell.swift
+//  traccar
+//
+//  Created by iOS Developer on 2/6/22.
+//
+
+import UIKit
+
+final class FieldTableViewCell: KNTableViewCell {
+    
+    // MARK: - Outlets
+    @IBOutlet var fieldView: KNTextFieldView!
+    
+    @IBOutlet private weak var fieldViewLeadingConstraint: NSLayoutConstraint!
+    @IBOutlet private weak var fieldViewTrailingConstraint: NSLayoutConstraint!
+    
+    // MARK: - Properties
+    private var indexPath: IndexPath?
+    private var field: KNField?
+    
+    var isLeadingSpaceZero: Bool = false
+    
+    weak var delegate: KNTextFieldViewDelegate?
+    weak var dropdownDelegate: KNTextFieldViewDropdownDelegate?
+    weak var prefixDelegate: KNTextFieldViewPrefixDelegate?
+    
+    // MARK: - Lifecycle
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        setupUI()
+    }
+    
+    // MARK: - Setup
+    func set(field: KNField?, indexPath: IndexPath?) {
+        self.indexPath = indexPath
+        self.field = field
+        fieldView.textField.textAlignment = .left
+        
+        updateUI()
+    }
+    
+    func set(field: KNField?, indexPath: IndexPath?, isLeadingSpaceZero: Bool) {
+        self.isLeadingSpaceZero = isLeadingSpaceZero
+        self.set(field: field, indexPath: indexPath)
+        fieldView.textField.textAlignment = .left
+        if let field = field {
+                fieldView.textField.textAlignment = .left
+                fieldView.semanticContentAttribute = .forceLeftToRight
+        }
+    }
+    
+    // MARK: - UI
+    private func setupUI() {
+        contentView.backgroundColor = .white
+    }
+    
+    private func updateUI() {
+        guard let field = field else { return }
+        
+        fieldView.setupUI()
+
+        fieldView.prefixDelegate = prefixDelegate
+        fieldView.delegate = delegate
+        fieldView.dropdownDelegate = dropdownDelegate
+        fieldView.set(field: field)
+        fieldView.textField.textAlignment = .left
+        fieldView.semanticContentAttribute = .forceLeftToRight
+      
+        fieldViewLeadingConstraint.constant = isLeadingSpaceZero ? 0 : 16
+        fieldViewTrailingConstraint.constant = isLeadingSpaceZero ? 0 : 16
+
+    }
+}
diff --git a/TraccarClient/BMTextFieldView/Cell/FieldTableViewCell.xib b/TraccarClient/BMTextFieldView/Cell/FieldTableViewCell.xib
new file mode 100644
index 0000000000000000000000000000000000000000..2f2235b0086f300e1b9395a01e08538e9126afc1
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Cell/FieldTableViewCell.xib
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="FieldTableViewCell" rowHeight="475" id="KGk-i7-Jjw" customClass="FieldTableViewCell" customModule="opa" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="280" height="475"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="280" height="475"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ja2-lQ-BKV" customClass="KNTextFieldView" customModule="opa" customModuleProvider="target">
+                        <rect key="frame" x="16" y="0.0" width="248" height="450"/>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="Ja2-lQ-BKV" secondAttribute="trailing" constant="16" id="Niq-du-wkN"/>
+                    <constraint firstAttribute="bottom" secondItem="Ja2-lQ-BKV" secondAttribute="bottom" constant="25" id="hpt-Fg-Vp8"/>
+                    <constraint firstItem="Ja2-lQ-BKV" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="jBI-Ud-W3x"/>
+                    <constraint firstItem="Ja2-lQ-BKV" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="16" id="ufc-ZF-ttC"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
+            <connections>
+                <outlet property="fieldView" destination="Ja2-lQ-BKV" id="Mem-Kd-4xD"/>
+                <outlet property="fieldViewLeadingConstraint" destination="ufc-ZF-ttC" id="50H-ox-Tj7"/>
+                <outlet property="fieldViewTrailingConstraint" destination="Niq-du-wkN" id="fQX-t4-YbC"/>
+            </connections>
+            <point key="canvasLocation" x="155.07246376811597" y="57.254464285714285"/>
+        </tableViewCell>
+    </objects>
+</document>
diff --git a/TraccarClient/BMTextFieldView/KNTextFieldView+Protocols.swift b/TraccarClient/BMTextFieldView/KNTextFieldView+Protocols.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a613a7867804e46b4c73b1fe8d668a4d9a47f68e
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/KNTextFieldView+Protocols.swift
@@ -0,0 +1,21 @@
+//
+//  KNTextFieldView+Protocols.swift
+//  traccar
+//
+//  Created by iOS Developer on 2/9/22.
+//
+
+import Foundation
+import UIKit
+
+protocol KNTextFieldViewDelegate: AnyObject {
+    func updateUI(for field: KNField?)
+}
+
+protocol KNTextFieldViewDropdownDelegate: AnyObject {
+    func dropdownTapped(with field: KNField?)
+}
+
+protocol KNTextFieldViewPrefixDelegate: AnyObject {
+    func prefixTapped(with field: KNField?)
+}
diff --git a/TraccarClient/BMTextFieldView/KNTextFieldView.swift b/TraccarClient/BMTextFieldView/KNTextFieldView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..45e13099f10f44a40e7685b615ab66a392c7486b
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/KNTextFieldView.swift
@@ -0,0 +1,480 @@
+//
+//  KNTextFieldView.swift
+//  traccar
+//
+
+import UIKit
+
+final class KNTextFieldView: KNComponentView {
+    
+    // MARK: - Outlets
+    @IBOutlet private weak var view: UIView!
+    @IBOutlet private weak var boxView: UIView!
+    
+    // top
+    @IBOutlet private weak var topView: UIView!
+    @IBOutlet private weak var titleLabel: UILabel!
+    @IBOutlet private weak var titleLabel_bottom: NSLayoutConstraint!
+    @IBOutlet private weak var countLabel: UILabel!
+    @IBOutlet private weak var countLabel_leading: NSLayoutConstraint!
+    @IBOutlet private weak var countLabel_width: NSLayoutConstraint!
+    
+    // field
+    @IBOutlet private weak var fieldView: UIView!
+    @IBOutlet private weak var borderView: UIView!
+    
+    @IBOutlet private weak var prefixView: UIView!
+    @IBOutlet private weak var prefixView_width: NSLayoutConstraint!
+    @IBOutlet private weak var prefixFlagIcon: UIImageView!
+    @IBOutlet private weak var prefixFlagIcon_leading: NSLayoutConstraint!
+    @IBOutlet private weak var prefixFlagIcon_width: NSLayoutConstraint! //31
+    @IBOutlet private weak var prefixFlagIcon_height: NSLayoutConstraint! //20
+    @IBOutlet private weak var prefixLabel_leading: NSLayoutConstraint! //2
+    @IBOutlet private weak var prefixLabel: UILabel!
+    @IBOutlet private weak var prefixLabel_trailing: NSLayoutConstraint! //2
+    @IBOutlet private weak var prefixArrowIcon: UIImageView!
+    @IBOutlet private weak var prefixArrowIcon_width: NSLayoutConstraint! //8
+    @IBOutlet private weak var prefixArrowIcon_height: NSLayoutConstraint! //4
+    @IBOutlet private weak var prefixButton: UIButton!
+    
+    @IBOutlet private weak var textFieldView: UIView!
+    @IBOutlet var textField: KNTextField!
+    @IBOutlet private weak var textField_trailing: NSLayoutConstraint! //12
+    @IBOutlet private weak var unitValueLabel: UILabel!
+    
+    @IBOutlet private weak var accessoryView: UIView!
+    @IBOutlet private weak var accessoryViewLabel: UILabel!
+    @IBOutlet private weak var accessoryViewIcon: UIImageView!
+    @IBOutlet private weak var accessoryView_width: NSLayoutConstraint!
+    @IBOutlet private weak var accessoryView_trailing: NSLayoutConstraint!
+    @IBOutlet private weak var accessory_button: UIButton!
+    @IBOutlet private weak var unitMeasurementDropdwonArrowImageView: UIImageView!
+    @IBOutlet private weak var unitMeasurementDropdwonArrowImageView_width: NSLayoutConstraint!
+    @IBOutlet private weak var unitMeasurementDropdwonArrowImageView_height: NSLayoutConstraint!
+    
+    // bottom
+    @IBOutlet private weak var bottomView: UIView!
+    @IBOutlet private weak var infoLabel: UILabel!
+    @IBOutlet private weak var infoLabel_top: NSLayoutConstraint!
+    
+    @IBOutlet private weak var button: UIButton!
+    // userName label
+    @IBOutlet private weak var useNameLabel: UILabel!
+    @IBOutlet private weak var userNameLabel_width: NSLayoutConstraint!
+    @IBOutlet weak var userNameLabel_trailing: NSLayoutConstraint!
+    @IBOutlet weak var userNameLabel_leading: NSLayoutConstraint!
+    @IBOutlet weak var textField_leading: NSLayoutConstraint!
+    
+    // MARK: - Properties
+    private var helper: KNTextFieldViewHelper?
+    private var disposeBag = DisposeBag()
+    
+    var field: KNField?
+    var unitValueField: KNTextFieldView?
+    
+    var isUnitMeasurement: (value: Bool, dropdown: Bool) = (value: false, dropdown: false)
+    
+    weak var delegate: KNTextFieldViewDelegate?
+    weak var dropdownDelegate: KNTextFieldViewDropdownDelegate?
+    weak var prefixDelegate: KNTextFieldViewPrefixDelegate?
+    
+    // MARK: - Lifecycle
+    override func setupNib() {
+        super.setupNib()
+        
+        view.frame = bounds
+        view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
+        
+        setupUI()
+    }
+    
+    // MARK: - UI
+    func setupUI() {
+        backgroundColor = .clear
+        view.backgroundColor = .clear
+        boxView.backgroundColor = .clear
+        topView.backgroundColor = .clear
+        fieldView.backgroundColor = .clear
+        borderView.backgroundColor = .white
+        prefixView.backgroundColor = .clear
+        textFieldView.backgroundColor = .clear
+        accessoryView.backgroundColor = .clear
+        textField.backgroundColor = .clear
+        bottomView.backgroundColor = .clear
+        
+        titleLabel_bottom.set(0) //8
+        prefixView_width.set(0) //100
+        accessoryView_width.set(0) //50
+        infoLabel_top.set(0) //8a
+        
+        useNameLabel.set(text: "")
+        useNameLabel.hide()
+        userNameLabel_width.set(0)
+        userNameLabel_trailing.set(0)
+        userNameLabel_leading.set(0)
+        textField_leading.set(12)
+        
+        borderView.addBorder(radius: 13, width: 1, color: .purple)
+        
+        titleLabel.set(text: "", color: .black, font: .semibold(12))
+        titleLabel.numberOfLines = 1
+        
+        infoLabel.set(text: "", color: .black, font: .regular(12))
+        infoLabel.numberOfLines = 0
+        
+        countLabel.set(text: "", color: .purple, font: .medium(12))
+        countLabel.numberOfLines = 1
+        countLabel.align(to: .left)
+        
+        unitValueLabel.hide()
+        
+        textField.text = ""
+        textField.placeholder = ""
+        textField.delegate = self
+        textField.isUserInteractionEnabled = true
+        textField.tintColor = .purple
+        textField.textAlignment = .left
+        
+        accessoryViewLabel.set(text: "", color: .gray, font: .medium(16))
+        accessoryViewLabel.numberOfLines = 1
+        
+        accessory_button.isUserInteractionEnabled = false
+        accessory_button.addTarget(self, action: #selector(accessoryButtonTapped), for: .touchUpInside)
+        
+        accessoryView.hide()
+        accessoryViewIcon.hide()
+        
+        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
+        button.isUserInteractionEnabled = false
+        button.hide()
+    }
+    
+    override func layoutSubviews() {
+        super.layoutSubviews()
+        //rtl
+        //@TODO @RTL-ISSUE
+        //everything is fine when we have layoustsubvies in textfield.
+        // not working properly here. play around to find a solution
+        //textField.textAlignment = lang == .en ? .right : .left
+        //textField.semanticContentAttribute = lang == .en ? .forceRightToLeft : .forceLeftToRight
+    }
+    
+    // MARK: - Setup
+    func set(field: KNField?) {
+        self.field = field
+        textField.textAlignment = .left
+        textField.semanticContentAttribute = .forceLeftToRight
+        updateUI()
+    }
+    
+    // MARK: - Handlers
+    private func updateUI() {
+        guard let field = field else { return }
+        // helper
+       
+        helper = KNTextFieldViewHelper(field: field)
+        guard let helper = helper else { return }
+        
+        //
+        borderView.addBorder(radius: 13, width: 1, color: .purple)
+        
+            textField.textAlignment = .left
+            textField.semanticContentAttribute = .forceLeftToRight
+        
+            titleLabel.text = field.title == "" ? helper.title : field.title
+        
+        titleLabel_bottom.set(8)
+        
+        countLabel.text = ""
+        countLabel.hide()
+        
+        // field
+        textField.keyboardType = helper.keyboard
+        textField.returnKeyType = helper.returnKey
+        textField.isSecureTextEntry = helper.secureEntry
+        
+        if field.field == .iban {
+            textField.autocapitalizationType = .allCharacters
+        }
+		
+		if field.field == .price || field.field == .sale_price {
+			textField.keyboardType = .decimalPad
+		}
+//        
+//        if field.hasPlaceholder {
+//            if isUnitMeasurement.dropdown {
+//                //textField.placeholder = field.unitMeasurement?.display ?? ""
+//            } else {
+//                if field.isArabic {
+//                    textField.setForArabic(localizedPlaceholder: field.placeholder != "" ? field.placeholder.localized : helper.placeholder, color: .placeholder, font: .regular(16))
+//                } else if field.isEnglish {
+//                    textField.setForEnglighs(localizedPlaceholder: field.placeholder != "" ? field.placeholder.localized : helper.placeholder, color: .placeholder, font: .regular(16))
+//                } else {
+//                    if field.placeholder == "" {
+//                        textField.set(localizedPlaceholder: field.placeholder != "" ? field.placeholder.localized : helper.placeholder, color: .placeholder, font: .regular(16))
+//                    } else {
+//                        textField.set(localizedPlaceholder: field.placeholder != "" ? field.placeholder.localized : helper.placeholder, color: .placeholder, font: .regular(16))
+//                    }
+//                }
+//            }
+//        } else {
+//            textField.placeholder = ""
+//        }
+        
+            textField.show()
+            unitValueLabel.hide()
+            textField.text = field.value.value
+        //        if field.isArabic {
+        //            textField.textAlignment = lang == .en ? .right : .left
+        //            textFieldView.semanticContentAttribute = lang == .en ? .forceRightToLeft : .forceLeftToRight
+        //        } else {
+        //            textField.textAlignment = lang == .en ? .left : .right
+        //            textFieldView.semanticContentAttribute = lang == .en ? .forceLeftToRight : .forceRightToLeft
+        //
+        //        }
+        
+//        field.unitValue.observe { [weak self] unit in
+//            guard let strongSelf = self else { return }
+//            
+//            strongSelf.borderView.addBorder(radius: 13,
+//                                            width: 1,
+//                                            color: .border)
+//            
+//            //strongSelf.textField.set(text: unit,
+////                                     color: .placeholder,
+////                                     font: .regular(16))
+//            strongSelf.unitValueLabel.show()
+//            strongSelf.unitValueLabel.set(text: unit,
+//                                          color: .red,
+//                                          font: .regular(16))
+//            print("putin", self?.field?.isUnitMeasurement, self?.isUnitMeasurement)
+//            print(strongSelf.unitValueField?.field?.value.value)
+//            print(strongSelf.unitValueField?.field?.unitValue.value)
+//        }.disposed(by: disposeBag)
+        
+        if !isUnitMeasurement.dropdown {
+            unitValueLabel.hide()
+            
+            field.value.observe { [weak self] text in
+                guard let strongSelf = self else { return }
+                
+                    strongSelf.textField.text = text
+                
+                    if text.count > 0 {
+                        strongSelf.borderView.addBorder(radius: 13,
+                                                        width: 2,
+                                                        color: .purple)
+                        
+                        if strongSelf.field?.field != .email || strongSelf.field?.field != .shipping_address_email || strongSelf.field?.field != .billing_address_email {
+                            strongSelf.field?.error.value = ""
+                        }
+                    } else {
+                        //@TODO: check the reset thign again(no reload/updates?)
+                        strongSelf.resetTextField()
+                    }
+                
+            }.disposed(by: disposeBag)
+        
+            textField.bind { [weak self] binded in
+                guard let strongSelf = self else { return }
+                
+                var text = binded
+                
+                field.value.value = text
+                
+                if text.count > 0 {
+                    strongSelf.borderView.addBorder(radius: 13, width: 2, color: .purple)
+                }
+                
+                //strongSelf.validate()
+                
+                if text.count == 0 {
+                    //@TODO no reset necessary?
+                    strongSelf.resetTextField()
+                }
+                
+                strongSelf.delegate?.updateUI(for: field)
+            }
+            
+            textField.endEditingBind { [weak self] endEditingBinded in
+                guard let strongSelf = self else { return }
+                strongSelf.validate()
+                strongSelf.delegate?.updateUI(for: field)
+            }
+        }
+        
+        // ////////////////////////////////// //
+        
+        
+        // accessory
+        
+        if field.field == .password || field.field == .confirm_password || field.field == .old_password {
+            accessoryView_width.set(50)
+            accessoryView.show()
+            accessoryViewIcon.show()
+            accessory_button.show()
+            accessory_button.isUserInteractionEnabled = true
+        }
+        
+        // info
+        if field.error.value.count > 0 {
+            if isUnitMeasurement.dropdown { return }
+            
+            set(error: field.error.value)
+            
+        } else {
+
+                infoLabel_top.set(0)
+                infoLabel.text = ""
+        }
+        
+        field.error.observe { [weak self] text in
+            guard let strongSelf = self else { return }
+            
+            if strongSelf.isUnitMeasurement.dropdown { return }
+            
+            if text.count > 0 {
+                strongSelf.borderView.addBorder(radius: 13, width: 2, color: .purple)
+                strongSelf.set(error: text)
+                strongSelf.delegate?.updateUI(for: field)
+            }
+            
+            if text.count == 0 {
+                //@TODO: reset the field but without any update
+                // test more for ERROR case
+                strongSelf.resetTextField()
+            }
+        }.disposed(by: disposeBag)
+        
+        // ////////////////
+        
+        // extra settings
+        if isUnitMeasurement.dropdown {
+            textField.isUserInteractionEnabled = false
+        }
+        
+        if field.editable {
+            textField.isUserInteractionEnabled = true
+        } else {
+            textField.isUserInteractionEnabled = false
+        }
+        
+        // update field
+        if let text = textField.text {
+            
+            if isUnitMeasurement.dropdown { return }
+            
+            if text.count > 0 {
+                borderView.addBorder(radius: 13, width: 2, color: .purple)
+            }
+        }
+        textField.textAlignment = .left
+        textField.semanticContentAttribute = .forceLeftToRight
+
+        
+    }
+    
+    // MARK: - Handler
+    @objc private func buttonTapped() {
+
+    }
+    
+    @objc private func prefixTapped() {
+
+    }
+    
+    @objc private func accessoryButtonTapped() {
+
+    }
+    
+    //@TODO @bibi add network error field
+}
+
+// MARK: - UI Helpers - Error
+extension KNTextFieldView {
+    private func validate() {
+        guard let field = field else { return }
+        
+        if field.field == .email || field.field == .shipping_address_email || field.field ==  .billing_address_email{
+            guard let text = textField.text else { return }
+            
+            if text.isValidEmail {
+                field.error.value = ""
+                //@TODO reset func
+                //resetTextField()
+            } else {
+                field.error.value = helper?.error ?? ""
+                set(error: helper?.error)
+            }
+        }
+    }
+    
+    private func set(error: String?) {
+        guard let error = error else { return }
+        
+        if isUnitMeasurement.dropdown { return }
+        
+        infoLabel_top.set(8)
+        infoLabel.set(localized: error, color: .red, font: .regular(12))
+        
+        borderView.addBorder(radius: 13, width: 2, color: .red)
+        textField.textAlignment = .left
+    }
+    
+    private func resetTextField() {
+        if isUnitMeasurement.dropdown { return }
+        guard let field = field else { return }
+            textField.textAlignment = .left
+            textField.semanticContentAttribute = .forceLeftToRight
+//        textField.textAlignment = lang == .en ? .left : .right
+//        textField.semanticContentAttribute = lang == .en ? .forceLeftToRight : .forceRightToLeft
+//
+        set(field: field)
+    }
+}
+
+// MARK: - TextField Delegate
+extension KNTextFieldView: UITextFieldDelegate {
+    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
+        guard let field = field else { return true }
+        
+        if field.field == .sale_start_date || field.field == .sale_end_date {
+            return false
+        }
+        
+        return true
+    }
+    
+    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
+        guard let field = field else { return true }
+        
+        if field.field == .password || field.field == .confirm_password || field.field == .old_password {
+            if let textFieldString = textField.text {
+                let nsString = NSString(string: textFieldString)
+                let updatedString = nsString.replacingCharacters(in:range, with:string)
+                textField.text = updatedString
+
+                //Setting the cursor at the right place
+                let selectedRange = NSMakeRange(range.location + string.count, 0)
+                let from = textField.position(from: textField.beginningOfDocument, offset:selectedRange.location)
+                let to = textField.position(from: from!, offset:selectedRange.length)
+                textField.selectedTextRange = textField.textRange(from: from!, to: to!)
+
+                //Sending an action
+                textField.sendActions(for: .editingChanged)
+                
+                return false
+            }
+            return true
+            
+        }
+        return false
+    }
+    
+    func textFieldDidEndEditing(_ textField: UITextField) {
+        
+        //@TODO this is not ok as well
+        //we could reset (but without the update(reload)
+        resetTextField()
+    }
+}
diff --git a/TraccarClient/BMTextFieldView/KNTextFieldView.xib b/TraccarClient/BMTextFieldView/KNTextFieldView.xib
new file mode 100644
index 0000000000000000000000000000000000000000..55830a318d6a4a11b0ab399c4e46c10ef429cdad
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/KNTextFieldView.xib
@@ -0,0 +1,312 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="KNTextFieldView" customModule="opa" customModuleProvider="target">
+            <connections>
+                <outlet property="accessoryView" destination="ea2-Us-SEt" id="p4b-CL-Urp"/>
+                <outlet property="accessoryViewIcon" destination="Yhy-oG-s53" id="lYN-aU-j5h"/>
+                <outlet property="accessoryViewLabel" destination="eFv-Xc-FRo" id="Zbq-oy-kGr"/>
+                <outlet property="accessoryView_trailing" destination="NDX-L9-WSE" id="NSc-Pm-EJC"/>
+                <outlet property="accessoryView_width" destination="BGm-OW-eMS" id="Upo-qf-WNW"/>
+                <outlet property="accessory_button" destination="Pv1-Dk-N5H" id="raI-wt-lE5"/>
+                <outlet property="borderView" destination="ul5-Ds-qkq" id="pVW-qY-b6g"/>
+                <outlet property="bottomView" destination="7bL-RF-WhF" id="8Q9-W4-7jW"/>
+                <outlet property="boxView" destination="SMp-fy-SaZ" id="I1D-qe-XuK"/>
+                <outlet property="button" destination="Wds-qc-Ukl" id="1xe-yt-YNs"/>
+                <outlet property="countLabel" destination="T11-bd-WWO" id="vRr-Sg-fbu"/>
+                <outlet property="countLabel_leading" destination="08k-V1-k2S" id="kF7-di-HCi"/>
+                <outlet property="countLabel_width" destination="ohI-jV-4Kc" id="zxy-8w-bxw"/>
+                <outlet property="fieldView" destination="oOx-si-t4T" id="cOf-jw-aee"/>
+                <outlet property="infoLabel" destination="MoR-vC-3Dt" id="sbM-kz-I0g"/>
+                <outlet property="infoLabel_top" destination="rAB-eX-Adh" id="sHH-cW-uJi"/>
+                <outlet property="prefixArrowIcon" destination="36t-6u-5hC" id="cyD-SX-zXe"/>
+                <outlet property="prefixArrowIcon_height" destination="H0K-yT-qcl" id="kFI-Kz-0dc"/>
+                <outlet property="prefixArrowIcon_width" destination="Set-8Q-vC3" id="6ot-J3-WUq"/>
+                <outlet property="prefixButton" destination="1rU-Im-3qD" id="T7b-9H-dFx"/>
+                <outlet property="prefixFlagIcon" destination="sIQ-cZ-bQl" id="Mat-gT-wKh"/>
+                <outlet property="prefixFlagIcon_height" destination="JO7-et-Q1B" id="xF0-rY-AgE"/>
+                <outlet property="prefixFlagIcon_leading" destination="ooJ-3T-MEL" id="2PM-97-8qY"/>
+                <outlet property="prefixFlagIcon_width" destination="apA-x8-Kk7" id="3be-i7-lcg"/>
+                <outlet property="prefixLabel" destination="xJT-Jg-L8U" id="0XU-bj-kmO"/>
+                <outlet property="prefixLabel_leading" destination="UP1-dN-PuV" id="rhZ-fi-MbJ"/>
+                <outlet property="prefixLabel_trailing" destination="PRI-6H-5DA" id="esn-rK-HQ0"/>
+                <outlet property="prefixView" destination="xd9-24-Klc" id="ios-Lc-EaP"/>
+                <outlet property="prefixView_width" destination="fuk-yW-q1T" id="olQ-ld-K1m"/>
+                <outlet property="textField" destination="8Ts-To-4pk" id="6Kr-lm-x5g"/>
+                <outlet property="textFieldView" destination="BMt-6W-FnU" id="91P-Uh-bqt"/>
+                <outlet property="textField_leading" destination="ubk-JJ-O6c" id="gdc-IY-cas"/>
+                <outlet property="textField_trailing" destination="QST-xS-3vE" id="3Eu-hT-8NP"/>
+                <outlet property="titleLabel" destination="yw7-1s-i7r" id="o21-eL-Uyr"/>
+                <outlet property="titleLabel_bottom" destination="JeG-wx-Avk" id="rZR-dH-yhB"/>
+                <outlet property="topView" destination="hYJ-Ve-1CF" id="2k1-5a-Ipn"/>
+                <outlet property="unitMeasurementDropdwonArrowImageView" destination="WtY-Wf-1Hp" id="HTn-hO-hGp"/>
+                <outlet property="unitMeasurementDropdwonArrowImageView_height" destination="WTT-h2-qg6" id="geK-G1-1zY"/>
+                <outlet property="unitMeasurementDropdwonArrowImageView_width" destination="Cqh-vs-rbj" id="aZa-LJ-Dk9"/>
+                <outlet property="unitValueLabel" destination="FRp-b6-UGn" id="wdW-qs-p2k"/>
+                <outlet property="useNameLabel" destination="nwD-zi-lEh" id="Za7-zZ-9bG"/>
+                <outlet property="userNameLabel_leading" destination="DIW-Wg-Gf9" id="d5T-In-cfA"/>
+                <outlet property="userNameLabel_trailing" destination="psJ-Rg-4Qs" id="9eD-nm-CFW"/>
+                <outlet property="userNameLabel_width" destination="Kgy-2z-58n" id="B45-Hl-rIw"/>
+                <outlet property="view" destination="iN0-l3-epB" id="F7b-Dc-iLy"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
+            <rect key="frame" x="0.0" y="0.0" width="710" height="420"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SMp-fy-SaZ" userLabel="boxView">
+                    <rect key="frame" x="0.0" y="48" width="710" height="338"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hYJ-Ve-1CF" userLabel="topView">
+                            <rect key="frame" x="2" y="0.0" width="706" height="0.0"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yw7-1s-i7r">
+                                    <rect key="frame" x="0.0" y="0.0" width="663" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="T11-bd-WWO">
+                                    <rect key="frame" x="671" y="0.0" width="35" height="0.0"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="35" id="ohI-jV-4Kc"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="T11-bd-WWO" firstAttribute="leading" secondItem="yw7-1s-i7r" secondAttribute="trailing" constant="8" id="08k-V1-k2S"/>
+                                <constraint firstItem="yw7-1s-i7r" firstAttribute="top" secondItem="hYJ-Ve-1CF" secondAttribute="top" id="3wC-dI-Fcw"/>
+                                <constraint firstAttribute="trailing" secondItem="T11-bd-WWO" secondAttribute="trailing" id="E8o-hL-WqJ"/>
+                                <constraint firstAttribute="bottom" secondItem="yw7-1s-i7r" secondAttribute="bottom" priority="999" id="JeG-wx-Avk"/>
+                                <constraint firstItem="T11-bd-WWO" firstAttribute="bottom" secondItem="yw7-1s-i7r" secondAttribute="bottom" id="Vke-PM-i3e"/>
+                                <constraint firstItem="yw7-1s-i7r" firstAttribute="leading" secondItem="hYJ-Ve-1CF" secondAttribute="leading" id="abH-cn-RsE"/>
+                                <constraint firstItem="T11-bd-WWO" firstAttribute="top" secondItem="hYJ-Ve-1CF" secondAttribute="top" id="x83-vy-cQC"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oOx-si-t4T" userLabel="fieldView">
+                            <rect key="frame" x="0.0" y="0.0" width="710" height="50"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ul5-Ds-qkq" userLabel="borderView">
+                                    <rect key="frame" x="0.0" y="0.0" width="710" height="50"/>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                </view>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xd9-24-Klc" userLabel="prefixView">
+                                    <rect key="frame" x="0.0" y="0.0" width="100" height="50"/>
+                                    <subviews>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="36t-6u-5hC">
+                                            <rect key="frame" x="92" y="23" width="8" height="4"/>
+                                            <constraints>
+                                                <constraint firstAttribute="height" constant="4" id="H0K-yT-qcl"/>
+                                                <constraint firstAttribute="width" constant="8" id="Set-8Q-vC3"/>
+                                            </constraints>
+                                        </imageView>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xJT-Jg-L8U">
+                                            <rect key="frame" x="48" y="0.0" width="42" height="50"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                            <nil key="textColor"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sIQ-cZ-bQl">
+                                            <rect key="frame" x="15" y="15" width="31" height="20"/>
+                                            <constraints>
+                                                <constraint firstAttribute="height" constant="20" id="JO7-et-Q1B"/>
+                                                <constraint firstAttribute="width" constant="31" id="apA-x8-Kk7"/>
+                                            </constraints>
+                                        </imageView>
+                                    </subviews>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                    <constraints>
+                                        <constraint firstItem="36t-6u-5hC" firstAttribute="centerY" secondItem="xd9-24-Klc" secondAttribute="centerY" id="1o0-yS-f31"/>
+                                        <constraint firstAttribute="bottom" secondItem="xJT-Jg-L8U" secondAttribute="bottom" id="4rd-Hg-y3e"/>
+                                        <constraint firstItem="36t-6u-5hC" firstAttribute="leading" secondItem="xJT-Jg-L8U" secondAttribute="trailing" constant="2" id="PRI-6H-5DA"/>
+                                        <constraint firstItem="xJT-Jg-L8U" firstAttribute="leading" secondItem="sIQ-cZ-bQl" secondAttribute="trailing" constant="2" id="UP1-dN-PuV"/>
+                                        <constraint firstItem="xJT-Jg-L8U" firstAttribute="top" secondItem="xd9-24-Klc" secondAttribute="top" id="dMe-e3-8Oe"/>
+                                        <constraint firstAttribute="width" constant="100" id="fuk-yW-q1T"/>
+                                        <constraint firstItem="sIQ-cZ-bQl" firstAttribute="centerY" secondItem="xd9-24-Klc" secondAttribute="centerY" id="ggc-h2-1K1"/>
+                                        <constraint firstItem="sIQ-cZ-bQl" firstAttribute="leading" secondItem="xd9-24-Klc" secondAttribute="leading" constant="15" id="ooJ-3T-MEL"/>
+                                        <constraint firstAttribute="trailing" secondItem="36t-6u-5hC" secondAttribute="trailing" id="tZx-YW-U7P"/>
+                                    </constraints>
+                                </view>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1rU-Im-3qD">
+                                    <rect key="frame" x="0.0" y="0.0" width="100" height="50"/>
+                                    <state key="normal" title=" "/>
+                                </button>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BMt-6W-FnU" userLabel="textFieldView">
+                                    <rect key="frame" x="100" y="0.0" width="560" height="50"/>
+                                    <subviews>
+                                        <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="16" translatesAutoresizingMaskIntoConstraints="NO" id="8Ts-To-4pk" customClass="KNTextField" customModule="opa" customModuleProvider="target">
+                                            <rect key="frame" x="12" y="0.0" width="536" height="50"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                            <textInputTraits key="textInputTraits"/>
+                                        </textField>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FRp-b6-UGn">
+                                            <rect key="frame" x="12" y="0.0" width="536" height="50"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                            <nil key="textColor"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                    </subviews>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                    <constraints>
+                                        <constraint firstItem="FRp-b6-UGn" firstAttribute="top" secondItem="8Ts-To-4pk" secondAttribute="top" id="52D-fe-86Q"/>
+                                        <constraint firstAttribute="bottom" secondItem="8Ts-To-4pk" secondAttribute="bottom" id="Orw-RX-FDG"/>
+                                        <constraint firstAttribute="trailing" secondItem="8Ts-To-4pk" secondAttribute="trailing" constant="12" id="QST-xS-3vE"/>
+                                        <constraint firstItem="FRp-b6-UGn" firstAttribute="leading" secondItem="8Ts-To-4pk" secondAttribute="leading" id="UjC-nU-Crz"/>
+                                        <constraint firstItem="FRp-b6-UGn" firstAttribute="trailing" secondItem="8Ts-To-4pk" secondAttribute="trailing" id="d7m-3F-4Pw"/>
+                                        <constraint firstItem="8Ts-To-4pk" firstAttribute="top" secondItem="BMt-6W-FnU" secondAttribute="top" id="gJ2-at-BQa"/>
+                                        <constraint firstItem="FRp-b6-UGn" firstAttribute="bottom" secondItem="8Ts-To-4pk" secondAttribute="bottom" id="nAc-s9-PPH"/>
+                                        <constraint firstItem="8Ts-To-4pk" firstAttribute="leading" secondItem="BMt-6W-FnU" secondAttribute="leading" constant="12" id="ubk-JJ-O6c"/>
+                                    </constraints>
+                                </view>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ea2-Us-SEt" userLabel="accessoryView">
+                                    <rect key="frame" x="660" y="0.0" width="50" height="50"/>
+                                    <subviews>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Yhy-oG-s53">
+                                            <rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
+                                        </imageView>
+                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eFv-Xc-FRo">
+                                            <rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
+                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                            <nil key="textColor"/>
+                                            <nil key="highlightedColor"/>
+                                        </label>
+                                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="WtY-Wf-1Hp">
+                                            <rect key="frame" x="0.0" y="20.5" width="16" height="9"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="16" id="Cqh-vs-rbj"/>
+                                                <constraint firstAttribute="height" constant="9" id="WTT-h2-qg6"/>
+                                            </constraints>
+                                        </imageView>
+                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pv1-Dk-N5H" userLabel="accessoryButton">
+                                            <rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
+                                        </button>
+                                    </subviews>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                    <constraints>
+                                        <constraint firstItem="WtY-Wf-1Hp" firstAttribute="leading" secondItem="ea2-Us-SEt" secondAttribute="leading" id="4Bj-BA-0v2"/>
+                                        <constraint firstItem="Pv1-Dk-N5H" firstAttribute="top" secondItem="ea2-Us-SEt" secondAttribute="top" id="8JO-H5-QWY"/>
+                                        <constraint firstAttribute="width" constant="50" id="BGm-OW-eMS"/>
+                                        <constraint firstAttribute="bottom" secondItem="Pv1-Dk-N5H" secondAttribute="bottom" id="EOE-FR-ZwH"/>
+                                        <constraint firstAttribute="bottom" secondItem="eFv-Xc-FRo" secondAttribute="bottom" id="GWr-He-J2e"/>
+                                        <constraint firstItem="Yhy-oG-s53" firstAttribute="top" secondItem="ea2-Us-SEt" secondAttribute="top" id="KaF-Oq-tHG"/>
+                                        <constraint firstAttribute="trailing" secondItem="eFv-Xc-FRo" secondAttribute="trailing" id="Kt5-Iw-7V7"/>
+                                        <constraint firstItem="WtY-Wf-1Hp" firstAttribute="centerY" secondItem="ea2-Us-SEt" secondAttribute="centerY" id="OXo-uo-eTB"/>
+                                        <constraint firstAttribute="trailing" secondItem="Yhy-oG-s53" secondAttribute="trailing" id="RTY-8g-jvo"/>
+                                        <constraint firstAttribute="bottom" secondItem="Yhy-oG-s53" secondAttribute="bottom" id="Usl-GN-sTZ"/>
+                                        <constraint firstItem="eFv-Xc-FRo" firstAttribute="leading" secondItem="ea2-Us-SEt" secondAttribute="leading" id="e3r-JW-0JC"/>
+                                        <constraint firstItem="Yhy-oG-s53" firstAttribute="leading" secondItem="ea2-Us-SEt" secondAttribute="leading" id="jEl-lM-rNs"/>
+                                        <constraint firstItem="eFv-Xc-FRo" firstAttribute="top" secondItem="ea2-Us-SEt" secondAttribute="top" id="prh-oj-ZGD"/>
+                                        <constraint firstAttribute="trailing" secondItem="Pv1-Dk-N5H" secondAttribute="trailing" id="tUa-th-ziL"/>
+                                        <constraint firstItem="Pv1-Dk-N5H" firstAttribute="leading" secondItem="ea2-Us-SEt" secondAttribute="leading" id="wW1-r2-Wln"/>
+                                    </constraints>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nwD-zi-lEh">
+                                    <rect key="frame" x="30" y="0.0" width="40" height="50"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="40" id="Kgy-2z-58n"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="1rU-Im-3qD" firstAttribute="height" secondItem="xd9-24-Klc" secondAttribute="height" id="2cZ-Mh-Kfl"/>
+                                <constraint firstItem="1rU-Im-3qD" firstAttribute="width" secondItem="xd9-24-Klc" secondAttribute="width" id="ACw-Lm-fhE"/>
+                                <constraint firstItem="xd9-24-Klc" firstAttribute="leading" secondItem="oOx-si-t4T" secondAttribute="leading" id="CFh-Eg-xai"/>
+                                <constraint firstItem="nwD-zi-lEh" firstAttribute="top" secondItem="oOx-si-t4T" secondAttribute="top" id="CmC-XQ-kV3"/>
+                                <constraint firstItem="nwD-zi-lEh" firstAttribute="leading" secondItem="oOx-si-t4T" secondAttribute="leading" constant="30" id="DIW-Wg-Gf9"/>
+                                <constraint firstItem="1rU-Im-3qD" firstAttribute="centerX" secondItem="xd9-24-Klc" secondAttribute="centerX" id="FO1-Ta-U9k"/>
+                                <constraint firstItem="BMt-6W-FnU" firstAttribute="leading" secondItem="xd9-24-Klc" secondAttribute="trailing" id="KtT-gh-B8u"/>
+                                <constraint firstAttribute="trailing" secondItem="ea2-Us-SEt" secondAttribute="trailing" id="NDX-L9-WSE"/>
+                                <constraint firstAttribute="height" constant="50" id="RO5-R8-3oK"/>
+                                <constraint firstItem="ea2-Us-SEt" firstAttribute="top" secondItem="oOx-si-t4T" secondAttribute="top" id="VAx-6x-ZtC"/>
+                                <constraint firstAttribute="bottom" secondItem="ul5-Ds-qkq" secondAttribute="bottom" id="XCY-va-mrA"/>
+                                <constraint firstAttribute="bottom" secondItem="xd9-24-Klc" secondAttribute="bottom" id="Y1m-24-uIQ"/>
+                                <constraint firstItem="BMt-6W-FnU" firstAttribute="top" secondItem="oOx-si-t4T" secondAttribute="top" id="hQ2-id-3Iv"/>
+                                <constraint firstItem="ul5-Ds-qkq" firstAttribute="top" secondItem="oOx-si-t4T" secondAttribute="top" id="iv8-Uj-SDo"/>
+                                <constraint firstAttribute="trailing" secondItem="ul5-Ds-qkq" secondAttribute="trailing" id="kEB-U1-GEr"/>
+                                <constraint firstItem="ul5-Ds-qkq" firstAttribute="leading" secondItem="oOx-si-t4T" secondAttribute="leading" id="mPL-98-v6c"/>
+                                <constraint firstItem="ea2-Us-SEt" firstAttribute="leading" secondItem="BMt-6W-FnU" secondAttribute="trailing" id="oyv-SU-kqh"/>
+                                <constraint firstItem="BMt-6W-FnU" firstAttribute="leading" secondItem="nwD-zi-lEh" secondAttribute="trailing" constant="30" id="psJ-Rg-4Qs"/>
+                                <constraint firstAttribute="bottom" secondItem="ea2-Us-SEt" secondAttribute="bottom" id="xH3-is-9EW"/>
+                                <constraint firstAttribute="bottom" secondItem="nwD-zi-lEh" secondAttribute="bottom" id="xiM-aG-JGi"/>
+                                <constraint firstItem="xd9-24-Klc" firstAttribute="top" secondItem="oOx-si-t4T" secondAttribute="top" id="yCu-Ye-2P0"/>
+                                <constraint firstAttribute="bottom" secondItem="BMt-6W-FnU" secondAttribute="bottom" id="yeq-Nq-96y"/>
+                                <constraint firstItem="1rU-Im-3qD" firstAttribute="centerY" secondItem="xd9-24-Klc" secondAttribute="centerY" id="ziZ-LU-hgN"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7bL-RF-WhF" userLabel="bottomView">
+                            <rect key="frame" x="2" y="50" width="706" height="288"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MoR-vC-3Dt">
+                                    <rect key="frame" x="0.0" y="8" width="706" height="280"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="MoR-vC-3Dt" firstAttribute="leading" secondItem="7bL-RF-WhF" secondAttribute="leading" id="3MD-WU-dBu"/>
+                                <constraint firstAttribute="trailing" secondItem="MoR-vC-3Dt" secondAttribute="trailing" id="Amk-Cp-mYu"/>
+                                <constraint firstAttribute="bottom" secondItem="MoR-vC-3Dt" secondAttribute="bottom" id="hsR-2Q-xTQ"/>
+                                <constraint firstItem="MoR-vC-3Dt" firstAttribute="top" secondItem="7bL-RF-WhF" secondAttribute="top" constant="8" id="rAB-eX-Adh"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstAttribute="bottom" secondItem="7bL-RF-WhF" secondAttribute="bottom" id="1qe-Mh-gmA"/>
+                        <constraint firstItem="oOx-si-t4T" firstAttribute="top" secondItem="hYJ-Ve-1CF" secondAttribute="bottom" id="50v-1I-po3"/>
+                        <constraint firstItem="7bL-RF-WhF" firstAttribute="top" secondItem="oOx-si-t4T" secondAttribute="bottom" id="SsE-Za-MzR"/>
+                        <constraint firstAttribute="trailing" secondItem="hYJ-Ve-1CF" secondAttribute="trailing" constant="2" id="UtC-5B-kNW"/>
+                        <constraint firstItem="hYJ-Ve-1CF" firstAttribute="leading" secondItem="SMp-fy-SaZ" secondAttribute="leading" constant="2" id="XPJ-Pc-DA1"/>
+                        <constraint firstItem="7bL-RF-WhF" firstAttribute="leading" secondItem="SMp-fy-SaZ" secondAttribute="leading" constant="2" id="ZKq-GI-QKr"/>
+                        <constraint firstItem="oOx-si-t4T" firstAttribute="leading" secondItem="SMp-fy-SaZ" secondAttribute="leading" id="dG6-i7-YAB"/>
+                        <constraint firstAttribute="trailing" secondItem="7bL-RF-WhF" secondAttribute="trailing" constant="2" id="mEV-bC-eR7"/>
+                        <constraint firstItem="hYJ-Ve-1CF" firstAttribute="top" secondItem="SMp-fy-SaZ" secondAttribute="top" id="q0y-J2-gNE"/>
+                        <constraint firstAttribute="trailing" secondItem="oOx-si-t4T" secondAttribute="trailing" id="qRS-3T-aLz"/>
+                    </constraints>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Wds-qc-Ukl">
+                    <rect key="frame" x="0.0" y="168" width="710" height="218"/>
+                    <state key="normal" title=" "/>
+                </button>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="SMp-fy-SaZ" secondAttribute="trailing" id="4Km-35-kOQ"/>
+                <constraint firstItem="SMp-fy-SaZ" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="E8A-L8-24L"/>
+                <constraint firstItem="SMp-fy-SaZ" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="Fi4-XC-7jV"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="top" secondItem="Wds-qc-Ukl" secondAttribute="top" id="Lk2-Su-9c5"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="SMp-fy-SaZ" secondAttribute="bottom" id="Tbp-au-VkI"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="Wds-qc-Ukl" secondAttribute="trailing" id="vce-Wq-ta0"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="Wds-qc-Ukl" secondAttribute="bottom" id="x5u-af-Dlv"/>
+                <constraint firstItem="Wds-qc-Ukl" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="yye-lV-GdZ"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="-1304.3478260869567" y="20.758928571428569"/>
+        </view>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>
diff --git a/TraccarClient/BMTextFieldView/KNTextFieldViewHelper.swift b/TraccarClient/BMTextFieldView/KNTextFieldViewHelper.swift
new file mode 100644
index 0000000000000000000000000000000000000000..0b898ad4284d41d19eae8b2dcd64e01cb0387dea
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/KNTextFieldViewHelper.swift
@@ -0,0 +1,91 @@
+//
+//  KNTextFieldViewHelper.swift
+//  traccar
+//
+//  Created by iOS Developer on 2/7/22.
+//
+
+import Foundation
+import UIKit
+import Alamofire
+
+final class KNTextFieldViewHelper {
+    
+    private var type: KNFieldType = .empty
+    private var field: JSONField = .none
+    
+    // MARK: - Init
+    init(field: KNField) {
+        self.type = field.type
+        self.field = field.field
+    }
+    
+    // MARK: - UI
+    let labelPadding: CGFloat = 8
+    
+    // MARK: - Localization
+    var title: String {
+        return ""
+    }
+    
+    var placeholder: String {
+        return ""
+    }
+    
+    var error: String {
+        return ""
+    }
+
+    
+
+    // keyboard type
+    var keyboard: UIKeyboardType {
+        
+        let units: [JSONField] = [
+            .weight, .width, .height, .length
+        ]
+        
+        if units.contains(field) {
+            return .decimalPad
+        }
+        
+        switch field {
+        case .phone, .shipping_address_phone, .billing_address_phone:
+            return .phonePad
+        case .email, .shipping_address_email, .billing_address_email:
+            return .emailAddress
+        case .block,
+                .billing_address_block,
+                .shipping_address_block,
+                .avenue,
+                .billing_address_avenue,
+                .shipping_address_avenue,
+                .floor,
+                .billing_address_floor,
+                .shipping_address_floor:
+            return .numberPad
+        default:
+            return .default
+        }
+    }
+    
+    // field is password
+    var secureEntry: Bool {
+        switch field {
+        case .password, .confirm_password, .old_password :
+            return true
+        default:
+            return false
+        }
+    }
+    
+    // return key (next or done)
+    var returnKey: UIReturnKeyType {
+        switch field {
+        case .phone:
+            return .done
+        default:
+            return .next
+        }
+    }
+}
diff --git a/TraccarClient/BMTextFieldView/Model/KNField.swift b/TraccarClient/BMTextFieldView/Model/KNField.swift
new file mode 100644
index 0000000000000000000000000000000000000000..24d8be43f7ebcf257e6d1a1779403e354a482927
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Model/KNField.swift
@@ -0,0 +1,88 @@
+//
+//  KNField.swift
+// 
+//
+//  Created by iOS Developer on 2/7/22.
+//
+
+import Foundation
+import UIKit
+
+final class KNField {
+    typealias KNFieldBuilderClosure = (KNFieldBuilder) -> Void
+    
+    // MARK: - Properties
+    var type: KNFieldType = .empty
+    var tag: KNFieldTag = .none
+    var field: JSONField = .none
+    var isRequired: Bool = false
+    
+    var value: Observable<String> = Observable("")
+    var info: Observable<String> = Observable("")
+    var error: Observable<String> = Observable("")
+
+    
+    var title: String = ""
+    var height: CGFloat = .automatic
+    
+    var hidden: Bool = false
+        
+    var enabled: Bool = true
+    var editable: Bool = true
+    
+    var labelStyle: KNLableStyle = .simple
+    var allignment: NSTextAlignment = .natural
+    
+    
+    // MARK: - Init
+    init() { }
+    
+    init(builder: KNFieldBuilder) {
+        isRequired = builder.isRequired
+        field = builder.field
+        type = builder.type
+        tag = builder.tag
+        
+        value.value = builder.value
+        error.value = builder.error
+        info.value = builder.info
+        
+        
+        height = builder.height
+        title = builder.title
+        
+        enabled = builder.enabled
+        editable = builder.editable
+        
+        labelStyle = builder.labelStyle
+        allignment = builder.allignment
+        hidden = builder.hidden
+    }
+    
+    convenience init(_ block: KNFieldBuilderClosure) {
+        let builder = KNFieldBuilder()
+        block(builder)
+
+        self.init(builder: builder)
+    }
+    
+    // MARK: - Helper
+    
+    // MARK: - JSON Param
+    var param: PARAMS {
+        var json: PARAMS = [:]
+        
+        guard field != .none else { return [:] }
+        
+        guard !hidden else { return [:] }
+        
+        switch type {
+        case .text, .empty:
+            if !value.value.isEmpty {
+                json.add(key: field, value.value)
+            }
+        }
+        
+        return json
+    }
+}
diff --git a/TraccarClient/BMTextFieldView/Model/KNFieldBuilder.swift b/TraccarClient/BMTextFieldView/Model/KNFieldBuilder.swift
new file mode 100644
index 0000000000000000000000000000000000000000..7b04788d249d85c977bcd78f1dc4e13df76a45dd
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Model/KNFieldBuilder.swift
@@ -0,0 +1,43 @@
+//
+//  KNFieldBuilder.swift
+//  traccar
+//
+//  Created by iOS Developer on 2/7/22.
+//
+
+import Foundation
+import UIKit
+
+enum KNLableStyle {
+    case simple
+    case colored_text
+}
+
+final class KNFieldBuilder {
+    
+    // MARK: - Properties
+    var tag: KNFieldTag = .none
+    var type: KNFieldType = .empty
+    var field: JSONField = .none
+    var isRequired: Bool = false
+    
+    var title: String = ""
+    var value: String = ""
+    var error: String = ""
+    var info: String = ""
+    
+    var height: CGFloat = .automatic
+            
+    var enabled: Bool = true
+    var editable: Bool = true
+    var hidden: Bool = false
+    
+        
+    var labelStyle: KNLableStyle = .simple
+    var allignment: NSTextAlignment = .natural
+    
+    // MARK: - Init
+    init() {
+        
+    }
+}
diff --git a/TraccarClient/BMTextFieldView/Model/KNFieldDropDownAddressObjectProtocol.swift b/TraccarClient/BMTextFieldView/Model/KNFieldDropDownAddressObjectProtocol.swift
new file mode 100644
index 0000000000000000000000000000000000000000..3b4446fdd8a2304513af68562f907412acf268ac
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Model/KNFieldDropDownAddressObjectProtocol.swift
@@ -0,0 +1,15 @@
+//
+//  KNFieldDropDownAddressObjectProtocol.swift
+//  traccar
+//
+//  Created by George Makhoul on 9/15/22.
+//
+
+import Foundation
+
+protocol KNFieldDropDownAddressObjectProtocol {
+    var iden: String? { get }
+    var name: String { get }
+    var formattedName: String { get }
+    var phone_number: String { get }
+}
diff --git a/TraccarClient/BMTextFieldView/Model/KNFieldDropdownObjectProtocol.swift b/TraccarClient/BMTextFieldView/Model/KNFieldDropdownObjectProtocol.swift
new file mode 100644
index 0000000000000000000000000000000000000000..d620aef9aa5a4396bc5da88c40811dbf4a226181
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Model/KNFieldDropdownObjectProtocol.swift
@@ -0,0 +1,14 @@
+//
+//  KNFieldDropdownObjectProtocol.swift
+//  traccar
+//
+//  Created by iOS Developer on 4/3/22.
+//
+
+import Foundation
+
+protocol KNFieldDropdownObjectProtocol {
+    var identifier: String? { get }
+    var name: String { get }
+    var formattedName: String { get }
+}
diff --git a/TraccarClient/BMTextFieldView/Model/KNFieldType.swift b/TraccarClient/BMTextFieldView/Model/KNFieldType.swift
new file mode 100644
index 0000000000000000000000000000000000000000..733004711baefe1fb72fb533b6ee5e4ffc6b555c
--- /dev/null
+++ b/TraccarClient/BMTextFieldView/Model/KNFieldType.swift
@@ -0,0 +1,18 @@
+//
+//  KNFieldType.swift
+//  traccar
+//
+//  Created by iOS Developer on 2/7/22.
+//
+
+import Foundation
+
+enum KNFieldTag {
+    case none
+    case spaceToNext
+}
+
+enum KNFieldType {
+    case empty
+    case text
+}
diff --git a/TraccarClient/CGFLoat.swift b/TraccarClient/CGFLoat.swift
new file mode 100644
index 0000000000000000000000000000000000000000..091a5adf70351f782f4de341a5140a3762ec692e
--- /dev/null
+++ b/TraccarClient/CGFLoat.swift
@@ -0,0 +1,14 @@
+//
+//  CGFLoat.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import UIKit
+
+extension CGFloat {
+    static let automatic: CGFloat = UITableView.automaticDimension
+    static let dynamic: CGFloat = 0
+}
diff --git a/TraccarClient/Dictionary.swift b/TraccarClient/Dictionary.swift
new file mode 100644
index 0000000000000000000000000000000000000000..04c9b24381b5edc5e32da0c24798ea6cdb0165b2
--- /dev/null
+++ b/TraccarClient/Dictionary.swift
@@ -0,0 +1,116 @@
+//
+//  Dictionary.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+
+extension Dictionary where Key: ExpressibleByStringLiteral {
+    // Custom enum keys
+    subscript<Index: RawRepresentable>(index: Index) -> Value? where Index.RawValue == String {
+        get {
+            return self["\(index.rawValue.lowercased())" as! Key]
+        }
+
+        set {
+            self["\(index.rawValue.lowercased())" as! Key] = newValue
+        }
+    }
+}
+
+extension Dictionary where Key == String, Value == Any {
+    mutating func add(key: JSONField, _ value: Any?) {
+        if let string = value as? String {
+            self[key.rawValue] = string
+        } else if let int = value as? Int {
+            self[key.rawValue] = int
+        } else if let double = value as? Double {
+            self[key.rawValue] = double
+        } else if let objects = value as? [JSON] {
+            self[key.rawValue] = objects
+        } else if let object = value as? JSON {
+            self[key.rawValue] = object
+        } else if value != nil {
+            self[key.rawValue] = value
+        }
+    }
+    
+    mutating func add(_ k: String, _ value: Any?) {
+        if let string = value as? String {
+            self[k] = string
+        } else if let int = value as? Int {
+            self[k] = int
+        } else if let double = value as? Double {
+            self[k] = double
+        } else if value != nil {
+            self[k] = value
+        }
+    }
+    
+    mutating func add(_ params: PARAMS) {
+        for (k, v) in params {
+            add(k, v)
+        }
+    }
+    
+    mutating func add(jsons: [JSON]) {
+        for json in jsons {
+            for (k, v) in json {
+                add(k, v)
+            }
+        }
+    }
+    
+    func string(_ key: JSONField) -> String {
+        if let str = self[key.rawValue] as? String {
+            return str
+        }
+        
+        return ""
+    }
+    
+    func dictionary(_ key: JSONField) -> JSON {
+        if let dict = self[key.rawValue] as? JSON {
+            return dict
+        }
+        
+        return [:]
+    }
+    
+    func dictionaries(_ key: JSONField) -> [JSON]? {
+        if let dicts = self[key.rawValue] as? [JSON] {
+            return dicts
+        }
+        
+        return nil
+    }
+    
+    func bool(_ key: JSONField) -> Bool {
+        if let bool = self[key.rawValue] as? Bool {
+            return bool
+        }
+        
+        return false
+    }
+    
+    func int(_ key: JSONField) -> Int {
+        if let int = self[key.rawValue] as? Int {
+            return int
+        }
+        
+        if let str = self[key.rawValue] as? String {
+            if let int = Int(str) {
+                return int
+            }
+            
+            return 0
+        }
+        
+        return 0
+    }
+}
+
+
diff --git a/TraccarClient/Images.xcassets/Contents.json b/TraccarClient/Images.xcassets/Contents.json
index da4a164c918651cdd1e11dca5cc62c333f097601..73c00596a7fca3f3d4bdd64053b69d86745f9e10 100644
--- a/TraccarClient/Images.xcassets/Contents.json
+++ b/TraccarClient/Images.xcassets/Contents.json
@@ -1,6 +1,6 @@
 {
   "info" : {
-    "version" : 1,
-    "author" : "xcode"
+    "author" : "xcode",
+    "version" : 1
   }
-}
\ No newline at end of file
+}
diff --git a/TraccarClient/Images.xcassets/DeliveryIcon.imageset/Contents.json b/TraccarClient/Images.xcassets/DeliveryIcon.imageset/Contents.json
new file mode 100644
index 0000000000000000000000000000000000000000..6c058ec8a1661b3c7c27aad25eb6b0e722e87870
--- /dev/null
+++ b/TraccarClient/Images.xcassets/DeliveryIcon.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Delivery service.pdf",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/TraccarClient/Images.xcassets/DeliveryIcon.imageset/Delivery service.pdf b/TraccarClient/Images.xcassets/DeliveryIcon.imageset/Delivery service.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..39925ce9e3817bace7aee548199fc842c48730f2
--- /dev/null
+++ b/TraccarClient/Images.xcassets/DeliveryIcon.imageset/Delivery service.pdf	
@@ -0,0 +1,2789 @@
+%PDF-1.7
+
+1 0 obj
+  << /Type /XObject
+     /Length 2 0 R
+     /Group << /Type /Group
+               /S /Transparency
+            >>
+     /Subtype /Form
+     /Resources << >>
+     /BBox [ 0.000000 0.000000 160.000000 160.000000 ]
+  >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 8.089233 14.815552 cm
+0.886275 0.933333 0.988235 scn
+8.234747 13.066879 m
+8.234747 13.066879 -15.871654 41.238865 18.405949 50.290066 c
+52.683552 59.341263 61.715549 67.090073 77.920349 90.543671 c
+94.125153 113.997269 163.848358 107.724472 135.487549 11.983673 c
+8.234747 13.066879 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 15.851440 81.760498 cm
+0.886275 0.933333 0.988235 scn
+9.981359 1.246674 m
+32.451759 0.704277 54.788559 13.058674 66.268555 32.381073 c
+68.485359 36.112270 67.602959 41.388268 64.292557 44.194668 c
+60.982159 47.001068 55.632561 47.008270 52.314960 44.209869 c
+46.822960 39.578671 39.540558 37.753071 32.474957 36.466671 c
+25.409357 35.180271 18.115759 34.245872 11.726158 30.959471 c
+5.336558 27.673071 -0.098642 21.386669 0.001358 14.203472 c
+0.101358 7.020271 7.525358 1.305874 9.981359 1.246674 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 115.044006 28.872803 cm
+0.800000 0.870588 1.000000 scn
+26.239998 31.479248 m
+0.000000 31.479248 l
+0.000000 0.000046 l
+26.239998 0.000046 l
+26.239998 31.479248 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.690369 57.504883 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.530396 57.504883 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 132.210388 57.504883 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.770386 55.344849 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.610352 55.344849 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 132.290405 55.344849 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.770386 53.184814 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.610352 53.184814 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 132.290405 53.184814 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.850403 51.024902 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.690369 51.024902 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 132.370361 51.024902 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.930359 48.864868 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.770386 48.864868 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 132.450378 48.864868 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.930359 46.704834 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.770386 46.704834 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 132.450378 46.704834 cm
+0.886275 0.933333 0.988235 scn
+6.480000 1.199951 m
+0.000000 1.199951 l
+0.000000 -0.000049 l
+6.480000 -0.000049 l
+6.480000 1.199951 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 116.930359 36.612793 cm
+0.886275 0.933333 0.988235 scn
+22.000000 8.000000 m
+0.000000 8.000000 l
+0.000000 0.000000 l
+22.000000 0.000000 l
+22.000000 8.000000 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 133.712769 28.872803 cm
+0.800000 0.870588 1.000000 scn
+8.160000 38.572021 m
+0.000000 38.572021 l
+0.000000 0.000015 l
+8.160000 0.000015 l
+8.160000 38.572021 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 141.100769 28.872803 cm
+0.800000 0.870588 1.000000 scn
+2.400000 35.040039 m
+0.000000 35.040039 l
+0.000000 0.000042 l
+2.400000 0.000042 l
+2.400000 35.040039 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 23.117554 28.792114 cm
+0.800000 0.870588 1.000000 scn
+12.640001 20.319946 m
+0.000000 20.319946 l
+0.000000 -0.000053 l
+12.640001 -0.000053 l
+12.640001 20.319946 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 24.442383 45.265625 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 24.442383 42.192017 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 24.447205 39.119263 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 24.447205 36.108887 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 32.325562 28.791992 cm
+0.800000 0.870588 1.000000 scn
+12.640001 26.800049 m
+0.000000 26.800049 l
+0.000000 0.000048 l
+12.640001 0.000048 l
+12.640001 26.800049 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.765564 28.791992 cm
+0.800000 0.870588 1.000000 scn
+28.248796 21.520020 m
+0.000000 21.520020 l
+0.000000 0.000019 l
+28.248796 0.000019 l
+28.248796 21.520020 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.077576 28.791992 cm
+0.800000 0.870588 1.000000 scn
+7.040000 11.920044 m
+0.000000 11.920044 l
+0.000000 0.000044 l
+7.040000 0.000044 l
+7.040000 11.920044 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 48.455994 50.312012 cm
+0.800000 0.870588 1.000000 scn
+0.240000 10.091187 m
+0.000000 10.091187 l
+0.000000 -0.000014 l
+0.240000 -0.000014 l
+0.240000 10.091187 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 51.150391 50.312134 cm
+0.800000 0.870588 1.000000 scn
+0.240000 7.767944 m
+0.000000 7.767944 l
+0.000000 -0.000053 l
+0.240000 -0.000053 l
+0.240000 7.767944 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 46.008789 50.312012 cm
+0.800000 0.870588 1.000000 scn
+0.560000 11.701660 m
+0.000000 11.701660 l
+0.000000 0.000059 l
+0.560000 0.000059 l
+0.560000 11.701660 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 24.601562 49.111938 cm
+0.800000 0.870588 1.000000 scn
+2.320000 2.912842 m
+0.000000 2.912842 l
+0.000000 0.000039 l
+2.320000 0.000039 l
+2.320000 2.912842 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 33.285583 55.592773 cm
+0.800000 0.870588 1.000000 scn
+5.040000 3.147217 m
+0.000000 3.147217 l
+0.000000 0.000019 l
+5.040000 0.000019 l
+5.040000 3.147217 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 40.574402 55.592041 cm
+0.800000 0.870588 1.000000 scn
+2.160000 6.421631 m
+0.000000 6.421631 l
+0.000000 0.000029 l
+2.160000 0.000029 l
+2.160000 6.421631 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 28.187195 49.112061 cm
+0.800000 0.870588 1.000000 scn
+1.920000 7.051147 m
+0.000000 7.051147 l
+0.000000 -0.000053 l
+1.920000 -0.000053 l
+1.920000 7.051147 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.957581 37.671997 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 20.037598 37.671997 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.957581 34.511963 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 20.037598 34.511963 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.957581 31.352051 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 20.037598 31.352051 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 33.847168 29.648804 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 37.047180 29.648804 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 39.927979 29.648804 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 42.968811 29.648804 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 55.490356 29.775269 cm
+0.800000 0.870588 1.000000 scn
+12.640001 20.319946 m
+0.000000 20.319946 l
+0.000000 -0.000053 l
+12.640001 -0.000053 l
+12.640001 20.319946 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 56.815979 46.248047 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 56.815979 43.175293 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 56.820801 40.101685 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 56.820801 37.091187 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 64.699158 29.775146 cm
+0.800000 0.870588 1.000000 scn
+12.640001 26.800049 m
+0.000000 26.800049 l
+0.000000 0.000048 l
+12.640001 0.000048 l
+12.640001 26.800049 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 76.139160 29.775146 cm
+0.800000 0.870588 1.000000 scn
+28.248796 21.520020 m
+0.000000 21.520020 l
+0.000000 0.000019 l
+28.248796 0.000019 l
+28.248796 21.520020 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 48.450378 29.775146 cm
+0.800000 0.870588 1.000000 scn
+7.040000 11.920044 m
+0.000000 11.920044 l
+0.000000 0.000044 l
+7.040000 0.000044 l
+7.040000 11.920044 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 80.829590 51.294434 cm
+0.800000 0.870588 1.000000 scn
+0.240000 10.091187 m
+0.000000 10.091187 l
+0.000000 -0.000004 l
+0.240000 -0.000004 l
+0.240000 10.091187 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 83.523987 51.295166 cm
+0.800000 0.870588 1.000000 scn
+0.240000 7.768066 m
+0.000000 7.768066 l
+0.000000 0.000059 l
+0.240000 0.000059 l
+0.240000 7.768066 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 78.382385 51.295166 cm
+0.800000 0.870588 1.000000 scn
+0.560000 11.701660 m
+0.000000 11.701660 l
+0.000000 0.000059 l
+0.560000 0.000059 l
+0.560000 11.701660 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 56.975159 50.094360 cm
+0.800000 0.870588 1.000000 scn
+2.320000 2.912842 m
+0.000000 2.912842 l
+0.000000 0.000049 l
+2.320000 0.000049 l
+2.320000 2.912842 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 65.659180 56.575195 cm
+0.800000 0.870588 1.000000 scn
+5.040000 3.147217 m
+0.000000 3.147217 l
+0.000000 0.000010 l
+5.040000 0.000010 l
+5.040000 3.147217 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 72.947205 56.575195 cm
+0.800000 0.870588 1.000000 scn
+2.160000 6.421631 m
+0.000000 6.421631 l
+0.000000 0.000029 l
+2.160000 0.000029 l
+2.160000 6.421631 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 60.560791 50.094482 cm
+0.800000 0.870588 1.000000 scn
+1.920000 7.051147 m
+0.000000 7.051147 l
+0.000000 -0.000044 l
+1.920000 -0.000044 l
+1.920000 7.051147 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 49.331177 38.655151 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 52.411194 38.655151 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 49.331177 35.495239 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 52.411194 35.495239 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 49.331177 32.335205 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 52.411194 32.335205 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 66.220764 30.632080 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 69.420776 30.632080 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 72.301575 30.632080 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 75.342407 30.632080 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 87.847961 31.548096 cm
+0.800000 0.870588 1.000000 scn
+12.640001 20.319946 m
+0.000000 20.319946 l
+0.000000 -0.000053 l
+12.640001 -0.000053 l
+12.640001 20.319946 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 89.173584 48.020874 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 89.173584 44.947998 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 89.178345 41.875244 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 89.178345 38.864014 cm
+0.886275 0.933333 0.988235 scn
+9.400001 1.839966 m
+0.000000 1.839966 l
+0.000000 -0.000034 l
+9.400001 -0.000034 l
+9.400001 1.839966 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 97.055969 31.547974 cm
+0.800000 0.870588 1.000000 scn
+12.640001 26.800049 m
+0.000000 26.800049 l
+0.000000 0.000048 l
+12.640001 0.000048 l
+12.640001 26.800049 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 108.495972 31.547974 cm
+0.800000 0.870588 1.000000 scn
+28.248810 21.520020 m
+0.000000 21.520020 l
+0.000000 0.000019 l
+28.248810 0.000019 l
+28.248810 21.520020 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 80.807983 31.547974 cm
+0.800000 0.870588 1.000000 scn
+7.040000 11.920044 m
+0.000000 11.920044 l
+0.000000 0.000044 l
+7.040000 0.000044 l
+7.040000 11.920044 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 113.187134 53.067993 cm
+0.800000 0.870588 1.000000 scn
+0.240000 10.091187 m
+0.000000 10.091187 l
+0.000000 -0.000014 l
+0.240000 -0.000014 l
+0.240000 10.091187 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 115.881592 53.068115 cm
+0.800000 0.870588 1.000000 scn
+0.240000 7.767944 m
+0.000000 7.767944 l
+0.000000 -0.000053 l
+0.240000 -0.000053 l
+0.240000 7.767944 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 110.739990 53.067993 cm
+0.800000 0.870588 1.000000 scn
+0.560000 11.701660 m
+0.000000 11.701660 l
+0.000000 0.000059 l
+0.560000 0.000059 l
+0.560000 11.701660 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 89.332764 51.867920 cm
+0.800000 0.870588 1.000000 scn
+2.320000 2.912842 m
+0.000000 2.912842 l
+0.000000 0.000039 l
+2.320000 0.000039 l
+2.320000 2.912842 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 98.016785 58.348022 cm
+0.800000 0.870588 1.000000 scn
+5.040000 3.147217 m
+0.000000 3.147217 l
+0.000000 0.000020 l
+5.040000 0.000020 l
+5.040000 3.147217 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 105.304810 58.348022 cm
+0.800000 0.870588 1.000000 scn
+2.160000 6.421631 m
+0.000000 6.421631 l
+0.000000 0.000029 l
+2.160000 0.000029 l
+2.160000 6.421631 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 92.918335 51.867310 cm
+0.800000 0.870588 1.000000 scn
+1.920000 7.051147 m
+0.000000 7.051147 l
+0.000000 -0.000053 l
+1.920000 -0.000053 l
+1.920000 7.051147 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 81.687988 40.427979 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 84.767944 40.427979 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 81.687988 37.267944 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 84.767944 37.267944 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 81.687988 34.108032 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 84.767944 34.108032 cm
+0.886275 0.933333 0.988235 scn
+1.880000 1.880005 m
+0.000000 1.880005 l
+0.000000 0.000005 l
+1.880000 0.000005 l
+1.880000 1.880005 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 98.578369 32.404785 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 101.778381 32.404785 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 104.659180 32.404785 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 107.699158 32.404785 cm
+0.886275 0.933333 0.988235 scn
+0.720000 24.239990 m
+0.000000 24.239990 l
+0.000000 -0.000008 l
+0.720000 -0.000008 l
+0.720000 24.239990 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 102.083984 28.804077 cm
+0.800000 0.870588 1.000000 scn
+12.960000 9.864746 m
+0.000000 9.864746 l
+0.000000 -0.000049 l
+12.960000 -0.000049 l
+12.960000 9.864746 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 126.727966 30.813599 cm
+0.800000 0.870588 1.000000 scn
+0.480000 0.479980 m
+0.000000 0.479980 l
+0.000000 -0.000020 l
+0.480000 -0.000020 l
+0.480000 0.479980 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 101.259155 122.345825 cm
+0.886275 0.933333 0.988235 scn
+7.076796 1.089427 m
+5.089599 1.729426 l
+5.889599 4.100627 9.403198 4.967026 11.209599 3.236626 c
+10.261599 4.371027 11.049602 6.431026 12.512801 6.643826 c
+13.976001 6.856627 15.312798 5.103827 14.729598 3.747027 c
+15.861598 5.051827 18.309595 4.747828 19.087194 3.205428 c
+20.020796 4.362227 22.063993 4.325426 22.956795 3.138226 c
+27.156443 3.923321 31.492712 3.499404 35.460796 1.915825 c
+0.000000 0.195027 l
+2.551200 0.661427 5.105597 1.127827 7.076796 1.089427 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 10.359192 137.564575 cm
+0.886275 0.933333 0.988235 scn
+28.377598 1.075437 m
+30.320801 1.837036 l
+29.376801 4.157036 25.811998 4.797037 24.118399 2.957037 c
+24.992798 4.149037 24.076797 6.157037 22.603197 6.274637 c
+21.129599 6.392237 19.902397 4.561037 20.572798 3.244237 c
+19.360798 4.475437 16.936798 4.017036 16.257599 2.429037 c
+15.252798 3.525037 13.217599 3.361036 12.399999 2.118636 c
+8.160052 2.638123 3.859772 1.942310 0.000000 0.112236 c
+35.499199 0.628237 l
+32.920799 0.936237 30.342398 1.241837 28.377598 1.075437 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 8.870361 24.399902 cm
+0.101961 0.101961 0.207843 scn
+0.000000 2.400049 m
+0.000000 3.036568 0.252856 3.647022 0.702944 4.097109 c
+1.153031 4.547197 1.763481 4.800049 2.400001 4.800049 c
+140.640015 4.800049 l
+141.276535 4.800049 141.886978 4.547197 142.337067 4.097109 c
+142.787155 3.647022 143.040009 3.036568 143.040009 2.400049 c
+143.040009 1.763529 142.787155 1.153075 142.337067 0.702988 c
+141.886978 0.252901 141.276535 0.000049 140.640015 0.000049 c
+2.400001 0.000049 l
+2.084828 0.000049 1.772741 0.062123 1.481560 0.182734 c
+1.190378 0.303345 0.925804 0.480127 0.702944 0.702988 c
+0.480083 0.925849 0.303301 1.190430 0.182689 1.481611 c
+0.062078 1.772793 0.000000 2.084876 0.000000 2.400049 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 50.418396 60.091187 cm
+0.101961 0.101961 0.207843 scn
+0.000000 0.000050 m
+0.000000 7.703252 l
+0.000000 7.936643 0.092717 8.160466 0.257749 8.325498 c
+0.422781 8.490530 0.646610 8.583252 0.880000 8.583252 c
+1.760000 8.583252 l
+1.760000 0.000050 l
+0.000000 0.000050 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.655701 65.347046 cm
+0.984314 0.690196 0.537255 scn
+0.238671 2.039313 m
+0.503471 2.054513 0.488270 1.959313 0.682670 1.779313 c
+0.757739 1.702977 0.817244 1.612773 0.857871 1.513717 c
+1.075910 1.046539 1.163010 0.528928 1.109872 0.016119 c
+1.606997 0.460590 2.181253 0.810341 2.804272 1.048111 c
+2.525872 1.433712 2.376274 1.896119 2.251474 2.355319 c
+2.213996 2.513458 2.160382 2.667330 2.091474 2.814518 c
+2.060392 2.882927 2.013504 2.942971 1.954672 2.989713 c
+1.844642 3.054224 1.713937 3.073719 1.589872 3.044117 c
+1.253073 2.992117 0.949871 2.821718 0.658671 2.644117 c
+0.437871 2.506517 0.222141 2.361446 0.011474 2.208912 c
+-0.062126 2.155312 0.242674 2.090513 0.236274 1.999313 c
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 36.087158 59.196777 cm
+0.894118 0.270588 0.192157 scn
+8.712800 2.065615 m
+8.712800 2.065615 5.161601 0.000017 4.278401 0.617618 c
+4.278401 0.617618 1.615201 1.134411 0.128000 7.871211 c
+0.084000 8.068011 0.041600 8.271209 0.000000 8.479209 c
+1.024001 8.901611 l
+1.024001 8.901611 1.203200 8.686411 1.488001 8.320810 c
+2.264000 7.324811 3.824000 5.212010 4.688000 3.280811 c
+4.688000 3.280811 7.398401 5.834414 9.093601 6.434414 c
+8.712800 2.065615 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.319214 53.540161 cm
+0.968627 0.360784 0.239216 scn
+1.344800 11.623032 m
+1.310457 11.617650 1.278109 11.603407 1.250947 11.581714 c
+1.223786 11.560019 1.202748 11.531624 1.189907 11.499321 c
+1.177067 11.467017 1.172869 11.431925 1.177725 11.397504 c
+1.182581 11.363083 1.196326 11.330522 1.217603 11.303032 c
+1.012803 11.255032 0.930401 11.012626 0.886401 10.807026 c
+0.236001 7.767026 0.317600 4.628626 0.160000 1.527026 c
+0.147975 1.069782 0.094422 0.614577 0.000000 0.167027 c
+0.677015 0.126827 1.356374 0.156854 2.027202 0.256626 c
+2.548802 0.336626 3.067203 0.455034 3.597603 0.424634 c
+4.077603 0.397434 4.539201 0.246229 5.011201 0.159829 c
+5.736760 0.027763 6.481844 0.047922 7.199200 0.219028 c
+7.368000 0.779029 7.341600 1.384629 7.279200 1.970229 c
+7.107200 3.639830 6.670400 5.268630 6.239200 6.890230 c
+6.054399 7.579830 5.867199 8.274231 5.564000 8.921431 c
+5.372563 9.311094 5.160530 9.690293 4.928799 10.057426 c
+3.443999 12.503032 l
+3.409039 12.578512 3.348749 12.639359 3.273599 12.675024 c
+3.160799 12.711823 3.047999 12.629424 2.953599 12.555024 c
+2.414896 12.120967 1.811958 11.773355 1.166402 11.524633 c
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 44.222412 64.488770 cm
+0.219608 0.219608 0.360784 scn
+2.407197 2.396851 m
+1.571495 1.955075 0.767196 1.456303 0.000000 0.904058 c
+0.088336 0.771980 0.140824 0.619207 0.152324 0.460728 c
+0.163824 0.302249 0.133937 0.143502 0.065596 0.000054 c
+0.957835 0.751113 1.928522 1.403688 2.960796 1.946450 c
+2.772268 2.099606 2.576012 2.243004 2.372798 2.376060 c
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 40.630371 51.604004 cm
+0.384314 0.219608 0.623529 scn
+15.516802 8.313599 m
+0.000000 8.313599 l
+0.000000 0.000005 l
+15.516802 0.000005 l
+15.516802 8.313599 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 40.630371 51.604004 cm
+0.598270 0.442878 0.823958 scn
+3.916802 8.313599 m
+0.000000 8.313599 l
+0.000000 0.000005 l
+3.916802 0.000005 l
+3.916802 8.313599 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 51.818359 58.623169 cm
+1.000000 1.000000 1.000000 scn
+3.766401 0.816040 m
+0.000000 0.816040 l
+0.000000 0.000044 l
+3.766401 0.000044 l
+3.766401 0.816040 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 51.818359 57.507202 cm
+1.000000 1.000000 1.000000 scn
+3.766401 0.816040 m
+0.000000 0.816040 l
+0.000000 0.000034 l
+3.766401 0.000034 l
+3.766401 0.816040 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 45.476013 50.473145 cm
+0.894118 0.270588 0.192157 scn
+0.468776 15.671626 m
+1.244777 15.945220 l
+1.244777 15.945220 1.506376 16.236423 3.428776 14.368423 c
+5.351176 12.500423 8.179176 8.161226 8.179176 8.161226 c
+4.363976 1.653218 l
+3.115178 2.453218 l
+4.815978 8.237222 l
+4.815978 8.237222 -4.122422 17.614819 2.355178 15.353218 c
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 47.346375 51.272461 cm
+0.984314 0.690196 0.537255 scn
+1.258398 1.698770 m
+0.963998 1.618770 0.731997 1.458770 0.471997 1.298769 c
+0.445443 1.285028 0.421592 1.266594 0.401597 1.244365 c
+0.381758 1.215061 0.368646 1.181734 0.363198 1.146768 c
+0.283067 0.803798 0.161087 0.471979 0.000000 0.158770 c
+0.330213 0.068273 0.669822 0.016454 1.011997 0.004365 c
+1.056464 -0.000008 1.101358 0.004620 1.143999 0.017969 c
+1.196902 0.042376 1.241627 0.081549 1.272798 0.130772 c
+1.353446 0.238011 1.420867 0.354584 1.473599 0.477969 c
+1.860799 0.557969 2.219196 0.574772 2.491196 0.851572 c
+2.146396 1.011572 1.840000 1.341972 1.515200 1.541172 c
+1.431935 1.600688 1.344510 1.654158 1.253599 1.701172 c
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 46.831177 71.330322 cm
+0.882353 0.760784 0.690196 scn
+0.000000 -0.006318 m
+0.037600 0.001682 0.074401 0.011280 0.111201 0.021680 c
+0.074401 0.011280 0.036800 0.002482 0.000000 -0.006318 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 42.579285 68.376099 cm
+0.909804 0.541176 0.470588 scn
+0.003108 0.983936 m
+-0.002271 0.899948 -0.000666 0.815656 0.007908 0.731934 c
+0.045508 0.323933 0.172706 0.124739 0.335906 0.047939 c
+0.347561 0.042318 0.359590 0.037502 0.371907 0.033535 c
+0.467528 0.002757 0.569959 -0.000017 0.667107 0.025537 c
+0.629507 0.283937 0.595907 0.531937 0.571907 0.745537 c
+0.554307 0.899137 0.539906 1.036733 0.531106 1.151133 c
+0.475906 1.112733 0.279905 1.335938 0.279905 1.335938 c
+0.112705 1.303938 0.028708 1.152735 0.003108 0.983936 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 44.471985 66.420776 cm
+0.909804 0.541176 0.470588 scn
+0.000000 0.559185 m
+0.129600 0.518385 0.329598 0.839981 0.432798 0.815181 c
+0.565598 0.783181 0.666398 0.763981 0.712798 0.755181 c
+0.723198 0.755181 l
+0.723198 0.748784 l
+0.730400 0.753589 l
+0.739199 0.753589 l
+0.739199 0.759985 l
+0.763199 0.774385 0.814398 0.806387 0.883198 0.851987 c
+0.929598 0.882387 0.983998 0.919987 1.043198 0.961587 c
+1.149598 1.041587 1.450400 1.023184 1.574399 1.128784 c
+1.597600 0.930384 1.538400 0.850385 1.664800 0.579985 c
+1.643339 0.553611 1.620363 0.528497 1.595996 0.504780 c
+1.520744 0.429143 1.436047 0.363539 1.343999 0.309585 c
+1.213333 0.232000 1.070108 0.177852 0.920796 0.149585 c
+0.792102 0.125495 0.660578 0.120369 0.530400 0.134380 c
+0.403335 0.148183 0.279184 0.181658 0.162397 0.233589 c
+0.134397 0.246389 0.137600 0.266387 0.110400 0.281587 c
+0.147200 0.464787 0.184800 -0.000015 0.000000 0.559185 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 46.667969 68.209106 cm
+0.909804 0.541176 0.470588 scn
+0.000000 0.090869 m
+0.113322 0.027899 0.242812 0.000052 0.372002 0.010869 c
+0.405189 0.015435 0.437698 0.024028 0.468804 0.036465 c
+0.628804 0.102865 0.769600 0.286866 0.850400 0.667666 c
+0.936800 1.074866 0.850404 1.239665 0.714404 1.286865 c
+0.697199 1.269753 0.676817 1.256166 0.654404 1.246865 c
+0.579204 1.172465 0.285603 1.158874 0.238403 1.075674 c
+0.230403 1.034074 0.220800 0.990072 0.210400 0.943672 c
+0.206400 0.922872 0.201602 0.902069 0.196802 0.880469 c
+0.189600 0.848467 l
+0.184800 0.826867 0.179204 0.805270 0.174404 0.782070 c
+0.174404 0.772471 l
+0.164804 0.732471 0.155201 0.692468 0.145601 0.649267 c
+0.135200 0.606865 l
+0.135200 0.606865 0.135200 0.606870 0.135200 0.602070 c
+0.129600 0.580470 0.124004 0.558065 0.119204 0.536465 c
+0.114404 0.514865 0.111201 0.502864 0.106401 0.486064 c
+0.070401 0.358064 0.036800 0.226069 0.000000 0.090869 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.739990 70.118530 cm
+1.000000 0.925490 0.901961 scn
+0.000000 0.011898 m
+0.960000 0.203900 l
+0.931994 0.218985 0.902834 0.231824 0.872798 0.242298 c
+0.741953 0.287994 0.601557 0.299260 0.465098 0.275023 c
+0.328638 0.250785 0.200704 0.191860 0.093599 0.103900 c
+0.059255 0.076604 0.027884 0.045766 0.000000 0.011898 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.110413 66.707153 cm
+0.984314 0.690196 0.537255 scn
+0.000000 2.822451 m
+0.009600 2.708051 0.023201 2.570455 0.040801 2.416855 c
+0.065601 2.200855 0.098401 1.953655 0.136001 1.696855 c
+0.152801 1.580855 0.171200 1.462453 0.190400 1.344053 c
+0.230400 1.095253 0.423997 0.859254 0.662397 0.656054 c
+0.813223 0.528860 0.973707 0.413575 1.142397 0.311250 c
+1.258397 0.240050 1.368797 0.179249 1.462397 0.130449 c
+1.583197 0.067249 1.676799 0.024053 1.719199 0.004853 c
+1.728799 0.000049 l
+1.736802 0.000049 l
+1.745601 0.000049 l
+1.772001 0.008849 1.825601 0.027253 1.905601 0.054453 c
+1.957601 0.072853 2.019997 0.096051 2.087197 0.122451 c
+2.208797 0.170451 2.351202 0.231252 2.496802 0.304053 c
+2.679764 0.393760 2.853637 0.500924 3.016001 0.624053 c
+3.216001 0.777653 3.375202 0.956855 3.432002 1.156054 c
+3.474402 1.304854 3.511998 1.452855 3.552798 1.596855 c
+3.593598 1.740855 3.622399 1.864848 3.653599 1.989648 c
+3.653599 2.006448 3.662401 2.023249 3.666401 2.040049 c
+3.670401 2.056849 3.677597 2.084854 3.682397 2.105654 c
+3.682397 2.105654 3.682397 2.105649 3.682397 2.110449 c
+3.682397 2.124849 3.689598 2.139251 3.692798 2.152852 c
+3.703198 2.195251 3.712801 2.232855 3.721601 2.276055 c
+3.721601 2.285654 l
+3.726402 2.308054 3.732002 2.330451 3.736802 2.352051 c
+3.743999 2.384053 l
+3.748799 2.405653 3.753597 2.426456 3.757598 2.447256 c
+3.767998 2.493656 3.777601 2.538448 3.785600 2.579248 c
+3.783401 2.575135 3.781528 2.570862 3.780000 2.566455 c
+3.770400 2.628055 3.761598 2.690451 3.752798 2.752051 c
+3.683998 2.871251 3.581598 3.047248 3.463198 3.249648 c
+3.399199 3.358447 l
+3.314399 3.503252 l
+3.249599 3.613652 l
+3.227200 3.650452 3.205598 3.688054 3.183198 3.725654 c
+3.077598 3.904053 l
+2.941029 3.796734 2.798395 3.697372 2.650400 3.606455 c
+2.625469 3.606310 2.600590 3.604164 2.576001 3.600049 c
+2.611201 3.582451 l
+1.898177 3.158867 1.088295 2.925546 0.259199 2.904853 c
+0.139199 2.904853 l
+0.140799 2.898453 0.009600 2.812851 0.000000 2.822451 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 41.960754 69.360107 cm
+0.219608 0.219608 0.360784 scn
+4.781602 3.850342 m
+4.756797 3.864746 l
+4.957327 3.701575 5.136119 3.513375 5.288799 3.304746 c
+5.172978 3.529693 4.997513 3.718441 4.781602 3.850342 c
+h
+3.743198 0.938340 m
+2.649598 0.778340 1.314397 0.635139 0.191997 0.677539 c
+0.202397 0.660742 l
+0.282397 0.519942 0.390397 0.232742 0.522398 0.079942 c
+0.549474 0.047237 0.582618 0.020073 0.620000 -0.000058 c
+0.644800 0.168741 0.728801 0.319945 0.896001 0.353545 c
+0.896001 0.353545 1.092798 0.131140 1.147998 0.168740 c
+1.152798 0.163140 1.288801 0.248740 1.296001 0.248740 c
+1.416001 0.248740 l
+2.245353 0.269404 3.055497 0.502722 3.768799 0.926338 c
+3.743198 0.938340 l
+h
+0.401602 3.295938 m
+0.418398 3.288740 l
+0.559214 3.483257 0.722776 3.660243 0.905601 3.815938 c
+0.703992 3.678675 0.532499 3.501736 0.401602 3.295938 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 46.725586 69.271973 cm
+0.219608 0.219608 0.360784 scn
+1.107998 1.413574 m
+1.075198 1.275174 1.042401 1.135980 1.005601 0.999980 c
+0.984001 0.919980 0.960801 0.839980 0.936001 0.759980 c
+0.691201 0.256777 l
+0.666401 0.232783 l
+0.657598 0.223975 l
+0.640473 0.206765 0.620070 0.193163 0.597598 0.183975 c
+0.522398 0.109575 0.228802 0.095983 0.181602 0.012783 c
+0.179402 0.008670 0.177529 0.004388 0.176001 -0.000020 c
+0.167201 0.061581 0.157599 0.123976 0.148799 0.185576 c
+0.148799 0.209576 0.141598 0.233578 0.138398 0.257578 c
+0.091998 0.570645 0.045867 0.882908 0.000000 1.194375 c
+0.380801 1.263975 l
+0.700801 1.323975 0.928801 1.371175 1.036001 1.394375 c
+1.099199 1.407979 l
+1.099199 1.413574 l
+1.107998 1.413574 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 46.197571 69.454468 cm
+0.909804 0.541176 0.470588 scn
+0.000000 1.151973 m
+0.105601 0.973574 l
+0.172002 0.861572 l
+0.236802 0.751172 l
+0.321602 0.606377 l
+0.385601 0.497578 l
+0.504001 0.295178 0.605600 0.119181 0.675200 -0.000020 c
+0.675200 0.023980 0.668005 0.047972 0.664805 0.071172 c
+0.604005 0.481839 0.543470 0.891972 0.483203 1.301572 c
+0.470403 1.386372 0.458401 1.470376 0.445601 1.555176 c
+0.365601 1.475176 l
+0.249546 1.361041 0.127507 1.253152 0.000000 1.151973 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 45.261597 71.570435 cm
+0.509804 0.388235 0.352941 scn
+0.000000 1.292046 m
+0.029600 1.292046 0.060000 1.286446 0.089600 1.282446 c
+0.119200 1.278446 0.140000 1.276045 0.164800 1.271245 c
+0.215996 1.262446 l
+0.269600 1.251245 l
+0.322397 1.238442 l
+0.345864 1.233109 0.369064 1.226710 0.391997 1.219243 c
+0.421597 1.210443 0.452001 1.200844 0.480801 1.190444 c
+0.505601 1.181646 l
+0.524801 1.174446 0.544799 1.168044 0.563999 1.160044 c
+0.597598 1.146441 l
+0.621597 1.136841 l
+0.630870 1.133327 0.639952 1.129319 0.648799 1.124839 c
+0.728799 1.087241 l
+0.755199 1.074441 0.781599 1.060840 0.808799 1.046440 c
+0.835999 1.032040 0.836800 1.031247 0.850400 1.023247 c
+0.880000 1.005640 l
+0.887998 1.000845 l
+0.904800 0.990444 l
+0.926397 0.976841 l
+1.015878 0.920989 1.101171 0.858694 1.181597 0.790444 c
+1.194399 0.779243 l
+1.253992 0.728964 1.310872 0.675555 1.364800 0.619243 c
+1.372800 0.610443 1.380798 0.602448 1.387998 0.593647 c
+1.395198 0.584848 1.411998 0.567248 1.423198 0.553647 c
+1.456797 0.513647 l
+1.470397 0.497647 1.483196 0.480839 1.495996 0.464839 c
+1.508796 0.448839 1.511199 0.445639 1.518399 0.435239 c
+1.525599 0.424839 1.543200 0.400847 1.555200 0.383247 c
+1.583198 0.342446 l
+1.589598 0.332846 1.595997 0.323247 1.601597 0.313648 c
+1.611196 0.298442 l
+1.615196 0.292842 1.617597 0.287246 1.621597 0.282446 c
+1.633597 0.262446 1.645597 0.242446 1.656797 0.221646 c
+1.667997 0.200845 1.679200 0.180843 1.689600 0.159243 c
+1.700000 0.137643 1.710400 0.117640 1.720000 0.096040 c
+1.729600 0.074440 1.739198 0.053646 1.747998 0.032046 c
+1.756798 0.010446 1.756801 0.010444 1.760801 0.000044 c
+1.764801 0.009644 1.767996 0.020044 1.771196 0.029644 c
+1.777598 0.050444 l
+1.777598 0.057642 l
+1.777598 0.064842 1.781599 0.072844 1.783999 0.080044 c
+1.786399 0.087244 1.792797 0.114446 1.796797 0.132046 c
+1.800797 0.149646 1.796801 0.144845 1.800801 0.151245 c
+1.801185 0.157639 1.801185 0.164050 1.800801 0.170444 c
+1.805601 0.203247 l
+1.805992 0.205363 1.805992 0.207528 1.805601 0.209644 c
+1.805996 0.212564 1.805996 0.215522 1.805601 0.218442 c
+1.805601 0.228042 1.805601 0.236840 1.805601 0.246440 c
+1.805992 0.248556 1.805992 0.250731 1.805601 0.252847 c
+1.805601 0.267247 1.805601 0.280839 1.805601 0.295239 c
+1.805601 0.309639 1.805601 0.319245 1.805601 0.331245 c
+1.805601 0.343245 1.805601 0.372046 1.805601 0.392046 c
+1.805601 0.403247 l
+1.806000 0.410975 1.806000 0.418712 1.805601 0.426440 c
+1.805998 0.433635 1.805998 0.440848 1.805601 0.448042 c
+1.805601 0.463242 1.805601 0.479248 1.805601 0.494448 c
+1.805601 0.494448 1.805601 0.494443 1.805601 0.499243 c
+1.805601 0.515243 1.801599 0.530440 1.799199 0.546440 c
+1.796799 0.562440 1.799198 0.569646 1.792798 0.581646 c
+1.785601 0.616841 l
+1.785601 0.621641 1.785601 0.627246 1.785601 0.632046 c
+1.784203 0.639097 1.782332 0.646047 1.780000 0.652847 c
+1.780000 0.662447 1.775197 0.672046 1.771997 0.681646 c
+1.772359 0.685637 1.772359 0.689656 1.771997 0.693648 c
+1.771997 0.702447 1.767199 0.712045 1.763999 0.720845 c
+1.756799 0.744045 1.748801 0.766443 1.740801 0.788843 c
+1.728799 0.820044 l
+1.719199 0.843244 1.708799 0.865642 1.698399 0.888042 c
+1.686397 0.912046 l
+1.664800 0.951245 l
+1.664800 0.959245 1.655996 0.966448 1.651196 0.974448 c
+1.646396 0.982448 1.641598 0.989642 1.637598 0.997642 c
+1.633598 1.005642 1.618398 1.028046 1.607998 1.042446 c
+1.587197 1.072046 l
+1.575997 1.086446 1.565600 1.100848 1.554399 1.114448 c
+1.519199 1.155239 l
+1.511554 1.164603 1.503268 1.173431 1.494400 1.181646 c
+1.482998 1.193976 1.470982 1.205719 1.458399 1.216841 c
+1.420801 1.250444 l
+1.395200 1.272046 l
+1.359199 1.299243 l
+1.334399 1.316841 l
+1.295996 1.342446 l
+1.256797 1.365640 l
+1.247990 1.370914 1.238913 1.375725 1.229600 1.380044 c
+1.202398 1.393647 l
+1.176797 1.405640 l
+1.141597 1.420845 l
+1.115200 1.432046 l
+1.103198 1.432046 l
+1.090400 1.436841 l
+1.064800 1.445640 l
+1.032798 1.456040 l
+1.007198 1.464040 0.980798 1.471241 0.952798 1.476841 c
+0.915200 1.484839 l
+0.880000 1.491245 l
+0.867998 1.491245 l
+0.862398 1.491245 l
+0.832798 1.495239 l
+0.795996 1.495239 l
+0.779199 1.495239 l
+0.751196 1.495239 l
+0.706397 1.495239 l
+0.658399 1.495239 l
+0.632798 1.495239 0.607998 1.495239 0.578398 1.495239 c
+0.553599 1.495239 l
+0.503198 1.488843 l
+0.453599 1.480044 l
+0.403999 1.469644 l
+0.355200 1.456841 l
+0.311196 1.443247 l
+0.301597 1.443247 l
+0.268799 1.432046 l
+0.254399 1.426440 l
+0.213599 1.409644 l
+0.179199 1.393647 l
+0.149600 1.379243 l
+0.141597 1.379243 l
+0.112798 1.364048 l
+0.073390 1.343006 0.035678 1.318931 0.000000 1.292046 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 47.763977 70.664917 cm
+0.509804 0.388235 0.352941 scn
+0.063203 0.019165 m
+0.063203 0.013560 l
+0.000000 -0.000034 l
+0.045601 0.013560 l
+0.063203 0.019165 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 45.548767 69.409424 cm
+0.062745 0.062745 0.160784 scn
+0.960000 0.017739 m
+0.000000 0.381743 l
+0.177729 0.436048 0.368468 0.429760 0.542236 0.363872 c
+0.716005 0.297985 0.862955 0.176229 0.960000 0.017739 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.328003 69.412476 cm
+0.062745 0.062745 0.160784 scn
+0.824004 0.267538 m
+0.000000 0.011542 l
+0.096590 0.130974 0.226453 0.219045 0.373140 0.264618 c
+0.519826 0.310190 0.676740 0.311209 0.824004 0.267538 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.731934 68.778564 cm
+0.062745 0.062745 0.160784 scn
+0.126410 0.641456 m
+0.236010 0.675856 0.366414 0.572656 0.415214 0.411856 c
+0.464014 0.251056 0.415212 0.091854 0.308012 0.059854 c
+0.200812 0.027854 0.068013 0.127853 0.019213 0.288653 c
+-0.029587 0.449453 0.017610 0.607056 0.126410 0.641456 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 45.489319 68.773438 cm
+0.062745 0.062745 0.160784 scn
+0.181052 0.622574 m
+0.294652 0.632974 0.399450 0.505779 0.414650 0.337779 c
+0.429850 0.169779 0.349851 0.025779 0.235451 0.017779 c
+0.121051 0.009779 0.017052 0.135374 0.001852 0.302574 c
+-0.013348 0.469774 0.066652 0.612174 0.181052 0.622574 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 44.298828 68.277588 cm
+0.984314 0.396078 0.384314 scn
+0.228335 1.242432 m
+0.274735 1.015232 0.320333 0.788030 0.366733 0.560830 c
+0.358282 0.589445 0.343112 0.615624 0.322490 0.637187 c
+0.301868 0.658751 0.276388 0.675075 0.248179 0.684795 c
+0.219969 0.694514 0.189845 0.697351 0.160317 0.693066 c
+0.130790 0.688782 0.102717 0.677502 0.078433 0.660166 c
+0.054149 0.642830 0.034361 0.619943 0.020718 0.593408 c
+0.007075 0.566873 -0.000029 0.537454 0.000000 0.507617 c
+0.000030 0.477780 0.007188 0.448383 0.020884 0.421875 c
+0.034579 0.395367 0.054413 0.372522 0.078731 0.355234 c
+0.580332 0.000029 l
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 44.392761 67.440063 cm
+1.000000 1.000000 1.000000 scn
+0.000000 0.495195 m
+0.301392 0.412770 0.621073 0.427209 0.913809 0.536465 c
+1.206544 0.645720 1.457512 0.844268 1.631201 1.104004 c
+1.650168 0.902340 1.603487 0.699938 1.498110 0.526953 c
+1.392734 0.353968 1.234298 0.219653 1.046402 0.144004 c
+0.668001 0.000004 0.201600 0.147995 0.000000 0.495195 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 35.553406 67.641113 cm
+0.984314 0.690196 0.537255 scn
+1.478592 0.420544 m
+1.558592 0.963477 1.638592 1.506409 1.718592 2.049343 c
+1.740192 2.197343 1.574593 2.326146 1.426593 2.302946 c
+1.353383 2.285501 1.286410 2.248179 1.233053 2.195104 c
+1.179695 2.142030 1.142026 2.075261 1.124193 2.002145 c
+1.090055 1.855825 1.083812 1.704373 1.105792 1.555739 c
+0.951654 1.627300 0.786782 1.672984 0.617794 1.690944 c
+0.533072 1.699103 0.447634 1.686629 0.368783 1.654587 c
+0.289931 1.622545 0.220009 1.571883 0.164993 1.506940 c
+0.078479 1.389830 0.023764 1.252315 0.006175 1.107780 c
+-0.011413 0.963246 0.008724 0.816616 0.064627 0.682175 c
+0.120530 0.547734 0.210293 0.430063 0.325177 0.340612 c
+0.440060 0.251162 0.576150 0.192986 0.720194 0.171745 c
+0.728194 0.121345 0.735392 0.070944 0.743392 0.020544 c
+0.958218 0.203200 1.208540 0.339393 1.478592 0.420544 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 36.084778 67.070435 cm
+0.968627 0.360784 0.239216 scn
+1.488001 0.449595 m
+0.128000 -0.000005 l
+0.084000 0.196795 0.041600 0.399993 0.000000 0.607993 c
+1.023999 1.030396 l
+1.023999 1.030396 1.203200 0.812795 1.488001 0.449595 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 41.807983 70.625488 cm
+0.968627 0.360784 0.239216 scn
+6.025600 0.254518 m
+6.025600 0.187318 6.025604 0.120118 6.019204 0.054518 c
+6.000801 0.048922 l
+0.007202 0.048922 l
+0.002402 0.116922 0.000000 0.184918 0.000000 0.254518 c
+0.000000 0.324118 -0.000000 0.414518 0.009600 0.494518 c
+0.037505 0.852326 0.129645 1.202183 0.281602 1.527321 c
+0.361950 1.700325 0.458940 1.865103 0.571201 2.019322 c
+0.895800 2.468161 1.337765 2.818902 1.848599 3.033073 c
+2.359432 3.247244 2.919389 3.316560 3.467026 3.233414 c
+4.014664 3.150269 4.528816 2.917875 4.953062 2.561735 c
+5.377306 2.205594 5.695251 1.739474 5.872002 1.214518 c
+5.894402 1.148118 5.914402 1.080116 5.932002 1.012115 c
+5.994431 0.764428 6.025870 0.509952 6.025600 0.254518 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 40.691895 69.927856 cm
+0.894118 0.270588 0.192157 scn
+7.116889 0.750506 m
+7.071288 0.736912 l
+6.964088 0.713712 6.733688 0.666512 6.416088 0.606512 c
+6.300088 0.584912 6.176092 0.560912 6.035292 0.536912 c
+5.736092 0.484112 5.390488 0.426507 5.016088 0.371307 c
+3.922488 0.211307 2.587291 0.068106 1.464891 0.110506 c
+0.904891 0.131306 0.400089 0.198508 0.002489 0.332108 c
+-0.003111 0.332108 0.002489 0.332107 0.002489 0.341707 c
+-0.023911 0.821707 1.122489 0.749705 1.122489 0.749705 c
+7.122489 0.749705 l
+7.116889 0.750506 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 19.045593 37.874268 cm
+0.219608 0.219608 0.360784 scn
+39.841606 15.413696 m
+39.841606 0.824898 l
+39.841766 0.548897 39.821980 0.273251 39.782402 0.000103 c
+0.059200 0.000103 l
+0.019621 0.273251 -0.000163 0.548897 0.000001 0.824898 c
+0.000001 15.413696 l
+0.000001 16.937525 0.605339 18.398941 1.682848 19.476450 c
+2.760357 20.553959 4.221774 21.159302 5.745602 21.159302 c
+34.095203 21.159302 l
+34.849792 21.159407 35.597012 21.010870 36.294193 20.722174 c
+36.991371 20.433475 37.624863 20.010273 38.158474 19.476734 c
+38.692089 18.943195 39.115376 18.309772 39.404167 17.612633 c
+39.692963 16.915491 39.841606 16.168287 39.841606 15.413696 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 34.196777 59.033569 cm
+0.647059 0.270588 0.270588 scn
+0.026433 0.000028 m
+0.000000 0.000028 l
+0.000000 0.000854 l
+0.026433 0.000028 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 28.259155 59.034424 cm
+0.219608 0.219608 0.360784 scn
+2.240801 1.096825 m
+2.240801 1.068827 l
+4.807199 1.068827 l
+2.240801 1.096825 l
+h
+2.240801 1.096825 m
+2.240801 1.068827 l
+4.807199 1.068827 l
+2.240801 1.096825 l
+h
+2.240801 1.096825 m
+2.240801 1.068827 l
+4.807199 1.068827 l
+2.240801 1.096825 l
+h
+10.312002 17.982422 m
+8.863617 17.982424 7.454079 17.513968 6.293833 16.646992 c
+5.133587 15.780016 4.284873 14.561026 3.874402 13.172021 c
+0.000000 0.059227 l
+5.296001 0.000029 l
+23.918398 0.000029 l
+23.918398 0.760818 l
+5.652002 0.760818 l
+0.617600 0.815224 l
+2.240801 6.104823 l
+4.300801 12.818428 l
+5.100801 15.429627 7.592001 17.218428 10.419202 17.218428 c
+24.346401 17.218428 l
+24.346401 16.921621 l
+24.963203 16.921621 l
+24.963203 17.979229 l
+10.312002 17.982422 l
+h
+2.240801 1.096825 m
+2.240801 1.068827 l
+4.807199 1.068827 l
+2.240801 1.096825 l
+h
+2.240801 1.096825 m
+2.240801 1.068827 l
+4.807199 1.068827 l
+2.240801 1.096825 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 30.500000 60.103271 cm
+0.909804 0.474510 0.474510 scn
+0.000000 0.027954 m
+0.000000 -0.000044 l
+2.566399 -0.000044 l
+0.000000 0.027954 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 28.880005 40.654419 cm
+0.101961 0.101961 0.207843 scn
+23.726400 35.304764 m
+23.726400 35.601562 l
+9.798401 35.601562 l
+6.971201 35.601562 4.480800 33.809563 3.680000 31.201561 c
+1.620000 24.487967 l
+0.000000 19.195164 l
+5.034400 19.140759 l
+23.298397 19.140759 l
+23.298397 -0.000034 l
+24.343197 -0.000034 l
+24.343197 35.305565 l
+23.726400 35.305565 l
+23.726400 35.304764 l
+h
+5.300801 19.436766 m
+5.280000 19.436766 l
+4.188799 19.448767 l
+1.620000 19.448767 l
+1.620000 23.384764 l
+1.957600 24.483963 l
+3.975200 31.059170 l
+4.747200 33.575970 7.148001 35.299171 9.873601 35.299171 c
+23.298397 35.299171 l
+23.298397 19.431961 l
+5.298401 19.431961 l
+5.300801 19.436766 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 30.500000 60.103271 cm
+0.968627 0.737255 0.737255 scn
+2.566399 -0.000044 m
+0.000000 -0.000044 l
+0.000000 0.027954 l
+2.566399 -0.000044 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.562561 42.109619 cm
+0.984314 0.717647 0.313726 scn
+2.493433 4.850342 m
+2.493433 -0.000059 l
+2.426234 -0.000059 l
+1.999939 0.000111 1.581209 0.112549 1.212172 0.325947 c
+0.843136 0.539345 0.536810 0.846170 0.324018 1.215556 c
+0.111226 1.584943 -0.000528 2.003862 0.000002 2.430156 c
+0.000531 2.856450 0.113324 3.275089 0.327033 3.643945 c
+0.540980 4.010956 0.847389 4.315474 1.215715 4.527148 c
+1.584040 4.738823 2.001416 4.850257 2.426234 4.850342 c
+2.493433 4.850342 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.562561 42.106445 cm
+0.992157 0.925490 0.533333 scn
+2.493433 1.093560 m
+2.493433 -0.000044 l
+2.426234 -0.000044 l
+1.999939 0.000126 1.581209 0.112574 1.212172 0.325972 c
+0.843136 0.539370 0.536810 0.846195 0.324018 1.215581 c
+0.111226 1.584967 -0.000528 2.003877 0.000002 2.430171 c
+0.000531 2.856465 0.113324 3.275104 0.327033 3.643960 c
+0.433551 3.827867 0.564026 3.996814 0.715034 4.146362 c
+0.941602 2.955452 1.569229 1.878064 2.493433 1.093560 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.564880 42.133545 cm
+0.992157 0.992157 0.988235 scn
+2.075079 0.000010 m
+1.682813 0.057525 1.310607 0.210254 0.991001 0.444844 c
+0.671394 0.679433 0.414118 0.988736 0.241663 1.345723 c
+0.069207 1.702710 -0.013177 2.096505 0.001713 2.492686 c
+0.016603 2.888866 0.128314 3.275373 0.327079 3.618408 c
+0.315079 2.241608 0.995079 0.860810 2.075079 0.000010 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 18.964966 41.996826 cm
+0.101961 0.101961 0.207843 scn
+0.145384 5.065552 m
+1.191784 3.586352 1.131784 1.419146 0.006184 -0.000054 c
+-0.005016 1.647146 -0.019416 3.294352 0.145384 5.065552 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 53.223206 40.653687 cm
+0.219608 0.219608 0.360784 scn
+55.368008 41.746338 m
+0.000000 41.746338 l
+0.000000 -0.000057 l
+55.368008 -0.000057 l
+55.368008 41.746338 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 25.726379 40.495117 cm
+0.101961 0.101961 0.207843 scn
+21.224001 0.000049 m
+0.000000 0.000049 l
+0.586653 2.371097 1.950462 4.477384 3.873865 5.982891 c
+5.797267 7.488398 8.169456 8.306396 10.612001 8.306396 c
+13.054547 8.306396 15.426731 7.488398 17.350134 5.982891 c
+19.273537 4.477384 20.637348 2.371097 21.224001 0.000049 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 80.991943 40.495117 cm
+0.101961 0.101961 0.207843 scn
+21.856796 0.000044 m
+0.000000 0.000044 l
+0.000000 4.588044 4.892798 8.307251 10.927998 8.307251 c
+16.963198 8.307251 21.856796 4.588044 21.856796 0.000044 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 16.075195 37.874390 cm
+0.101961 0.101961 0.207843 scn
+95.659203 1.389575 m
+95.658997 1.021095 95.512512 0.667766 95.251961 0.407212 c
+94.991402 0.146657 94.638100 0.000187 94.269615 -0.000025 c
+1.389600 -0.000025 l
+1.021055 -0.000025 0.667605 0.146377 0.407004 0.406977 c
+0.146404 0.667578 0.000000 1.021030 0.000000 1.389575 c
+0.000000 1.758120 0.146404 2.111562 0.407004 2.372163 c
+0.667605 2.632764 1.021055 2.779175 1.389600 2.779175 c
+94.269615 2.779175 l
+94.452103 2.779175 94.632782 2.743227 94.801376 2.673393 c
+94.969971 2.603559 95.123161 2.501199 95.252197 2.372163 c
+95.381233 2.243127 95.483589 2.089947 95.553421 1.921353 c
+95.623260 1.752758 95.659203 1.572060 95.659203 1.389575 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 26.825562 28.866455 cm
+0.384314 0.219608 0.623529 scn
+9.512801 -0.000017 m
+14.766576 -0.000017 19.025602 4.033010 19.025602 9.007992 c
+19.025602 13.982973 14.766576 18.015991 9.512801 18.015991 c
+4.259026 18.015991 0.000000 13.982973 0.000000 9.007992 c
+0.000000 4.033010 4.259026 -0.000017 9.512801 -0.000017 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 29.004761 30.929565 cm
+0.219608 0.219608 0.360784 scn
+7.333601 0.000050 m
+11.383837 0.000050 14.667203 3.109346 14.667203 6.944854 c
+14.667203 10.780361 11.383837 13.889648 7.333601 13.889648 c
+3.283366 13.889648 0.000000 10.780361 0.000000 6.944854 c
+0.000000 3.109346 3.283366 0.000050 7.333601 0.000050 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 30.224792 32.084839 cm
+0.384314 0.219608 0.623529 scn
+6.113601 0.000025 m
+9.490049 0.000025 12.227201 2.592116 12.227201 5.789624 c
+12.227201 8.987132 9.490049 11.579224 6.113601 11.579224 c
+2.737153 11.579224 0.000000 8.987132 0.000000 5.789624 c
+0.000000 2.592116 2.737153 0.000025 6.113601 0.000025 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 82.407959 28.866455 cm
+0.384314 0.219608 0.623529 scn
+9.512803 -0.000017 m
+14.766578 -0.000017 19.025606 4.033010 19.025606 9.007992 c
+19.025606 13.982973 14.766578 18.015991 9.512803 18.015991 c
+4.259028 18.015991 0.000000 13.982973 0.000000 9.007992 c
+0.000000 4.033010 4.259028 -0.000017 9.512803 -0.000017 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 84.587158 30.929565 cm
+0.219608 0.219608 0.360784 scn
+7.333604 0.000050 m
+11.383840 0.000050 14.667208 3.109346 14.667208 6.944854 c
+14.667208 10.780361 11.383840 13.889648 7.333604 13.889648 c
+3.283368 13.889648 0.000000 10.780361 0.000000 6.944854 c
+0.000000 3.109346 3.283368 0.000050 7.333604 0.000050 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 85.807190 32.084839 cm
+0.384314 0.219608 0.623529 scn
+6.113604 0.000025 m
+9.490051 0.000025 12.227207 2.592116 12.227207 5.789624 c
+12.227207 8.987132 9.490051 11.579224 6.113604 11.579224 c
+2.737155 11.579224 0.000000 8.987132 0.000000 5.789624 c
+0.000000 2.592116 2.737155 0.000025 6.113604 0.000025 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 30.500000 57.198364 cm
+0.598270 0.442878 0.823958 scn
+0.855200 6.840820 m
+0.000000 6.840820 l
+0.000000 0.000021 l
+0.855200 0.000021 l
+0.855200 6.840820 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 28.260010 59.093628 cm
+0.598270 0.442878 0.823958 scn
+2.240000 1.037598 m
+0.000000 1.037598 l
+0.000000 0.000000 l
+2.240000 0.000000 l
+2.240000 1.037598 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 34.035156 59.794434 cm
+0.101961 0.101961 0.207843 scn
+0.000000 -0.000010 m
+0.000000 5.942383 l
+0.000000 6.207599 0.105357 6.461956 0.292893 6.649492 c
+0.480429 6.837029 0.734783 6.942383 1.000000 6.942383 c
+1.000000 -0.000010 l
+0.000000 -0.000010 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 115.044006 29.200073 cm
+0.384314 0.219608 0.623529 scn
+32.960003 17.085571 m
+0.000000 17.085571 l
+0.000000 -0.000025 l
+32.960003 -0.000025 l
+32.960003 17.085571 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 115.043945 29.200073 cm
+0.598270 0.442878 0.823958 scn
+8.040000 17.085571 m
+0.000000 17.085571 l
+0.000000 -0.000025 l
+8.040000 -0.000025 l
+8.040000 17.085571 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 119.064758 46.285645 cm
+0.384314 0.219608 0.623529 scn
+19.399199 16.094360 m
+0.000000 16.094360 l
+0.000000 -0.000044 l
+19.399199 -0.000044 l
+19.399199 16.094360 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 119.064758 46.285645 cm
+0.598270 0.442878 0.823958 scn
+4.896797 16.094360 m
+0.000000 16.094360 l
+0.000000 -0.000044 l
+4.896797 -0.000044 l
+4.896797 16.094360 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 119.014404 46.171997 cm
+0.925490 0.498039 0.215686 scn
+0.000000 0.074443 m
+4.946396 0.554443 l
+14.978396 0.000049 l
+0.000000 0.074443 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 140.288757 43.239258 cm
+1.000000 1.000000 1.000000 scn
+6.733604 1.580811 m
+0.000000 1.580811 l
+0.000000 0.000010 l
+6.733604 0.000010 l
+6.733604 1.580811 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 140.396790 40.827148 cm
+1.000000 1.000000 1.000000 scn
+6.733604 1.580811 m
+0.000000 1.580811 l
+0.000000 0.000010 l
+6.733604 0.000010 l
+6.733604 1.580811 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 133.052002 59.872803 cm
+1.000000 1.000000 1.000000 scn
+4.708799 1.580811 m
+0.000000 1.580811 l
+0.000000 0.000010 l
+4.708799 0.000010 l
+4.708799 1.580811 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 133.052002 57.712036 cm
+1.000000 1.000000 1.000000 scn
+4.708799 1.580811 m
+0.000000 1.580811 l
+0.000000 0.000010 l
+4.708799 0.000010 l
+4.708799 1.580811 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 120.924805 67.040039 cm
+0.968627 0.360784 0.239216 scn
+0.000000 12.673559 m
+0.000000 17.153559 3.535197 20.780762 7.896797 20.780762 c
+12.258397 20.780762 15.795195 17.151159 15.795195 12.673559 c
+15.795195 8.195958 8.219199 -0.000040 8.219199 -0.000040 c
+8.219199 -0.000040 0.000000 8.195958 0.000000 12.673559 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 124.542358 75.425659 cm
+0.101961 0.101961 0.207843 scn
+4.279199 -0.000054 m
+6.642536 -0.000054 8.558398 1.915813 8.558398 4.279150 c
+8.558398 6.642487 6.642536 8.558350 4.279199 8.558350 c
+1.915862 8.558350 0.000000 6.642487 0.000000 4.279150 c
+0.000000 1.915813 1.915862 -0.000054 4.279199 -0.000054 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 76.254395 55.632812 cm
+0.384314 0.219608 0.623529 scn
+0.000000 0.724780 m
+0.000000 0.917009 0.076364 1.101364 0.212290 1.237290 c
+0.348216 1.373216 0.532571 1.449585 0.724800 1.449585 c
+28.404802 1.449585 l
+28.597031 1.449585 28.781385 1.373216 28.917311 1.237290 c
+29.053238 1.101364 29.129606 0.917009 29.129606 0.724780 c
+29.129606 0.532551 29.053238 0.348197 28.917311 0.212270 c
+28.781385 0.076344 28.597031 -0.000015 28.404802 -0.000015 c
+0.724800 -0.000015 l
+0.532571 -0.000015 0.348216 0.076344 0.212290 0.212270 c
+0.076364 0.348197 -0.000000 0.532551 0.000000 0.724780 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 54.974365 79.275269 cm
+0.384314 0.219608 0.623529 scn
+0.000000 0.724785 m
+0.000000 0.917014 0.076364 1.101369 0.212290 1.237295 c
+0.348216 1.373221 0.532571 1.449585 0.724800 1.449585 c
+51.436001 1.449585 l
+51.628227 1.449585 51.812584 1.373221 51.948509 1.237295 c
+52.084435 1.101369 52.160793 0.917014 52.160793 0.724785 c
+52.160793 0.532556 52.084435 0.348202 51.948509 0.212275 c
+51.812584 0.076349 51.628227 -0.000015 51.436001 -0.000015 c
+0.724800 -0.000015 l
+0.532571 -0.000015 0.348216 0.076349 0.212290 0.212275 c
+0.076364 0.348202 0.000000 0.532556 0.000000 0.724785 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 86.899170 52.992798 cm
+0.384314 0.219608 0.623529 scn
+0.000000 0.724780 m
+0.000000 0.917009 0.076359 1.101364 0.212285 1.237290 c
+0.348212 1.373216 0.532576 1.449585 0.724805 1.449585 c
+17.595995 1.449585 l
+17.788225 1.449585 17.972589 1.373216 18.108515 1.237290 c
+18.244442 1.101364 18.320801 0.917009 18.320801 0.724780 c
+18.320801 0.532551 18.244442 0.348197 18.108515 0.212270 c
+17.972589 0.076344 17.788225 -0.000015 17.595995 -0.000015 c
+0.724805 -0.000015 l
+0.532576 -0.000015 0.348212 0.076344 0.212285 0.212270 c
+0.076359 0.348197 0.000000 0.532551 0.000000 0.724780 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 91.939148 50.352905 cm
+0.384314 0.219608 0.623529 scn
+0.000000 0.724780 m
+0.000000 0.917009 0.076359 1.101364 0.212285 1.237290 c
+0.348211 1.373216 0.532576 1.449585 0.724805 1.449585 c
+12.715995 1.449585 l
+12.908223 1.449585 13.092587 1.373216 13.228514 1.237290 c
+13.364441 1.101364 13.440799 0.917009 13.440799 0.724780 c
+13.440799 0.532551 13.364441 0.348197 13.228514 0.212270 c
+13.092587 0.076344 12.908223 -0.000015 12.715995 -0.000015 c
+0.724805 -0.000015 l
+0.532576 -0.000015 0.348211 0.076344 0.212285 0.212270 c
+0.076359 0.348197 0.000000 0.532551 0.000000 0.724780 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 68.879639 92.008545 cm
+0.384314 0.219608 0.623529 scn
+21.633163 0.509887 m
+13.132361 0.509887 l
+13.132361 0.445888 l
+11.939295 0.459754 10.741426 0.442954 9.538759 0.395487 c
+9.538759 0.509887 l
+0.231562 0.509887 l
+0.056684 0.909454 -0.021007 1.344781 0.004858 1.780174 c
+0.030723 2.215569 0.159406 2.638633 0.380361 3.014687 c
+1.053161 4.119486 2.380362 4.694686 3.666762 4.789086 c
+4.953162 4.883486 6.238759 4.569890 7.493158 4.258690 c
+6.513158 5.809890 6.728362 8.018689 7.991562 9.346689 c
+9.254762 10.674689 11.445155 11.011487 13.045956 10.114687 c
+14.646755 9.217887 15.508362 7.175489 15.032362 5.402689 c
+16.608362 6.494689 18.921164 6.362688 20.365164 5.101088 c
+21.630764 3.991488 22.121964 2.108287 21.633163 0.509887 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 78.468750 88.534424 cm
+0.219608 0.219608 0.360784 scn
+3.593604 5.641602 m
+0.000000 5.641602 l
+0.000000 0.000000 l
+3.593604 0.000000 l
+3.593604 5.641602 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 77.194397 93.876831 cm
+0.219608 0.219608 0.360784 scn
+3.100801 4.364746 m
+0.000000 -0.000054 l
+6.201597 -0.000054 l
+3.100801 4.364746 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 19.115173 81.980713 cm
+0.384314 0.219608 0.623529 scn
+0.000000 4.099365 m
+0.000000 9.500166 l
+0.000000 10.587341 0.431878 11.629986 1.200627 12.398735 c
+1.969377 13.167484 3.012024 13.599365 4.099199 13.599365 c
+27.740801 13.599365 l
+28.827976 13.599365 29.870621 13.167484 30.639370 12.398735 c
+31.408119 11.629986 31.840000 10.587341 31.840000 9.500166 c
+31.840000 4.099365 l
+31.840000 3.012190 31.408119 1.969541 30.639370 1.200791 c
+29.870621 0.432042 28.827976 0.000166 27.740801 0.000166 c
+4.100000 0.000166 l
+3.561589 -0.000044 3.028413 0.105833 2.530935 0.311753 c
+2.033458 0.517673 1.581428 0.819596 1.200676 1.200274 c
+0.819925 1.580951 0.517913 2.032924 0.311896 2.530361 c
+0.105879 3.027799 -0.000105 3.560954 0.000000 4.099365 c
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 21.741577 86.337646 cm
+0.219608 0.219608 0.360784 scn
+2.415200 4.830444 m
+2.985601 2.985644 l
+4.830401 2.985644 l
+3.337600 1.844848 l
+3.908001 0.000043 l
+2.415200 1.140044 l
+0.922400 0.000043 l
+1.492800 1.844848 l
+0.000000 2.985644 l
+1.844800 2.985644 l
+2.415200 4.830444 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 27.174377 86.337646 cm
+0.219608 0.219608 0.360784 scn
+2.415200 4.830444 m
+2.984800 2.985644 l
+4.830401 2.985644 l
+3.337600 1.844848 l
+3.907200 0.000043 l
+2.415200 1.140044 l
+0.922400 0.000043 l
+1.492800 1.844848 l
+0.000000 2.985644 l
+1.844800 2.985644 l
+2.415200 4.830444 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 32.607971 86.392822 cm
+0.219608 0.219608 0.360784 scn
+2.415200 4.830444 m
+2.985601 2.985644 l
+4.830401 2.985644 l
+3.337600 1.844844 l
+3.908001 0.000043 l
+2.415200 1.140044 l
+0.922400 0.000043 l
+1.492800 1.844844 l
+0.000000 2.985644 l
+1.844800 2.985644 l
+2.415200 4.830444 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 38.079956 86.392822 cm
+0.219608 0.219608 0.360784 scn
+2.415200 4.830444 m
+2.985601 2.985644 l
+4.830401 2.985644 l
+3.337598 1.844844 l
+3.907998 0.000043 l
+2.415200 1.140044 l
+0.923201 0.000043 l
+1.492800 1.844844 l
+0.000000 2.985644 l
+1.845601 2.985644 l
+2.415200 4.830444 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 43.498352 86.392822 cm
+0.219608 0.219608 0.360784 scn
+2.415200 4.830444 m
+2.985601 2.985644 l
+4.830401 2.985644 l
+3.337603 1.844844 l
+3.908003 0.000043 l
+2.415200 1.140044 l
+0.922402 0.000043 l
+1.492803 1.844844 l
+0.000000 2.985644 l
+1.844800 2.985644 l
+2.415200 4.830444 l
+h
+f
+n
+Q
+q
+1.000000 0.000000 -0.000000 1.000000 45.976746 73.312012 cm
+0.384314 0.219608 0.623529 scn
+4.880796 12.604858 m
+4.507998 0.000059 l
+0.000000 8.642456 l
+4.880796 12.604858 l
+h
+f
+n
+Q
+
+endstream
+endobj
+
+2 0 obj
+  62629
+endobj
+
+3 0 obj
+  << /Type /XObject
+     /Length 4 0 R
+     /Group << /Type /Group
+               /S /Transparency
+            >>
+     /Subtype /Form
+     /Resources << >>
+     /BBox [ 0.000000 0.000000 160.000000 160.000000 ]
+  >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
+0.000000 0.000000 0.000000 scn
+0.000000 160.000000 m
+160.000000 160.000000 l
+160.000000 0.000000 l
+0.000000 0.000000 l
+0.000000 160.000000 l
+h
+f
+n
+Q
+
+endstream
+endobj
+
+4 0 obj
+  237
+endobj
+
+5 0 obj
+  << /XObject << /X1 1 0 R >>
+     /ExtGState << /E1 << /SMask << /Type /Mask
+                                    /G 3 0 R
+                                    /S /Alpha
+                                 >>
+                          /Type /ExtGState
+                       >> >>
+  >>
+endobj
+
+6 0 obj
+  << /Length 7 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+/E1 gs
+/X1 Do
+Q
+
+endstream
+endobj
+
+7 0 obj
+  46
+endobj
+
+8 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 160.000000 160.000000 ]
+     /Resources 5 0 R
+     /Contents 6 0 R
+     /Parent 9 0 R
+  >>
+endobj
+
+9 0 obj
+  << /Kids [ 8 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+10 0 obj
+  << /Pages 9 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 11
+0000000000 65535 f
+0000000010 00000 n
+0000062889 00000 n
+0000062913 00000 n
+0000063400 00000 n
+0000063422 00000 n
+0000063720 00000 n
+0000063822 00000 n
+0000063843 00000 n
+0000064018 00000 n
+0000064092 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 10 0 R
+   /Size 11
+>>
+startxref
+64152
+%%EOF
\ No newline at end of file
diff --git a/TraccarClient/JSONField.swift b/TraccarClient/JSONField.swift
new file mode 100644
index 0000000000000000000000000000000000000000..9e7f1246c91dd0e28a31c4b325836da88d740cb1
--- /dev/null
+++ b/TraccarClient/JSONField.swift
@@ -0,0 +1,194 @@
+//
+//  JSONField.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+
+import Foundation
+
+enum JSONField: String {
+    case none
+    
+    case app_errors = "app_errors"
+    case field_errors = "field_errors"
+    case display_errors = "display_errors"
+    
+    case access_token = "access_token"
+    case refresh_token = "refresh_token"
+    case picture = "picture"
+    
+    case id
+    case results
+    
+    case email
+    case password
+    case name
+    case phone
+    case prefix
+    case user_type
+    case account_type
+    
+    case country
+    case governorate
+    case area
+    case instagram
+    case swift
+    case weight
+    case height
+    case bio
+    case website
+    
+    case product_name_en = "name_en"
+    case product_name_ar = "name_ar"
+    case product_type = "type"
+    case product_description_en = "description_en"
+    case product_description_ar = "description_ar"
+    case product_comment_en = "comment_en"
+    case product_comment_ar = "comment_ar"
+    case product_occasion = "occasion"
+    case product_key_features_en = "key_features_en"
+    case product_key_features_ar = "key_features_ar"
+    case can_be_customized
+    case web_media
+    
+    case category
+    case level1
+    case level2
+    case level3
+    
+    case brand
+    case length
+    case width
+    
+    case price
+    case on_sale
+    case sale_price
+    case sale_start_date
+    case sale_end_date
+    case quantity
+    case sku
+    case size
+    case variant_name
+    case color
+    case variants
+    case variant
+    
+    case account
+    case option
+    case confirm_password
+    case code
+    case username = "user_name"
+    case business = "business_name"
+    case dynamicSpace
+    case old_password
+    case province
+    case city_name
+    case street_1
+    case street_2
+    case zip
+    case block
+    case avenue
+    case building
+    case floor
+    case unit
+    case iban
+    case bank
+    case civil_number
+    case civil_name
+    case civil_front
+    case civil_back
+    case trading_licence
+    case signature
+    case details
+    case subject
+    case message
+    case fName = "first_name"
+    case lName = "last_name"
+    case gender
+    case birthday = "birth_date"
+    
+    case shippings = "shipping_by"
+    case locations = "locations"
+    case location = "location"
+    case one_item_price = "one_item_price"
+    case additional_item_price = "additional_item_price"
+    case addresses = "address"
+    case processing_times = "processing_time"
+    case freeShipping = "free_shipping"
+    case authUsername = "username"
+    case authBusiness = "business"
+    case handling_fees
+    
+    case can_be_returned
+    case return_terms
+    
+    case activity = "activity"
+    
+    case sameAddress
+    case billingAddress
+    case is_bank_completed
+    case is_document_completed
+    case is_warehouse_added
+    case is_account_type_pending
+    
+    case is_public
+    case partner_sku
+    
+    case shipping_address_name
+    case shipping_address_country
+    case shipping_address_block
+    case shipping_address_street_1
+    case shipping_address_details
+    case shipping_address_avenue
+    case shipping_address_floor
+    case shipping_address_building
+    case shipping_address_province
+    case shipping_address_city_name
+    case shipping_address_zip
+    case shipping_address_street_2
+    case shipping_address_phone
+    case shipping_address_prefix
+    case shipping_address_governorate
+    case shipping_address_area
+    case shipping_address_unit
+    case shipping_address_email
+    case shipping_address_first_name
+    case shipping_address_last_name
+    
+    case billing_address_name
+    case billing_address_province
+    case billing_address_block
+    case billing_address_street_1
+    case billing_address_street_2
+    case billing_address_avenue
+    case billing_address_building
+    case billing_address_floor
+    case billing_address_unit
+    case billing_address_prefix
+    case billing_address_phone
+    case billing_address_country
+    case billing_address_phone_number
+    case billing_address_city_name
+    case billing_address_zip
+    case billing_address_details
+    case billing_address_governorate
+    case billing_address_area
+    case billing_address_email
+    case billing_address_first_name
+    case billing_address_last_name
+    case reason
+    
+    case favourites_count
+    case notification_count
+    case my_follower_count
+    case my_following_count
+    case basket_items_count
+    
+    case signup_checkbox
+    case full_name
+    
+    case categories
+}
diff --git a/TraccarClient/KNComponentView.swift b/TraccarClient/KNComponentView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f06afc7754cc6c8f72e111b6430d1efa09ff62c1
--- /dev/null
+++ b/TraccarClient/KNComponentView.swift
@@ -0,0 +1,34 @@
+//
+//  KNComponentView.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+
+class KNComponentView: UIView {
+    
+    // MARK: - Init
+    required init(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)!
+        
+        setupNib()
+    }
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        
+        setupNib()
+    }
+    
+    func setupNib() {
+        let bundle = Bundle(for: type(of: self))
+        
+        guard let view = bundle.loadNibNamed(Self.name, owner: self, options: nil)?.first as? UIView else { return }
+        
+        addSubview(view)
+    }
+}
diff --git a/TraccarClient/KNObject.swift b/TraccarClient/KNObject.swift
new file mode 100644
index 0000000000000000000000000000000000000000..89a58f6dc5f168ca854d5cfb69b44a8ce1a37f6f
--- /dev/null
+++ b/TraccarClient/KNObject.swift
@@ -0,0 +1,23 @@
+//
+//  KNObject.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+
+class KNObject: NSObject {
+    
+    // MARK: - Properties
+    var isSelected: Bool = false
+    
+    // MARK: - Init
+    override init() {
+        super.init()
+        
+        isSelected = false
+    }
+}
diff --git a/TraccarClient/KNTableViewCell.swift b/TraccarClient/KNTableViewCell.swift
new file mode 100644
index 0000000000000000000000000000000000000000..1488795bfa6575e6462901839a8027298fab1f34
--- /dev/null
+++ b/TraccarClient/KNTableViewCell.swift
@@ -0,0 +1,20 @@
+//
+//  KNTableViewCell.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+
+class KNTableViewCell: UITableViewCell {
+    
+    // MARK: - Lifecycle
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        selectionStyle = .none
+    }
+}
diff --git a/TraccarClient/KNTextField.swift b/TraccarClient/KNTextField.swift
new file mode 100644
index 0000000000000000000000000000000000000000..b2eae200ea88a12c07d4ca3ad6135441514eeb9a
--- /dev/null
+++ b/TraccarClient/KNTextField.swift
@@ -0,0 +1,112 @@
+//
+//  KNTextField.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+
+public class KNTextField: UITextField {
+    
+    // MARK: - Properties
+    typealias KNTextFieldClosure = (String) -> ()
+    
+    var textChanged: KNTextFieldClosure  = { _ in }
+    var textEndEditing: KNTextFieldClosure  = { _ in }
+    
+    var padding: UIEdgeInsets?
+    
+    // MARK: - Init
+    required init(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)!
+        
+        setupUI()
+    }
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        
+        setupUI()
+    }
+    
+    func setupUI() {
+        borderStyle = .none
+        backgroundColor = .clear
+        tintColor = .purple
+        
+        padding = .zero
+        
+        autocorrectionType = .no
+        textAlignment = .left
+        
+    }
+    
+    // MARK: - Handler
+    func bind(callback: @escaping KNTextFieldClosure) {
+        textChanged = callback
+        
+        addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
+    }
+    
+    @objc func textFieldDidChange(_ textField: KNTextField) {
+        textChanged(textField.text ?? "")
+    }
+    
+    func endEditingBind(callback: @escaping KNTextFieldClosure) {
+        textEndEditing = callback
+        
+        addTarget(self, action: #selector(textFieldDidEndEditing), for: .editingDidEnd)
+    }
+    
+    @objc func textFieldDidEndEditing(_ textField: KNTextField) {
+        textEndEditing(textField.text ?? "")
+    }
+}
+
+final class KNPaddingTextField: KNTextField {
+    
+    // MARK: - Init
+    override func setupUI() {
+        let padding_value: CGFloat = 0
+        let padding_leftRight_value: CGFloat = 16
+        padding = UIEdgeInsets(top: padding_value,
+                               left: padding_leftRight_value,
+                               bottom: padding_value,
+                               right: padding_leftRight_value)
+        super.setupUI()
+    }
+    
+    override func textRect(forBounds bounds: CGRect) -> CGRect {
+        let rect = super.textRect(forBounds: bounds)
+        return rect.inset(by: padding ?? .zero)
+    }
+    
+    override func editingRect(forBounds bounds: CGRect) -> CGRect {
+        let rect = super.editingRect(forBounds: bounds)
+        return rect.inset(by: padding ?? .zero)
+    }
+}
+
+final class MATextFieldCode: KNTextField {
+    // MARK: - Properties
+    typealias DeleteFieldClosure = () -> ()
+
+    var deleteButtonPressed: DeleteFieldClosure  = {
+        //
+    }
+    
+    // MARK: - Init
+    override func setupUI() {
+        autocorrectionType = .no
+        textAlignment = .center
+        tintColor = .purple
+    }
+    
+    override func deleteBackward() {
+        deleteButtonPressed()
+        super.deleteBackward()
+    }
+}
diff --git a/TraccarClient/Keys.swift b/TraccarClient/Keys.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f8cf3dbe4f1bd70a3448521427f80df9b7eb847c
--- /dev/null
+++ b/TraccarClient/Keys.swift
@@ -0,0 +1,50 @@
+//
+//  Keys.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+let tag: String = "KN_"
+
+struct Keys {
+    static let appLanguage = tag + "_appLanguage"
+    static let isLoggedIn = tag + "_isLoggedIn"
+    static let guestToken = tag + "_guestToken"
+    static let deviceToken = tag + "_deviceToken"
+    static let socialLoginType = tag + "_socialLoginType"
+    static let socialLoginName = tag + "socialLoginName"
+    static let socialLoginEmail = tag + "socialLoginEmail"
+
+    struct User {
+        static let id = tag + "_user_id"
+        static let email = tag + "_user_email"
+        static let firstName = tag + "_user_first_name"
+        static let lastName = tag + "_user_last_name"
+        static let user_type = tag + "_user_type"
+        static let access_token = tag + "_user_access_token"
+        static let refresh_token = tag + "_user_refresh_token"
+        static let picture = tag + "_profile_picture"
+        static let is_bank_completed = tag + "_is_bank_completed"
+        static let is_document_completed = tag + "_is_document_completed"
+        static let is_warehouse_added = tag + "_is_warehouse_added"
+        static let is_account_type_pending = tag + "_is_account_type_pending"
+        static let fullName = tag + "_full_name"
+        static let phone = tag + "_phone"
+        static let prefix = tag + "_prefix"
+        static let account_type = tag + "_account_type"
+    }
+    
+    struct Badge {
+        static let favourites_count = tag + "_favourites_count_badge"
+        static let notification_count = tag + "_notification_count_badge"
+        static let my_follower_count = tag + "_my_follower_count_badge"
+        static let my_following_count = tag + "_my_following_count_badge"
+        static let basket_items_count = tag + "_basket_items_count_badge"
+
+    }
+
+}
diff --git a/TraccarClient/LoginViewController.swift b/TraccarClient/LoginViewController.swift
new file mode 100644
index 0000000000000000000000000000000000000000..e87d9066daca558982b97cbe766937a8a8fa60dd
--- /dev/null
+++ b/TraccarClient/LoginViewController.swift
@@ -0,0 +1,17 @@
+//
+//  LoginViewController.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import UIKit
+
+final class LoginViewController: UIViewController {
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+    }
+    
+}
diff --git a/TraccarClient/LoginViewController.xib b/TraccarClient/LoginViewController.xib
new file mode 100644
index 0000000000000000000000000000000000000000..00485dc670700e704dfd8239a7a826be7a12cc3c
--- /dev/null
+++ b/TraccarClient/LoginViewController.xib
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22155" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22131"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <customFonts key="customFonts">
+        <array key="Montserrat-Bold.ttf">
+            <string>Montserrat-Bold</string>
+        </array>
+        <array key="Montserrat-Regular.ttf">
+            <string>Montserrat-Regular</string>
+        </array>
+    </customFonts>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="LoginViewController" customModule="TraccarClient" customModuleProvider="target">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="DeliveryIcon" translatesAutoresizingMaskIntoConstraints="NO" id="rPb-N8-5pB">
+                    <rect key="frame" x="116.66666666666669" y="75" width="160" height="160"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="160" id="eJs-0H-D6L"/>
+                        <constraint firstAttribute="height" constant="160" id="xEg-fV-es4"/>
+                    </constraints>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Dive into Fleet Tracking!" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jC6-Ly-QKC">
+                    <rect key="frame" x="81.666666666666671" y="245" width="229.66666666666663" height="22"/>
+                    <fontDescription key="fontDescription" name="Montserrat-Bold" family="Montserrat" pointSize="18"/>
+                    <nil key="textColor"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Stay connected, drive smart." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ejG-GP-Evp">
+                    <rect key="frame" x="111.33333333333333" y="274" width="170.33333333333337" height="14.666666666666686"/>
+                    <fontDescription key="fontDescription" name="Montserrat-Regular" family="Montserrat" pointSize="12"/>
+                    <nil key="textColor"/>
+                    <nil key="highlightedColor"/>
+                </label>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+            <constraints>
+                <constraint firstItem="rPb-N8-5pB" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="CJs-Qh-u3u"/>
+                <constraint firstItem="rPb-N8-5pB" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" constant="75" id="HjK-k3-B52"/>
+                <constraint firstItem="ejG-GP-Evp" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="nuW-Lh-yVC"/>
+                <constraint firstItem="ejG-GP-Evp" firstAttribute="top" secondItem="jC6-Ly-QKC" secondAttribute="bottom" constant="7" id="o0G-Yj-sgP"/>
+                <constraint firstItem="jC6-Ly-QKC" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="x2w-Bh-kGc"/>
+                <constraint firstItem="jC6-Ly-QKC" firstAttribute="top" secondItem="rPb-N8-5pB" secondAttribute="bottom" constant="10" id="yvR-wY-vOb"/>
+            </constraints>
+            <point key="canvasLocation" x="139" y="21"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="DeliveryIcon" width="160" height="160"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>
diff --git a/TraccarClient/Logs.swift b/TraccarClient/Logs.swift
new file mode 100644
index 0000000000000000000000000000000000000000..33a6fb235ff78a6788e7697fcf4c75e7e18862fb
--- /dev/null
+++ b/TraccarClient/Logs.swift
@@ -0,0 +1,30 @@
+//
+//  Logs.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+
+// MARK: - Console Log
+func log(_ args: Any...) {
+    print_log(args, oneLine: true)
+}
+
+func logs(_ args: Any...) {
+    print_log(args, oneLine: false)
+}
+
+fileprivate func print_log(_ args: Any..., oneLine: Bool) {
+    if !app.logsAreEnabled { return }
+
+    if oneLine {
+        print(args)
+    } else {
+        for line in args {
+            print(line)
+        }
+    }
+}
diff --git a/TraccarClient/Montserrat-Black.ttf b/TraccarClient/Montserrat-Black.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..7af9fb4420e3851e67c228388a491b908d08b63b
Binary files /dev/null and b/TraccarClient/Montserrat-Black.ttf differ
diff --git a/TraccarClient/Montserrat-BlackItalic.ttf b/TraccarClient/Montserrat-BlackItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..c60836677b311310ea44d70205bac6bb0d00b365
Binary files /dev/null and b/TraccarClient/Montserrat-BlackItalic.ttf differ
diff --git a/TraccarClient/Montserrat-Bold.ttf b/TraccarClient/Montserrat-Bold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..0927b8133cfc1ed1c326677f8f1275fae4529606
Binary files /dev/null and b/TraccarClient/Montserrat-Bold.ttf differ
diff --git a/TraccarClient/Montserrat-BoldItalic.ttf b/TraccarClient/Montserrat-BoldItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..02f57843cf5c836dcd349ac53e093c7a0cf4ebd8
Binary files /dev/null and b/TraccarClient/Montserrat-BoldItalic.ttf differ
diff --git a/TraccarClient/Montserrat-ExtraBold.ttf b/TraccarClient/Montserrat-ExtraBold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..e33afd43473e10754779197293464292358090d0
Binary files /dev/null and b/TraccarClient/Montserrat-ExtraBold.ttf differ
diff --git a/TraccarClient/Montserrat-ExtraBoldItalic.ttf b/TraccarClient/Montserrat-ExtraBoldItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..92fc3013c2283ccd5c4d8cd47f391d0434ddbbb5
Binary files /dev/null and b/TraccarClient/Montserrat-ExtraBoldItalic.ttf differ
diff --git a/TraccarClient/Montserrat-ExtraLight.ttf b/TraccarClient/Montserrat-ExtraLight.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..8aa56c1771aa9e07aad4509a7274b4fb1a1cae3e
Binary files /dev/null and b/TraccarClient/Montserrat-ExtraLight.ttf differ
diff --git a/TraccarClient/Montserrat-ExtraLightItalic.ttf b/TraccarClient/Montserrat-ExtraLightItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..98c10f11e0e8003c07426eda037604dfe67f1aa9
Binary files /dev/null and b/TraccarClient/Montserrat-ExtraLightItalic.ttf differ
diff --git a/TraccarClient/Montserrat-Italic.ttf b/TraccarClient/Montserrat-Italic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..cff3cebcdab38622c0e4c8e9ef9990ace0f1b063
Binary files /dev/null and b/TraccarClient/Montserrat-Italic.ttf differ
diff --git a/TraccarClient/Montserrat-Light.ttf b/TraccarClient/Montserrat-Light.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..fd787a81c3e608898214c09e62216eefa8f2ba90
Binary files /dev/null and b/TraccarClient/Montserrat-Light.ttf differ
diff --git a/TraccarClient/Montserrat-LightItalic.ttf b/TraccarClient/Montserrat-LightItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..6a2c9d4c1f242183b5e005bc9c46343754a65982
Binary files /dev/null and b/TraccarClient/Montserrat-LightItalic.ttf differ
diff --git a/TraccarClient/Montserrat-Medium.ttf b/TraccarClient/Montserrat-Medium.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..4012225c0b220d0e1d67001daa7e01bba3df6953
Binary files /dev/null and b/TraccarClient/Montserrat-Medium.ttf differ
diff --git a/TraccarClient/Montserrat-MediumItalic.ttf b/TraccarClient/Montserrat-MediumItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..84b2539406cd93f9aff24809ef62223bab691581
Binary files /dev/null and b/TraccarClient/Montserrat-MediumItalic.ttf differ
diff --git a/TraccarClient/Montserrat-Regular.ttf b/TraccarClient/Montserrat-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..f4a266dd37d5066da46c9a6b8898073ae2930a64
Binary files /dev/null and b/TraccarClient/Montserrat-Regular.ttf differ
diff --git a/TraccarClient/Montserrat-SemiBold.ttf b/TraccarClient/Montserrat-SemiBold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..189ce9d0c60c76251cf57657cee1e3e068feaaab
Binary files /dev/null and b/TraccarClient/Montserrat-SemiBold.ttf differ
diff --git a/TraccarClient/Montserrat-SemiBoldItalic.ttf b/TraccarClient/Montserrat-SemiBoldItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..4c59d861872842ea49a4ec8241ef5e197901df61
Binary files /dev/null and b/TraccarClient/Montserrat-SemiBoldItalic.ttf differ
diff --git a/TraccarClient/Montserrat-Thin.ttf b/TraccarClient/Montserrat-Thin.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..7d085bba948901e1f61812a5bff6082591506ca5
Binary files /dev/null and b/TraccarClient/Montserrat-Thin.ttf differ
diff --git a/TraccarClient/Montserrat-ThinItalic.ttf b/TraccarClient/Montserrat-ThinItalic.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..6fbfad1ade1ac4e4e4aab8040ec8961a21916fa9
Binary files /dev/null and b/TraccarClient/Montserrat-ThinItalic.ttf differ
diff --git a/TraccarClient/NSLayoutConstraints.swift b/TraccarClient/NSLayoutConstraints.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a9c53b411339073274e9f2ceadf6c80b677f072f
--- /dev/null
+++ b/TraccarClient/NSLayoutConstraints.swift
@@ -0,0 +1,25 @@
+//
+//  NSLayoutConstraints.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import UIKit
+
+extension NSLayoutConstraint {
+    
+    // MARK: - Value
+    func set(_ value: CGFloat) {
+        constant = value
+    }
+    
+    func add(_ value: CGFloat) {
+        constant += value
+    }
+    
+    func substract(_ value: CGFloat) {
+        constant -= value
+    }
+}
diff --git a/TraccarClient/Nameable.swift b/TraccarClient/Nameable.swift
new file mode 100644
index 0000000000000000000000000000000000000000..fc3a1036dc4977ebd387a341e28b9f5896361e4f
--- /dev/null
+++ b/TraccarClient/Nameable.swift
@@ -0,0 +1,19 @@
+//
+//  Nameable.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+protocol Nameable: AnyObject {
+    static var name: String { get }
+}
+
+extension Nameable {
+    static var name: String {
+        return String(describing: self)
+    }
+}
diff --git a/TraccarClient/Network+Endpoint.swift b/TraccarClient/Network+Endpoint.swift
new file mode 100644
index 0000000000000000000000000000000000000000..740eb764809b58dc8ad5a63e2c2437efdfac91d4
--- /dev/null
+++ b/TraccarClient/Network+Endpoint.swift
@@ -0,0 +1,287 @@
+//
+//  Network+Endpoints.swift
+//  traccar
+//
+//  Created by George Makhoul on 10/25/23.
+//
+
+import Foundation
+
+// MARK: - API Endpoint
+enum Endpoint: String, CaseIterable {
+    
+    static var baseURL: String {
+        switch app.environment {
+        case .development, .sandbox:
+            return "\(serverURL)/api/v1/"
+        case .production:
+            return "\(serverURL)/api/v1/"
+        }
+    }
+    
+    static var serverURL: String {
+        switch app.environment {
+        case .development, .sandbox:
+            return "https://traccaravenue.mykuwaitnet.net"
+        case .production:
+            return "https://www.traccaravenue.com"
+        }
+    }
+    
+    case all
+    case signin = "account/login/"
+    case refreshToken = "account/token/refresh/"
+    case generateGuestToken = "generate-guest-token/"
+    case forgotPassword = "account/login/forgot-password/"
+    
+    case receiveCode = "account/login/forgot-password/receive-code/"
+    case verifyCode = "account/login/forgot-password/verify-code/"
+    case resetPassword = "account/login/forgot-password/reset-password/"
+    
+    case signup = "account/sign-up/user/"
+    case companySignup = "account/sign-up/company/"
+    
+    case signupPassword = "account/sign-up/user/password/"
+    case companySignupPassword = "account/sign-up/company/password/"
+    
+    case signupVerifyCode = "account/sign-up/user/verify/"
+    case companySignupVerifyCode = "account/sign-up/company/verify/"
+    case updateAccountType = "account/sign-up/set_account_type/"
+    case resendCode = "account/sign-up/resend-code/"
+    case contactInfo = "settings/contact-info/"
+    case changePassword = "settings/change-password/"
+    
+    case language = "account/language/"
+    case currency = "settings/currency/"
+    case about = "settings/about/"
+    case terms = "settings/terms-and-conditions/"
+    case privacy = "settings/privacy-policy/"
+    case settingsOptions = "settings/my-settings/"
+    case notificationsSettings = "notification/settings/"
+    case updateBadge = "account/me/badges_count/"
+    case updateBadgeGuest = "guest/"
+    
+    // ADDRESS
+    case addresses = "account/address/"
+    case deleteAddress = "account/address/%@/"
+    case editAddress = "account/address/%@/update_address/"
+    case searchAddress = "account/address/autocomplete_search/"
+    case getLocation = "account/address/place/%@/"
+    case set_location = "account/address/set-location/"
+    
+    // shippingWarehouse
+    case shippingWarehouse = "account/warehouse_address/my_warehouse/"
+    case editshippingWarehouse = "account/warehouse_address/%@/update_address/"
+    case searchshippingWarehouse = "account/warehouse_address/autocomplete_search/"
+    case getLocationShippingWarehouse = "account/warehouse_address/place/%@/"
+    case setlocationShippingWarehouse = "account/warehouse_address/set-location/"
+
+    case bankAccount = "account/bank-account/"
+    case contactus = "settings/contact/"
+    
+    case documents = "account/documents/"
+    
+    // PRODUCT BUILDER
+    case product_builder = "product-builder/"
+    case product_builder_id = "product-builder/%@/"
+    case product_builder_new_id = "product-builder/new/%@/"
+    case product_builder_new = "product-builder/new/"
+    case product_builder_continue = "product-builder/continue/"
+    case product_builder_step_information = "product-builder/%@/information/"
+    case product_builder_step_information_media = "product-builder/%@/information/media/"
+    case product_builder_step_category = "product-builder/%@/category/"
+    case product_builder_step_attributes = "product-builder/%@/attributes/"
+    case product_builder_step_stock = "product-builder/%@/stock/"
+    case product_builder_step_set_for_all_variant = "product-builder/%@/set_for_all_variant/"
+    
+    case product_builder_generate_variants = "product-builder/%@/generate_variants/"
+    case product_builder_variant_detail = "product-builder/%@/variant_detail/%@/"
+    case product_builder_step_variants = "product-builder/%@/variants/"
+    case product_builder_step_variants_new = "product-builder/%@/variants/new/"
+    case product_builder_step_variants_id = "product-builder/%@/variants/%@/"
+    case product_builder_step_shipping = "product-builder/%@/shipping/"
+    case product_builder_step_shipping_add_location = "product-builder/%@/shipping/location/new/"
+    case product_builder_step_shipping_location_new = "%@/shipping/location/new/"
+    case product_builder_step_returns = "product-builder/%@/returns/"
+    case product_builder_cancel = "product-builder/cancel/"
+    case product_builder_single_variant = "product-builder/%@/add_single_variant/"
+    
+    // Media Upload
+    case upload_Media = "media-upload?field-name=web_media"
+    
+    // Product
+    case product = "product/"
+    case productLike = "product/%@/like/"
+    case productComments = "product/%@/comments/"
+    case deleteComment = "product/%@/comments/%@/"
+    case addToCart = "basket/add-product/"
+    case buyNow = "basket/buy_now/"
+    case productDetails = "product/%@/"
+    case productFilterOptions = "filter_options/"
+    
+    //Profile
+    case currentProfile = "account/me/"
+    case profile = "account/public/user/%@/"
+    case profileProduct = "product/compact_list/?partner_id="
+    case recentlyViewedProduct = "product/my_recently_view_products/"
+    case vacationMode = "account/vacation_mode/"
+    case profileData = "account/update/"
+    case uploadProfilePicture = "media-upload?field-name=profile_image/"
+    case fetchFollowers = "account/followers/"
+    case fetchPublicFollowers = "account/public/user/%@/followers/"
+    case fetchFollowing = "account/following/"
+    case fetchPublicFollowing = "account/public/user/%@/following/"
+    case followUser = "account/follow/"
+    
+    case favorite = "favourites/"
+    case delete_favorite = "favourites/remove_lines/"
+    
+    case search = "search/"
+    case variant = "product/%@/variant/"
+    case categories = "category/"
+    case logout = "account/logout/"
+    
+    case activities = "account/me/activities/"
+    
+    // Sales Orders
+    case salesOrders = "trader_dashboard/received_orders/"
+    case salesOrderDetails = "trader_dashboard/received_orders/%@/"
+    case acceptOrder = "trader_dashboard/received_orders/%@/accept/"
+    case rejectOrder = "trader_dashboard/received_orders/%@/reject_order/"
+    case shippedOrder = "trader_dashboard/received_orders/%@/mark_shipped/"
+    case updateOrderStatus = "trader_dashboard/received_orders/%@/line_update/%@/"
+    
+    // Purchases Orders
+    case purchasesOrders = "orders/"
+    case purchasesOrderDetails = "orders/%@/"
+    
+    case markAllRead = "account/me/activities/mark-all-read/"
+//    case markActivityRead = "account/activities/mark-activity-read/"
+    case markActivityRead = "account/activity/%@/mark-read"
+    
+    case cart = "basket/"
+    case updateCart = "baskets/%@/lines/%@/"
+
+    case checkout = "checkout/"
+    case checkoutDetails = "checkout/%@/"
+    
+    case notifications = "notification/my_notification/"
+    case markAllReadNotification = "notification/notification-mark-read/"
+    case markActivityReadNotification = "notification/notification-mark-read/?id=%@"
+    case markPushNotificationRead = "notification/notification-mark-read/?notification_group_id=%@"
+    case registerToken = "notification/device/apns/"
+    
+    // Checkout
+    case checkout_payment_methods = "checkout/%@/payment/"
+    case checkout_address = "checkout/%@/address/"
+    case checkout_shipping_methods = "checkout/%@/shipping_method/"
+    case checkout_add_coupon = "checkout/%@/add_coupon/"
+    case checkout_remove_coupon = "checkout/%@/remove_coupon/"
+    case retryPayment = "retry-payment"
+    
+    // Reports
+    case sales_summary = "summary_orders/"
+    case best_selling = "best_selling/"
+    case report_product = "report_product/"
+    
+    // Social login
+    case google = "login/google/"
+    case facebook = "login/facebook/"
+    case apple = "login/apple/"
+    
+    case delete_account = "account/me/delete_account/"
+    case static_pages = "settings/cms/pages/"
+    case static_page = "settings/cms/pages/%@/"
+    
+    case public_account_contact_details = "account/partner_contact_info/"
+    
+    // My Products
+    case myProducts = "trader_dashboard/my_products/"
+    case deleteProduct = "trader_dashboard/my_products/%@/"
+    // ///////////////
+    
+    // get endpoint with resource
+    func with(resource: Int) -> String {
+        String(format: self.rawValue, "\(resource)")
+    }
+	
+	func with(detailsID: Int, productID: Int) -> String {
+		String(format: self.rawValue, "\(detailsID)", "\(productID)")
+	}
+    
+    func with(productBuilderID: Int, variantID: Int) -> String {
+        String(format: self.rawValue, "\(productBuilderID)", "\(variantID)")
+    }
+    
+    func with(orderID: Int, lineID: Int) -> String {
+        String(format: self.rawValue, "\(orderID)", "\(lineID)")
+    }
+    
+    func with(basket: Int, line: Int) -> String {
+        String(format: self.rawValue, "\(basket)", "\(line)")
+    }
+    
+    func with(resource: String) -> String {
+        String(format: self.rawValue, "\(resource)")
+    }
+    
+    func with(product: Int, comment: Int) -> String {
+        String(format: self.rawValue, "\(product)", "\(comment)")
+    }
+    
+    func with(resource: String, urlParams: String) -> String {
+        var result: String = ""
+        
+        if urlParams.isEmpty {
+            result = with(resource: resource)
+        } else {
+            if urlParams.contains(resource) {
+                result = result + "?\(urlParams)"
+            } else {
+                result = with(resource: resource)
+                result = result + "&\(urlParams)"
+            }
+        }
+        
+        return result
+        
+    }
+    func with(resource: Int, urlParams: String) -> String {
+        var result: String = ""
+        
+        result = with(resource: resource)
+        
+        if !urlParams.isEmpty {
+            result = result + "?\(urlParams)"
+        }
+        
+        return result
+        
+    }
+    
+    func with(urlParams: String) -> String {
+        var result: String = ""
+        
+        result = String(format: self.rawValue, "")
+        
+        if !urlParams.isEmpty {
+            
+            var params = "?"
+            
+            if let ampersand = urlParams.first {
+                if ampersand == "&" {
+                    params += String(urlParams.dropFirst())
+                } else {
+                    params += urlParams
+                }
+            }
+            
+            result.append(params)
+            
+        }
+        
+        return result
+    }
+    
+}
+
diff --git a/TraccarClient/Network+Error.swift b/TraccarClient/Network+Error.swift
new file mode 100644
index 0000000000000000000000000000000000000000..3829600d418dc82a8ad31833b1868b00aafa900a
--- /dev/null
+++ b/TraccarClient/Network+Error.swift
@@ -0,0 +1,56 @@
+//
+//  Network+Error.swift
+//  traccar
+//
+//  Created by George Makhoul on 10/25/23.
+//
+
+import Foundation
+import UIKit
+import Alamofire
+
+final class NetworkError: NSObject, Error {
+    
+    enum Typee {
+        case none
+        case general
+        case noInternet
+        
+        case badRequest
+        case unauthorized
+        case notFound
+        case serverDown
+        
+        case INVALID_ACCESS_TOKEN
+        case INVALID_REFRESH_TOKEN
+    }
+    
+    // MARK: - Properties
+    private(set) var message: String = ""
+    private(set) var type: NetworkError.Typee = .none
+    
+    var error: AFError?
+    
+    // MARK: - Init
+    override init() {
+        super.init()
+    }
+    
+    init(request: AFError) {
+        self.error = request
+    }
+    
+    init(_ message: String, _ type: NetworkError.Typee = .none) {
+        self.message = message
+        self.type = type
+    }
+    
+    init(_ type: NetworkError.Typee = .none) {
+        self.type = type
+        
+        if type == .noInternet {
+            message = String.API.noInternetConnection
+        }
+    }
+}
+
diff --git a/TraccarClient/Network+Rechability.swift b/TraccarClient/Network+Rechability.swift
new file mode 100644
index 0000000000000000000000000000000000000000..8dcdc80174fcf46b3022ce064fe207287ec9f815
--- /dev/null
+++ b/TraccarClient/Network+Rechability.swift
@@ -0,0 +1,37 @@
+//
+//  Network+Rechability.swift
+//  traccar
+//
+//  Created by George Makhoul on 10/25/23.
+//
+
+import Foundation
+import Reachability
+
+final class ReachabilityManager {
+    static let sharedInstance = ReachabilityManager()
+    
+    private var reachability = try? Reachability()
+    private var isConnected = true
+    
+    private init() {
+        reachability?.whenReachable = { _ in
+            self.isConnected = true
+        }
+        
+        reachability?.whenUnreachable = { _ in
+            self.isConnected = false
+        }
+        
+        do {
+            try reachability?.startNotifier()
+        } catch {
+            log("ReachabilityManager", "Unable to start notifier")
+        }
+    }
+    
+    func isConnectedToNetwork() -> Bool {
+        return isConnected
+    }
+}
+
diff --git a/TraccarClient/Network+Result.swift b/TraccarClient/Network+Result.swift
new file mode 100644
index 0000000000000000000000000000000000000000..faf184c1aa2f70eb9dbea85c0784b18ea6e8688f
--- /dev/null
+++ b/TraccarClient/Network+Result.swift
@@ -0,0 +1,345 @@
+//
+//  Network+Result.swift
+//  traccar
+//
+//  Created by George Makhoul on 10/25/23.
+//
+
+
+import Foundation
+import Alamofire
+
+
+extension String {
+    
+    // MARK: - API Errors
+    static let INVALID_ACCESS_TOKEN = "INVALID_ACCESS_TOKEN"
+    static let INVALID_REFRESH_TOKEN = "INVALID_REFRESH_TOKEN"
+}
+
+final class AppError {
+    enum AppErrorType {
+        case none
+        
+        case invalidAccessToken
+        case invalidRefreshToken
+    }
+    
+    var type: AppErrorType = .none
+    var message: String = ""
+    
+    init(_ dict: JSON) {
+        if let error = dict["error"] as? String {
+            if error == String.INVALID_ACCESS_TOKEN {
+                type = .invalidRefreshToken
+            }
+            
+            if error == String.INVALID_REFRESH_TOKEN {
+                type = .invalidRefreshToken
+            }
+        }
+        
+        message = dict["message"] as? String ?? ""
+    }
+    
+}
+
+final class NetworkResultModel: KNObject {
+    
+    enum ErrorType {
+        case none
+        case app
+        case field
+        case custom
+        case display
+    }
+    
+    // MARK: - Properties
+    private var error: NetworkError?
+    var appErrors: JSON = [:] {
+        didSet {
+            appError = AppError(appErrors)
+        }
+    }
+    
+    var fieldErrors: JSON = [:]
+    var customErrors: JSON = [:]
+    var displayError: String = ""
+    
+    var haveFieldsErrors: Bool {
+        return fieldErrors.keys.count > 0
+    }
+    
+    var appError: AppError?
+    var errorType: ErrorType = .none
+    
+    private var dataResponse: AFDataResponse<Data>?
+    var success: Bool = false
+    var data: Any?
+    
+    private var value: Any?
+    private var _object: JSON?
+    private var _objects: [JSON]?
+    
+    var object: JSON {
+        return _object ?? [:]
+    }
+    
+    var objects: [JSON] {
+        return _objects ?? []
+    }
+    
+    var statusCode: Int = 0
+    var requestURL: String = ""
+    
+    // MARK: Init
+    override init() {
+        super.init()
+    }
+    
+    init(dataResponse: AFDataResponse<Data>) {
+        super.init()
+        
+        self.dataResponse = dataResponse
+        
+        if let request = dataResponse.request {
+            if let url = request.url {
+                requestURL = url.absoluteString
+            }
+        }
+        
+        guard let response = dataResponse.response else {
+            switch dataResponse.result {
+            case .failure(let error):
+                displayError = error.localizedDescription
+                statusCode = error.responseCode ?? -1010101
+            default:
+                displayError = "Error"
+                statusCode = -1010101
+            }
+            
+            return
+        }
+        
+        statusCode = response.statusCode
+        
+        if statusCode.isOk {
+            parseData()
+            
+        } else if statusCode.isError {
+            parseErrors()
+            
+        } else if statusCode.isCritical {
+            displayError = String.API.serverIsNotResponding
+            errorType = .display
+            success = false
+            
+        } else {
+            displayError = String.API.baseError
+            errorType = .display
+            success = false
+        }
+        
+        logResponse()
+    }
+    
+    init(error: NetworkError) {
+        self.error = error
+        displayError = error.message
+        
+        log()
+        log("=========================")
+        log("@API -> error")
+        log(error.message)
+        log("=========================")
+        log()
+    }
+    
+    // MARK: - Log
+    private func logResponse() {
+        var shouldLog = false
+        for each in app.logRequest {
+            if let response = self.dataResponse {
+                if let request = response.request {
+                    if let url = request.url {
+                        if url.absoluteString.contains(each.rawValue) {
+                            shouldLog = true
+                            break
+                        }
+                        
+                        if app.logRequest.contains(.all) {
+                            shouldLog = true
+                        }
+                    }
+                }
+            }
+        }
+        
+        if shouldLog {
+            if let response = dataResponse {
+                //app.useShortLogsForRequests = false
+                if app.useShortLogsForRequests {
+                    print("@API", "🌎")
+                    print(" -> \(String(describing: response.request!.httpMethod!))")
+                    print(" -> \(String(describing: response.response!.statusCode))")
+                    print(" -> \(String(describing: response.response!.url!.absoluteString))")
+                    print(" --------: \n")
+                } else {
+                    log()
+                    log("=========================")
+                    log("@API -> dataResponse")
+                    log(response)
+                    log("=========================")
+                }
+            }
+        }
+    }
+}
+
+// MARK: - Data
+extension NetworkResultModel {
+    func parseData() {
+        guard let responseData = dataResponse else { return }
+        
+        switch responseData.result {
+        case .success(let data):
+            do {
+                let value = try JSONSerialization.jsonObject(with: data)
+                self.value = value
+                
+            } catch {
+                print("Error while decoding response: \(String(data: data, encoding: .utf8) ?? "")")
+            }
+            
+            if let dict = value as? JSON {
+                _object = dict
+            }
+            
+            if let dicts = value as? [JSON] {
+                _objects = dicts
+            }
+            
+            success = true
+        case .failure(let error):
+            success = false
+            self.error = NetworkError(request: error)
+        }
+    }
+}
+
+// MARK: - Errors
+extension NetworkResultModel {
+    func parseErrors() {
+        guard let responseData = dataResponse else { return }
+        
+        if let error = responseData.error {
+            displayError = error.localizedDescription
+            errorType = .display
+            success = false
+            statusCode = error.responseCode ?? -0
+            return
+        }
+        
+        switch responseData.result {
+        case .success(let data):
+            do {
+                let value = try JSONSerialization.jsonObject(with: data)
+                self.value = value
+                
+            } catch {
+                print("Error while decoding response: \(String(data: data, encoding: .utf8) ?? "")")
+            }
+                        
+            // error is dictionary
+            if let dict = value as? JSON {
+                displayError = "\(dict)"
+                
+                if let display_errors = dict["display_errors"] as? [String] {
+                    displayError = display_errors.joined(separator: "\n")
+                    errorType = .display
+                    
+                    if !displayError.isEmpty { return }
+                }
+                
+                if let custom_errors = dict["custom_errors"] as? JSON {
+                    customErrors = custom_errors
+                    displayError = ""
+                    errorType = .custom
+                    
+                    if !customErrors.isEmpty { return }
+                }
+                
+                if let app_errors = dict["app_errors"] as? JSON {
+                    appErrors = app_errors
+                    
+                    if let appError = appError {
+                        if appError.message.isEmpty {
+                            displayError = ""
+                        } else {
+                            displayError = appError.message
+                        }
+                    } else {
+                        displayError = ""
+                    }
+                    
+                    
+                    errorType = .app
+                    
+                    if !appErrors.isEmpty { return }
+                }
+                
+                if let field_errors = dict["field_errors"] as? JSON {
+                    fieldErrors = field_errors
+                    displayError = ""
+                    errorType = .field
+                    
+                    if !fieldErrors.isEmpty { return }
+                }
+            }
+            
+            // error is array
+            if let arr = value as? [JSON] {
+                displayError = "\(arr)"
+            }
+            
+            success = false
+        case .failure(let error):
+            success = false
+            self.error = NetworkError(request: error)
+        }
+    }
+    
+    func error(for field: JSONField) -> String {
+        var output: [String] = []
+        
+        for key in fieldErrors.keys {
+            
+            if key != "prefix" {
+                if key == "prefix" && field.rawValue == "phone" {
+                    if let string = fieldErrors[key] as? String {
+                        output.append(string)
+                    }
+                    
+                    if let strings = fieldErrors[key] as? [String] {
+                        output.append(contentsOf: strings)
+                    }
+                    
+                } else if key == field.rawValue {
+                    if let string = fieldErrors[key] as? String {
+                        output.append(string)
+                    }
+                    
+                    if let strings = fieldErrors[key] as? [String] {
+                        output.append(contentsOf: strings)
+                    }
+                } else {
+                    print("result.error: key = \(key)")
+                }
+            }            
+        }
+        
+        return output.joined(separator: "\n")
+    }
+}
+
+
diff --git a/TraccarClient/Network+Types.swift b/TraccarClient/Network+Types.swift
new file mode 100644
index 0000000000000000000000000000000000000000..310afb9db41de94748891208ef9df52fd814f991
--- /dev/null
+++ b/TraccarClient/Network+Types.swift
@@ -0,0 +1,20 @@
+//
+//  Network+Types.swift
+//  traccar
+//
+//  Created by iOS Developer on 2/7/22.
+//
+
+import Foundation
+import Alamofire
+
+typealias KV = [JSONField: Any]
+typealias JSON = [String: Any]
+typealias JSONDictionary = [AnyHashable: Any]
+typealias PARAMS = [String: Any]
+typealias ResultClosure = (_ result: NetworkResultModel) -> ()
+typealias Closure = () -> ()
+
+typealias Object = JSON
+typealias Objects = [JSON]
+typealias Strings = [String]
diff --git a/TraccarClient/NetworkManager.swift b/TraccarClient/NetworkManager.swift
index 92e93b10f82326b2e63565c04e4c9628d176d6be..6864c0fb7cc9e8ef8799ec63feef3f2de80380ac 100644
--- a/TraccarClient/NetworkManager.swift
+++ b/TraccarClient/NetworkManager.swift
@@ -49,9 +49,9 @@ class NetworkManager : NSObject {
     }
     
     func start() {
-        /*var context = SCNetworkReachabilityContext(version: 0, info: Unmanaged.passUnretained(self).toOpaque(), retain: nil, release: nil, copyDescription: nil)
+        /*var context = SCNetworkReachabilityContext(version: 0, info: Unmanaged.passUnretained(self).totraccarque(), retain: nil, release: nil, copyDescription: nil)
         SCNetworkReachabilitySetCallback(reachability, { (reachability, flags, pointer) in
-            let networkManager = Unmanaged<NetworkManager>.fromOpaque(pointer!).takeUnretainedValue()
+            let networkManager = Unmanaged<NetworkManager>.fromtraccarque(pointer!).takeUnretainedValue()
             networkManager.delegate?.didUpdateNetwork(online: NetworkManager.online(for: flags))
         }, &context)
         SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)*/
diff --git a/TraccarClient/NetworkRequest.swift b/TraccarClient/NetworkRequest.swift
new file mode 100644
index 0000000000000000000000000000000000000000..a27b489b5f9ae0dcfc831c31654b059ef35239fc
--- /dev/null
+++ b/TraccarClient/NetworkRequest.swift
@@ -0,0 +1,372 @@
+//
+//  NetworkRequest.swift
+//  traccar
+//
+//  Created by George Makhoul on 10/25/23.
+//
+
+import Foundation
+import Alamofire
+import UIKit
+
+let api = NetworkRequest.si
+
+struct RequestOptions {
+    let authorization: Bool
+    let validation: Bool
+}
+
+final class NetworkRequest: NSObject {
+    
+    // MARK: - Properties
+    static let si = NetworkRequest()
+    fileprivate let requestRetryLimit = 3
+    
+    // MARK: - Init
+    override private init() {
+        super.init()
+    }
+    
+    // MARK: - HTTP Headers
+    var headers : HTTPHeaders {
+        var _headers: HTTPHeaders = [:]
+        _headers["Content-Type"] = "application/json"
+        
+//        _headers["Accept-Language"] = lang == .en ? "en" : "ar"
+        _headers["Accept-Language"] = "en"
+        _headers["X-App-Client"] = "ios"
+        
+        return _headers
+    }
+    
+    // MARK: - Endpoint
+    func endpoint(_ endpoint: Endpoint, id: String = "") -> URLConvertible {
+        let fullUrl: String = Endpoint.baseURL + endpoint.rawValue + id
+        
+        do {
+            let regex = try NSRegularExpression(pattern: "( )*$", options: NSRegularExpression.Options.caseInsensitive)
+            let range = NSMakeRange(0, fullUrl.count)
+            return regex.stringByReplacingMatches(in: fullUrl, options: [], range: range, withTemplate: "") as URLConvertible
+        } catch {
+            return fullUrl as URLConvertible
+        }
+    }
+    
+    func stringUrl(_ endpoint: String) -> URLConvertible {
+        let fullUrl: String = Endpoint.baseURL + endpoint
+        
+        do {
+            let regex = try NSRegularExpression(pattern: "( )*$", options: NSRegularExpression.Options.caseInsensitive)
+            let range = NSMakeRange(0, fullUrl.count)
+            return regex.stringByReplacingMatches(in: fullUrl, options: [], range: range, withTemplate: "") as URLConvertible
+        } catch {
+            return fullUrl as URLConvertible
+        }
+    }
+    
+    func completeStringUrl(_ endpoint: String) -> URLConvertible {
+        let fullUrl: String = endpoint
+        
+        do {
+            let regex = try NSRegularExpression(pattern: "( )*$", options: NSRegularExpression.Options.caseInsensitive)
+            let range = NSMakeRange(0, fullUrl.count)
+            return regex.stringByReplacingMatches(in: fullUrl, options: [], range: range, withTemplate: "") as URLConvertible
+        } catch {
+            return fullUrl as URLConvertible
+        }
+    }
+    
+    func getQueryStringParameter(url: String, param: String) -> String? {
+      guard let url = URLComponents(string: url) else { return nil }
+      return url.queryItems?.first(where: { $0.name == param })?.value
+    }
+    
+    func request(endpoint: URLConvertible, method: HTTPMethod, _ completion: @escaping ResultClosure) {
+        
+        if !isConnected {
+            completion(NetworkResultModel(error: NetworkError(.noInternet)))
+            return
+        }
+        
+        var customValidation: [Int] = []
+        customValidation.append(contentsOf: 1...400)
+        customValidation.append(contentsOf: 402...999)
+        
+        AF.request(endpoint,
+                   method: method,
+                   parameters: nil,
+                   encoding: JSONEncoding.default,
+                   headers: headers,
+                   interceptor: self).validate(statusCode: customValidation).responseData { response in
+                    completion(NetworkResultModel(dataResponse: response))
+                   }
+    }
+    
+    func request(endpoint: URLConvertible, method: HTTPMethod, params: Parameters? = nil, _ completion: @escaping ResultClosure) {
+        
+        if !isConnected {
+            completion(NetworkResultModel(error: NetworkError(.noInternet)))
+            return
+        }
+        
+        var customValidation: [Int] = []
+        customValidation.append(contentsOf: 1...400)
+        customValidation.append(contentsOf: 402...999)
+        
+        AF.request(endpoint,
+                   method: method,
+                   parameters: params,
+                   encoding: JSONEncoding.default,
+                   headers: headers,
+                   interceptor: self).validate(statusCode: customValidation).responseData { response in
+                    completion(NetworkResultModel(dataResponse: response))
+                   }
+    }
+    
+    func request(endpoint: URLConvertible, method: HTTPMethod, params: Parameters? = nil, options: RequestOptions? = nil, _ completion: @escaping ResultClosure) {
+        
+        if !isConnected {
+            completion(NetworkResultModel(error: NetworkError(.noInternet)))
+            return
+        }
+        
+        var customValidation: [Int] = []
+        customValidation.append(contentsOf: 1...400)
+        customValidation.append(contentsOf: 402...999)
+        
+        if let options = options {
+            let request = AF.request(endpoint,
+                                     method: method,
+                                     parameters: params,
+                                     encoding: JSONEncoding.default,
+                                     headers: options.authorization ? headers : nil,
+                                     interceptor: self)
+            if options.validation {
+                request.validate(statusCode: customValidation)
+            }
+            request.responseData { response in
+                completion(NetworkResultModel(dataResponse: response))
+            }
+        } else {
+            AF.request(endpoint,
+                       method: method,
+                       parameters: params,
+                       encoding: JSONEncoding.default,
+                       headers: headers,
+                       interceptor: self).responseData { response in
+                        completion(NetworkResultModel(dataResponse: response))
+            }
+        }
+    }
+
+    func requestToUpload(_ imageToUpload: UIImage, endpoint: URLConvertible, params: Parameters? = nil, options: RequestOptions? = nil, _ completion: @escaping ResultClosure){
+        
+        if !isConnected {
+            completion(NetworkResultModel(error: NetworkError(.noInternet)))
+            return
+        }
+        
+            var customValidation: [Int] = []
+            customValidation.append(contentsOf: 1...400)
+        customValidation.append(contentsOf: 402...999)
+        
+        guard let imageData = imageToUpload.jpegData(compressionQuality: 0.50) else { return }
+        
+        let  timeStamp = Int(Date().timeIntervalSince1970 * 1000)
+        
+        if let options = options {
+            let request = AF.upload(multipartFormData: { (multipartFormData) in
+                multipartFormData.append(imageData, withName: "file", fileName: "file\(timeStamp).jpeg", mimeType: "image/jpeg")
+            }, to: endpoint, method: .post , headers: headers)
+            
+            if options.validation {
+                request.validate(statusCode: customValidation)
+            }
+            request.responseData { response in
+                completion(NetworkResultModel(dataResponse: response))
+            }
+        } else {
+            
+            AF.upload(multipartFormData: { (multipartFormData) in
+                multipartFormData.append(imageData, withName: "file", fileName: "file\(timeStamp).jpeg", mimeType: "image/jpeg")
+            }, to: endpoint, method: .post , headers: headers).responseData { response in
+                completion(NetworkResultModel(dataResponse: response))
+            }        
+        }
+    }
+    
+    func requestToUploadVideo(_ videoToUpload: URL, endpoint: URLConvertible, params: Parameters? = nil, options: RequestOptions? = nil, _ completion: @escaping ResultClosure){
+        
+        if !isConnected {
+            completion(NetworkResultModel(error: NetworkError(.noInternet)))
+            return
+        }
+        
+            var customValidation: [Int] = []
+            customValidation.append(contentsOf: 1...400)
+        customValidation.append(contentsOf: 402...999)
+                
+        let  timeStamp = Int(Date().timeIntervalSince1970 * 1000)
+        
+        if let options = options {
+            let request = AF.upload(multipartFormData: { (multipartFormData) in
+                multipartFormData.append(videoToUpload, withName: "file", fileName: "file\(timeStamp).mp4", mimeType: "\(timeStamp)/mp4")
+            }, to: endpoint, method: .post , headers: headers)
+            
+            if options.validation {
+                request.validate(statusCode: customValidation)
+            }
+            request.responseData { response in
+                completion(NetworkResultModel(dataResponse: response))
+            }
+        } else {
+            
+            AF.upload(multipartFormData: { (multipartFormData) in
+                multipartFormData.append(videoToUpload, withName: "file", fileName: "file\(timeStamp).mp4", mimeType: "\(timeStamp)/mp4")
+            }, to: endpoint, method: .post , headers: headers).responseData { response in
+                completion(NetworkResultModel(dataResponse: response))
+            }
+        }
+    }
+    
+    func requestToDownload(downloadURL: String, completion: @escaping (_ isDownloaded: Bool, _ downloadPath: String?) -> Void ){
+        
+        if !isConnected {
+//            completion(NetworkResultModel(error: NetworkError(.noInternet)))
+            return
+        }
+        
+        var customValidation: [Int] = []
+        customValidation.append(contentsOf: 1...400)
+        customValidation.append(contentsOf: 402...999)
+        
+        guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
+            return completion(false, nil)
+        }
+        
+        let destination: DownloadRequest.Destination = { _, _ in
+            let timeStamp = Int(Date().timeIntervalSince1970 * 1000)
+            
+            let fileName = (downloadURL.components(separatedBy: "/").last)?.components(separatedBy: ".")
+            
+            let name = fileName?.first ?? "\(timeStamp)"
+            let format = fileName?.last ?? ""
+            
+            let fileURL = documentsURL.appendingPathComponent("traccar-\(name).\(format)")
+            
+            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
+        }
+        
+        AF.download(downloadURL, to: destination).response { response in
+            
+            if response.error == nil, let filePath = response.fileURL?.path {
+                completion(true, filePath)
+                
+            } else {
+                completion(false, nil)
+            }
+        }
+    }
+}
+
+// MARK: - Helpers
+extension NetworkRequest {
+    
+    // MARK: - Internet Connection
+    var isConnected: Bool {
+        return ReachabilityManager.sharedInstance.isConnectedToNetwork()
+    }
+}
+
+// MARK: - Interceptor
+extension NetworkRequest: RequestInterceptor {
+    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
+        
+        guard let access_token = UserDefaults.standard.string(forKey: Keys.User.access_token), access_token != "" else {
+            
+            guard let guestToken = UserDefaults.standard.string(forKey: Keys.guestToken), guestToken != "" else {
+                
+                completion(.success(urlRequest))
+                return
+            }
+            
+            var request = urlRequest
+            let bearer_token = "Bearer \(guestToken)"
+            request.setValue(bearer_token, forHTTPHeaderField: "Authorization")
+            
+            completion(.success(request))
+            return
+        }
+        
+        var request = urlRequest
+        let bearer_token = "Bearer \(access_token)"
+        request.setValue(bearer_token, forHTTPHeaderField: "Authorization")
+        
+        //log("@NetworkRequest: RequestInterceptor @adapt", "ACCESS_TOKEN", UserDefaults.standard.string(forKey: Keys.User.access_token) as Any, "REFRESH_TOKEN", UserDefaults.standard.string(forKey: Keys.User.refresh_token) as Any)
+        
+        completion(.success(request))
+    }
+    
+    public func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
+        
+        guard let response = request.response else {
+            completion(.doNotRetry)
+            return
+        }
+        
+        let statusCode = response.statusCode
+        
+        switch statusCode {
+        case 200...400:
+            completion(.doNotRetry)
+        case 401:
+            refreshAccessToken { success in
+                if success {
+                    completion(.retry)
+                } else {
+                    completion(.doNotRetry)
+                }
+            }
+        case 402...999:
+            completion(.doNotRetry)
+        default:
+            if request.retryCount < requestRetryLimit {
+                completion(.retry)
+                return
+            }
+        }
+    }
+    
+    func refreshAccessToken(completion: @escaping (_ success: Bool) -> Void) {
+        guard let _ = UserDefaults.standard.string(forKey: Keys.User.refresh_token) else {
+            completion(false)
+            return
+        }
+        
+//        let params = ["refresh_token" : refresh_token]
+//
+//        api.refreshToken(params: params) { result in
+//            if result.success {
+//                if let newAccessToken = result.data as? String {
+//                    UserDefaults.standard.setValue(newAccessToken, forKey: Keys.User.access_token)
+//                    completion(true)
+//                } else {
+//                    completion(false)
+//                }
+//            } else {
+//                guard let error = result.appError else {
+//                    completion(false)
+//                    return
+//                }
+//
+//                if error.type == .invalidRefreshToken {
+//                    app.delegate.presentLoginViewController(with: error.message)
+//                    completion(false)
+//                } else if error.type == .invalidAccessToken {
+//                    completion(false)
+//                }
+//            }
+//        }
+    }
+}
+
diff --git a/TraccarClient/Observable.swift b/TraccarClient/Observable.swift
new file mode 100644
index 0000000000000000000000000000000000000000..89d5f14a3d93d19f1b074dcaedb497632a40201e
--- /dev/null
+++ b/TraccarClient/Observable.swift
@@ -0,0 +1,93 @@
+//
+//  Observable.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+
+final class Observable<T> {
+    typealias ObserverClosure = (T) -> Void
+    
+    private(set) var observers: [ObjectIdentifier: ObserverClosure] = [:]
+    
+    var value: T {
+        didSet {
+            notifyObservers()
+        }
+    }
+    
+    init(_ value: T) {
+        self.value = value
+    }
+    
+    func notifyObservers() {
+        for (_, observer) in observers {
+            observer(value)
+        }
+    }
+    
+    func observe(_ observer: @escaping ObserverClosure) -> Disposable {
+        let uniqueKey: ObjectIdentifier = ObjectIdentifier(self)
+        
+        observers[uniqueKey] = observer
+        
+        return ObserverDisposable(owner: self, key: uniqueKey)
+    }
+    
+    func removeObserver(with key: ObjectIdentifier) {
+        if observers.keys.contains(key) {
+            observers.removeValue(forKey: key)
+            notifyObservers()
+        }
+    }
+}
+
+
+final class ObserverDisposable<T>: Disposable {
+    var key: ObjectIdentifier
+    weak var owner: Observable<T>?
+    
+    init(owner: Observable<T>, key: ObjectIdentifier) {
+        self.owner = owner
+        self.key = key
+    }
+    
+    func dispose() {
+        self.owner?.removeObserver(with: key)
+    }
+}
+
+protocol Disposable {
+    func dispose()
+}
+
+extension Disposable {
+    func disposed(by bag: DisposeBag) {
+        bag.add(self)
+    }
+}
+
+
+final class DisposeBag {
+    var disposables: [Disposable] = []
+    
+    func add(_ disposable: Disposable) {
+        disposables.append(disposable)
+    }
+    
+    func dispose() {
+        disposables.forEach {
+            $0.dispose()
+        }
+    }
+    
+    deinit {
+        dispose()
+    }
+}
+
+
+
diff --git a/TraccarClient/TraccarClient-Info.plist b/TraccarClient/TraccarClient-Info.plist
index 296861d9f5a0ac4d04154ed563f4077d9d035431..b07535fbfe47b6286e64d311cc5511ae6ea555aa 100644
--- a/TraccarClient/TraccarClient-Info.plist
+++ b/TraccarClient/TraccarClient-Info.plist
@@ -87,5 +87,26 @@
 	</array>
 	<key>UIViewControllerBasedStatusBarAppearance</key>
 	<false/>
+	<key>UIAppFonts</key>
+	<array>
+		<string>Montserrat-Black.ttf</string>
+		<string>Montserrat-BlackItalic.ttf</string>
+		<string>Montserrat-Bold.ttf</string>
+		<string>Montserrat-BoldItalic.ttf</string>
+		<string>Montserrat-ExtraBold.ttf</string>
+		<string>Montserrat-ExtraBoldItalic.ttf</string>
+		<string>Montserrat-ExtraLight.ttf</string>
+		<string>Montserrat-ExtraLightItalic.ttf</string>
+		<string>Montserrat-Italic.ttf</string>
+		<string>Montserrat-Light.ttf</string>
+		<string>Montserrat-LightItalic.ttf</string>
+		<string>Montserrat-Medium.ttf</string>
+		<string>Montserrat-MediumItalic.ttf</string>
+		<string>Montserrat-Regular.ttf</string>
+		<string>Montserrat-SemiBold.ttf</string>
+		<string>Montserrat-SemiBoldItalic.ttf</string>
+		<string>Montserrat-Thin.ttf</string>
+		<string>Montserrat-ThinItalic.ttf</string>
+	</array>
 </dict>
 </plist>
diff --git a/TraccarClient/UIFont.swift b/TraccarClient/UIFont.swift
new file mode 100644
index 0000000000000000000000000000000000000000..8b5f48809488b5ad0415b020166a0517ffa8d699
--- /dev/null
+++ b/TraccarClient/UIFont.swift
@@ -0,0 +1,186 @@
+//
+//  UIFont.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+import UIKit
+
+extension UIFont {
+    
+    // MARK: - Font Name
+    enum AppFont {
+        case black
+        case blackItalic
+        case bold
+        case boldItalic
+        case extraBold
+        case extraBoldItalic
+        case extraLight
+        case extraLightItalic
+        case italic
+        case light
+        case lightItalic
+        case medium
+        case mediumItalic
+        case regular
+        case semibold
+        case semiboldItalic
+        case thin
+        case thinitalic
+
+        enum fonts: String {
+            case black = "Montserrat-Black"
+            case blackItalic = "Montserrat-BlackItalic"
+            case bold = "Montserrat-Bold"
+            case boldItalic = "Montserrat-BoldItalic"
+            case extraBold = "Montserrat-ExtraBold"
+            case extraBoldItalic = "Montserrat-ExtraBoldItalic"
+            case extraLight = "Montserrat-ExtraLight"
+            case extraLightItalic = "Montserrat-ExtraLightItalic"
+            case italic = "Montserrat-Italic"
+            case light = "Montserrat-Light"
+            case lightItalic = "Montserrat-LightItalic"
+            case medium = "Montserrat-Medium"
+            case mediumItalic = "Montserrat-MediumItalic"
+            case regular = "Montserrat-Regular"
+            case semibold = "Montserrat-Semibold"
+            case semiboldItalic = "Montserrat-SemiboldItalic"
+            case thin = "Montserrat-Thin"
+            case thinitalic = "Montserrat-ThinItalic"
+        }
+
+        func font() -> String {
+            switch self {
+            case .bold:
+                return fonts.bold.rawValue
+            case .semibold:
+                return fonts.semibold.rawValue
+            case .regular:
+                return fonts.regular.rawValue
+            case .medium:
+                return fonts.medium.rawValue
+            case .light:
+                return fonts.light.rawValue
+            case .black:
+                return fonts.black.rawValue
+            case .blackItalic:
+                return fonts.blackItalic.rawValue
+            case .boldItalic:
+                return fonts.boldItalic.rawValue
+            case .extraBold:
+                return fonts.extraBold.rawValue
+            case .extraBoldItalic:
+                return fonts.extraBoldItalic.rawValue
+            case .extraLight:
+                return fonts.extraLight.rawValue
+            case .extraLightItalic:
+                return fonts.extraLightItalic.rawValue
+            case .italic:
+                return fonts.italic.rawValue
+            case .lightItalic:
+                return fonts.lightItalic.rawValue
+            case .mediumItalic:
+                return fonts.mediumItalic.rawValue
+            case .semiboldItalic:
+                return fonts.semiboldItalic.rawValue
+            case .thin:
+                return fonts.thin.rawValue
+            case .thinitalic:
+                return fonts.thinitalic.rawValue
+            }
+        }
+    }
+}
+
+extension UIFont {
+    
+    // MARK: - Get Font
+    static func getFont(_ name: UIFont.AppFont, size: CGFloat) -> UIFont {
+        return getFont(name: name.font(), size: size)
+    }
+    
+    static func getFont(name: String, size: CGFloat) -> UIFont {
+        if let font = UIFont(name: name, size: size) {
+            return font
+        } else {
+            return UIFont.systemFont(ofSize: size)
+        }
+    }
+    
+    // MARK: - Font Styles
+    class func light(_ size: CGFloat) -> UIFont {
+        getFont(.light, size: size)
+    }
+    
+    class func regular(_ size: CGFloat) -> UIFont {
+        getFont(.regular, size: size)
+    }
+    
+    class func medium(_ size: CGFloat) -> UIFont {
+        getFont(.medium, size: size)
+    }
+    
+    class func semibold(_ size: CGFloat) -> UIFont {
+        getFont(.semibold, size: size)
+    }
+    
+    class func bold(_ size: CGFloat) -> UIFont {
+        getFont(.bold, size: size)
+    }
+    
+    class func black(_ size: CGFloat) -> UIFont {
+        getFont(.black, size: size)
+    }
+    
+    class func blackItalic(_ size: CGFloat) -> UIFont {
+        getFont(.blackItalic, size: size)
+    }
+    
+    class func extraLightItalic(_ size: CGFloat) -> UIFont {
+        getFont(.extraLightItalic, size: size)
+    }
+    
+    class func italic(_ size: CGFloat) -> UIFont {
+        getFont(.italic, size: size)
+    }
+    
+    class func lightItalic(_ size: CGFloat) -> UIFont {
+        getFont(.lightItalic, size: size)
+    }
+    
+    class func mediumItalic(_ size: CGFloat) -> UIFont {
+        getFont(.mediumItalic, size: size)
+    }
+    
+    class func semiboldItalic(_ size: CGFloat) -> UIFont {
+        getFont(.semiboldItalic, size: size)
+    }
+    
+    class func thin(_ size: CGFloat) -> UIFont {
+        getFont(.thin, size: size)
+    }
+    
+    class func thinitalic(_ size: CGFloat) -> UIFont {
+        getFont(.thinitalic, size: size)
+    }
+    
+    class func boldItalic(_ size: CGFloat) -> UIFont {
+        getFont(.boldItalic, size: size)
+    }
+    
+    class func extraBold(_ size: CGFloat) -> UIFont {
+        getFont(.extraBold, size: size)
+    }
+    
+    class func extraBoldItalic(_ size: CGFloat) -> UIFont {
+        getFont(.extraBoldItalic, size: size)
+    }
+    
+    class func extraLight(_ size: CGFloat) -> UIFont {
+        getFont(.extraLight, size: size)
+    }
+}
diff --git a/TraccarClient/UIInt.swift b/TraccarClient/UIInt.swift
new file mode 100644
index 0000000000000000000000000000000000000000..7c3da3b7ad20ecdfc4b0bdce0acb441eefef3101
--- /dev/null
+++ b/TraccarClient/UIInt.swift
@@ -0,0 +1,37 @@
+//
+//  UIInt.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+
+extension Int {
+    
+    // MARK: - API Status Code
+    var isOk: Bool {
+        let okCodes = [
+            200, 201, 204
+        ]
+        
+        return okCodes.contains(self)
+    }
+    
+    var isError: Bool {
+        let errorCodes = [
+            400, 401, 403, 404
+        ]
+        
+        return errorCodes.contains(self)
+    }
+    
+    var isCritical: Bool {
+        let criticalCodes = [
+            500
+        ]
+        
+        return criticalCodes.contains(self)
+    }
+}
diff --git a/TraccarClient/UILabel.swift b/TraccarClient/UILabel.swift
new file mode 100644
index 0000000000000000000000000000000000000000..2e624c8ad090582114ffc771c08150828cd57460
--- /dev/null
+++ b/TraccarClient/UILabel.swift
@@ -0,0 +1,160 @@
+//
+//  UILabel.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import UIKit
+
+extension UILabel {
+    // MARK: - Set Text, Color, Font
+    func set(text: String) {
+        self.text = text
+        alignment()
+    }
+    
+    func set(color: UIColor) {
+        textColor = color
+    }
+    
+    func set(font: UIFont) {
+        self.font = font
+    }
+    
+    func set(text: String, color: UIColor, font: UIFont) {
+        set(text: text)
+        set(color: color)
+        set(font: font)
+    }
+    
+    func set(uppercased: String) {
+        text = uppercased.uppercased()
+        alignment()
+    }
+    
+    func set(uppercased: String, color: UIColor, font: UIFont) {
+        set(uppercased: uppercased)
+        set(font: font)
+        set(color: color)
+    }
+    
+    // MARK: - Localization
+    func set(localized: String) {
+        text = localized
+        alignment()
+    }
+    
+    func set(localizedUppercased: String) {
+        text = localizedUppercased.uppercased()
+        alignment()
+    }
+    
+    func set(localized: String, color: UIColor, font: UIFont) {
+        set(localized: localized)
+        set(font: font)
+        set(color: color)
+    }
+    
+    func set(localizedUppercased: String, color: UIColor, font: UIFont) {
+        set(localizedUppercased: localizedUppercased)
+        set(font: font)
+        set(color: color)
+    }
+    
+    // MARK: - Alignment
+    func alignment() {
+        textAlignment = .left
+    }
+    
+    func align(to alignment: NSTextAlignment) {
+        textAlignment = alignment
+    }
+}
+
+// MARK: - Helpers
+extension UILabel {
+    var maxNumberOfLines: Int {
+        let maxSize = CGSize(width: frame.size.width, height: CGFloat(MAXFLOAT))
+        let text = (self.text ?? "") as NSString
+        let lineHeight = ceil(font.lineHeight)
+        let textHeight = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [.font: font as UIFont], context: nil).height
+        
+        return Int(ceil(textHeight / lineHeight))
+    }
+    func countLines() -> Int {
+        guard let myText = self.text as NSString? else {
+            return 0
+        }
+        self.layoutIfNeeded()
+        let rect = CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude)
+        let labelSize = myText.boundingRect(with: rect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: self.font as Any], context: nil)
+        return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
+    }
+    
+    var labelTextHeight: CGFloat {
+        if text?.isEmpty ?? false{
+            return 0.0
+        }
+        let labelTextSize = ((text ?? "") as NSString).boundingRect(
+            with: CGSize(width: frame.size.width, height: .greatestFiniteMagnitude),
+            options: .usesLineFragmentOrigin,
+            attributes: [.font: font!],
+            context: nil).size
+        
+        return labelTextSize.height
+    }
+    
+}
+
+extension UITapGestureRecognizer {
+
+    func didTapAttributedTextInLabel(label: UILabel, inRange targetRange: NSRange) -> Bool {
+        // Create instances of NSLayoutManager, NSTextContainer and NSTextStorage
+        let layoutManager = NSLayoutManager()
+        let textContainer = NSTextContainer(size: CGSize.zero)
+        let textStorage = NSTextStorage(attributedString: label.attributedText!)
+
+        // Configure layoutManager and textStorage
+        layoutManager.addTextContainer(textContainer)
+        textStorage.addLayoutManager(layoutManager)
+
+        // Configure textContainer
+        textContainer.lineFragmentPadding = 0.0
+        textContainer.lineBreakMode = label.lineBreakMode
+        textContainer.maximumNumberOfLines = label.numberOfLines
+        let labelSize = label.bounds.size
+        textContainer.size = labelSize
+
+        // Find the tapped character location and compare it to the specified range
+        let locationOfTouchInLabel = self.location(in: label)
+        let textBoundingBox = layoutManager.usedRect(for: textContainer)
+        //let textContainerOffset = CGPointMake((labelSize.width - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x,
+        //(labelSize.height - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y);
+        let textContainerOffset = CGPoint(x: (labelSize.width - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x, y: (labelSize.height - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y)
+
+        //let locationOfTouchInTextContainer = CGPointMake(locationOfTouchInLabel.x - textContainerOffset.x,
+        // locationOfTouchInLabel.y - textContainerOffset.y);
+        let locationOfTouchInTextContainer = CGPoint(x: locationOfTouchInLabel.x - textContainerOffset.x, y: locationOfTouchInLabel.y - textContainerOffset.y)
+        let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
+        return NSLocationInRange(indexOfCharacter, targetRange)
+    }
+}
+
+extension NSMutableAttributedString {
+
+    convenience init?(withLocalizedHTMLString: String) {
+
+        guard let stringData = withLocalizedHTMLString.data(using: String.Encoding.utf8) else {
+            return nil
+        }
+
+        let options: [NSMutableAttributedString.DocumentReadingOptionKey: Any] = [
+            NSMutableAttributedString.DocumentReadingOptionKey.documentType: NSMutableAttributedString.DocumentType.html as Any,
+            NSMutableAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue
+        ]
+
+        try? self.init(data: stringData, options: options, documentAttributes: nil)
+    }
+}
diff --git a/TraccarClient/UIString.swift b/TraccarClient/UIString.swift
new file mode 100644
index 0000000000000000000000000000000000000000..f6bb0227bb39dc2ef04c3c8715cdc6704aaf723d
--- /dev/null
+++ b/TraccarClient/UIString.swift
@@ -0,0 +1,33 @@
+//
+//  UIString.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import Foundation
+
+extension String {
+    
+    struct API {
+        static let error = "Error"
+        static let baseError = "Something went wrong. Please try again later!"
+        static let somethingWentWrong = "Something went wrong."
+        static let noInternetConnection = "No internet connection!"
+        static let serverIsNotResponding = "Server is not responding!"
+    }
+    
+    // MARK: - toChar
+    func toChar() -> Character {
+        Character(self)
+    }
+    
+    // MARK: - Validate E-Mail
+    var isValidEmail: Bool {
+        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
+        
+        let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
+        return emailPredicate.evaluate(with: self)
+    }
+}
diff --git a/TraccarClient/UIView.swift b/TraccarClient/UIView.swift
new file mode 100644
index 0000000000000000000000000000000000000000..721d0e85151e284d5f0fc3a9788197014e312cf1
--- /dev/null
+++ b/TraccarClient/UIView.swift
@@ -0,0 +1,170 @@
+//
+//  UIView.swift
+//  TraccarClient
+//
+//  Created by George Makhoul on 25/10/2023.
+//  Copyright © 2023 Traccar. All rights reserved.
+//
+
+import UIKit
+
+extension UIView: Nameable {}
+
+extension UIView {
+    
+    func show(_ show: Bool = true) {
+        isHidden = !show
+    }
+    
+    func hide() {
+        isHidden = true
+    }
+    
+    // MARK: - Drop Shadow
+    func addShadow(corner: CGFloat = 0, color: UIColor, radius: CGFloat, opacity: Float, offset: CGSize) {
+        addCorners(corner)
+        layer.masksToBounds = false
+        layer.shadowColor = color.cgColor
+        layer.shadowOpacity = opacity
+        layer.shadowOffset = offset
+        layer.shadowRadius = radius
+    }
+    
+    // MARK: - Round Corners
+    func circle() {
+        layer.cornerRadius = frame.width / 2
+        clipsToBounds = true
+    }
+    
+    func addCorners(_ radius: CGFloat) {
+        layer.cornerRadius = radius
+        clipsToBounds = true
+    }
+    
+    func addCorners(corners: CACornerMask, radius: CGFloat) {
+        clipsToBounds = true
+        layer.cornerRadius = radius
+        layer.maskedCorners = corners
+    }
+    
+    // MARK: - Border
+    func addBorder(radius: CGFloat, width: CGFloat, color: UIColor) {
+        layer.cornerRadius = radius
+        layer.borderWidth = width
+        layer.borderColor = color.cgColor
+        clipsToBounds = true
+    }
+    
+    // MARK: - Rotate
+    func rotate(from value: CGFloat, toValue: CGFloat, duration: CFTimeInterval = 0.2) {
+        let animation = CABasicAnimation(keyPath: "transform.rotation")
+        
+        animation.fromValue = value
+        animation.toValue = toValue
+        animation.duration = duration
+        animation.isRemovedOnCompletion = false
+        animation.fillMode = CAMediaTimingFillMode.forwards
+        
+        layer.add(animation, forKey: nil)
+    }
+    
+    // MARK: - Animation
+    func show(with option: AnimationOptions, duration: TimeInterval, _ completion: @escaping () -> ()) {
+        UIView.transition(with: self, duration: duration,
+                   options: option,
+                   animations: {
+                    self.show()
+                    completion()
+                   })
+    }
+    
+    func hide(with option: AnimationOptions, duration: TimeInterval, _ completion: @escaping () -> ()) {
+        UIView.transition(with: self, duration: duration,
+                   options: option,
+                   animations: {
+                    self.hide()
+                    completion()
+                   })
+    }
+    
+    //MARK: - Add Gradient Color
+    
+    func addBorderGradient(startColor:UIColor, endColor: UIColor, lineWidth: CGFloat, startPoint: CGPoint, endPoint: CGPoint) {
+        //This will make view border circular
+        layer.cornerRadius = bounds.size.height / 2.0
+        //This will hide the part outside of border, so that it would look like circle
+        clipsToBounds = true
+        //Create object of CAGradientLayer
+        let gradient = CAGradientLayer()
+        //Assign origin and size of gradient so that it will fit exactly over circular view
+        gradient.frame = bounds
+        //Pass the gredient colors list to gradient object
+        gradient.colors = [startColor.cgColor, endColor.cgColor]
+        //Point from where gradient should start
+        gradient.startPoint = startPoint
+        //Point where gradient should end
+        gradient.endPoint = endPoint
+        //Now we have to create a circular shape so that it can be added to view’s layer
+        let shape = CAShapeLayer()
+        //Width of circular line
+        shape.lineWidth = lineWidth
+        //Create circle with center same as of center of view, with radius equal to half height of view, startAngle is the angle from where circle should start, endAngle is the angle where circular path should end
+        shape.path = UIBezierPath(
+            arcCenter: CGPoint(x: bounds.height/2,
+                               y: bounds.height/2),
+            radius: bounds.height/2,
+            startAngle: CGFloat(0),
+            endAngle:CGFloat(CGFloat.pi * 2),
+            clockwise: true).cgPath
+        //the color to fill the path’s stroked outline
+        shape.strokeColor = UIColor.black.cgColor
+        //The color to fill the path
+        shape.fillColor = UIColor.clear.cgColor
+        //Apply shape to gradient layer, this will create gradient with circular border
+        gradient.mask = shape
+        //Finally add the gradient layer to out View
+        layer.addSublayer(gradient)
+    }
+    
+    // MARK: - Draw Dotted Line
+    
+    func drawDottedLine(color: UIColor, dash: NSNumber, gap: NSNumber) {
+        let shapeLayer = CAShapeLayer()
+        shapeLayer.strokeColor = color.cgColor
+        shapeLayer.lineWidth = 1
+        shapeLayer.lineDashPattern = [dash, gap]
+
+        let path = CGMutablePath()
+        path.addLines(between: [CGPoint(x: bounds.minX, y: bounds.minY), CGPoint(x: bounds.maxX, y: bounds.minY)])
+        shapeLayer.path = path
+        layer.addSublayer(shapeLayer)
+    }
+    
+    // MARK: - Show/Hide No Data Found Label
+    
+    func showNoDataFound(_ text: String) {
+        var noDataLabel = UILabel()
+        noDataLabel = UILabel(frame: CGRect(x: 0, y: center.y - 100, width: UIScreen.main.bounds.width, height: 150))
+//        noDataLabel.set(localized: text, color: .black, font: .semibold(18))
+//        noDataLabel.align(to: .center)
+        noDataLabel.numberOfLines = 0
+        noDataLabel.tag = 999
+        
+        if viewWithTag(999) == nil {
+            addSubview(noDataLabel)
+        }
+    }
+    
+    func hideNoDataFound() {
+        if let viewWithTag = viewWithTag(999) {
+            viewWithTag.removeFromSuperview()
+        }
+    }
+    
+    //MARK: - Load Nib
+    
+    class func fromNib<T: UIView>() -> T {
+        return Bundle(for: T.self).loadNibNamed(String(describing: T.self), owner: nil, options: nil)![0] as! T
+    }
+}
+