[
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [kirualex]\ncustom: ['https://www.paypal.me/alexiscreuzot']\n"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xccheckout\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n.DS_Store\n"
  },
  {
    "path": ".swift-version",
    "content": "5.4\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: swift\nosx_image: xcode10\n\nbranches:\n only:\n - master\n\nscript:\n - xcodebuild build -project KAPinField.xcodeproj -scheme KAPinField -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone X,OS=12' | xcpretty\n"
  },
  {
    "path": "KAPinField/Example/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  KAPinCode\n//\n//  Created by Alexis Creuzot on 15/10/2018.\n//  Copyright © 2018 alexiscreuzot. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        return true\n    }\n\n}\n\n"
  },
  {
    "path": "KAPinField/Example/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "KAPinField/Example/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "KAPinField/Example/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14313.18\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14283.14\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <textField opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" text=\"KAPinField\" textAlignment=\"center\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qkF-b8-Iix\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"233.5\" width=\"375\" height=\"50\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"50\" id=\"YgO-D9-lom\"/>\n                                </constraints>\n                                <color key=\"textColor\" red=\"0.93725490199999995\" green=\"0.93725490199999995\" blue=\"0.95686274510000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"30\"/>\n                                <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" keyboardType=\"numberPad\" textContentType=\"one-time-code\"/>\n                            </textField>\n                            <button opaque=\"NO\" alpha=\"0.29999999999999999\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fJq-4G-zMg\">\n                                <rect key=\"frame\" x=\"140\" y=\"323.5\" width=\"95\" height=\"40\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"0.14506635270000001\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                <inset key=\"contentEdgeInsets\" minX=\"10\" minY=\"10\" maxX=\"10\" maxY=\"10\"/>\n                                <state key=\"normal\" title=\"Refresh ↻\"/>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.094117647060000004\" green=\"0.5450980392\" blue=\"0.96078431369999995\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"fJq-4G-zMg\" firstAttribute=\"top\" secondItem=\"qkF-b8-Iix\" secondAttribute=\"bottom\" constant=\"40\" id=\"Coz-RY-dac\"/>\n                            <constraint firstItem=\"fJq-4G-zMg\" firstAttribute=\"centerY\" secondItem=\"6Tk-OE-BBY\" secondAttribute=\"centerY\" id=\"L6C-vl-0Al\"/>\n                            <constraint firstItem=\"qkF-b8-Iix\" firstAttribute=\"centerX\" secondItem=\"6Tk-OE-BBY\" secondAttribute=\"centerX\" id=\"PDL-pK-Rme\"/>\n                            <constraint firstItem=\"qkF-b8-Iix\" firstAttribute=\"width\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"width\" id=\"hcw-WT-swN\"/>\n                            <constraint firstItem=\"fJq-4G-zMg\" firstAttribute=\"centerX\" secondItem=\"qkF-b8-Iix\" secondAttribute=\"centerX\" id=\"vLW-qI-AWA\"/>\n                        </constraints>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "KAPinField/Example/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"21507\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"retina4_0\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"21505\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"KAPinField\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"u2o-qm-AuS\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"95\"/>\n                                <subviews>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"inm-x7-8p7\">\n                                        <rect key=\"frame\" x=\"83.5\" y=\"40\" width=\"153\" height=\"31\"/>\n                                        <subviews>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"1000\" verticalHuggingPriority=\"1000\" horizontalCompressionResistancePriority=\"1000\" verticalCompressionResistancePriority=\"1000\" text=\"Secure entry\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pkg-a2-BMf\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"5\" width=\"98\" height=\"21\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SFt-BM-ZkA\">\n                                                <rect key=\"frame\" x=\"106\" y=\"0.0\" width=\"51\" height=\"31\"/>\n                                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                <color key=\"tintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                <color key=\"onTintColor\" red=\"0.094117647060000004\" green=\"0.5450980392\" blue=\"0.96078431369999995\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                <color key=\"thumbTintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                                <connections>\n                                                    <action selector=\"toggleSecure\" destination=\"BYZ-38-t0r\" eventType=\"valueChanged\" id=\"ptC-yn-G11\"/>\n                                                </connections>\n                                            </switch>\n                                        </subviews>\n                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"31\" id=\"0Vq-Td-mfx\"/>\n                                            <constraint firstItem=\"SFt-BM-ZkA\" firstAttribute=\"top\" secondItem=\"inm-x7-8p7\" secondAttribute=\"top\" id=\"99g-J2-SLZ\"/>\n                                            <constraint firstAttribute=\"trailing\" secondItem=\"SFt-BM-ZkA\" secondAttribute=\"trailing\" constant=\"-2\" id=\"Ghh-f8-aoD\"/>\n                                            <constraint firstItem=\"pkg-a2-BMf\" firstAttribute=\"leading\" secondItem=\"inm-x7-8p7\" secondAttribute=\"leading\" id=\"cpV-H8-fHf\"/>\n                                            <constraint firstAttribute=\"bottom\" secondItem=\"SFt-BM-ZkA\" secondAttribute=\"bottom\" id=\"fd2-2u-ivP\"/>\n                                            <constraint firstItem=\"pkg-a2-BMf\" firstAttribute=\"centerY\" secondItem=\"inm-x7-8p7\" secondAttribute=\"centerY\" id=\"tLS-Ub-ZNf\"/>\n                                            <constraint firstItem=\"SFt-BM-ZkA\" firstAttribute=\"leading\" secondItem=\"pkg-a2-BMf\" secondAttribute=\"trailing\" constant=\"8\" id=\"z8s-4u-VDZ\"/>\n                                        </constraints>\n                                    </view>\n                                </subviews>\n                                <viewLayoutGuide key=\"safeArea\" id=\"4wk-QL-KCj\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"bottomMargin\" secondItem=\"inm-x7-8p7\" secondAttribute=\"bottom\" constant=\"16\" id=\"1aP-Ys-tyt\"/>\n                                    <constraint firstItem=\"inm-x7-8p7\" firstAttribute=\"top\" secondItem=\"4wk-QL-KCj\" secondAttribute=\"top\" constant=\"40\" id=\"eeH-0k-P4d\"/>\n                                    <constraint firstItem=\"inm-x7-8p7\" firstAttribute=\"centerX\" secondItem=\"4wk-QL-KCj\" secondAttribute=\"centerX\" id=\"gdi-hQ-kq3\"/>\n                                </constraints>\n                            </view>\n                            <label opaque=\"NO\" alpha=\"0.5\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" verticalCompressionResistancePriority=\"1000\" text=\"Code : 1234\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ee6-G1-KAi\">\n                                <rect key=\"frame\" x=\"121\" y=\"145\" width=\"78\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"xM1-qL-uy3\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZrA-JK-GPg\" userLabel=\"embedViewTest\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"182\" width=\"320\" height=\"50\"/>\n                                <subviews>\n                                    <textField opaque=\"NO\" contentMode=\"scaleToFill\" horizontalCompressionResistancePriority=\"250\" verticalCompressionResistancePriority=\"250\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" text=\"KAPinField\" textAlignment=\"center\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"d8l-Ws-A8U\" customClass=\"KAPinField\" customModule=\"KAPinField\" customModuleProvider=\"target\">\n                                        <rect key=\"frame\" x=\"18\" y=\"0.0\" width=\"284\" height=\"50\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"50\" id=\"yDT-nY-Afy\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"30\"/>\n                                        <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" keyboardType=\"numberPad\" keyboardAppearance=\"alert\" returnKeyType=\"go\" textContentType=\"one-time-code\"/>\n                                    </textField>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                <constraints>\n                                    <constraint firstItem=\"d8l-Ws-A8U\" firstAttribute=\"height\" secondItem=\"ZrA-JK-GPg\" secondAttribute=\"height\" id=\"Af7-la-H6n\"/>\n                                    <constraint firstItem=\"d8l-Ws-A8U\" firstAttribute=\"width\" secondItem=\"ZrA-JK-GPg\" secondAttribute=\"width\" multiplier=\"2:3\" constant=\"71\" id=\"W43-aS-BYW\"/>\n                                    <constraint firstItem=\"d8l-Ws-A8U\" firstAttribute=\"centerY\" secondItem=\"ZrA-JK-GPg\" secondAttribute=\"centerY\" id=\"Y3y-Ml-fIE\"/>\n                                    <constraint firstItem=\"d8l-Ws-A8U\" firstAttribute=\"centerX\" secondItem=\"ZrA-JK-GPg\" secondAttribute=\"centerX\" id=\"zhr-Ur-ONO\"/>\n                                </constraints>\n                            </view>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"deI-wI-pgE\">\n                                <rect key=\"frame\" x=\"92\" y=\"264\" width=\"136\" height=\"40\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"o02-23-GNN\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                <inset key=\"contentEdgeInsets\" minX=\"10\" minY=\"10\" maxX=\"10\" maxY=\"10\"/>\n                                <state key=\"normal\" title=\"Refresh Code ↻\">\n                                    <color key=\"titleColor\" systemColor=\"systemBlueColor\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"setupPinfield\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"q70-6w-eig\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"aDb-oH-ANJ\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"deI-wI-pgE\" firstAttribute=\"top\" secondItem=\"ZrA-JK-GPg\" secondAttribute=\"bottom\" constant=\"32\" id=\"7CR-QR-oP5\"/>\n                            <constraint firstItem=\"deI-wI-pgE\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"8PS-0h-axA\"/>\n                            <constraint firstItem=\"Ee6-G1-KAi\" firstAttribute=\"centerX\" secondItem=\"aDb-oH-ANJ\" secondAttribute=\"centerX\" id=\"8wt-lz-a2B\"/>\n                            <constraint firstItem=\"aDb-oH-ANJ\" firstAttribute=\"top\" secondItem=\"u2o-qm-AuS\" secondAttribute=\"top\" id=\"9ha-nD-VAo\"/>\n                            <constraint firstItem=\"ZrA-JK-GPg\" firstAttribute=\"width\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"width\" id=\"BpT-uC-Rgm\"/>\n                            <constraint firstItem=\"ZrA-JK-GPg\" firstAttribute=\"centerX\" secondItem=\"aDb-oH-ANJ\" secondAttribute=\"centerX\" id=\"FZP-4I-B0A\"/>\n                            <constraint firstItem=\"u2o-qm-AuS\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" id=\"Ndg-Hs-4mw\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"u2o-qm-AuS\" secondAttribute=\"trailing\" id=\"S0N-eT-0wG\"/>\n                            <constraint firstItem=\"ZrA-JK-GPg\" firstAttribute=\"top\" secondItem=\"Ee6-G1-KAi\" secondAttribute=\"bottom\" constant=\"20\" id=\"in4-IT-LYe\"/>\n                            <constraint firstItem=\"Ee6-G1-KAi\" firstAttribute=\"top\" relation=\"greaterThanOrEqual\" secondItem=\"u2o-qm-AuS\" secondAttribute=\"bottom\" constant=\"16\" id=\"p0N-xu-6Zl\"/>\n                            <constraint firstItem=\"Ee6-G1-KAi\" firstAttribute=\"top\" secondItem=\"u2o-qm-AuS\" secondAttribute=\"bottom\" priority=\"250\" constant=\"40\" id=\"sdr-hB-WxV\"/>\n                            <constraint firstItem=\"deI-wI-pgE\" firstAttribute=\"centerY\" secondItem=\"aDb-oH-ANJ\" secondAttribute=\"centerY\" priority=\"751\" id=\"wMO-13-RHJ\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"pinField\" destination=\"d8l-Ws-A8U\" id=\"Hgh-qB-l0c\"/>\n                        <outlet property=\"refreshButton\" destination=\"deI-wI-pgE\" id=\"lOe-N8-CAg\"/>\n                        <outlet property=\"secureLabel\" destination=\"pkg-a2-BMf\" id=\"4tP-wM-q2f\"/>\n                        <outlet property=\"secureSwitch\" destination=\"SFt-BM-ZkA\" id=\"CsQ-xS-7aZ\"/>\n                        <outlet property=\"targetCodeLabel\" destination=\"Ee6-G1-KAi\" id=\"1WI-Bj-zMW\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-42\" y=\"113\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <systemColor name=\"systemBlueColor\">\n            <color red=\"0.0\" green=\"0.47843137254901963\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "KAPinField/Example/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarStyle</key>\n\t<string>UIStatusBarStyleLightContent</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "KAPinField/Example/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  KAPinCode\n//\n//  Created by Alexis Creuzot on 15/10/2018.\n//  Copyright © 2018 alexiscreuzot. All rights reserved.\n//\n\nimport UIKit\n\nclass ViewController: UIViewController {\n    \n    @IBOutlet var secureSwitch: UISwitch!\n    @IBOutlet var secureLabel: UILabel!\n    @IBOutlet var targetCodeLabel: UILabel!\n    @IBOutlet var pinField: KAPinField!\n    @IBOutlet var refreshButton: UIButton!\n    \n    @IBOutlet var keyboardheightConstraint: NSLayoutConstraint!\n    \n    private var targetCode = \"\"\n    \n    override var preferredStatusBarStyle: UIStatusBarStyle {\n        return .lightContent\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // -- Properties --\n        self.setupPinfield()\n        \n        // Get focus\n        pinField.becomeFirstResponder()\n    }\n    \n    \n    func randomCode(numDigits: Int) -> String {\n        var string = \"\"\n        for _ in 0..<numDigits {\n            string += String(Int.random(in: 0...9))\n        }\n        return string\n    }\n    \n    @IBAction func setupPinfield() {\n        \n        // Random numberOfCharacters\n        pinField.text = \"\"\n        \n        pinField.updateProperties { properties in\n            properties.numberOfCharacters = [4,5].randomElement()!\n            properties.delegate = self\n        }\n        \n        // Random target code\n        targetCode = self.randomCode(numDigits: pinField.properties.numberOfCharacters)\n        targetCodeLabel.text = \"Code : \\(targetCode)\"\n        UIPasteboard.general.string = targetCode\n        \n        self.refresh()\n    }\n    \n    @IBAction func toggleSecure() {\n        self.refresh()\n        self.pinField.becomeFirstResponder()\n    }\n    \n    func refresh() {\n                \n        self.targetCodeLabel.textColor = UIColor.label.withAlphaComponent(0.8)\n        \n        pinField.updateProperties { properties in\n            properties.isSecure = self.secureSwitch.isOn\n            properties.token = \"•\"\n            properties.animateFocus = false\n            properties.isUppercased = false\n            properties.validCharacters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\"\n        }\n        \n        pinField.updateAppearence { appearance in\n            appearance.tokenColor = UIColor.clear\n            appearance.tokenFocusColor = UIColor.clear\n            appearance.textColor = UIColor.label\n            appearance.font = .menlo(40)\n            appearance.kerning = 24\n            appearance.backOffset = 8\n            appearance.backColor = UIColor.clear\n            appearance.backBorderWidth = 1\n            appearance.backBorderColor = UIColor.label.withAlphaComponent(0.2)\n            appearance.backCornerRadius = 4\n            appearance.backFocusColor = UIColor.clear\n            appearance.backBorderFocusColor = UIColor.systemBlue\n            appearance.backActiveColor = UIColor.clear\n            appearance.backBorderActiveColor = UIColor.label\n            appearance.backRounded = false\n        }\n    }\n}\n\n// Mark: - KAPinFieldDelegate\nextension ViewController : KAPinFieldDelegate {\n    func pinField(_ field: KAPinField, didChangeTo string: String, isValid: Bool) {\n        if isValid {\n            print(\"Valid input: \\(string) \")\n        } else {\n            print(\"Invalid input: \\(string) \")\n            self.pinField.animateFailure()\n        }\n    }\n    \n    func pinField(_ field: KAPinField, didFinishWith code: String) {\n        print(\"didFinishWith : \\(code)\")\n        \n        // Randomly show success or failure\n        if code != targetCode {\n            print(\"Failure\")\n            field.animateFailure()\n        } else {\n            print(\"Success\")\n            field.animateSuccess(with: \"👍\") {\n                self.setupPinfield()\n            }\n            \n        }\n    }\n}\n\n"
  },
  {
    "path": "KAPinField/Sources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "KAPinField/Sources/KAPinField.h",
    "content": "//\n//  KAPinField.h\n//  KAPinField\n//\n//  Created by Basem Emara on 2019-04-16.\n//  Copyright © 2019 alexiscreuzot. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for KAPinField.\nFOUNDATION_EXPORT double KAPinFieldVersionNumber;\n\n//! Project version string for KAPinField.\nFOUNDATION_EXPORT const unsigned char KAPinFieldVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <KAPinField/PublicHeader.h>\n\n\n"
  },
  {
    "path": "KAPinField/Sources/KAPinField.swift",
    "content": "//\n//  KAPinField.swift\n//  KAPinCode\n//\n//  Created by Alexis Creuzot on 15/10/2018.\n//  Copyright © 2018 alexiscreuzot. All rights reserved.\n//\n\nimport UIKit\n\n// Mark: - KAPinFieldDelegate\npublic protocol KAPinFieldDelegate : AnyObject {\n    func pinField(_ field: KAPinField, didChangeTo string: String, isValid: Bool) // Optional\n    func pinField(_ field: KAPinField, didFinishWith code: String)\n}\n\npublic extension KAPinFieldDelegate {\n    func pinField(_ field: KAPinField, didChangeTo string: String, isValid: Bool) {}\n}\n\npublic struct KAPinFieldProperties {\n    public weak var delegate : KAPinFieldDelegate? = nil\n    public var numberOfCharacters: Int = 4 {\n        didSet {\n            precondition(numberOfCharacters >= 0, \"🚫 Number of character must be >= 0, with 0 meaning dynamic\")\n        }\n    }\n    public var validCharacters: String = \"0123456789\" {\n        didSet {\n            precondition(validCharacters.count > 0, \"🚫 There must be at least 1 valid character\")\n            precondition(!validCharacters.contains(token), \"🚫 Valid characters can't contain token \\\"\\(token)\\\"\")\n        }\n    }\n    public var token: Character = \"•\" {\n        didSet {\n            precondition(!validCharacters.contains(token), \"🚫 token can't be one of the valid characters \\\"\\(token)\\\"\")\n            precondition(!token.isWhitespace, \"🚫 token can't be a whitespace. Please use a token with a clear color to achieve the same effect\")\n        }\n    }\n    public var animateFocus : Bool = true\n    public var isSecure : Bool = false\n    public var secureToken: Character = \"•\"\n    public var isUppercased: Bool = false\n    public var keyboardType: UIKeyboardType = .numberPad\n}\n\npublic struct KAPinFieldAppearance {\n    \n    public init() {}\n    \n    public var font : KA_MonospacedFont? = .menlo(40)\n    public var tokenColor : UIColor = .black\n    public var tokenFocusColor : UIColor = .gray\n    public var textColor : UIColor = .black\n    public var kerning : CGFloat = 20.0\n    public var backColor : UIColor = UIColor.clear\n    public var backBorderColor : UIColor = UIColor.clear\n    public var backBorderWidth : CGFloat = 1\n    public var backCornerRadius : CGFloat = 4\n    public var backOffset : CGFloat = 4\n    public var backFocusColor : UIColor = .clear\n    public var backBorderFocusColor : UIColor = .black\n    public var backActiveColor : UIColor = .clear\n    public var backBorderActiveColor : UIColor = .black\n    public var backRounded : Bool = false\n}\n\n// Mark: - KAPinField Class\npublic class KAPinField : UITextField {\n    \n    public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        super.traitCollectionDidChange(previousTraitCollection)\n        self.reload()\n    }\n    \n    // Mark: - Public vars\n    private (set) var properties = KAPinFieldProperties() {\n        didSet {\n            self.reload()\n        }\n    }\n    private (set) var appearance = KAPinFieldAppearance() {\n        didSet {\n            self.reloadAppearance()\n        }\n    }\n    \n    public func updateProperties(block : ((inout KAPinFieldProperties) -> ())) {\n        var properties = self.properties\n        block(&properties)\n        self.properties = properties\n    }\n    \n    public func updateAppearence(block : ((inout KAPinFieldAppearance) -> ())) {\n        var appearance = self.appearance\n        block(&appearance)\n        self.appearance = appearance\n    }\n    \n    // Mark: - Overriden vars\n    public override var text : String? {\n        get { return invisibleText }\n        set {\n            self.invisibleField.text = newValue\n        }\n    }\n    \n    public override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {\n        return action == #selector(paste(_:)) // Only allow pasting\n    }\n    \n    // Mark: - Private vars\n    \n    private var isRightToLeft : Bool {\n        return UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft\n    }\n    \n    // Uses an invisible UITextField to handle text\n    // this is necessary for iOS12 .oneTimePassword feature\n    // Remove textField.inputView = UIView() to fix issue with keyboard\n    private var invisibleField: UITextField = {\n        let textField = UITextField()\n        return textField\n    }()\n    private var invisibleText : String {\n        get {\n            return invisibleField.text ?? \"\"\n        }\n        set {\n            self.reloadAppearance()\n        }\n    }\n    \n    private var attributes: [NSAttributedString.Key : Any] = [:]\n    private var backViews: [UIView] = [UIView]()\n    private var isAnimating: Bool = false\n    private var lastEntry: String = \"\"\n    private var timer : Timer?\n    private var currentFocusRange : NSRange?\n    private var previousCode : String?\n    private var isDynamicLength = false\n    private var toolbar : UIToolbar?\n    \n    // Mark: - UIKeyInput\n    public override func insertText(_ text: String) {\n        self.invisibleField.insertText(text)\n    }\n    \n    public override func deleteBackward() {\n        self.invisibleField.deleteBackward()\n    }\n    \n    public override var hasText: Bool {\n        return self.invisibleField.hasText\n    }\n    \n    // Mark: - Lifecycle\n    \n    public override var keyboardAppearance: UIKeyboardAppearance {\n        get { return self.invisibleField.keyboardAppearance }\n        set { self.invisibleField.keyboardAppearance = newValue}\n    }\n    \n    public override var keyboardType: UIKeyboardType {\n        get { return self.invisibleField.keyboardType }\n        set { self.invisibleField.keyboardType = newValue}\n    }\n    \n    public override func reloadInputViews() {\n      invisibleField.reloadInputViews()\n    }\n    \n    override public func awakeFromNib() {\n        super.awakeFromNib()\n        self.reload()\n    }\n    \n    override public func layoutSubviews() {\n        super.layoutSubviews()\n        self.bringSubviewToFront(self.invisibleField)\n        self.invisibleField.frame = self.bounds\n        \n        guard !self.isAnimating, !self.isDynamicLength else {\n            return\n        }\n        \n        // back views\n        var myText = \"\"\n        for _ in 0..<self.properties.numberOfCharacters {\n            myText += \"0\"\n        }\n        let nsText = NSString(string: myText)\n        let textFrame = nsText.boundingRect(with: self.bounds.size,\n                                            options: .usesLineFragmentOrigin,\n                                            attributes: self.attributes,\n                                            context: nil)\n        \n        \n        let actualWidth = textFrame.width\n            + (self.appearance.kerning * CGFloat(self.properties.numberOfCharacters))\n        let digitWidth = actualWidth / CGFloat(self.properties.numberOfCharacters)\n        \n        let offset = (self.bounds.width - actualWidth) / 2\n        \n        for (index, v) in self.backViews.enumerated() {\n            let x = CGFloat(index) * digitWidth + offset\n            var vFrame = CGRect(x: x,\n                                y: -1,\n                                width: digitWidth,\n                                height: self.bounds.height)\n            vFrame.origin.x += self.appearance.backOffset / 2\n            vFrame.size.width -= self.appearance.backOffset\n            \n            if self.appearance.backRounded {\n                \n                if vFrame.size.height < vFrame.size.width {\n                    let delta = vFrame.size.width - vFrame.size.height\n                    vFrame.origin.x += delta/2\n                } else {\n                    let delta = vFrame.size.height - vFrame.size.width\n                    vFrame.origin.y += delta/2\n                }\n                \n                let minSide = min(vFrame.size.height, vFrame.size.width)\n                vFrame.size.width = minSide\n                vFrame.size.height = minSide\n                v.layer.cornerRadius = minSide/2\n            }\n            \n            v.frame = vFrame\n        }\n    }\n    \n    // Mark: - Public functions\n    \n    @discardableResult override public func becomeFirstResponder() -> Bool {\n        return self.invisibleField.becomeFirstResponder()\n    }\n    \n    public func animateFailure(_ completion : (() -> Void)? = nil) {\n        \n        guard !self.isAnimating else {\n            return\n        }\n        \n        isAnimating = true\n        \n        CATransaction.begin()\n        CATransaction.setCompletionBlock({\n            self.isAnimating = false\n            completion?()\n            self.reloadAppearance()\n        })\n        \n        let animation = CAKeyframeAnimation(keyPath: \"transform.translation.x\")\n        animation.timingFunction = CAMediaTimingFunction.init(name: .linear)\n        animation.duration = 0.6\n        animation.values = [-14.0, 14.0, -14.0, 14.0, -8.0, 8.0, -4.0, 4.0, 0.0 ]\n        layer.add(animation, forKey: \"shake\")\n        \n        CATransaction.commit()\n    }\n    \n    public func animateSuccess(with text: String, completion : (() -> Void)? = nil) {\n        \n        guard !self.isAnimating else {\n            return\n        }\n        \n        self.isAnimating  = true\n        \n        UIView.animate(withDuration: 0.2, animations: {\n            \n            for v in self.backViews {\n                v.alpha = 0\n            }\n            \n            self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)\n            self.alpha = 0\n        }) { _ in\n            self.attributedText = NSAttributedString(string: text, attributes: self.attributes)\n            UIView.animate(withDuration: 0.2, animations: {\n                self.transform = CGAffineTransform.identity\n                self.alpha = 1.0\n                \n            }) { _ in\n                \n                DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {\n                    self.isAnimating = false\n                    completion?()\n                }\n                \n            }\n        }\n    }\n    \n    // Mark: - Private function\n    \n    @objc func cancelNumberPad() {\n        self.endEditing(true)\n    }\n    \n    @objc func doneWithNumberPad() {\n        self.properties.delegate?.pinField(self, didFinishWith: self.invisibleText)\n    }\n    \n    private func reload() {\n        \n        // Dynamic length flag\n        isDynamicLength = (self.properties.numberOfCharacters == 0)\n        \n        // Only setup if view showing\n        guard self.superview != nil else {\n            return\n        }\n        \n        self.endEditing(true)\n        if isDynamicLength {\n            if self.inputAccessoryView == nil {\n                \n                let frame = CGRect(x: 0,\n                                   y: 0,\n                                   width: UIScreen.main.bounds.width,\n                                   height: 50)\n                let numberToolbar = UIToolbar(frame:frame)\n                numberToolbar.barStyle = .default\n                numberToolbar.items = [\n                    UIBarButtonItem.init(barButtonSystemItem: .cancel, target: self, action: #selector(cancelNumberPad)),\n                    UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),\n                    UIBarButtonItem.init(barButtonSystemItem: .done, target: self, action: #selector(doneWithNumberPad))\n                ]\n                numberToolbar.sizeToFit()\n                self.inputAccessoryView = numberToolbar\n            }\n        } else {\n            \n            self.inputAccessoryView = nil\n        }\n        \n        // Debugging ---------------\n        // Change alpha for easy debug\n        let alpha: CGFloat = 0.0\n        self.invisibleField.backgroundColor =  UIColor.white.withAlphaComponent(alpha * 0.8)\n        self.invisibleField.tintColor = UIColor.black.withAlphaComponent(alpha)\n        self.invisibleField.textColor = UIColor.black.withAlphaComponent(alpha)\n        // --------------------------\n        \n        // Prepare `invisibleField`\n        self.invisibleField.textAlignment = .center\n        self.invisibleField.autocapitalizationType = .none\n        self.invisibleField.autocorrectionType = .no\n        self.invisibleField.spellCheckingType = .no\n\n        self.invisibleField.keyboardType = self.properties.keyboardType\n        \n        if #available(iOS 12.0, *) {\n            // Show possible prediction on iOS >= 12\n            self.invisibleField.textContentType = .oneTimeCode\n            self.invisibleField.autocorrectionType = .yes\n        }\n\n        self.addSubview(self.invisibleField)\n        self.invisibleField.addTarget(self, action: #selector(reloadAppearance), for: .allEditingEvents)\n        \n        // Prepare visible field\n        self.tintColor = .clear // Hide cursor\n        self.invisibleField.tintColor = .clear // Hide cursor\n        self.contentVerticalAlignment = .center\n        \n        // Set back views\n        for v in self.backViews {\n            v.removeFromSuperview()\n        }\n        self.backViews.removeAll(keepingCapacity: false)\n        for _ in 0..<self.properties.numberOfCharacters {\n            let v = UIView()\n            backViews.append(v)\n            self.addSubview(v)\n            self.sendSubviewToBack(v)\n        }\n        \n        // Delay fixes kerning offset issue\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {\n            self.reloadAppearance()\n        }\n        \n        // Focus token animation\n        if self.properties.animateFocus {\n            if self.timer == nil {\n                self.timer = Timer.scheduledTimer(timeInterval:  0.6, target: self, selector: #selector(animateFocusedToken), userInfo: nil, repeats: true)\n                self.timer?.fire()\n            }\n        } else {\n            self.timer?.invalidate()\n            self.timer = nil\n        }\n    }\n    \n    @objc private func animateFocusedToken() {\n        \n        guard !isDynamicLength else {\n            return\n        }\n        \n        if  let attString = self.attributedText?.mutableCopy() as? NSMutableAttributedString,\n            let range = self.currentFocusRange {\n            \n            var atts = attString.attributes(at: range.location, effectiveRange: nil)\n            \n            guard let color = atts[.foregroundColor] as? UIColor else {\n                return\n            }\n            let isClear = (color == .clear)\n            let duration: Double = isClear ? 0.3 : 0.6\n            if isClear{\n                atts[.foregroundColor] = self.appearance.tokenFocusColor\n            } else {\n                atts[.foregroundColor] = UIColor.clear\n            }\n            attString.setAttributes(atts, range: range)\n            \n            UIView.transition(with: self, duration: duration, options: [.transitionCrossDissolve, .allowUserInteraction], animations: {\n                self.attributedText = attString\n            }, completion: nil)\n            \n        }\n    }\n    \n    // Updates textfield content\n    @objc public func reloadAppearance() {\n        \n        guard !self.isAnimating else {\n            return\n        }\n        \n        // Styling backviews\n        for v in self.backViews {\n            v.alpha = 1.0\n            v.backgroundColor = self.appearance.backColor\n            v.layer.borderColor = self.appearance.backBorderColor.cgColor\n            v.layer.borderWidth = self.appearance.backBorderWidth\n            v.layer.cornerRadius = self.appearance.backCornerRadius\n        }\n        \n        self.sanitizeText()\n        \n        let paragraph = NSMutableParagraphStyle()\n        paragraph.alignment = .center\n        \n        let font =  self.appearance.font?.font() ?? self.font ?? UIFont.preferredFont(forTextStyle: .headline)\n        self.attributes = [ .paragraphStyle : paragraph,\n                            .font : font,\n                            .kern : self.appearance.kerning]\n        \n        if isDynamicLength {\n            attributes[.foregroundColor] = self.appearance.textColor\n            self.attributedText =  NSAttributedString(string: self.invisibleField.text!, attributes: attributes)\n            return\n        }\n        \n        // Display\n        let attString = NSMutableAttributedString(string: \"\")\n        let loopStride = isRightToLeft\n            ? stride(from: self.properties.numberOfCharacters-1, to: -1, by: -1)\n            : stride(from: 0, to: self.properties.numberOfCharacters, by: 1)\n        \n        for i in loopStride {\n            \n            var string = \"\"\n            var isToken = false\n            if i < invisibleText.count {\n                if self.properties.isSecure {\n                    string = String(self.properties.secureToken)\n                } else {\n                    let index = invisibleText.index(string.startIndex, offsetBy: i)\n                    string = String(invisibleText[index])\n                }\n                \n            } else {\n                isToken = true\n                string = String(self.properties.token)\n            }\n            \n            // Color for active / inactive\n            let backIndex = self.isRightToLeft ? self.properties.numberOfCharacters-i-1 : i\n            if !self.backViews.isEmpty && backIndex < self.backViews.count {\n                let backView = self.backViews[backIndex]\n                if isToken {\n                    attributes[.foregroundColor] = self.appearance.tokenColor\n                    backView.backgroundColor = self.appearance.backColor\n                    backView.layer.borderColor = self.appearance.backBorderColor.cgColor\n                } else {\n                    attributes[.foregroundColor] = self.appearance.textColor\n                    backView.backgroundColor = self.appearance.backActiveColor\n                    backView.layer.borderColor = self.appearance.backBorderActiveColor.cgColor\n                }\n            }\n\n            // Fix kerning-centering\n            let indexForKernFix = isRightToLeft ? 0 : self.properties.numberOfCharacters-1\n            if i == indexForKernFix {\n                attributes[.kern] = 0.0\n            }\n            \n            attString.append(NSAttributedString(string: string, attributes: attributes))\n        }\n        \n        if #available(iOS 11.0, *) {\n            self.updateCursorPosition()\n        }\n        \n        guard !self.isAnimating else {\n            return\n        }\n        \n        self.attributedText = attString\n        \n        if invisibleText == self.previousCode {\n            return\n        }\n        self.previousCode = invisibleText\n        \n        //        self.sizeToFit()\n        self.checkCodeValidity()\n    }\n    \n    private func sanitizeText() {\n        var text = self.invisibleField.text ?? \"\"\n        \n        if properties.isUppercased {\n            text = text.uppercased()\n        }\n        \n        if text != lastEntry {\n            let isValid = text.reduce(true) { result, char -> Bool in\n                return result && self.properties.validCharacters.contains(char)\n            }\n            if text.count <= self.properties.numberOfCharacters {\n                self.properties.delegate?.pinField(self, didChangeTo: text, isValid: isValid)\n            }\n            \n            lastEntry = text\n        }\n        \n        text = String(text.lazy.filter(self.properties.validCharacters.contains))\n        \n        if !self.isDynamicLength {\n            text = String(text.prefix(self.properties.numberOfCharacters))\n        }\n        \n        self.invisibleField.text = text\n    }\n    \n    // Always position cursor on last valid character\n    private func updateCursorPosition() {\n        self.currentFocusRange = nil\n        let offset = min(self.invisibleText.count, self.properties.numberOfCharacters)\n        // Only works with a small delay\n        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {\n            if let position = self.invisibleField.position(from: self.invisibleField.beginningOfDocument, offset: offset) {\n                \n                let textRange = self.textRange(from: position, to: position)\n                self.invisibleField.selectedTextRange = textRange\n                \n                // Compute the currently focused element\n                if   let attString = self.attributedText?.mutableCopy() as? NSMutableAttributedString,\n                    var range = self.invisibleField.selectedRange,\n                    range.location >= -1 && range.location < self.properties.numberOfCharacters {\n                    \n                    // Compute range of focused text\n                    if self.isRightToLeft {\n                        range.location = self.properties.numberOfCharacters-range.location-1\n                    }\n                    range.length = 1\n                    \n                    // Make sure it's a token that is focused\n                    let string = attString.string\n                    let startIndex = string.index(string.startIndex, offsetBy: range.location)\n                    let endIndex = string.index(startIndex, offsetBy: 1)\n                    let sub = string[startIndex..<endIndex]\n                    if sub == String(self.properties.token) {\n                        \n                        // Token focus color\n                        var atts = attString.attributes(at: range.location, effectiveRange: nil)\n                        atts[.foregroundColor] = self.appearance.tokenFocusColor\n                        attString.setAttributes(atts, range: range)\n                        \n                        // Avoid long fade from tick()\n                        UIView.transition(with: self, duration: 0.1, options: [.transitionCrossDissolve, .allowUserInteraction], animations: {\n                            self.attributedText = attString\n                        }, completion: nil)\n                        \n                        self.currentFocusRange = range\n                        \n                        // Backview focus color\n                        var backIndex = self.isRightToLeft ? self.properties.numberOfCharacters-offset-1 : offset\n                        backIndex = min(backIndex, self.properties.numberOfCharacters-1)\n                        backIndex = max(backIndex, 0)\n                        if !self.backViews.isEmpty && backIndex < self.backViews.count {\n                            let backView = self.backViews[backIndex]\n                            backView.backgroundColor = self.appearance.backFocusColor\n                            backView.layer.borderColor = self.appearance.backBorderFocusColor.cgColor\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    private func checkCodeValidity() {\n        \n        guard !self.isAnimating, !self.isDynamicLength else {\n            return\n        }\n        \n        if self.invisibleText.count == self.properties.numberOfCharacters {\n            if let pinDelegate = self.properties.delegate {\n                let result = isRightToLeft ? String(self.invisibleText.reversed()) : self.invisibleText\n                pinDelegate.pinField(self, didFinishWith: result)\n            } else {\n                print(\"⚠️ : No delegate set for KAPinField. Set it via yourPinField.properties.delegate.\")\n            }\n        }\n    }\n}\n\nprivate extension UITextInput {\n    var selectedRange: NSRange? {\n        guard let range = selectedTextRange else { return nil }\n        let location = offset(from: beginningOfDocument, to: range.start)\n        let length = offset(from: range.start, to: range.end)\n        return NSRange(location: location, length: length)\n    }\n}\n\n// Mark: - KA_MonospacedFont\n// Helper to provide monospaced fonts via literal\npublic enum KA_MonospacedFont {\n    \n    case courier(CGFloat)\n    case courierBold(CGFloat)\n    case courierBoldOblique(CGFloat)\n    case courierOblique(CGFloat)\n    case courierNewBoldItalic(CGFloat)\n    case courierNewBold(CGFloat)\n    case courierNewItalic(CGFloat)\n    case courierNew(CGFloat)\n    case menloBold(CGFloat)\n    case menloBoldItalic(CGFloat)\n    case menloItalic(CGFloat)\n    case menlo(CGFloat)\n    \n    func font() -> UIFont {\n        switch self {\n        case .courier(let size) :\n            return UIFont(name: \"Courier\", size: size)!\n        case .courierBold(let size) :\n            return UIFont(name: \"Courier-Bold\", size: size)!\n        case .courierBoldOblique(let size) :\n            return UIFont(name: \"Courier-BoldOblique\", size: size)!\n        case .courierOblique(let size) :\n            return UIFont(name: \"Courier-Oblique\", size: size)!\n        case .courierNewBoldItalic(let size) :\n            return UIFont(name: \"CourierNewPS-BoldItalicMT\", size: size)!\n        case .courierNewBold(let size) :\n            return UIFont(name: \"CourierNewPS-BoldMT\", size: size)!\n        case .courierNewItalic(let size) :\n            return UIFont(name: \"CourierNewPS-ItalicMT\", size: size)!\n        case .courierNew(let size) :\n            return UIFont(name: \"CourierNewPSMT\", size: size)!\n        case .menloBold(let size) :\n            return UIFont(name: \"Menlo-Bold\", size: size)!\n        case .menloBoldItalic(let size) :\n            return UIFont(name: \"Menlo-BoldItalic\", size: size)!\n        case .menloItalic(let size) :\n            return UIFont(name: \"Menlo-Italic\", size: size)!\n        case .menlo(let size) :\n            return UIFont(name: \"Menlo-Regular\", size: size)!\n        }\n    }\n}\n"
  },
  {
    "path": "KAPinField.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name             = 'KAPinField'\n  s.version          =  '5.0.3'\n  s.summary          = 'Lightweight, highly customizable Pin Code Field library for iOS, written in Swift'\n  s.homepage         = 'https://github.com/kirualex/KAPinField'\n  s.license          = { :type => \"MIT\", :file => \"LICENSE\" }\n  s.author           = { \"Alexis Creuzot\" => \"alexis.creuzot@gmail.com\" }\n  s.source           = { :git => \"https://github.com/kirualex/KAPinField.git\", :tag => s.version.to_s }\n  s.platform         = :ios, '9.0'\n  s.source_files     = '**/KAPinField.swift'\nend\n"
  },
  {
    "path": "KAPinField.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t8BA8433222667EE000CC8D98 /* KAPinField.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BA8432B22667EE000CC8D98 /* KAPinField.framework */; };\n\t\t8BA8433322667EE000CC8D98 /* KAPinField.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8BA8432B22667EE000CC8D98 /* KAPinField.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t8BA843382266800600CC8D98 /* KAPinField.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA8432D22667EE000CC8D98 /* KAPinField.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t8BA843392266803200CC8D98 /* KAPinField.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAAE9C7121749E5200ACE4E6 /* KAPinField.swift */; };\n\t\tFAAE9C6021749E0200ACE4E6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAAE9C5F21749E0200ACE4E6 /* AppDelegate.swift */; };\n\t\tFAAE9C6221749E0200ACE4E6 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAAE9C6121749E0200ACE4E6 /* ViewController.swift */; };\n\t\tFAAE9C6521749E0200ACE4E6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FAAE9C6321749E0200ACE4E6 /* Main.storyboard */; };\n\t\tFAAE9C6721749E0300ACE4E6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FAAE9C6621749E0300ACE4E6 /* Assets.xcassets */; };\n\t\tFAAE9C6A21749E0300ACE4E6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FAAE9C6821749E0300ACE4E6 /* LaunchScreen.storyboard */; };\n\t\tFAAE9C7221749E5200ACE4E6 /* KAPinField.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAAE9C7121749E5200ACE4E6 /* KAPinField.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t8BA8433022667EE000CC8D98 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = FAAE9C5421749E0100ACE4E6 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8BA8432A22667EE000CC8D98;\n\t\t\tremoteInfo = \"KAPinField iOS\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t8BA8433722667EE000CC8D98 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t8BA8433322667EE000CC8D98 /* KAPinField.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t8BA8432B22667EE000CC8D98 /* KAPinField.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KAPinField.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8BA8432D22667EE000CC8D98 /* KAPinField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KAPinField.h; sourceTree = \"<group>\"; };\n\t\t8BA8432E22667EE000CC8D98 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tFAAE9C5C21749E0100ACE4E6 /* KAPinField.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KAPinField.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFAAE9C5F21749E0200ACE4E6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tFAAE9C6121749E0200ACE4E6 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\tFAAE9C6421749E0200ACE4E6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\tFAAE9C6621749E0300ACE4E6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tFAAE9C6921749E0300ACE4E6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\tFAAE9C6B21749E0300ACE4E6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tFAAE9C7121749E5200ACE4E6 /* KAPinField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KAPinField.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8BA8432822667EE000CC8D98 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFAAE9C5921749E0100ACE4E6 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8BA8433222667EE000CC8D98 /* KAPinField.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tFA88CCEC2174FA7C00EFDA17 /* Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAE9C7121749E5200ACE4E6 /* KAPinField.swift */,\n\t\t\t\t8BA8432D22667EE000CC8D98 /* KAPinField.h */,\n\t\t\t\t8BA8432E22667EE000CC8D98 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Sources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFA88CCED2174FA8600EFDA17 /* Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAE9C5F21749E0200ACE4E6 /* AppDelegate.swift */,\n\t\t\t\tFAAE9C6121749E0200ACE4E6 /* ViewController.swift */,\n\t\t\t\tFAAE9C6321749E0200ACE4E6 /* Main.storyboard */,\n\t\t\t\tFAAE9C6621749E0300ACE4E6 /* Assets.xcassets */,\n\t\t\t\tFAAE9C6821749E0300ACE4E6 /* LaunchScreen.storyboard */,\n\t\t\t\tFAAE9C6B21749E0300ACE4E6 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAAE9C5321749E0100ACE4E6 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAE9C5E21749E0200ACE4E6 /* KAPinField */,\n\t\t\t\tFAAE9C5D21749E0100ACE4E6 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAAE9C5D21749E0100ACE4E6 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAE9C5C21749E0100ACE4E6 /* KAPinField.app */,\n\t\t\t\t8BA8432B22667EE000CC8D98 /* KAPinField.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAAE9C5E21749E0200ACE4E6 /* KAPinField */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFA88CCEC2174FA7C00EFDA17 /* Sources */,\n\t\t\t\tFA88CCED2174FA8600EFDA17 /* Example */,\n\t\t\t);\n\t\t\tpath = KAPinField;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8BA8432622667EE000CC8D98 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8BA843382266800600CC8D98 /* KAPinField.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t8BA8432A22667EE000CC8D98 /* KAPinField iOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8BA8433622667EE000CC8D98 /* Build configuration list for PBXNativeTarget \"KAPinField iOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8BA8432622667EE000CC8D98 /* Headers */,\n\t\t\t\t8BA8432722667EE000CC8D98 /* Sources */,\n\t\t\t\t8BA8432822667EE000CC8D98 /* Frameworks */,\n\t\t\t\t8BA8432922667EE000CC8D98 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"KAPinField iOS\";\n\t\t\tproductName = \"KAPinField iOS\";\n\t\t\tproductReference = 8BA8432B22667EE000CC8D98 /* KAPinField.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tFAAE9C5B21749E0100ACE4E6 /* KAPinField */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = FAAE9C6E21749E0300ACE4E6 /* Build configuration list for PBXNativeTarget \"KAPinField\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tFAAE9C5821749E0100ACE4E6 /* Sources */,\n\t\t\t\tFAAE9C5921749E0100ACE4E6 /* Frameworks */,\n\t\t\t\tFAAE9C5A21749E0100ACE4E6 /* Resources */,\n\t\t\t\t8BA8433722667EE000CC8D98 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t8BA8433122667EE000CC8D98 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = KAPinField;\n\t\t\tproductName = KAPinCode;\n\t\t\tproductReference = FAAE9C5C21749E0100ACE4E6 /* KAPinField.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tFAAE9C5421749E0100ACE4E6 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1000;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = alexiscreuzot;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t8BA8432A22667EE000CC8D98 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.2;\n\t\t\t\t\t};\n\t\t\t\t\tFAAE9C5B21749E0100ACE4E6 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.0;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = FAAE9C5721749E0100ACE4E6 /* Build configuration list for PBXProject \"KAPinField\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = FAAE9C5321749E0100ACE4E6;\n\t\t\tproductRefGroup = FAAE9C5D21749E0100ACE4E6 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tFAAE9C5B21749E0100ACE4E6 /* KAPinField */,\n\t\t\t\t8BA8432A22667EE000CC8D98 /* KAPinField iOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8BA8432922667EE000CC8D98 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFAAE9C5A21749E0100ACE4E6 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFAAE9C6A21749E0300ACE4E6 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\tFAAE9C6721749E0300ACE4E6 /* Assets.xcassets in Resources */,\n\t\t\t\tFAAE9C6521749E0200ACE4E6 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8BA8432722667EE000CC8D98 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8BA843392266803200CC8D98 /* KAPinField.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFAAE9C5821749E0100ACE4E6 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFAAE9C6221749E0200ACE4E6 /* ViewController.swift in Sources */,\n\t\t\t\tFAAE9C7221749E5200ACE4E6 /* KAPinField.swift in Sources */,\n\t\t\t\tFAAE9C6021749E0200ACE4E6 /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t8BA8433122667EE000CC8D98 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8BA8432A22667EE000CC8D98 /* KAPinField iOS */;\n\t\t\ttargetProxy = 8BA8433022667EE000CC8D98 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\tFAAE9C6321749E0200ACE4E6 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAE9C6421749E0200ACE4E6 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAAE9C6821749E0300ACE4E6 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tFAAE9C6921749E0300ACE4E6 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t8BA8433422667EE000CC8D98 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = KAPinField/Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.alexiscreuzot.KAPinField-iOS\";\n\t\t\t\tPRODUCT_NAME = KAPinField;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8BA8433522667EE000CC8D98 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = KAPinField/Sources/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.alexiscreuzot.KAPinField-iOS\";\n\t\t\t\tPRODUCT_NAME = KAPinField;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tFAAE9C6C21749E0300ACE4E6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFAAE9C6D21749E0300ACE4E6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tFAAE9C6F21749E0300ACE4E6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = J6US63N7X8;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/KAPinField/Example/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.alexiscreuzot.KAPinField;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFAAE9C7021749E0300ACE4E6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = J6US63N7X8;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/KAPinField/Example/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.alexiscreuzot.KAPinField;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t8BA8433622667EE000CC8D98 /* Build configuration list for PBXNativeTarget \"KAPinField iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8BA8433422667EE000CC8D98 /* Debug */,\n\t\t\t\t8BA8433522667EE000CC8D98 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tFAAE9C5721749E0100ACE4E6 /* Build configuration list for PBXProject \"KAPinField\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tFAAE9C6C21749E0300ACE4E6 /* Debug */,\n\t\t\t\tFAAE9C6D21749E0300ACE4E6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tFAAE9C6E21749E0300ACE4E6 /* Build configuration list for PBXNativeTarget \"KAPinField\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tFAAE9C6F21749E0300ACE4E6 /* Debug */,\n\t\t\t\tFAAE9C7021749E0300ACE4E6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = FAAE9C5421749E0100ACE4E6 /* Project object */;\n}\n"
  },
  {
    "path": "KAPinField.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/alex/Development/iOS/_frameworks/KAPinCode/KAPinField.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "KAPinField.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "KAPinField.xcodeproj/xcshareddata/xcschemes/KAPinField iOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8BA8432A22667EE000CC8D98\"\n               BuildableName = \"KAPinField.framework\"\n               BlueprintName = \"KAPinField iOS\"\n               ReferencedContainer = \"container:KAPinField.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8BA8432A22667EE000CC8D98\"\n            BuildableName = \"KAPinField.framework\"\n            BlueprintName = \"KAPinField iOS\"\n            ReferencedContainer = \"container:KAPinField.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8BA8432A22667EE000CC8D98\"\n            BuildableName = \"KAPinField.framework\"\n            BlueprintName = \"KAPinField iOS\"\n            ReferencedContainer = \"container:KAPinField.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "KAPinField.xcodeproj/xcshareddata/xcschemes/KAPinField.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"FAAE9C5B21749E0100ACE4E6\"\n               BuildableName = \"KAPinField.app\"\n               BlueprintName = \"KAPinField\"\n               ReferencedContainer = \"container:KAPinField.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"FAAE9C5B21749E0100ACE4E6\"\n            BuildableName = \"KAPinField.app\"\n            BlueprintName = \"KAPinField\"\n            ReferencedContainer = \"container:KAPinField.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"FAAE9C5B21749E0100ACE4E6\"\n            BuildableName = \"KAPinField.app\"\n            BlueprintName = \"KAPinField\"\n            ReferencedContainer = \"container:KAPinField.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"FAAE9C5B21749E0100ACE4E6\"\n            BuildableName = \"KAPinField.app\"\n            BlueprintName = \"KAPinField\"\n            ReferencedContainer = \"container:KAPinField.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "KAPinField.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"container:KAPinField.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "KAPinField.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Alexis Creuzot\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.4\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"KAPinField\",\n    platforms: [\n        .iOS(.v9),\n    ],\n    products: [\n        .library(\n            name: \"KAPinField\",\n            targets: [\"KAPinField\"]\n        ),\n    ],\n    dependencies: [],\n    targets: [\n        .target(\n            name: \"KAPinField\",\n            path: \"KAPinField\",\n            exclude: [\n                \"Example\",\n                \"Sources/Info.plist\",\n                \"Sources/KAPinField.h\",\n            ],\n            sources: [\n                \"Sources\",\n            ],\n            linkerSettings: [\n                .linkedFramework(\"UIKit\"),\n            ]\n        ),\n    ]\n)\n"
  },
  {
    "path": "README.md",
    "content": "[![Platform](https://img.shields.io/cocoapods/p/KAPinField.svg?style=flat)](https://alamofire.github.io/KAPinField)\n[![Language](https://img.shields.io/badge/swift-5.0-blue.svg)](http://swift.org)\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/KAPinField.svg)](https://img.shields.io/cocoapods/v/KAPinField.svg)\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-blue.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Build Status](https://travis-ci.org/kirualex/KAPinField.svg?branch=master)](https://travis-ci.org/kirualex/KAPinField)\n[![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://raw.githubusercontent.com/kirualex/SwiftyGif/master/LICENSE)\n\n# KAPinField\n### Lightweight pin code field library for iOS, written in Swift\n\n**Supports one time password autofill out of the box !**\n\n<table>\n  <tr>\n    <td>\n      <img src=\"https://github.com/kirualex/KAPinField/blob/4.0.0/preview1.gif\"  width=\"400\"  />\n    </td>\n  </tr>\n  <tr>\n  <td align=center>\n      Example\n    </td>\n   </tr>\n </table>\n\n## Install\nWith Cocoapods\n`pod 'KAPinField'`\n\n## Usage\n\n```swift\nimport KAPinField\n\nclass MyController : UIVIewController {\n  ...\n}\n```\n\n### Storyboard\nYou can add an UITextField directly in your Storyboard scene and declare it as `KAPinField`. It will automagically become a pin field. You can then customize it from the inspector view to suit your needs.\n\n### Delegation\nDon't forget to set the delegate likeso :\n```swift\n\n@IBOutlet var pinField: KAPinField!\n\noverride func viewDidLoad() {\n        super.viewDidLoad()\n        properties.delegate = self\n        ...\n}\n```\n\nOne simple method will be called on your delegate\n```swift\nextension MyController : KAPinFieldDelegate {\n  func pinField(_ field: KAPinField, didFinishWith code: String) {\n    print(\"didFinishWith : \\(code)\")\n  }\n}\n```\n\n### Properties\nAll the logic properties are available in the `KAPinFieldProperties` struct named `properties`.\n\n**Token can't be a whitespace due to Apple handling of trailing spaces. You can achieve the same effect using any token with `tokenColor` and `tokenFocusColor` set to `.clear`**\n\n##### Logic\n```swift\npinField.updateProperties { properties in\n  properties.token = \"-\" // Default to \"•\", can't be a whitespace !\n  properties.numberOfCharacters = 5 // Default to 4\n  properties.validCharacters = \"0123456789+#?\" // Default to only numbers, \"0123456789\"\n  properties.text = \"123\" // You can set part or all of the text\n  properties.animateFocus = true // Animate the currently focused token\n  properties.isSecure = false // Secure pinField will hide actual input\n  properties.secureToken = \"*\" // Token used to hide actual character input when using isSecure = true\n  properties.isUppercased = false // You can set this to convert input to uppercased.\n}\n```\n\n##### Styling\nAll the styling can be done via the `KAPinFieldAppearance` struct named `appearance`.\n\n```swift\npinField.updateAppearence { appearance in\n  appearance.font = .menloBold(40) // Default to appearance.MonospacedFont.menlo(40)\n  appearance.kerning = 20 // Space between characters, default to 16\n  appearance.textColor = UIColor.white.withAlphaComponent(1.0) // Default to nib color or black if initialized programmatically.\n  appearance.tokenColor = UIColor.black.withAlphaComponent(0.3) // token color, default to text color\n  appearance.tokenFocusColor = UIColor.black.withAlphaComponent(0.3)  // token focus color, default to token color\n  appearance.backOffset = 8 // Backviews spacing between each other\n  appearance.backColor = UIColor.clear\n  appearance.backBorderWidth = 1\n  appearance.backBorderColor = UIColor.white.withAlphaComponent(0.2)\n  appearance.backCornerRadius = 4\n  appearance.backFocusColor = UIColor.clear\n  appearance.backBorderFocusColor = UIColor.white.withAlphaComponent(0.8)\n  appearance.backActiveColor = UIColor.clear\n  appearance.backBorderActiveColor = UIColor.white\n  appearance.keyboardType = UIKeyboardType.numberPad // Specify keyboard type\n}\n```\n\n### Font\nA [monospaced font](https://en.wikipedia.org/wiki/Monospaced_font) is highly recommended in order to avoid horizontal offsetting during typing. For this purpose, a handy helper is available to allow you to access native iOS monospaced fonts.\nTo use it, just set `appearance.font` with a enum value from `appearance.MonospacedFont`.\nYou can of course still use your own font by setting the default `font` property on KAPinField.\n\n### Animation\n`KAPinField` also provide some eye-candy for failure and success.\n\n##### Success\n```swift\npinfield.animateSuccess(with: \"👍\") {\n    print(\"Success\")\n}\n```\n\n##### Failure\n```swift\npinfield.animateFailure() {\n   print(\"Failure\")\n}\n```\n"
  }
]