text:
import UIKit
import RxSwift
import RxCocoa
import Cartography

class ShowFieldCell: UITableViewCell {
	var dbag = DisposeBag()
	lazy var name = UITextField()
	lazy var content = UITextField()

	override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
		super.init(style: style, reuseIdentifier: reuseIdentifier)
		addSubview(name)
		addSubview(content)
	}

	required init?(coder aDecoder: NSCoder) { // REALLY?
		fatalError("init(coder:) has not been implemented")
	}

	override func layoutSubviews() {
		super.layoutSubviews()
		name.enabled = false
		name.textColor = Colors.primaryAccent
		name.font = name.font?.fontWithSize(16)

		content.enabled = false
		content.textColor = Colors.primaryContent
	}

	func setField(field: FieldViewModel) {
		field.field_name.asObservable().bindTo(name.rx_text).addDisposableTo(dbag)
		updateConstraints()
	}

	override func updateConstraints() {
		constrain(name, content) { name, content in
			for v in [name, content] {
				v.centerX == name.superview!.centerX
				v.width == name.superview!.width - 20
//				v.height == 24
			}
			name.top == name.superview!.topMargin
			content.bottom == name.superview!.bottomMargin
			distribute(by: 4, vertically: name, content)
		}
		super.updateConstraints()
	}
}

class ShowPasswordFieldCell: ShowFieldCell {
	override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
		super.init(style: style, reuseIdentifier: reuseIdentifier)
	}

	required init?(coder aDecoder: NSCoder) { // WHAT
		fatalError("init(coder:) has not been implemented")
	}

	override func layoutSubviews() {
		super.layoutSubviews()
		content.secureTextEntry = true
		content.text = "************"
	}
}

class EditFieldCell: UITableViewCell {
	var dbag = DisposeBag()
	weak var field: FieldViewModel?
	lazy var name_field = UITextField()
	lazy var type_selector = UISegmentedControl(items: ["Derived", "Stored"])
	lazy var derived_site_name_field = UITextField()
	lazy var derived_counter_label = UILabel()
	lazy var derived_counter_stepper = UIStepper()
	lazy var stored_string_field = UITextField()

	override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
		super.init(style: style, reuseIdentifier: reuseIdentifier)
		addSubview(name_field)
		addSubview(type_selector)
		addSubview(derived_site_name_field)
		addSubview(derived_counter_stepper)
		addSubview(derived_counter_label)
		addSubview(stored_string_field)
	}

	override func layoutSubviews() {
		super.layoutSubviews()
		name_field.textColor = Colors.primaryContent

		derived_site_name_field.placeholder = "Site name (leave blank to use the entry name)"
		derived_site_name_field.textColor = Colors.primaryContent

		derived_counter_stepper.maximumValue = Double(UInt32.max)
		derived_counter_label.textColor = Colors.primaryContent

		stored_string_field.textColor = Colors.primaryContent
		updateConstraints()
	}

	func setField(field: FieldViewModel) {
		self.field = field

		(name_field.rx_text <-> field.field_name).addDisposableTo(dbag)

		transformBind(type_selector.rx_value,
			variable: field.field_type,
			propToVar: { $0 == 0 ? .Some(.Derived) : .Some(.Stored) },
			varToProp: { $0 == .Some(.Derived) ? 0 : 1 }).addDisposableTo(dbag)

		field.field_type.asObservable().map { $0 == .Some(.Derived) }.distinctUntilChanged().subscribeNext {
			self.derived_site_name_field.hidden = !$0
			self.derived_counter_stepper.hidden = !$0
			self.derived_counter_label.hidden = !$0
			self.stored_string_field.hidden = $0
			// I've spent so much time figuring this shit out:
			self.tableView?.beginUpdates()
			self.updateConstraints()
			self.tableView?.endUpdates()
		}.addDisposableTo(dbag)

		(derived_site_name_field.rx_text <-> field.derived_site_name).addDisposableTo(dbag)

		field.derived_counter.asObservable().subscribeNext { self.derived_counter_stepper.value = Double($0 ?? 1) }.addDisposableTo(dbag)
		derived_counter_stepper.rx_value.map { UInt32($0) }.bindTo(field.derived_counter).addDisposableTo(dbag)
		field.derived_counter.asObservable().map { "Counter: \($0 ?? 1)" }
			.bindTo(derived_counter_label.rx_text).addDisposableTo(dbag)

		(stored_string_field.rx_text <-> field.stored_data_string).addDisposableTo(dbag)

		field.stored_usage.asObservable().subscribeNext {
			switch $0 ?? .Text {
			case .Password: self.stored_string_field.placeholder = "Password"
			case .Text: self.stored_string_field.placeholder = "Text"
			}
		}.addDisposableTo(dbag)

		updateConstraints()
	}

	let group = ConstraintGroup()

	override func updateConstraints() {
		constrain([name_field, type_selector, derived_site_name_field, derived_counter_label, derived_counter_stepper, stored_string_field], replace: group) {
			let name_field = $0[0], type_selector = $0[1], derived_site_name_field = $0[2], derived_counter_label = $0[3], derived_counter_stepper = $0[4], stored_string_field = $0[5] //  FUCK
			guard let superview = name_field.superview else { return }
			let isDerived = self.field?.field_type.value == .Some(.Derived)
			for v in [name_field, type_selector, derived_site_name_field, stored_string_field] {
				v.left == superview.left + 50
				v.right == superview.right - 10
				v.height == 24
			}
			name_field.top == superview.topMargin
			if isDerived {
				derived_counter_stepper.bottom == superview.bottomMargin
				derived_counter_label.left == superview.left + 50
				derived_counter_label.right == derived_counter_stepper.left - 10
				derived_counter_label.top == derived_counter_stepper.top
				derived_counter_label.bottom == derived_counter_stepper.bottom
				derived_counter_stepper.right == superview.right - 10
				distribute(by: 10, vertically: name_field, type_selector, derived_site_name_field, derived_counter_stepper)
			} else {
				stored_string_field.bottom == superview.bottomMargin
				distribute(by: 10, vertically: name_field, type_selector, stored_string_field)
			}
		}
		super.updateConstraints()
	}

	required init?(coder aDecoder: NSCoder) { // SERIOUSLY?
		fatalError("init(coder:) has not been implemented")
	}
}


text:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="3aH-BQ-1TL">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
    </dependencies>
    <scenes>
        <!--Master-->
        <scene sceneID="pY4-Hu-kfo">
            <objects>
                <navigationController title="Master" id="RMx-3f-FxP" sceneMemberID="viewController">
                    <navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="Pmd-2v-anx">
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <connections>
                        <segue destination="7bK-jq-Zjz" kind="relationship" relationship="rootViewController" id="tsl-Nk-0bq"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="8fS-aE-onr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-38" y="-630"/>
        </scene>
        <!--Entry-->
        <scene sceneID="yUG-lL-AsK">
            <objects>
                <viewController title="Entry" id="JEX-9P-axG" customClass="EntryViewController" customModule="Freepass" customModuleProvider="target" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="86" sectionHeaderHeight="18" sectionFooterHeight="18" id="71p-5R-VLU">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                        <color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
                    </tableView>
                    <toolbarItems/>
                    <navigationItem key="navigationItem" title="Entry" id="mOI-FS-AaM">
                        <barButtonItem key="rightBarButtonItem" title="Edit" id="KNe-Fg-K9x">
                            <connections>
                                <action selector="toggleEdit:" destination="JEX-9P-axG" id="LB3-Jj-tn1"/>
                            </connections>
                        </barButtonItem>
                    </navigationItem>
                    <connections>
                        <outlet property="editButton" destination="KNe-Fg-K9x" id="5Sn-ar-VDW"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="FJe-Yq-33r" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="749" y="129"/>
        </scene>
        <!--Login View Controller-->
        <scene sceneID="tYz-Ew-SQ8">
            <objects>
                <tableViewController id="3aH-BQ-1TL" customClass="LoginViewController" customModule="Freepass" customModuleProvider="target" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="7ON-3S-pg9">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                        <color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
                        <sections>
                            <tableViewSection id="4EB-jf-Tue">
                                <cells>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="Hzt-lu-kYu">
                                        <rect key="frame" x="0.0" y="35" width="600" height="44"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Hzt-lu-kYu" id="Eer-AQ-Ga3">
                                            <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Your name" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="WkM-rV-6TM">
                                                    <rect key="frame" x="8" y="0.0" width="584" height="43"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <textInputTraits key="textInputTraits"/>
                                                </textField>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="bottomMargin" secondItem="WkM-rV-6TM" secondAttribute="bottom" constant="-8" id="18M-ua-8rm"/>
                                                <constraint firstItem="WkM-rV-6TM" firstAttribute="leading" secondItem="Eer-AQ-Ga3" secondAttribute="leadingMargin" id="gT5-oq-cMn"/>
                                                <constraint firstItem="WkM-rV-6TM" firstAttribute="top" secondItem="Eer-AQ-Ga3" secondAttribute="topMargin" constant="-8" id="o6W-5V-gxL"/>
                                                <constraint firstItem="WkM-rV-6TM" firstAttribute="trailing" secondItem="Eer-AQ-Ga3" secondAttribute="trailingMargin" id="xBi-12-6Ug"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="22f-xD-8Nj">
                                        <rect key="frame" x="0.0" y="79" width="600" height="44"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="22f-xD-8Nj" id="zUR-Lc-FO4">
                                            <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="rw5-DM-Hbg">
                                                    <rect key="frame" x="8" y="0.0" width="584" height="43"/>
                                                    <edgeInsets key="layoutMargins" top="8" left="8" bottom="8" right="8"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" secureTextEntry="YES"/>
                                                </textField>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="bottomMargin" secondItem="rw5-DM-Hbg" secondAttribute="bottom" constant="-8" id="1XZ-In-RN6"/>
                                                <constraint firstItem="rw5-DM-Hbg" firstAttribute="top" secondItem="zUR-Lc-FO4" secondAttribute="topMargin" constant="-8" id="Hnf-QJ-wGZ"/>
                                                <constraint firstItem="rw5-DM-Hbg" firstAttribute="leading" secondItem="zUR-Lc-FO4" secondAttribute="leadingMargin" id="TrT-tM-DON"/>
                                                <constraint firstItem="rw5-DM-Hbg" firstAttribute="trailing" secondItem="zUR-Lc-FO4" secondAttribute="trailingMargin" id="cvg-z4-346"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="Q63-0c-Gtm">
                                        <rect key="frame" x="0.0" y="123" width="600" height="44"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Q63-0c-Gtm" id="Tu3-pE-d9Z">
                                            <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OfY-9c-NkT">
                                                    <rect key="frame" x="8" y="8" width="584" height="27"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <color key="textColor" red="0.20392156862745098" green="0.28627450980392155" blue="0.36862745098039218" alpha="1" colorSpace="calibratedRGB"/>
                                                    <nil key="highlightedColor"/>
                                                </label>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="OfY-9c-NkT" firstAttribute="leading" secondItem="Tu3-pE-d9Z" secondAttribute="leadingMargin" id="KWk-8S-k3b"/>
                                                <constraint firstItem="OfY-9c-NkT" firstAttribute="top" secondItem="Tu3-pE-d9Z" secondAttribute="topMargin" id="VJg-dc-O0i"/>
                                                <constraint firstItem="OfY-9c-NkT" firstAttribute="bottom" secondItem="Tu3-pE-d9Z" secondAttribute="bottomMargin" id="hak-ES-23t"/>
                                                <constraint firstItem="OfY-9c-NkT" firstAttribute="trailing" secondItem="Tu3-pE-d9Z" secondAttribute="trailingMargin" id="kYd-k8-97R"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="nRf-5x-rJr">
                                        <rect key="frame" x="0.0" y="167" width="600" height="44"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="nRf-5x-rJr" id="y80-vZ-tGA">
                                            <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JUQ-xX-ELW">
                                                    <rect key="frame" x="8" y="0.0" width="584" height="43"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                                    <state key="normal" title="Open"/>
                                                    <connections>
                                                        <segue destination="H1p-Uh-vWS" kind="show" identifier="openVault" id="D18-nf-zP2"/>
                                                    </connections>
                                                </button>
                                            </subviews>
                                            <constraints>
                                                <constraint firstAttribute="trailingMargin" secondItem="JUQ-xX-ELW" secondAttribute="trailing" id="Rle-wN-0Jc"/>
                                                <constraint firstItem="JUQ-xX-ELW" firstAttribute="top" secondItem="y80-vZ-tGA" secondAttribute="topMargin" constant="-8" id="SC6-cC-SL9"/>
                                                <constraint firstItem="JUQ-xX-ELW" firstAttribute="leading" secondItem="y80-vZ-tGA" secondAttribute="leadingMargin" id="WmE-ej-c6X"/>
                                                <constraint firstAttribute="bottomMargin" secondItem="JUQ-xX-ELW" secondAttribute="bottom" constant="-8" id="arS-T2-cbA"/>
                                            </constraints>
                                        </tableViewCellContentView>
                                    </tableViewCell>
                                </cells>
                            </tableViewSection>
                        </sections>
                        <connections>
                            <outlet property="dataSource" destination="3aH-BQ-1TL" id="3RY-cW-n14"/>
                            <outlet property="delegate" destination="3aH-BQ-1TL" id="WSX-Zb-CMe"/>
                        </connections>
                    </tableView>
                    <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
                    <size key="freeformSize" width="600" height="600"/>
                    <connections>
                        <outlet property="password" destination="rw5-DM-Hbg" id="kwa-Te-nsd"/>
                        <outlet property="userName" destination="WkM-rV-6TM" id="DTx-zJ-Or0"/>
                    </connections>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="md4-CK-pde" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-1627" y="-330"/>
        </scene>
        <!--Split View Controller-->
        <scene sceneID="Nki-YV-4Qg">
            <objects>
                <splitViewController id="H1p-Uh-vWS" sceneMemberID="viewController">
                    <toolbarItems/>
                    <connections>
                        <segue destination="RMx-3f-FxP" kind="relationship" relationship="masterViewController" id="BlO-5A-QYV"/>
                        <segue destination="vC3-pB-5Vb" kind="relationship" relationship="detailViewController" id="Tll-UG-LXB"/>
                    </connections>
                </splitViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="cZU-Oi-B1e" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-856" y="-330"/>
        </scene>
        <!--Entries-->
        <scene sceneID="smW-Zh-WAh">
            <objects>
                <tableViewController title="Entries" clearsSelectionOnViewWillAppear="NO" id="7bK-jq-Zjz" customClass="VaultViewController" customModule="Freepass" customModuleProvider="target" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="r7i-6Z-zg0">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <prototypes>
                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="EntryCell" textLabel="Arm-wq-HPj" style="IBUITableViewCellStyleDefault" id="WCw-Qf-5nD" customClass="EntryCell" customModule="Freepass" customModuleProvider="target">
                                <rect key="frame" x="0.0" y="86" width="600" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg">
                                    <rect key="frame" x="0.0" y="0.0" width="600" height="43"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Arm-wq-HPj">
                                            <rect key="frame" x="15" y="0.0" width="570" height="43"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="system" pointSize="20"/>
                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                            <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                        </label>
                                    </subviews>
                                </tableViewCellContentView>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <connections>
                                    <outlet property="entryName" destination="Arm-wq-HPj" id="Tgj-eX-u0v"/>
                                    <segue destination="vC3-pB-5Vb" kind="showDetail" identifier="showEntry" id="6S0-TO-JiA"/>
                                </connections>
                            </tableViewCell>
                        </prototypes>
                        <sections/>
                        <connections>
                            <outlet property="dataSource" destination="7bK-jq-Zjz" id="Gho-Na-rnu"/>
                            <outlet property="delegate" destination="7bK-jq-Zjz" id="RA6-mI-bju"/>
                        </connections>
                    </tableView>
                    <navigationItem key="navigationItem" title="Entries" id="Zdf-7t-Un8"/>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="Rux-fX-hf1" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="709" y="-630"/>
        </scene>
        <!--Navigation Controller-->
        <scene sceneID="r7l-gg-dq7">
            <objects>
                <navigationController id="vC3-pB-5Vb" sceneMemberID="viewController">
                    <navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="DjV-YW-jjY">
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <connections>
                        <segue destination="JEX-9P-axG" kind="relationship" relationship="rootViewController" id="GKi-kA-LjT"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="SLD-UC-DBI" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-45" y="129"/>
        </scene>
    </scenes>
    <inferredMetricsTieBreakers>
        <segue reference="6S0-TO-JiA"/>
    </inferredMetricsTieBreakers>
    <color key="tintColor" red="0.55686274509803924" green="0.26666666666666666" blue="0.67843137254901964" alpha="1" colorSpace="calibratedRGB"/>
</document>

repo_name: valpackett/freepass

repo_language: Rust

mime_type: text/plain


text:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9051"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <animations/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
</document>


text:
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 46;
	objects = {

/* Begin PBXBuildFile section */
		3705C5F31C14597100D36B5B /* Cartography.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3705C5E41C14595B00D36B5B /* Cartography.framework */; };
		3705C5F41C14598300D36B5B /* Cartography.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3705C5E41C14595B00D36B5B /* Cartography.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		3705C5FA1C145A1D00D36B5B /* FieldViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3705C5F91C145A1D00D36B5B /* FieldViewModel.swift */; };
		3705C5FC1C145A4100D36B5B /* FieldCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3705C5FB1C145A4100D36B5B /* FieldCells.swift */; };
		3705C5FE1C14C46900D36B5B /* Field.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3705C5FD1C14C46900D36B5B /* Field.swift */; };
		3705C7181C12511400D36B5B /* HexColor.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3705C7121C12510000D36B5B /* HexColor.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		3705C71E1C1251B000D36B5B /* HexColor.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3705C7121C12510000D36B5B /* HexColor.framework */; };
		3705C7271C1251CE00D36B5B /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3705C7261C1251CE00D36B5B /* Colors.swift */; };
		37259DFD1BFA58FD00D36B5B /* libsodium.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 37259DFC1BFA58FD00D36B5B /* libsodium.a */; };
		3759131B1C88BFFE00D36B5B /* CocoaStuff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759131A1C88BFFE00D36B5B /* CocoaStuff.swift */; };
		376234CB1BFA306700D36B5B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376234CA1BFA306700D36B5B /* AppDelegate.swift */; };
		376234CD1BFA306700D36B5B /* VaultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376234CC1BFA306700D36B5B /* VaultViewController.swift */; };
		376234CF1BFA306700D36B5B /* EntryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376234CE1BFA306700D36B5B /* EntryViewController.swift */; };
		376234D21BFA306700D36B5B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 376234D01BFA306700D36B5B /* Main.storyboard */; };
		376234D41BFA306700D36B5B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 376234D31BFA306700D36B5B /* Assets.xcassets */; };
		376234D71BFA306700D36B5B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 376234D51BFA306700D36B5B /* LaunchScreen.storyboard */; };
		376234E21BFA306800D36B5B /* FreepassTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376234E11BFA306800D36B5B /* FreepassTests.swift */; };
		376234ED1BFA306800D36B5B /* FreepassUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376234EC1BFA306800D36B5B /* FreepassUITests.swift */; };
		37936F161C163CF500D36B5B /* CoreActionSheetPicker.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37936F0F1C163CB800D36B5B /* CoreActionSheetPicker.framework */; };
		37936F171C163CFE00D36B5B /* CoreActionSheetPicker.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37936F0F1C163CB800D36B5B /* CoreActionSheetPicker.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		37CA326C1C077EFB00D36B5B /* SwiftCBOR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37CA32671C077ED900D36B5B /* SwiftCBOR.framework */; };
		37CA326D1C077EFB00D36B5B /* SwiftCBOR.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37CA32671C077ED900D36B5B /* SwiftCBOR.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		37CA32761C10949900D36B5B /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CA32751C10949800D36B5B /* Entry.swift */; };
		37D879071C55117700D36B5B /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37D878E01C55115300D36B5B /* RxSwift.framework */; };
		37D879081C55118F00D36B5B /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37D878E81C55115300D36B5B /* RxCocoa.framework */; };
		37D879091C55176200D36B5B /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37D878E01C55115300D36B5B /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		37D8790A1C55176C00D36B5B /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37D878E81C55115300D36B5B /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		37D8790C1C5517E900D36B5B /* RxStuff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D8790B1C5517E900D36B5B /* RxStuff.swift */; };
		37E74BB31C8887E000D36B5B /* libfreepass_capi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 37259DFE1BFB885900D36B5B /* libfreepass_capi.a */; };
		37E750391BFBB02C00D36B5B /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E750381BFBB02C00D36B5B /* LoginViewController.swift */; };
		37E7503B1BFBCDBC00D36B5B /* Vault.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E7503A1BFBCDBC00D36B5B /* Vault.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		3705C5E31C14595B00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 54C96A11195063CD000CDD27;
			remoteInfo = "Cartography-iOS";
		};
		3705C5E51C14595B00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 54C96A1C195063CD000CDD27;
			remoteInfo = "Cartography-iOS-Tests";
		};
		3705C5E71C14595B00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 54F6A838195C20C100313D24;
			remoteInfo = "Cartography-Mac";
		};
		3705C5E91C14595B00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 54F6A842195C20C200313D24;
			remoteInfo = "Cartography-Mac-Tests";
		};
		3705C5EB1C14595B00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 632F090A1BF1E7AA002431A3;
			remoteInfo = "Cartography-tvOS";
		};
		3705C5ED1C14595B00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 632F09221BF1E7FC002431A3;
			remoteInfo = "Cartography-tvOS-tests";
		};
		3705C5F11C14596A00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = 54C96A10195063CD000CDD27;
			remoteInfo = "Cartography-iOS";
		};
		3705C7111C12510000D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C7061C12510000D36B5B /* HexColor.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 7228B6E619B5353600A81D94;
			remoteInfo = HexColor;
		};
		3705C7131C12510000D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C7061C12510000D36B5B /* HexColor.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 7228B6F119B5353600A81D94;
			remoteInfo = HexColorTests;
		};
		3705C7161C12510E00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 3705C7061C12510000D36B5B /* HexColor.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = 7228B6E519B5353600A81D94;
			remoteInfo = HexColor;
		};
		376234DE1BFA306800D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 376234BF1BFA306700D36B5B /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 376234C61BFA306700D36B5B;
			remoteInfo = Freepass;
		};
		376234E91BFA306800D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 376234BF1BFA306700D36B5B /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 376234C61BFA306700D36B5B;
			remoteInfo = Freepass;
		};
		37936F0E1C163CB800D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37936EFE1C163CB800D36B5B /* CoreActionSheetPicker.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 1CCA90431AE0EFB000368F5E;
			remoteInfo = CoreActionSheetPicker;
		};
		37936F101C163CB800D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37936EFE1C163CB800D36B5B /* CoreActionSheetPicker.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 1CCA904E1AE0EFB000368F5E;
			remoteInfo = CoreActionSheetPickerTests;
		};
		37936F141C163CEC00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37936EFE1C163CB800D36B5B /* CoreActionSheetPicker.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = 1CCA90421AE0EFB000368F5E;
			remoteInfo = CoreActionSheetPicker;
		};
		37CA32661C077ED900D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 37F34C011C0265AD00D36B5B;
			remoteInfo = SwiftCBOR;
		};
		37CA32681C077ED900D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = 37F34C0B1C0265AE00D36B5B;
			remoteInfo = SwiftCBORTests;
		};
		37CA326A1C077EDD00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = 37F34C001C0265AD00D36B5B;
			remoteInfo = SwiftCBOR;
		};
		37CA326E1C077EFB00D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = 37F34C001C0265AD00D36B5B;
			remoteInfo = SwiftCBOR;
		};
		37D878DF1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C8A56AD71AD7424700B4673B;
			remoteInfo = "RxSwift-iOS";
		};
		37D878E11C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C88BB8711B07E5ED0064D411;
			remoteInfo = "RxSwift-OSX";
		};
		37D878E31C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = D2EA280C1BB9B5A200880ED3;
			remoteInfo = "RxSwift-tvOS";
		};
		37D878E51C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C8F0C0021BBBFB8B001B112F;
			remoteInfo = "RxSwift-watchOS";
		};
		37D878E71C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C809396D1B8A71760088E94D;
			remoteInfo = "RxCocoa-iOS";
		};
		37D878E91C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C80939E71B8A71840088E94D;
			remoteInfo = "RxCocoa-OSX";
		};
		37D878EB1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = D2138C751BB9BE9800339B5C;
			remoteInfo = "RxCocoa-tvOS";
		};
		37D878ED1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C8F0C04B1BBBFBB9001B112F;
			remoteInfo = "RxCocoa-watchOS";
		};
		37D878EF1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C8093BC71B8A71F00088E94D;
			remoteInfo = "RxBlocking-iOS";
		};
		37D878F11C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C8093C451B8A71FC0088E94D;
			remoteInfo = "RxBlocking-OSX";
		};
		37D878F31C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = D2EBEB811BB9B99D003A27DC;
			remoteInfo = "RxBlocking-tvOS";
		};
		37D878F51C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C8F0C0581BBBFBCE001B112F;
			remoteInfo = "RxBlocking-watchOS";
		};
		37D878F71C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C88FA50C1C25C44800CCFEA4;
			remoteInfo = "RxTests-iOS";
		};
		37D878F91C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C88FA51D1C25C4B500CCFEA4;
			remoteInfo = "RxTests-OSX";
		};
		37D878FB1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C88FA52E1C25C4C000CCFEA4;
			remoteInfo = "RxTests-tvOS";
		};
		37D878FD1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C88FA53F1C25C4CC00CCFEA4;
			remoteInfo = "RxTests-watchOS";
		};
		37D878FF1C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C83508C31C386F6F0027C24C;
			remoteInfo = "AllTests-iOS";
		};
		37D879011C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C83509841C38740E0027C24C;
			remoteInfo = "AllTests-tvOS";
		};
		37D879031C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C83509941C38742C0027C24C;
			remoteInfo = "AllTests-OSX";
		};
		37D879051C55115300D36B5B /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = C85BA04B1C3878740075D68E;
			remoteInfo = PerformanceTests;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
		37CA32701C077EFB00D36B5B /* Embed Frameworks */ = {
			isa = PBXCopyFilesBuildPhase;
			buildActionMask = 2147483647;
			dstPath = "";
			dstSubfolderSpec = 10;
			files = (
				3705C5F41C14598300D36B5B /* Cartography.framework in Embed Frameworks */,
				37936F171C163CFE00D36B5B /* CoreActionSheetPicker.framework in Embed Frameworks */,
				3705C7181C12511400D36B5B /* HexColor.framework in Embed Frameworks */,
				37D8790A1C55176C00D36B5B /* RxCocoa.framework in Embed Frameworks */,
				37D879091C55176200D36B5B /* RxSwift.framework in Embed Frameworks */,
				37CA326D1C077EFB00D36B5B /* SwiftCBOR.framework in Embed Frameworks */,
			);
			name = "Embed Frameworks";
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
		3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Cartography.xcodeproj; path = Deps/Cartography/Cartography.xcodeproj; sourceTree = "<group>"; };
		3705C5F91C145A1D00D36B5B /* FieldViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FieldViewModel.swift; sourceTree = "<group>"; };
		3705C5FB1C145A4100D36B5B /* FieldCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FieldCells.swift; sourceTree = "<group>"; };
		3705C5FD1C14C46900D36B5B /* Field.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Field.swift; sourceTree = "<group>"; };
		3705C7061C12510000D36B5B /* HexColor.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = HexColor.xcodeproj; path = Deps/HexColor/HexColor.xcodeproj; sourceTree = "<group>"; };
		3705C7261C1251CE00D36B5B /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
		37259DF81BFA462700D36B5B /* Freepass-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Freepass-Bridging-Header.h"; sourceTree = "<group>"; };
		37259DFC1BFA58FD00D36B5B /* libsodium.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsodium.a; path = "../../../../jedisct1/libsodium/libsodium-ios/lib/libsodium.a"; sourceTree = "<group>"; };
		37259DFE1BFB885900D36B5B /* libfreepass_capi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreepass_capi.a; path = ../../capi/target/universal/release/libfreepass_capi.a; sourceTree = "<group>"; };
		3759131A1C88BFFE00D36B5B /* CocoaStuff.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaStuff.swift; sourceTree = "<group>"; };
		376234C71BFA306700D36B5B /* Freepass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Freepass.app; sourceTree = BUILT_PRODUCTS_DIR; };
		376234CA1BFA306700D36B5B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		376234CC1BFA306700D36B5B /* VaultViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VaultViewController.swift; sourceTree = "<group>"; };
		376234CE1BFA306700D36B5B /* EntryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryViewController.swift; sourceTree = "<group>"; };
		376234D11BFA306700D36B5B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
		376234D31BFA306700D36B5B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		376234D61BFA306700D36B5B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		376234D81BFA306700D36B5B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		376234DD1BFA306800D36B5B /* FreepassTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FreepassTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		376234E11BFA306800D36B5B /* FreepassTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreepassTests.swift; sourceTree = "<group>"; };
		376234E31BFA306800D36B5B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		376234E81BFA306800D36B5B /* FreepassUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FreepassUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		376234EC1BFA306800D36B5B /* FreepassUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreepassUITests.swift; sourceTree = "<group>"; };
		376234EE1BFA306800D36B5B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		37936EFE1C163CB800D36B5B /* CoreActionSheetPicker.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CoreActionSheetPicker.xcodeproj; path = Deps/ActionSheetPicker/CoreActionSheetPicker/CoreActionSheetPicker.xcodeproj; sourceTree = "<group>"; };
		37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SwiftCBOR.xcodeproj; path = Deps/SwiftCBOR/SwiftCBOR.xcodeproj; sourceTree = "<group>"; };
		37CA32751C10949800D36B5B /* Entry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Entry.swift; sourceTree = "<group>"; };
		37D878C81C55115200D36B5B /* Rx.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Rx.xcodeproj; path = Deps/RxSwift/Rx.xcodeproj; sourceTree = "<group>"; };
		37D8790B1C5517E900D36B5B /* RxStuff.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxStuff.swift; sourceTree = "<group>"; };
		37E750381BFBB02C00D36B5B /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = "<group>"; };
		37E7503A1BFBCDBC00D36B5B /* Vault.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Vault.swift; sourceTree = "<group>"; };
		37FEE06A1C885B5000D36B5B /* libfreepass_capi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfreepass_capi.a; path = ../../capi/target/universal/debug/libfreepass_capi.a; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		376234C41BFA306700D36B5B /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				37E74BB31C8887E000D36B5B /* libfreepass_capi.a in Frameworks */,
				37259DFD1BFA58FD00D36B5B /* libsodium.a in Frameworks */,
				37CA326C1C077EFB00D36B5B /* SwiftCBOR.framework in Frameworks */,
				37D879071C55117700D36B5B /* RxSwift.framework in Frameworks */,
				37D879081C55118F00D36B5B /* RxCocoa.framework in Frameworks */,
				3705C71E1C1251B000D36B5B /* HexColor.framework in Frameworks */,
				3705C5F31C14597100D36B5B /* Cartography.framework in Frameworks */,
				37936F161C163CF500D36B5B /* CoreActionSheetPicker.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		376234DA1BFA306800D36B5B /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		376234E51BFA306800D36B5B /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		3705C5D51C14595A00D36B5B /* Products */ = {
			isa = PBXGroup;
			children = (
				3705C5E41C14595B00D36B5B /* Cartography.framework */,
				3705C5E61C14595B00D36B5B /* Cartography-iOS-Tests.xctest */,
				3705C5E81C14595B00D36B5B /* Cartography.framework */,
				3705C5EA1C14595B00D36B5B /* Cartography-Mac-Tests.xctest */,
				3705C5EC1C14595B00D36B5B /* Cartography.framework */,
				3705C5EE1C14595B00D36B5B /* Cartography-tvOS-tests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		3705C5F51C1459DF00D36B5B /* Entry */ = {
			isa = PBXGroup;
			children = (
				37CA32751C10949800D36B5B /* Entry.swift */,
				376234CE1BFA306700D36B5B /* EntryViewController.swift */,
				3705C5F81C145A0800D36B5B /* Field */,
			);
			name = Entry;
			sourceTree = "<group>";
		};
		3705C5F61C1459EB00D36B5B /* Vault */ = {
			isa = PBXGroup;
			children = (
				37E7503A1BFBCDBC00D36B5B /* Vault.swift */,
				376234CC1BFA306700D36B5B /* VaultViewController.swift */,
			);
			name = Vault;
			sourceTree = "<group>";
		};
		3705C5F71C1459F800D36B5B /* Login */ = {
			isa = PBXGroup;
			children = (
				37E750381BFBB02C00D36B5B /* LoginViewController.swift */,
			);
			name = Login;
			sourceTree = "<group>";
		};
		3705C5F81C145A0800D36B5B /* Field */ = {
			isa = PBXGroup;
			children = (
				3705C5FD1C14C46900D36B5B /* Field.swift */,
				3705C5F91C145A1D00D36B5B /* FieldViewModel.swift */,
				3705C5FB1C145A4100D36B5B /* FieldCells.swift */,
			);
			name = Field;
			sourceTree = "<group>";
		};
		3705C7071C12510000D36B5B /* Products */ = {
			isa = PBXGroup;
			children = (
				3705C7121C12510000D36B5B /* HexColor.framework */,
				3705C7141C12510000D36B5B /* HexColorTests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		376234BE1BFA306600D36B5B = {
			isa = PBXGroup;
			children = (
				37FEE06A1C885B5000D36B5B /* libfreepass_capi.a */,
				37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */,
				37D878C81C55115200D36B5B /* Rx.xcodeproj */,
				3705C7061C12510000D36B5B /* HexColor.xcodeproj */,
				3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */,
				37936EFE1C163CB800D36B5B /* CoreActionSheetPicker.xcodeproj */,
				37259DFE1BFB885900D36B5B /* libfreepass_capi.a */,
				37259DFC1BFA58FD00D36B5B /* libsodium.a */,
				376234C91BFA306700D36B5B /* Freepass */,
				376234E01BFA306800D36B5B /* FreepassTests */,
				376234EB1BFA306800D36B5B /* FreepassUITests */,
				376234C81BFA306700D36B5B /* Products */,
			);
			sourceTree = "<group>";
		};
		376234C81BFA306700D36B5B /* Products */ = {
			isa = PBXGroup;
			children = (
				376234C71BFA306700D36B5B /* Freepass.app */,
				376234DD1BFA306800D36B5B /* FreepassTests.xctest */,
				376234E81BFA306800D36B5B /* FreepassUITests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		376234C91BFA306700D36B5B /* Freepass */ = {
			isa = PBXGroup;
			children = (
				376234CA1BFA306700D36B5B /* AppDelegate.swift */,
				3705C7261C1251CE00D36B5B /* Colors.swift */,
				37D8790B1C5517E900D36B5B /* RxStuff.swift */,
				3759131A1C88BFFE00D36B5B /* CocoaStuff.swift */,
				3705C5F71C1459F800D36B5B /* Login */,
				3705C5F61C1459EB00D36B5B /* Vault */,
				3705C5F51C1459DF00D36B5B /* Entry */,
				376234D01BFA306700D36B5B /* Main.storyboard */,
				376234D51BFA306700D36B5B /* LaunchScreen.storyboard */,
				376234D81BFA306700D36B5B /* Info.plist */,
				37259DF81BFA462700D36B5B /* Freepass-Bridging-Header.h */,
				376234D31BFA306700D36B5B /* Assets.xcassets */,
			);
			path = Freepass;
			sourceTree = "<group>";
		};
		376234E01BFA306800D36B5B /* FreepassTests */ = {
			isa = PBXGroup;
			children = (
				376234E11BFA306800D36B5B /* FreepassTests.swift */,
				376234E31BFA306800D36B5B /* Info.plist */,
			);
			path = FreepassTests;
			sourceTree = "<group>";
		};
		376234EB1BFA306800D36B5B /* FreepassUITests */ = {
			isa = PBXGroup;
			children = (
				376234EC1BFA306800D36B5B /* FreepassUITests.swift */,
				376234EE1BFA306800D36B5B /* Info.plist */,
			);
			path = FreepassUITests;
			sourceTree = "<group>";
		};
		37936EFF1C163CB800D36B5B /* Products */ = {
			isa = PBXGroup;
			children = (
				37936F0F1C163CB800D36B5B /* CoreActionSheetPicker.framework */,
				37936F111C163CB800D36B5B /* CoreActionSheetPickerTests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		37CA32621C077ED900D36B5B /* Products */ = {
			isa = PBXGroup;
			children = (
				37CA32671C077ED900D36B5B /* SwiftCBOR.framework */,
				37CA32691C077ED900D36B5B /* SwiftCBORTests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		37D878C91C55115200D36B5B /* Products */ = {
			isa = PBXGroup;
			children = (
				37D878E01C55115300D36B5B /* RxSwift.framework */,
				37D878E21C55115300D36B5B /* RxSwift.framework */,
				37D878E41C55115300D36B5B /* RxSwift.framework */,
				37D878E61C55115300D36B5B /* RxSwift.framework */,
				37D878E81C55115300D36B5B /* RxCocoa.framework */,
				37D878EA1C55115300D36B5B /* RxCocoa.framework */,
				37D878EC1C55115300D36B5B /* RxCocoa.framework */,
				37D878EE1C55115300D36B5B /* RxCocoa.framework */,
				37D878F01C55115300D36B5B /* RxBlocking.framework */,
				37D878F21C55115300D36B5B /* RxBlocking.framework */,
				37D878F41C55115300D36B5B /* RxBlocking.framework */,
				37D878F61C55115300D36B5B /* RxBlocking.framework */,
				37D878F81C55115300D36B5B /* RxTests.framework */,
				37D878FA1C55115300D36B5B /* RxTests.framework */,
				37D878FC1C55115300D36B5B /* RxTests.framework */,
				37D878FE1C55115300D36B5B /* RxTests.framework */,
				37D879001C55115300D36B5B /* AllTests-iOS.xctest */,
				37D879021C55115300D36B5B /* AllTests-tvOS.xctest */,
				37D879041C55115300D36B5B /* AllTests-OSX.xctest */,
				37D879061C55115300D36B5B /* PerformanceTests.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		376234C61BFA306700D36B5B /* Freepass */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 376234F11BFA306800D36B5B /* Build configuration list for PBXNativeTarget "Freepass" */;
			buildPhases = (
				376234C31BFA306700D36B5B /* Sources */,
				376234C41BFA306700D36B5B /* Frameworks */,
				376234C51BFA306700D36B5B /* Resources */,
				37CA32701C077EFB00D36B5B /* Embed Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
				37CA326B1C077EDD00D36B5B /* PBXTargetDependency */,
				3705C7171C12510E00D36B5B /* PBXTargetDependency */,
				3705C5F21C14596A00D36B5B /* PBXTargetDependency */,
				37936F151C163CEC00D36B5B /* PBXTargetDependency */,
				37CA326F1C077EFB00D36B5B /* PBXTargetDependency */,
			);
			name = Freepass;
			productName = Freepass;
			productReference = 376234C71BFA306700D36B5B /* Freepass.app */;
			productType = "com.apple.product-type.application";
		};
		376234DC1BFA306800D36B5B /* FreepassTests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 376234F41BFA306800D36B5B /* Build configuration list for PBXNativeTarget "FreepassTests" */;
			buildPhases = (
				376234D91BFA306800D36B5B /* Sources */,
				376234DA1BFA306800D36B5B /* Frameworks */,
				376234DB1BFA306800D36B5B /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				376234DF1BFA306800D36B5B /* PBXTargetDependency */,
			);
			name = FreepassTests;
			productName = FreepassTests;
			productReference = 376234DD1BFA306800D36B5B /* FreepassTests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		376234E71BFA306800D36B5B /* FreepassUITests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 376234F71BFA306800D36B5B /* Build configuration list for PBXNativeTarget "FreepassUITests" */;
			buildPhases = (
				376234E41BFA306800D36B5B /* Sources */,
				376234E51BFA306800D36B5B /* Frameworks */,
				376234E61BFA306800D36B5B /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				376234EA1BFA306800D36B5B /* PBXTargetDependency */,
			);
			name = FreepassUITests;
			productName = FreepassUITests;
			productReference = 376234E81BFA306800D36B5B /* FreepassUITests.xctest */;
			productType = "com.apple.product-type.bundle.ui-testing";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		376234BF1BFA306700D36B5B /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 0710;
				LastUpgradeCheck = 0710;
				ORGANIZATIONNAME = unrelenting.technology;
				TargetAttributes = {
					376234C61BFA306700D36B5B = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeam = Y53B7HVFA3;
					};
					376234DC1BFA306800D36B5B = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeam = 644G8932B4;
						TestTargetID = 376234C61BFA306700D36B5B;
					};
					376234E71BFA306800D36B5B = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeam = 644G8932B4;
						TestTargetID = 376234C61BFA306700D36B5B;
					};
				};
			};
			buildConfigurationList = 376234C21BFA306700D36B5B /* Build configuration list for PBXProject "Freepass" */;
			compatibilityVersion = "Xcode 3.2";
			developmentRegion = English;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = 376234BE1BFA306600D36B5B;
			productRefGroup = 376234C81BFA306700D36B5B /* Products */;
			projectDirPath = "";
			projectReferences = (
				{
					ProductGroup = 3705C5D51C14595A00D36B5B /* Products */;
					ProjectRef = 3705C5D41C14595A00D36B5B /* Cartography.xcodeproj */;
				},
				{
					ProductGroup = 37936EFF1C163CB800D36B5B /* Products */;
					ProjectRef = 37936EFE1C163CB800D36B5B /* CoreActionSheetPicker.xcodeproj */;
				},
				{
					ProductGroup = 3705C7071C12510000D36B5B /* Products */;
					ProjectRef = 3705C7061C12510000D36B5B /* HexColor.xcodeproj */;
				},
				{
					ProductGroup = 37D878C91C55115200D36B5B /* Products */;
					ProjectRef = 37D878C81C55115200D36B5B /* Rx.xcodeproj */;
				},
				{
					ProductGroup = 37CA32621C077ED900D36B5B /* Products */;
					ProjectRef = 37CA32611C077ED900D36B5B /* SwiftCBOR.xcodeproj */;
				},
			);
			projectRoot = "";
			targets = (
				376234C61BFA306700D36B5B /* Freepass */,
				376234DC1BFA306800D36B5B /* FreepassTests */,
				376234E71BFA306800D36B5B /* FreepassUITests */,
			);
		};
/* End PBXProject section */

/* Begin PBXReferenceProxy section */
		3705C5E41C14595B00D36B5B /* Cartography.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = Cartography.framework;
			remoteRef = 3705C5E31C14595B00D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C5E61C14595B00D36B5B /* Cartography-iOS-Tests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "Cartography-iOS-Tests.xctest";
			remoteRef = 3705C5E51C14595B00D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C5E81C14595B00D36B5B /* Cartography.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = Cartography.framework;
			remoteRef = 3705C5E71C14595B00D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C5EA1C14595B00D36B5B /* Cartography-Mac-Tests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "Cartography-Mac-Tests.xctest";
			remoteRef = 3705C5E91C14595B00D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C5EC1C14595B00D36B5B /* Cartography.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = Cartography.framework;
			remoteRef = 3705C5EB1C14595B00D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C5EE1C14595B00D36B5B /* Cartography-tvOS-tests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "Cartography-tvOS-tests.xctest";
			remoteRef = 3705C5ED1C14595B00D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C7121C12510000D36B5B /* HexColor.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = HexColor.framework;
			remoteRef = 3705C7111C12510000D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		3705C7141C12510000D36B5B /* HexColorTests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = HexColorTests.xctest;
			remoteRef = 3705C7131C12510000D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37936F0F1C163CB800D36B5B /* CoreActionSheetPicker.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = CoreActionSheetPicker.framework;
			remoteRef = 37936F0E1C163CB800D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37936F111C163CB800D36B5B /* CoreActionSheetPickerTests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = CoreActionSheetPickerTests.xctest;
			remoteRef = 37936F101C163CB800D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37CA32671C077ED900D36B5B /* SwiftCBOR.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = SwiftCBOR.framework;
			remoteRef = 37CA32661C077ED900D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37CA32691C077ED900D36B5B /* SwiftCBORTests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = SwiftCBORTests.xctest;
			remoteRef = 37CA32681C077ED900D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878E01C55115300D36B5B /* RxSwift.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxSwift.framework;
			remoteRef = 37D878DF1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878E21C55115300D36B5B /* RxSwift.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxSwift.framework;
			remoteRef = 37D878E11C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878E41C55115300D36B5B /* RxSwift.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxSwift.framework;
			remoteRef = 37D878E31C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878E61C55115300D36B5B /* RxSwift.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxSwift.framework;
			remoteRef = 37D878E51C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878E81C55115300D36B5B /* RxCocoa.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxCocoa.framework;
			remoteRef = 37D878E71C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878EA1C55115300D36B5B /* RxCocoa.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxCocoa.framework;
			remoteRef = 37D878E91C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878EC1C55115300D36B5B /* RxCocoa.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxCocoa.framework;
			remoteRef = 37D878EB1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878EE1C55115300D36B5B /* RxCocoa.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxCocoa.framework;
			remoteRef = 37D878ED1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878F01C55115300D36B5B /* RxBlocking.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxBlocking.framework;
			remoteRef = 37D878EF1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878F21C55115300D36B5B /* RxBlocking.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxBlocking.framework;
			remoteRef = 37D878F11C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878F41C55115300D36B5B /* RxBlocking.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxBlocking.framework;
			remoteRef = 37D878F31C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878F61C55115300D36B5B /* RxBlocking.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxBlocking.framework;
			remoteRef = 37D878F51C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878F81C55115300D36B5B /* RxTests.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxTests.framework;
			remoteRef = 37D878F71C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878FA1C55115300D36B5B /* RxTests.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxTests.framework;
			remoteRef = 37D878F91C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878FC1C55115300D36B5B /* RxTests.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxTests.framework;
			remoteRef = 37D878FB1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D878FE1C55115300D36B5B /* RxTests.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = RxTests.framework;
			remoteRef = 37D878FD1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D879001C55115300D36B5B /* AllTests-iOS.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "AllTests-iOS.xctest";
			remoteRef = 37D878FF1C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D879021C55115300D36B5B /* AllTests-tvOS.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "AllTests-tvOS.xctest";
			remoteRef = 37D879011C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D879041C55115300D36B5B /* AllTests-OSX.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "AllTests-OSX.xctest";
			remoteRef = 37D879031C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		37D879061C55115300D36B5B /* PerformanceTests.app */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.application;
			path = PerformanceTests.app;
			remoteRef = 37D879051C55115300D36B5B /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
/* End PBXReferenceProxy section */

/* Begin PBXResourcesBuildPhase section */
		376234C51BFA306700D36B5B /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				376234D71BFA306700D36B5B /* LaunchScreen.storyboard in Resources */,
				376234D41BFA306700D36B5B /* Assets.xcassets in Resources */,
				376234D21BFA306700D36B5B /* Main.storyboard in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		376234DB1BFA306800D36B5B /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		376234E61BFA306800D36B5B /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		376234C31BFA306700D36B5B /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				3705C5FE1C14C46900D36B5B /* Field.swift in Sources */,
				37CA32761C10949900D36B5B /* Entry.swift in Sources */,
				37E750391BFBB02C00D36B5B /* LoginViewController.swift in Sources */,
				37D8790C1C5517E900D36B5B /* RxStuff.swift in Sources */,
				3759131B1C88BFFE00D36B5B /* CocoaStuff.swift in Sources */,
				376234CF1BFA306700D36B5B /* EntryViewController.swift in Sources */,
				3705C7271C1251CE00D36B5B /* Colors.swift in Sources */,
				376234CD1BFA306700D36B5B /* VaultViewController.swift in Sources */,
				3705C5FC1C145A4100D36B5B /* FieldCells.swift in Sources */,
				376234CB1BFA306700D36B5B /* AppDelegate.swift in Sources */,
				37E7503B1BFBCDBC00D36B5B /* Vault.swift in Sources */,
				3705C5FA1C145A1D00D36B5B /* FieldViewModel.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		376234D91BFA306800D36B5B /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				376234E21BFA306800D36B5B /* FreepassTests.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		376234E41BFA306800D36B5B /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				376234ED1BFA306800D36B5B /* FreepassUITests.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		3705C5F21C14596A00D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = "Cartography-iOS";
			targetProxy = 3705C5F11C14596A00D36B5B /* PBXContainerItemProxy */;
		};
		3705C7171C12510E00D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = HexColor;
			targetProxy = 3705C7161C12510E00D36B5B /* PBXContainerItemProxy */;
		};
		376234DF1BFA306800D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 376234C61BFA306700D36B5B /* Freepass */;
			targetProxy = 376234DE1BFA306800D36B5B /* PBXContainerItemProxy */;
		};
		376234EA1BFA306800D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 376234C61BFA306700D36B5B /* Freepass */;
			targetProxy = 376234E91BFA306800D36B5B /* PBXContainerItemProxy */;
		};
		37936F151C163CEC00D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = CoreActionSheetPicker;
			targetProxy = 37936F141C163CEC00D36B5B /* PBXContainerItemProxy */;
		};
		37CA326B1C077EDD00D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = SwiftCBOR;
			targetProxy = 37CA326A1C077EDD00D36B5B /* PBXContainerItemProxy */;
		};
		37CA326F1C077EFB00D36B5B /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = SwiftCBOR;
			targetProxy = 37CA326E1C077EFB00D36B5B /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		376234D01BFA306700D36B5B /* Main.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				376234D11BFA306700D36B5B /* Base */,
			);
			name = Main.storyboard;
			sourceTree = "<group>";
		};
		376234D51BFA306700D36B5B /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				376234D61BFA306700D36B5B /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		376234EF1BFA306800D36B5B /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				FRAMEWORK_SEARCH_PATHS = "";
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		376234F01BFA306800D36B5B /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				FRAMEWORK_SEARCH_PATHS = "";
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		376234F21BFA306800D36B5B /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
				CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
				CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
				CLANG_ENABLE_MODULES = YES;
				CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
				ENABLE_BITCODE = NO;
				HEADER_SEARCH_PATHS = ../../capi;
				INFOPLIST_FILE = Freepass/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
				LIBRARY_SEARCH_PATHS = (
					"../../libsodium/libsodium-ios/lib",
					../../capi/target/universal/release,
				);
				PRODUCT_BUNDLE_IDENTIFIER = technology.unrelenting.FreepassForiOS;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_OBJC_BRIDGING_HEADER = "Freepass/Freepass-Bridging-Header.h";
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				VALID_ARCHS = "arm64 armv7";
			};
			name = Debug;
		};
		376234F31BFA306800D36B5B /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
				CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
				CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
				CLANG_ENABLE_MODULES = YES;
				CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
				ENABLE_BITCODE = NO;
				HEADER_SEARCH_PATHS = ../../capi;
				INFOPLIST_FILE = Freepass/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
				LIBRARY_SEARCH_PATHS = (
					"../../libsodium/libsodium-ios/lib",
					../../capi/target/universal/release,
				);
				PRODUCT_BUNDLE_IDENTIFIER = technology.unrelenting.FreepassForiOS;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_OBJC_BRIDGING_HEADER = "Freepass/Freepass-Bridging-Header.h";
				VALID_ARCHS = "arm64 armv7";
			};
			name = Release;
		};
		376234F51BFA306800D36B5B /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				BUNDLE_LOADER = "$(TEST_HOST)";
				HEADER_SEARCH_PATHS = ../../capi;
				INFOPLIST_FILE = FreepassTests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				LIBRARY_SEARCH_PATHS = (
					"../../libsodium/libsodium-ios/lib",
					../../capi/target/universal/release,
				);
				PRODUCT_BUNDLE_IDENTIFIER = technology.unrelenting.FreepassTests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Freepass.app/Freepass";
			};
			name = Debug;
		};
		376234F61BFA306800D36B5B /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				BUNDLE_LOADER = "$(TEST_HOST)";
				HEADER_SEARCH_PATHS = ../../capi;
				INFOPLIST_FILE = FreepassTests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				LIBRARY_SEARCH_PATHS = (
					"../../libsodium/libsodium-ios/lib",
					../../capi/target/universal/release,
				);
				PRODUCT_BUNDLE_IDENTIFIER = technology.unrelenting.FreepassTests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Freepass.app/Freepass";
			};
			name = Release;
		};
		376234F81BFA306800D36B5B /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				HEADER_SEARCH_PATHS = ../../capi;
				INFOPLIST_FILE = FreepassUITests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				LIBRARY_SEARCH_PATHS = (
					"../../libsodium/libsodium-ios/lib",
					../../capi/target/universal/release,
				);
				PRODUCT_BUNDLE_IDENTIFIER = technology.unrelenting.FreepassUITests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TEST_TARGET_NAME = Freepass;
				USES_XCTRUNNER = YES;
			};
			name = Debug;
		};
		376234F91BFA306800D36B5B /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				HEADER_SEARCH_PATHS = ../../capi;
				INFOPLIST_FILE = FreepassUITests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
				LIBRARY_SEARCH_PATHS = (
					"../../libsodium/libsodium-ios/lib",
					../../capi/target/universal/release,
				);
				PRODUCT_BUNDLE_IDENTIFIER = technology.unrelenting.FreepassUITests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TEST_TARGET_NAME = Freepass;
				USES_XCTRUNNER = YES;
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		376234C21BFA306700D36B5B /* Build configuration list for PBXProject "Freepass" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				376234EF1BFA306800D36B5B /* Debug */,
				376234F01BFA306800D36B5B /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		376234F11BFA306800D36B5B /* Build configuration list for PBXNativeTarget "Freepass" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				376234F21BFA306800D36B5B /* Debug */,
				376234F31BFA306800D36B5B /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		376234F41BFA306800D36B5B /* Build configuration list for PBXNativeTarget "FreepassTests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				376234F51BFA306800D36B5B /* Debug */,
				376234F61BFA306800D36B5B /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		376234F71BFA306800D36B5B /* Build configuration list for PBXNativeTarget "FreepassUITests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				376234F81BFA306800D36B5B /* Debug */,
				376234F91BFA306800D36B5B /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 376234BF1BFA306700D36B5B /* Project object */;
}


text:
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:Freepass.xcodeproj">
   </FileRef>
</Workspace>


text:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>BNDL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1</string>
</dict>
</plist>


text:
import XCTest
@testable import Freepass

class FreepassTests: XCTestCase {

	override func setUp() {
		super.setUp()
		// Put setup code here. This method is called before the invocation of each test method in the class.
	}

	override func tearDown() {
		// Put teardown code here. This method is called after the invocation of each test method in the class.
		super.tearDown()
	}

	func testExample() {
		// This is an example of a functional test case.
		// Use XCTAssert and related functions to verify your tests produce the correct results.
	}

	func testPerformanceMasterKeyDerivation() {
		self.measureBlock {
			let mkey = rusterpassword_gen_master_key("Correct Horse Battery Staple", "Cosima Niehaus")
			rusterpassword_free_master_key(mkey)
		}
	}

}


text:
import XCTest

class FreepassUITests: XCTestCase {

	override func setUp() {
		super.setUp()

		// Put setup code here. This method is called before the invocation of each test method in the class.

		// In UI tests it is usually best to stop immediately when a failure occurs.
		continueAfterFailure = false
		// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
		XCUIApplication().launch()

		// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
	}

	override func tearDown() {
		// Put teardown code here. This method is called after the invocation of each test method in the class.
		super.tearDown()
	}

	func testExample() {
		// Use recording to get started writing UI tests.
		// Use XCTAssert and related functions to verify your tests produce the correct results.
	}

}


text:
[package]
name = "freepass-cli"
version = "0.0.0"
authors = [ "Greg V <greg@unrelenting.technology>" ]
keywords = [ "Security", "Password", "MasterPassword" ]
description = "Freepass password/auth manager: CLI (command line interface)"
license = "Unlicense"
readme = "README.md"
homepage = "https://github.com/myfreeweb/freepass"
repository = "https://github.com/myfreeweb/freepass"

[[bin]]
name = "freepass"

[dependencies]
freepass-core = { version = "0", path = "../core", features = ["keepass"] }
secstr = { version = "0.3", features = ["serde", "libsodium-sys"] }
sodiumoxide = "0"
rusterpassword = "0"
colorhash256 = "0"
interactor = "0.1.1"
serde = "1"
serde_cbor = "0.6"
base64 = "0"
hex = "0"
ansi_term = "0"
clap = "2"
#fuse = "0.3"
csv = "1"


text:
# freepass-cli [![unlicense](https://img.shields.io/badge/un-license-green.svg?style=flat)](http://unlicense.org)

The free password manager for power users: UNIX edition (command line… but not just command line).

![CLI screencast gif](https://unrelenting.technology/pub/screens/freepass-cli.gif)

## Installation

You need to install [libsodium](https://download.libsodium.org/doc/) on your system first.

Your system's package manager probably has it:

```bash
$ sudo pkg install libsodium
```

Building from source is easy with [cargo](https://crates.io):

```bash
$ cargo build --release
$ strip target/release/freepass
$ mv target/release/freepass ~/.local/bin
```

(or something... `~/.local/bin` must be on your path of course)

Binary builds will probably be available in the future.

## Usage

The `freepass` binary takes your full name as the `-n` / `--name` option or the `$FREEPASS_NAME` environment variable.
And the file you want to use as the `-f` / `--file` option or the `$FREEPASS_FILE` environment variable.
If the file doesn't exist, it will be created!

The `freepass` binary has several subcommands, you can see them all by running:
```bash
$ freepass help
```

But the most important one (and the default one) is `interact`.
It launches *interactive mode*: you'll interact with `freepass` using a menu, a password prompt and a text prompt.

It has built-in command line implementations of all three interactions, but that's not fun.
You can replace each one with an external program!

That's where the "not just command line" bit comes from.
On the command line, you can use the built-in password prompt (which is pretty nice, it displays a [colorhash] of your password after you've entered enough characters) and a fuzzy finder tool like [peco] or [fzf] for the menus.
(See [interactor]'s README for a list of these programs.)
But in X11, you can use [rofi] or [dmenu] for the menus and text prompts, and something like `x11-ssh-askpass` for the password prompt!

Here's an example shell script for a fully X11 experience with [rofi], `x11-ssh-askpass`, `xclip` and `notify-send`:

```bash
#!/bin/sh

NAME="Chloe Price"
FILES_DIR="$HOME/Personal"
ROFI_SETTINGS="-dmenu -fuzzy"

if [ "$FREEPASS_MODE" = "MENU" ]; then
	exec rofi $ROFI_SETTINGS -p 'freepass> '
elif [ "$FREEPASS_MODE" = "TEXT" ]; then
	exec rofi $ROFI_SETTINGS -p "$FREEPASS_PROMPT: "
else
	FREEPASS_NAME="$NAME" \
	FREEPASS_MENU="freepass-x11" \    # Path to THIS SCRIPT!!!
	FREEPASS_ASKTEXT="freepass-x11" \ # Same
	FREEPASS_ASKPASS="x11-ssh-askpass" \
	FREEPASS_FILE="$FILES_DIR/`ls $FILES_DIR | grep .fpass | rofi $ROFI_SETTINGS -p 'freepass file: '`" \ # Select .fpass files from $FILES_DIR
	freepass | (while read -r line; do
		echo -n "$line" | xclip
		notify-send -u low "Copied to clipboard!"
	done)
fi
```

Put it into `~/.local/bin` as `freepass-x11`, make sure `~/.local/bin` is on your `$PATH`, bind it to a hotkey using [sxhkd]...
Do whatever you want, really :-)

![X11 screencast gif](https://unrelenting.technology/pub/screens/freepass-x11.gif)

[colorhash]: https://github.com/myfreeweb/colorhash256
[peco]: https://github.com/peco/peco
[fzf]: https://github.com/junegunn/fzf
[interactor]: https://github.com/myfreeweb/interactor
[rofi]: https://github.com/DaveDavenport/rofi
[dmenu]: http://tools.suckless.org/dmenu/
[sxhkd]: https://github.com/baskerville/sxhkd

## Project-related stuff

See `../README.md`.


text:
use std::{fs, io};
use secstr::SecStr;
use rusterpassword::gen_master_key;
use freepass_core::encvault::*;

pub struct OpenFile {
    pub vault: DecryptedVault,
    pub master_key: SecStr,
    pub file_path: String,
}

impl OpenFile {
    pub fn open(file_path: String, user_name: &str, password: SecStr, need_write: bool) -> OpenFile {
        let file = match fs::OpenOptions::new()
                  .read(true)
                  .write(need_write)
                  .open(&file_path) {
            Ok(file) => Some(file),
            Err(ref err) if err.kind() == io::ErrorKind::NotFound => None,
            Err(ref err) => panic!("Could not open file {}: {}", &file_path, err),
        };
        let master_key = gen_master_key(password, user_name).unwrap();
        OpenFile {
            vault: match file {
                Some(f) => DecryptedVault::open(gen_entries_key(&master_key), gen_outer_key(&master_key), f).expect("Couldn't read/decrypt freepass vault"),
                None => DecryptedVault::new(gen_entries_key(&master_key), gen_outer_key(&master_key)),
            },
            master_key: master_key,
            file_path: file_path,
        }
    }

    pub fn save(self: &mut OpenFile) {
        // Atomic save!
        self.vault
            .save(fs::File::create(format!("{}.tmp", &self.file_path)).unwrap())
            .unwrap();
        fs::rename(format!("{}.tmp", &self.file_path), &self.file_path).unwrap();
    }
}