Full Code of Nike-Inc/SQift for AI

master 3014ab40dac3
79 files
574.7 KB
146.1k tokens
Showing preview only (603K chars total). The displayed content is truncated. Use the JSON API for full output.
Repository: Nike-Inc/SQift
Branch: master
Commit: 3014ab40dac3
Files: 79
Total size: 574.7 KB

Directory structure:
gitextract_d_hd5gf5/

├── .gitignore
├── .gitmodules
├── .ruby-version
├── .swiftpm/
│   └── xcode/
│       └── package.xcworkspace/
│           └── contents.xcworkspacedata
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Documentation/
│   └── SQift 4.0 Migration Guide.md
├── Gemfile
├── LICENSE
├── NOTICE
├── Package.swift
├── README.md
├── SQift.podspec
├── SQift.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── xcshareddata/
│       └── xcschemes/
│           ├── Cleanup Whitespace.xcscheme
│           ├── SQift iOS CI.xcscheme
│           ├── SQift iOS.xcscheme
│           ├── SQift macOS CI.xcscheme
│           ├── SQift macOS.xcscheme
│           ├── SQift tvOS CI.xcscheme
│           ├── SQift tvOS.xcscheme
│           └── SQift watchOS.xcscheme
├── Source/
│   ├── Connection/
│   │   ├── Connection.swift
│   │   ├── ConnectionPool.swift
│   │   ├── ConnectionQueue.swift
│   │   ├── Functions/
│   │   │   ├── Authorizer.swift
│   │   │   ├── Backup.swift
│   │   │   ├── Busy.swift
│   │   │   ├── Checkpoint.swift
│   │   │   ├── Collation.swift
│   │   │   ├── Function.swift
│   │   │   ├── Hook.swift
│   │   │   ├── Query.swift
│   │   │   ├── Trace.swift
│   │   │   └── Transaction.swift
│   │   └── Statement.swift
│   ├── Database/
│   │   ├── Database.swift
│   │   ├── Migrator.swift
│   │   ├── StorageLocation.swift
│   │   └── TableLockPolicy.swift
│   ├── Errors/
│   │   ├── ExpressibleByRowError.swift
│   │   └── SQLiteError.swift
│   ├── Extensions/
│   │   └── StringExtension.swift
│   ├── Row/
│   │   ├── Binding.swift
│   │   └── Row.swift
│   └── Supporting Files/
│       ├── Info.plist
│       └── SQift.h
└── Tests/
    ├── Extensions/
    │   ├── DispatchQueueExtension.swift
    │   ├── FileManagerExtension.swift
    │   └── ProcessInfoExtension.swift
    ├── Helpers/
    │   └── TestTables.swift
    ├── Supporting Files/
    │   └── Info.plist
    └── Tests/
        ├── BaseTestCase.swift
        ├── Connection/
        │   ├── ConnectionPoolTests.swift
        │   ├── ConnectionQueueTests.swift
        │   ├── ConnectionTests.swift
        │   ├── Functions/
        │   │   ├── AuthorizerTests.swift
        │   │   ├── BackupTests.swift
        │   │   ├── BusyTests.swift
        │   │   ├── CheckpointTests.swift
        │   │   ├── CollationTests.swift
        │   │   ├── FunctionTests.swift
        │   │   ├── HookTests.swift
        │   │   ├── QueryTests.swift
        │   │   ├── TraceTests.swift
        │   │   └── TransactionTests.swift
        │   └── StatementTests.swift
        ├── Database/
        │   ├── DatabaseTests.swift
        │   ├── MigratorTests.swift
        │   └── TableLockPolicyTests.swift
        ├── Errors/
        │   ├── ExpressibleByRowErrorTests.swift
        │   └── SQLiteErrorTests.swift
        ├── Extensions/
        │   └── StringExtensionTests.swift
        └── Rows/
            ├── BindingTests.swift
            └── RowTests.swift

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Mac OS X
.DS_Store

# Xcode

## Build generated
build/
DerivedData

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata

## Other
*.xccheckout
*.moved-aside
*.xcuserstate
*.xcscmblueprint

## Obj-C/Swift specific
*.hmap
*.ipa

# Carthage
Carthage/Build

# Swift Package Manager
.build

================================================
FILE: .gitmodules
================================================


================================================
FILE: .ruby-version
================================================
3.3.0


================================================
FILE: .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:">
   </FileRef>
</Workspace>


================================================
FILE: .travis.yml
================================================
os: osx
osx_image: xcode10.2
branches:
  only:
    - master

env:
  global:
  - LC_CTYPE=en_US.UTF-8
  - LANG=en_US.UTF-8
  - PROJECT=SQift.xcodeproj
  - IOS_FRAMEWORK_SCHEME="SQift iOS CI"
  - MACOS_FRAMEWORK_SCHEME="SQift macOS CI"
  - TVOS_FRAMEWORK_SCHEME="SQift tvOS CI"
  - WATCHOS_FRAMEWORK_SCHEME="SQift watchOS"
  matrix:
    - DESTINATION="OS=12.2,name=iPhone XS"                  SCHEME="$IOS_FRAMEWORK_SCHEME"     RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="YES"
    - DESTINATION="OS=11.3,name=iPhone X"                   SCHEME="$IOS_FRAMEWORK_SCHEME"     RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO"
    - DESTINATION="OS=10.3.1,name=iPhone 7"                 SCHEME="$IOS_FRAMEWORK_SCHEME"     RUN_TESTS="YES" BUILD_EXAMPLE="YES" POD_LINT="NO"
    - DESTINATION="arch=x86_64"                             SCHEME="$MACOS_FRAMEWORK_SCHEME"   RUN_TESTS="YES" BUILD_EXAMPLE="NO"  POD_LINT="NO"
    - DESTINATION="OS=12.2,name=Apple TV 4K"                SCHEME="$TVOS_FRAMEWORK_SCHEME"    RUN_TESTS="YES" BUILD_EXAMPLE="NO"  POD_LINT="NO"
    - DESTINATION="OS=5.2,name=Apple Watch Series 4 - 44mm" SCHEME="$WATCHOS_FRAMEWORK_SCHEME" RUN_TESTS="NO"  BUILD_EXAMPLE="NO"  POD_LINT="NO"

before_install:
  - gem update bundler

script:
  - set -o pipefail
  - rvm list
  - which ruby
  - bundle exec gem list
  - bundle exec pod --version
  - bundle exec xcpretty --version
  - xcodebuild -version
  - xcodebuild -showsdks

  # Build Framework in Debug and Run Tests if specified
  - if [ $RUN_TESTS == "YES" ]; then
      xcodebuild -project "$PROJECT" -scheme "$SCHEME" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=YES ENABLE_TESTABILITY=YES test | bundle exec xcpretty -c;
    else
      xcodebuild -project "$PROJECT" -scheme "$SCHEME" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO build | bundle exec xcpretty -c;
    fi

  # Build Framework in Release and Run Tests if specified
  - if [ $RUN_TESTS == "YES" ]; then
      xcodebuild -project "$PROJECT" -scheme "$SCHEME" -destination "$DESTINATION" -configuration Release ONLY_ACTIVE_ARCH=NO ENABLE_TESTABILITY=YES test | bundle exec xcpretty -c;
    else
      xcodebuild -project "$PROJECT" -scheme "$SCHEME" -destination "$DESTINATION" -configuration Release ONLY_ACTIVE_ARCH=NO build | bundle exec xcpretty -c;
    fi

  # Run `pod lib lint` if specified
  - if [ $POD_LINT == "YES" ]; then
      bundle exec pod lib lint;
    fi


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.
`SQift` adheres to [Semantic Versioning](http://semver.org/).

#### 5.x Releases

- `5.0.x` Releases - [5.0.0](#500) | [5.0.1](#501)

#### 4.x Releases

- `4.1.x` Releases - [4.1.0](#410)
- `4.0.x` Releases - [4.0.0](#400)

#### 3.x Releases

- `3.3.x` Releases - [3.3.0](#330)
- `3.2.x` Releases - [3.2.0](#320) | | [3.2.1](#321)
- `3.1.x` Releases - [3.1.0](#310)
- `3.0.x` Releases - [3.0.0](#300) | [3.0.1](#301)

#### 2.x Releases

- `2.1.x` Releases - [2.1.0](#210) | [2.1.1](#211)
- `2.0.x` Releases - [2.0.0](#200)

#### 1.x Releases

- `1.1.x` Releases - [1.1.0](#110) | [1.1.1](#111) | [1.1.2](#112)
- `1.0.x` Releases - [1.0.0](#100)

#### 0.x Releases

- `0.9.x` Releases - [0.9.0](#090)
- `0.8.x` Releases - [0.8.0](#080)
- `0.7.x` Releases - [0.7.0](#070) | [0.7.1](#071)
- `0.6.x` Releases - [0.6.0](#060) | [0.6.1](#061)
- `0.5.x` Releases - [0.5.0](#050)
- `0.4.x` Releases - [0.4.0](#040)
- `0.3.x` Releases - [0.3.0](#030)
- `0.2.x` Releases - [0.2.0](#020)
- `0.1.x` Releases - [0.1.0](#010)

---

## [5.1](https://github.com/Nike-Inc/SQift/releases/tag/5.1)

Released on 2024-01-18.

#### Added

- Swift Package Manager Support
  - Added by [Ben Scheirman](https://github.com/subdigital) in Pull Request [#40](https://github.com/Nike-Inc/SQift/pull/40)

#### Fixed

## [5.0.1](https://github.com/Nike-Inc/SQift/releases/tag/5.0.1)

Released on 2019-10-25. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/12?closed=1).

#### Fixed

- Issue where Carthage was unable to build SQift due to schemes requiring test suite compilation.
  - Fixed by [William Thompson](https://github.com/eSpecialized) in Pull Request [#28](https://github.com/Nike-Inc/SQift/pull/28).
- Issue in Xcode project Documentation group where links were invalid and README links were broken.
  - Fixed by [James Eisenhauer](https://github.com/jimmyeisenhauer) in Pull Request [#30](https://github.com/Nike-Inc/SQift/pull/30).
- Compiler warnings in `Function.swift` picked up by Xcode 11.
   - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#31](https://github.com/Nike-Inc/SQift/pull/31).

## [5.0.0](https://github.com/Nike-Inc/SQift/releases/tag/5.0.0)

Released on 2019-04-30. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/10?closed=1).

#### Updated

-  Dropped Swift 4.2 support.
   - Updated by [William Thompson](https://github.com/eSpecialized) in Pull Request [#19](https://github.com/Nike-Inc/SQift/pull/19).

---

## [4.1.0](https://github.com/Nike-Inc/SQift/releases/tag/4.1.0)

Released on 2019-04-30. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/8?closed=1).

#### Updated

- To Swift 5 with backwards compatibility to Swift 4.2.
   - Updated by [William Thompson](https://github.com/eSpecialized) in Pull Request [#18](https://github.com/Nike-Inc/SQift/pull/18).
- Deployment targets to watchOS 3.0 and tvOS 10.0 in Xcode project to match podspec.
   - Updated by [William Thompson](https://github.com/eSpecialized) in Pull Request [#18](https://github.com/Nike-Inc/SQift/pull/18).

---

## [4.0.0](https://github.com/Nike-Inc/SQift/releases/tag/4.0.0)

Released on 2018-11-30. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/7?closed=1).

#### Added

- Migration Guide for SQift 4 and added it to the README.
  - Added by [Jereme Claussen](https://github.com/jereme) in Pull Request [#16](https://github.com/Nike-Inc/SQift/pull/16).

#### Updated

- Deployment targets to iOS 9.0, Mac OSX 10.11, WatchOS 2.0 and tvOS 9.0.
  - Updated by [Jereme Claussen](https://github.com/jereme) in Pull Request [#16](https://github.com/Nike-Inc/SQift/pull/16).

#### Removed

- `Connection.trace` in favor of `Connection.traceEvent()`
  - Removed by [Jereme Claussen](https://github.com/jereme) in Pull Request [#16](https://github.com/Nike-Inc/SQift/pull/16).

---

## [3.3.0](https://github.com/Nike-Inc/SQift/releases/tag/3.3.0)

Released on 2018-11-30. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/5?closed=1).

#### Deprecated

- The `trace` API to prepare for 4.0 migration since the internal `sqlite3_trace` API is deprecated when bumping deployment targets.
  - Deprecated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#15](https://github.com/Nike-Inc/SQift/pull/15).

---

## [3.2.1](https://github.com/Nike-Inc/SQift/releases/tag/3.2.1)

Released on 2018-09-17. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/6?closed=1).

#### Added

- An internal initializer to `SQLiteError` to assist in error mocking for testing.
  - Added by [Christian Noon](https://github.com/cnoon).

#### Updated

- The Xcode project to use Xcode 9.3 compatibility mode.
  - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#10](https://github.com/Nike-Inc/SQift/pull/10).
- The Xcode project to support Xcode 10 and Swift 4.2.
  - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#10](https://github.com/Nike-Inc/SQift/pull/10).
- The Travis-CI YAML file to use `bundler` and Xcode 10.
  - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#10](https://github.com/Nike-Inc/SQift/pull/10).

## [3.2.0](https://github.com/Nike-Inc/SQift/releases/tag/3.2.0)

Released on 2018-05-02. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/3?closed=1).

#### Added

- A new `TableLockPolicy` to handle table lock errors on `execute`, `prepare`, and `step` operations.
  - Added by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#7](https://github.com/Nike-Inc/SQift/pull/7).

#### Updated

- The test suite by replacing `do-catch` implementations with `throws` test API variants and unhelpful assertion strings.
  - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#8](https://github.com/Nike-Inc/SQift/pull/8).

---

## [3.1.0](https://github.com/Nike-Inc/SQift/releases/tag/3.1.0)

Released on 2018-04-10. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/2?closed=1).

#### Updated

- The Xcode project and Travis CI to support Xcode 9.3.
  - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#6](https://github.com/Nike-Inc/SQift/pull/6).

#### Fixed

- Compiler warnings in aggregate context generation due to Swift 4.1 compiler.
  - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#6](https://github.com/Nike-Inc/SQift/pull/6).
- Compiler warnings in `CodableBinding` protocol extension with associated type typealias.
  - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#6](https://github.com/Nike-Inc/SQift/pull/6).

---

## [3.0.1](https://github.com/Nike-Inc/SQift/releases/tag/3.0.1)

Released on 2018-01-02. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/4?closed=1).

#### Updated

- The Xcode project and Travis CI to support Xcode 9.2.
  - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request
  [#5](https://github.com/Nike-Inc/SQift/pull/5).

## [3.0.0](https://github.com/Nike-Inc/SQift/releases/tag/3.0.0)

Released on 2017-10-25. All issues associated with this milestone can be found using this
[filter](https://github.com/Nike-Inc/SQift/milestone/1?closed=1).

### Breaking Changes

The SQift 3.0.0 release is a MAJOR version bump that comes with many new APIs and a few breaking changes worth calling out.

#### Swift 4

The SQift 3 release has been converted to only support Swift 4.
If you need to use Swift 3.2 or earlier, please stick with the latest SQift 2.x release until you can move to Swift 4.

#### Sequence Conformance on Statement

The biggest source code change in SQift 3 was the removal of `Sequence` conformance on `Statement`.
This change was made because it's not safe to assume errors will not be encountered while stepping through a result set.

#### New Query APIs

New `query` APIs have been added to safely iterate through a result set and throw if an error is encountered.
These are meant to replace the `Sequence` conformance on `Statement` and are safer and more robust as well.

The `fetch` APIs have also been removed and replaced with new `query` variants.
SQift 3 unifies all SQL "queries" underneath the `query` APIs.
The `ExpressibleByRow` protocol was also added to make it easier to convert result sets to model objects.

#### Non-Optional Query APIs

The other breaking change worth noting is the removal of non-optional `query` APIs.
In SQift 2.x, you could query for non-optional `Extractable` values directly.
SQift would internally force unwrap the optional value for you.
In SQift 3, these APIs have been removed entirely for safety reasons.

#### Generic Subscripts on Row

Swift 4 added the ability to make use of generics in subscripts.
This means that you no longer need to write custom extensions on `Row` to support your own custom bindings.
We were able to delete all the custom subscript functions in SQift itself for each of the primitive type bindings.

### Release Notes

#### Added

- A new test verifying that `Connection` supports FTS4 out-of-the-box.
- New `query` APIs to `Connection` and `Statement` to replace the `Sequence` conformance on `Statement`.
- Better support for converting result sets into model objects through the `ExpressibleByRow` and `ExpressibleByRowError` types.
- New APIs allowing you to query for `Column` information for each column in a `Row`.
- A `SQL` typealias used throughout the codebase to represent SQL statement strings.
- Support to `Connection` for interrupts.
- Support to `Statement` to query for busy, read-only status, and bound SQL.
- `BaseTestCase` class to the test suite to help DRY up the tests.
- Support to `Connection` to checkpoint a WAL database.
- Support to `Connection` for wiring up a busy handler or busy timeout.
- Support to `Connection` for update, commit, and rollback hooks.
- Support to `Connection` to backup database with progress monitoring, cancellation, and pausing.
- The ability to add an `Authorizer` to a `Connection` to prevent certain types of statements from being executed.
- Support for codable bindings along with array, set, and dictionary bindings.
- Database test demonstrating how a shared cache can compensate for checkpoint gaps in WAL databases.
- Deployment and documentation groups to the Xcode project.
- LICENSE and NOTICE documents to the project.

#### Updated

- The trace and transaction APIs to use Swift boxes instead of Objective-C block typealiases.
- The Xcode project and source code to compile against Swift 4 only.
- The `Row` subscript APIs to leverage generic subscripts in Swift 4 so you no longer need to write you own.
- The source code structure by separating out `Connection` extensions into separate files.
- The Xcode project to `import SQLite3` directly rather than including the `sqlite3.h` header.
- The copyright headers throughout the project to conform to the LICENSE.

#### Removed

- The `Sequence` conformance on `Statement` since stepping through the result set can throw an error in certain conditions.
- The `fetch` APIs from `Statement` and `Connection` and replaced with new `query` APIs.
- The non-optional `query` APIs on `Connection` due to them being unsafe.

---

## 2.1.1

### Release Notes

#### Added

- A `.swift-version` file to the project for CocoaPods set to `3.2`.

#### Updated

- The Xcode project to support Xcode 9 and Swift 3.2.
- The source and test code to compile against Swift 3.1 and 3.2.
- The sqlite3 header to the iOS 11 version.

## 2.1.0

### Release Notes

#### Added

- Support for adding and removing custom scalar and aggregate functions to SQLite.

---

## 2.0.0

### Breaking Changes

#### Extractable API

This major release contains only a single API change.
The `Extractable` protocol has been updated to allow optional return values instead of non-optional.

```swift
public protocol Extractable {
    associatedtype BindingType
    associatedtype DataType = Self

    static func fromBindingValue(_ value: Any) -> DataType?
}
```

To update to SQift 2.x, you only need to make the `DataType` return value of the `fromBindingValue` API optional in all your custom `Binding` implementations.
You'll also want to investigate your `fromBindingValue` implementations to see if you can add some additional safety now that the return type is optional.

#### Extractable Implementation for Numeric Types

The `Extractable` implementation of the numeric types has been updated to no longer clamp values outside the bounds of the type to the bounds of the type.
The implementations now return `nil` if the underlying value lies outside the bounds of the type.
The best way to demonstrate this is through an example.

If you store a value in the database with a value of `1_000`, and try to extract it as a `UInt8`, you will no longer receive `255`, but instead `nil` since the value does not fit within the `0...255` range.

### Release Notes

#### Updated

- The `Extractable` protocol to allow safe conversions of `Any` values into `DataType` by returning an optional value instead of non-optional.
- The `Extractable` implementations for all number types (`UInt8`, `Int32`, etc.) to no longer "clamp" values outside the type's bounds.

---

## 1.1.2

### Release Notes

#### Fixed

- Issue where `@discardableResult` attribute was used incorrectly on `bind` API that does not return a value.
- Issue where `TraceEvent` extension did not correctly use availability checks in the test suite.

## 1.1.1

### Release Notes

#### Updated

- Enabled `APPLICATION_EXTENSION_API_ONLY` for iOS, macOS and tvOS targets (was already on for watchOS).

---

## 1.1.0

### Release Notes

#### Updated

- The `Migrator` to an `open` ACL to allow subclassing.

---

## 1.0.0

### Release Notes

#### Updated

- All source and test APIs to compile against Swift 3 and follow the Swift API Design Guidelines.

---

## 0.9.0

### Release Notes

#### Added

- New `TraceEvent` system with `Connection.traceEvent` API backed by the new `sqlite3_tracev2` APIs.

#### Updated

- Updated to SQLite 3.14.0 header used in iOS 10.

#### Fixed

- Deprecation warning for `sqlite3_trace` function by manually removing the deprecation warning.
This is necessary since C libraries don't have availability checks.

---

## 0.8.0

### Release Notes

This release is all about updating to Xcode 8 and Swift 2.3. There are no other changes in this release.

#### Updated

- Updated project to Xcode 8 and Swift 2.3 and bumped deployment targets.
- Set code signing to automatic with no team on framework and test targets.

---

## 0.7.1

### Release Notes

Due to CI not being able to always have Xcode live in the /Applications folder, we needed to move away from module maps.
The alternative solution is to directly import the `sqlite3.h` header into the project and into the umbrella header.
Since the header is the same on all platforms, there's no reason to import different ones for each platform.

#### Added

- The `sqlite3.h` header to the project and the `-lsqlite3` linker flag.

#### Removed

- Modulemaps that created the `CSQLite` framework to import.

## 0.7.0

### Release Notes

Unfortunately the SQLCipher team is having a difficult time keeping up their support for the various Apple platforms.
Because of this, we've had to move away from the dependency altogether.
This required the database encryption logic to be removed from SQift.

#### Added

- Modulemaps to create `CSQLite` modules for each supported platform.

#### Updated

- Podspec to `preserve_paths` of the new modulemaps and import them using the `SWIFT_INCLUDE_PATHS` build setting.

#### Removed

- SQLCipher dependency and all encryption logic due to instability in the framework.
- All sections in the README referencing SQLCipher or Encryption.

## 0.6.1

### Release Notes

#### Updated

- Submodule reference for SQLCipher to point at Bitbucket clone.
- Connection tests to verify foreign key settings were connection specific.

## 0.6.0

### Release Notes

#### Added

- String extension allowing users to safely escape SQL strings.

## 0.5.0

### Release Notes

#### Updated

- All logic to use Swift 2.2 APIs.
- The required Xcode version to 7.3.

## 0.4.0

### Release Notes

#### Added

- Added `NSURL` binding along with `Row` subscripts and unit tests.

## 0.3.0

### Release Notes

#### Added

- New `run` and `fetch` variant APIs for arrays and dictionaries to `Connection`.
- Tests verifying all parameter binding variants work as expected for `fetch` and `query` APIs.

#### Updated

- `Database` and `Connection` initializers now set `sharedCache` to `false` by default.

> Using a `sharedCache` is intended for use with embedded servers to help keep memory usage low for embedded devices.

#### Removed

- The `readOnly` parameter from the `Database` initializer.

#### Fixed

- Refactored test names to use `Connection` instead of `Database` where applicable.

## 0.2.0

### Release Notes

#### Added

- Test around fetching a `Row` that cannot be found.
- Method to `Connection` allowing you to query a value with a parameter array.

#### Updated

- The connection property ACL on the `ConnectionQueue` to `public`.
- The writer queue and reader pool property ACLs on the `Database` to `public`.
- `Connection` and `Statement` fetch functions to return an optional `Row` for cases where the fetch does not find a valid `Row`.
- The code sample in the README for fetching a single `Row`.
- `Database` and `ConnectionPool` initializers to take connection preparation closures to allow you to prepare a `Connection` for use. This allows you to set PRAGMAs, custom collation closures, etc. on a connection before starting to use it.

## 0.1.0

### Release Notes

This is the initial release of SQift.
Things will continue to evolve through the November '15 - January '16 timeframe as more SQift features are added.
The goal is to be ready to release the 1.0.0 version around late January '16.
The road to 1.0.0 will attempt to follow semver as closely as possible, but is not guaranteed.
Until the 1.0.0 release, please pay close attention to the upgrade and release notes for each version.


================================================
FILE: CONTRIBUTING.md
================================================
# How to contribute

There are a few guidelines that we need contributors to follow so that we are able to process requests as efficiently as possible.
If you have any questions or concerns please feel free to contact us at [opensource@nike.com](mailto:opensource@nike.com).

## Getting Started

* Review our [Code of Conduct](https://github.com/Nike-Inc/nike-inc.github.io/blob/master/CONDUCT.md)
* Submit the [Individual Contributor License Agreement](https://www.clahub.com/agreements/Nike-Inc/Willow)
* Make sure you have a [GitHub account](https://github.com/signup/free)
* Submit a ticket for your issue, assuming one does not already exist.
  * Clearly describe the issue including steps to reproduce when it is a bug.
  * Make sure you fill in the earliest version that you know has the issue.
* Fork the repository on GitHub

## Making Changes

* Create a topic branch off of `master` before you start your work.
  * Please avoid working directly on the `master` branch.
* Make commits of logical units.
* Check for unnecessary whitespace with `git diff --check` before committing.
* Write meaningful, descriptive commit messages.

## Submitting Changes

* Push your changes to a topic branch in your fork of the repository.
* Submit a pull request to the repository in the Nike-Inc organization.
* After feedback has been given we expect responses within two weeks.
After two weeks we may close the pull request if it isn't showing any activity.
* Bug fixes or features that lack appropriate tests may not be considered for merge.
* Changes that lower test coverage may not be considered for merge.

# Additional Resources

* [General GitHub documentation](https://help.github.com/)
* [GitHub pull request documentation](https://help.github.com/send-pull-requests/)
* [Nike's Code of Conduct](https://github.com/Nike-Inc/nike-inc.github.io/blob/master/CONDUCT.md)
* [Nike's Individual Contributor License Agreement](https://www.clahub.com/agreements/Nike-Inc/nike-inc.github.io)
* [Nike OSS](https://nike-inc.github.io/)


================================================
FILE: Documentation/SQift 4.0 Migration Guide.md
================================================
#  SQift 4.0 Migration Guide

SQift 4.0 is the latest major release of SQift, a lightweight Swift wrapper for SQLite.  As a major release following Semantic Versioning
conventions, 4.0 introduces multiple API-breaking changes that one should be aware of.

This guide is provided in order to ease the transition of existing applications using SQift 3.x to the latest APIs, as well as explain the
design and structure of new and changed functionality.

## Requirements

SQift 4.0 officially supports iOS 10.0+, macOS 10.12+, tvOS 10.0+, watchOS 3.0+, Xcode 9.3+ and Swift 4.1.

## Why a Major Bump?

With the introduction of watchOS 5.0, applications are no longer able to consumer frameworks with a deployment target of less than 3.0.
This exposes SQift's use of APIs that SQlite3 has slated for deprecation.  It seemed best at this point, to bring all deployment targets up
one major revision and fully deprecate the use older APIs.

---

## Breaking API Changes

SQift 4.0 contains a very minor breaking change with how tracing can be performed.

### Event Tracing

With SQlite3's deprecation of the `sqlite3_trace` API, so goes SQift's `Connection.trace()` method.  Instead you must leverage
the `traceEvent` API, which will require a little bit of extra code to achieve your previous results.

In SQift 3.2, you could trace the execution of SQL statements simply with code similar to the following:

```swift
let connection = try Connection(storageLocation: storageLocation)

connection.trace { sql in
    print(sql)
}
```

In SQift 4.0, you will use the `traceEvent()` API, which returns a different type of object internally.  You would write the above example as:

```swift
let connection = try Connection(storageLocation: storageLocation)

connection.traceEvent { event in
    if case .statement(_, let sql) = sql {
        print(sql)
    }
}
```

In addition to this, you can pass a mask into `traceEvent` to restrict which event types are traced.  The default mask is:

```swift
UInt32(SQLITE_TRACE_STMT | SQLITE_TRACE_PROFILE | SQLITE_TRACE_ROW | SQLITE_TRACE_CLOSE)`
```

If you wanted to only trace statements, your code would look like:

```swift
let connection = try Connection(storageLocation: storageLocation)

connection.traceEvent(mask: Connection.TraceEvent.statementMask) { event in
    if case .statement(_, let sql) = sql {
        print(sql)
    }
}
```


================================================
FILE: Gemfile
================================================
#
#  Gemfile
#  SQift
#
#  Created by William Thompson on 4/30/19
#  Copyright © 2019 Nike. All rights reserved.
#

source "https://rubygems.org"

gem "cocoapods", "~> 1.9"
gem "xcpretty"


================================================
FILE: LICENSE
================================================
BSD License
For Nike SQift software

Copyright (c) 2015-present, Nike, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this list of conditions
   and the following disclaimer.

 * Redistributions in binary form must reproduce the above copyright notice, this list of
   conditions and the following disclaimer in the documentation and/or other materials provided
   with the distribution.

 * Neither the name Nike nor the names of its contributors may be used to endorse or promote
   products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: NOTICE
================================================
SQift
Copyright 2017-present, Nike, Inc. (http://nike.com)
All rights reserved.
The Nike SQift source code is licensed under the BSD-style license found in the LICENSE file in the root
directory of the project source tree.

** Free and Open-Source Software Notices:
The Nike SQift software incorporates, depends upon, or interacts with the free and open-source software
components listed below. Please see the linked component sites for additional licensing, dependency, and
use information and component source code:

* SQLite
project homepage: https://sqlite.org/
project licensing: https://sqlite.org/copyright.html

/*
** 2005 February 15
**
**
** The author disclaims copyright to this source code.
** In place of
** a legal notice, here is a blessing:
**
**    May you do good and not evil.
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**
*************************************************************************
**/

* Swift
project homepage: https://swift.org/; https://www.apple.com/swift/
project licensing: https://swift.org/LICENSE.txt

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by
Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting
the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are
controlled by, or are under common control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding
shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this
License.
"Source" form shall mean the preferred form for making modifications, including but not limited to
software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source
form, including but not limited to compiled object code, generated documentation, and conversions to
other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the
License, as indicated by a copyright notice that is included in or attached to the work (an example
is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or
derived from) the Work and for which the editorial revisions, annotations, elaborations, or other
modifications represent, as a whole, an original work of authorship. For the purposes of this License,
Derivative Works shall not include works that remain separable from, or merely link (or bind by name)
to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any
modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted
to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity
authorized to submit on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication sent to the Licensor or
its representatives, including but not limited to communication on electronic mailing lists, source
code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor
for the purpose of discussing and improving the Work, but excluding communication that is
conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution
has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor
hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform,
sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor
hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made, use, offer to sell, sell,
import, and otherwise transfer the Work, where such license applies only to those patent claims
licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by
combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If
You institute patent litigation against any entity (including a cross-claim or counterclaim in a
lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses granted to You under this License for
that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form, provided that You meet
the following conditions:

  (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
  (b) You must cause any modified files to carry prominent notices stating that You changed the
      files; and
  (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright,
      patent, trademark, and attribution notices from the Source form of the Work, excluding those
      notices that do not pertain to any part of the Derivative Works; and
  (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative
      Works that You distribute must include a readable copy of the attribution notices contained
      within such NOTICE file, excluding those notices that do not pertain to any part of the
      Derivative Works, in at least one of the following places: within a NOTICE text file
      distributed as part of the Derivative Works; within the Source form or documentation, if provided
      along with the Derivative Works; or, within a display generated by the Derivative Works, if and
      wherever such third-party notices normally appear. The contents of the NOTICE file are for
      informational purposes only and do not modify the License. You may add Your own attribution
      notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE
      text from the Work, provided that such additional attribution notices cannot be construed as
      modifying the License.

You may add Your own copyright statement to Your modifications and may provide additional or different
license terms and conditions for use, reproduction, or distribution of Your modifications, or for any
such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise
complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally
submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions. Notwithstanding the above, nothing herein
shall supersede or modify the terms of any separate license agreement you may have executed with
Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service
marks, or product names of the Licensor, except as required for reasonable and customary use in
describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides
the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or
conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or redistributing the Work and assume
any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including
negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including
any direct, indirect, special, incidental, or consequential damages of any character arising as a result
of this License or out of the use or inability to use the Work (including but not limited to damages for
loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages
or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof,
You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other
liability obligations and/or rights consistent with this License. However, in accepting such obligations,
You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other
Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any
liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such
warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following boilerplate notice, with the fields
enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!)
The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that
a file or class name and description of purpose be included on the same "printed page" as the copyright
notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License
is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing permissions and limitations under the
License.

## Runtime Library Exception to the Apache 2.0 License: ##
As an exception, if you use this Software to compile your source code and portions of this Software are
embedded into the binary product as a result, you may redistribute such product without providing
attribution as would otherwise be required by Sections 4(a), 4(b) and 4(d) of the License.


================================================
FILE: Package.swift
================================================
// swift-tools-version: 5.8
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "SQift",
    platforms: [
        .iOS(.v12),
        .macOS(.v10_13),
        .tvOS(.v12),
        .watchOS(.v7)
    ],
    products: [
        .library(
            name: "SQift",
            targets: ["SQift"]
        ),
    ],
    targets: [
        .target(
            name: "SQift",
            path: "Source",
            exclude: ["Supporting Files"]
        ),
        .testTarget(
            name: "SQiftTests",
            dependencies: ["SQift"],
            path: "Tests",
            exclude: ["Supporting Files"]
        )
    ]
)


================================================
FILE: README.md
================================================
# SQift

[![Build Status](https://travis-ci.org/Nike-Inc/SQift.svg?branch=master)](https://travis-ci.org/Nike-Inc/SQift)
[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/SQift.svg)](https://img.shields.io/cocoapods/v/SQift.svg)
[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
[![Platform](https://img.shields.io/cocoapods/p/SQift.svg?style=flat)](http://cocoadocs.org/docsets/SQift)

SQift is a lightweight Swift wrapper for SQLite.

## Features

- [X] On-Disk, In-Memory and Temporary Database Connections
- [X] SQL Statement Execution
- [X] Generic Parameter Binding and Value Extraction
- [X] Codable and Codable Collection Bindings
- [X] Simple Query APIs for Values, Rows, and Collections
- [X] Transactions and Savepoints
- [X] Tracing and Trace Event Support
- [X] Scalar and Aggregate Functions
- [X] Commit, Rollback, Update, Authorizer Hooks
- [X] WAL Checkpointing
- [X] ConnectionQueue for Serial Execution per Database Connection
- [X] ConnectionPool for Parallel Execution of Read-Only Connections
- [X] Top-Level Database to Simplify Thread-Safe Reads and Writes
- [X] Database Migration Support
- [X] Database Backups
- [x] Comprehensive Unit Test Coverage
- [x] Complete Documentation

## Requirements

- iOS 10.0+, macOS 10.12+, tvOS 10.0+, watchOS 3.0+
- Xcode 10.2+
- Swift 5.0+

## Migration Guides

- [SQift 4.0 Migration Guide](Documentation/SQift%204.0%20Migration%20Guide.md)

## Communication

- Need help? Open an issue.
- Have a feature request? Open an issue.
- Find a bug? Open an issue.
- Want to contribute? Fork the repo and submit a pull request.

---

## Installation

### Swift Package Manager

The [Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies.

>Xcode 11+ is required to provide SwiftPM support for iOS, watchOS, and tvOS platforms.
In Xcode menu `File -> Swift Packages -> Add Package Dependency...` enter repository URL `https://github.com/nike-inc/SQift.git`.

Or, alternatively, in a `Package.swift` file:

```swift
let package = Package(
    name: "MyPackage",
    dependencies: [
		.package(url: "https://github.com/nike-inc/SQift", from: "5.1"),
    ],
    products: [
        // ...
    ],
    targets: [
        .target(
            name: "YourTarget",
            dependencies: ["SQift"]
        ),
    // ...
```

### CocoaPods

[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects.
You can install it with the following command:

```bash
$ gem install cocoapods
```

> CocoaPods 1.3+ is required to build SQift.

To integrate SQift into your Xcode project using CocoaPods, specify it in your `Podfile`:

```ruby
platform :ios, '11.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'SQift', '~> 4.0'
end
```

Then, run the following command:

```bash
$ pod install
```

### Carthage

[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

You can install Carthage with [Homebrew](http://brew.sh/) using the following command:

```bash
$ brew update
$ brew install carthage
```

To integrate SQift into your Xcode project using Carthage, specify it in your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile):

```
github "Nike-Inc/SQift" ~> 4.0
```

Run `carthage update` to build the framework and drag the built `SQift.framework` into your Xcode project.

---

## Usage

SQift is designed to make it as easy as possible to work with SQLite from Swift.
It does not, however, eliminate the need to understand how SQLite actually works.
Before diving into SQift, it is recommended to first have a firm grasp on what SQLite is, how it works and how to use it.

- [SQLite Docs](https://www.sqlite.org/docs.html)
- [SQLite Tutorial](http://zetcode.com/db/sqlite/)

SQift heavily leverages the new error handling model released with Swift 2.0.
It was designed from the ground up to throw in all applicable cases.
This makes it easy to wrap all your SQift calls in the do-catch paradigm.

### Creating a Database Connection

Creating a database connection is simple.

```swift
let onDiskConnection = try Connection(storageLocation: .onDisk("path_to_db"))
let inMemoryConnection = try Connection(storageLocation: .inMemory)
let tempConnection = try Connection(storageLocation: .temporary)
```

There are also convenience parameters to make it easy to customize the flags when initializing the database connection:

```swift
let connection = try Connection(
    storageLocation: .onDisk("path_to_db"),
    readOnly: true,
    multiThreaded: false,
    sharedCache: false
)
```

> In most cases, the default values are preferred.
> For more details about creating a database connection, please refer to the SQLite [documentation](https://www.sqlite.org/c3ref/open.html).

### Executing Statements

To execute a SQL statement on the `Connection`, you need to first create a `Connection`, then call `execute`.

```swift
let connection = try Connection(storageLocation: .onDisk("path_to_db"))

try connection.execute("PRAGMA foreign_keys = true")
try connection.execute("PRAGMA journal_mode = WAL")

try connection.execute("CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INTEGER)")

try connection.execute("INSERT INTO cars VALUES(1, 'Audi', 52642)")
try connection.execute("INSERT INTO cars VALUES(2, 'Mercedes', 57127)")

try connection.execute("UPDATE cars SET name = 'Honda' where id = 1")
try connection.execute("UPDATE cars SET price = 61_999 where name = 'Mercedes'")

try connection.execute("DELETE FROM cars where name = 'Mercedes'")
try connection.execute("DROP TABLE cars")
```

### Bindings

Most Swift data types cannot be directly stored inside the database.
They need to be converted to a data type supported by SQLite.
In order to support moving Swift data types into the database and back out again, SQift leverage three powerful protocols: `Bindable`, `Extractable`, and `Binding`.

#### Bindable Protocol

The `Bindable` protocol handles converting Swift data types into a `BindingValue` enumeration type which can be stored in the database.

```swift
public protocol Bindable {
    var bindingValue: BindingValue { get }
}
```

#### Extractable Protocol

While the `Bindable` protocol helps move Swift data types into the database, the `Extractable` protocol allows SQift to extract the values from the database `Connection` and convert them back to the requested Swift data type.

```swift
public protocol Extractable {
    typealias BindingType
    typealias DataType = Self
    static func fromBindingValue(_ value: Any) -> DataType?
}
```

#### Binding Protocol

To extend Swift data types to be able to be inserted into the database and also be extracted safely, the `Binding` protocol forces the data type to conform to both the `Bindable` and `Extractable` protocols.

```swift
public protocol Binding: Bindable, Extractable {}
```

In order to make it as easy as possible to use SQift, SQift extends the following Swift data types to conform to the `Binding` protocol:

- **NULL:** `NSNull`
- **INTEGER:** `Bool`, `Int8`, `Int16`, `Int32`, `Int64`, `Int`, `UInt8`, `UInt16`, `UInt32`, `UInt64`, `UInt`
- **REAL:** `Float`, `Double`
- **TEXT:** `String`, `URL`, `Date`
- **BLOB:** `Data`

> Additional Swift data types can easily add `Bindable` protocol conformance if necessary.

### Binding Parameters to a Statement

Safely binding parameters to a `Statement` is easy thanks to the `Binding` protocol.
First you need to `prepare` a `Statement` object, then `bind` the parameters and `run` it using method chaining.

```swift
let connection = try Connection(storageLocation: .onDisk("path_to_db"))

try connection.prepare("INSERT INTO cars VALUES(?, ?, ?)").bind(1, "Audi", 52_642).run()
try connection.prepare("INSERT INTO cars VALUES(:id, :name, :price)").bind([":id": 1, ":name": "Audi", ":price": 52_642]).run()
```

There are also convenience methods on the `Connection` for preparing a `Statement`, binding parameters and running it all in a single method named `run`.

```swift
let connection = try Connection(storageLocation: .onDisk("path_to_db"))

try connection.run("INSERT INTO cars VALUES(?, ?, ?)", 1, "Audi", 52_642)
try connection.run("INSERT INTO cars VALUES(:id, :name, :price)", parameters: [":id": 1, ":name": "Audi", ":price": 52_642])
```

> It is very important to properly escape all parameter values provided in a SQL statement.
> When in doubt, always use the provided bind functionality.

### Querying Data

Querying data from the database makes extensive use of the `Binding` protocol.
It extracts the original values from the database, then uses the `Binding` protocol along with generics to convert the final Swift type.

#### Single Values

Extracting a single value from the database can be done using the `query` API.

```swift
let synchronous: Int? = try db.query("PRAGMA synchronous")
let minPrice: UInt? = try db.query("SELECT avg(price) FROM cars WHERE price > ?", 40_000)
```

#### Multiple Values

You can also use the `query` API to extract multiple values through the `Row` type.

```swift
if let row = try db.query("SELECT name, type, price FROM cars WHERE type = ? LIMIT 1", "Sedan") {
    let name: String = row[0]
    let type: String = row[1]
    let price: UInt = row[2]
}
```

The values can be accessed by index or by name.

```swift
if let row = try db.query("SELECT name, type, price FROM cars WHERE type = ? LIMIT 1", "Sedan") {
    let name: String = row["name"]
    let type: String = row["type"]
    let price: UInt = row["price"]
}
```

> The `Row` type supports both optional and non-optional value extraction through index and name subscripts.
> The non-optional subscripts are certainly the safest, but not always the most convenient.
> It is up to you to decide which makes more sense to use in each situation.
> Generally, try to use the optional types where the SQL statement is decoupled from the row value extraction.
> In these cases, the `ExpressibleByRow` type can be useful to help handle optionality.

#### ExpressibleByRow Types

In many cases, you want to construct model objects from a row in a result set.
The `ExpressibleByRow` type was designed for this use case.

```swift
protocol ExpressibleByRow {
    init(row: Row) throws
}
```

To make use of the `ExpressibleByRow` protocol, first create your model object and conform to the protocol.

```swift
struct Car {
    let name: String
    let type: String
    let price: UInt
}

extension Car: ExpressibleByRow {
    init(row: Row) throws {
        guard
            let name: String = row[0],
            let type: String = row[1],
            let price: UInt = row[2]
        else {
            throw ExpressibleByRowError(type: Car.self, row: row)
        }

        self.name = name
        self.type = type
        self.price = price
    }
}
```

Then, you can use the `query` API to automatically convert the result set into a `Car`.

```swift
let car: Car? = try db.query("SELECT name, type, price FROM cars WHERE type = ? LIMIT 1", "Sedan")
```

#### Multiple Rows

The `query` APIs also support querying for result sets with multiple rows.

```swift
let names: [String] = try db.query("SELECT name FROM cars")
let cars: [Car] = try db.query("SELECT * FROM cars WHERE price > ?", [20_000])
```

In addition to array result sets, you can also create dictionary result sets.

```swift
let sql = "SELECT name, price FROM cars WHERE price > ?"
let prices: [String: UInt] = try db.query(sql, 20_000) { ($0[0], $0[1]) }
```

### Dates

SQift has full binding support for `Date` objects which allows you to easily leverage the builtin date functionality in SQLite.
You can insert dates easily into the database, run queries against them, and then extract them back out.
SQift handles this through the `Date` binding which leverages the `bindingDateFormatter`.
By default, all `Date` types are stored in the database as `TEXT`, so make sure you map your column types accordingly.

```swift
let date1975: Date!
let date1983: Date!
let date1992: Date!
let date2001: Date!

try connection.execute(
	"CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, release_date TEXT)"
)

try connection.execute("INSERT INTO cars(?, ?)", "70s car", date1975)
try connection.execute("INSERT INTO cars(?, ?)", "80s car", date1983)
try connection.execute("INSERT INTO cars(?, ?)", "90s car", date1992)
try connection.execute("INSERT INTO cars(?, ?)", "00s car", date2001)
```

Once you have your dates stored in the database, you can run date range queries to narrow down your data.

```swift
let date1980: Date!
let date2000: Date!

let carCount: Int = try connection.query(
    "SELECT count(*) FROM cars WHERE release_date >= date(?) AND release_date <= date(?)",
    date1980, 
    date2000
)

print("Total Cars from the 80s and 90s: \(carCount)") // should equal 2
```

> You can swap the default date formatting, but be careful when doing so.
> You need to make sure the new date format complies with the SQLite [requirements](https://www.sqlite.org/lang_datefunc.html) so date range queries will continue to work as expected.

You can also extract dates out of each row as an `Date`.

```swift
let sql = "SELECT release_date WHERE name = ? LIMIT 1"
let releaseDate: Date = try connection.query(sql, "80s car")
```

### Custom Bindings

SQift has support for many common primitive types, but what about when you want to store a custom type in the database?
This is where custom bindings come into play.
All you need to do to store your own custom types in the database is conform to the `Binding` protocol.

```swift
enum DownloadState: Int {
    case pending, downloading, downloaded, failed
}

extension DownloadState: Binding {
    typealias BindingType = Int64

    var bindingValue: BindingValue { return .integer(Int64(rawValue)) }

    static func fromBindingValue(_ value: Any) -> AssetType? {
        guard let value = value as? Int64, let rawValue = Int(exactly: value) else { return nil }
        return DownloadState(rawValue: rawValue)
    }
}

try connection.execute("CREATE TABLE downloads(name TEXT PRIMARY KEY, state INTEGER NOT NULL)")
try connection.run("INSERT INTO downloads VALUES(?, ?)", "image1", DownloadState.pending)

if let state: DownloadState? = try connection.query("SELECT state FROM downloads WHERE name = 'image1') {
    print(state)
}

// Output
// DownloadState.pending
```

#### Codable Bindings

SQift also supports `Codable` bindings out-of-the-box.
For example, let's say we have a `Person` object that is `Codable`.
We can store `Person` instances directly in the database without having to create a custom binding.

```swift
struct Employee {
    let id: Int64
    let firstName: String
    let lastName: String
    let age: UInt
}

let phil = Person(id: 1, firstName: "Phil", lastName: "Knight", age: 79)

try connection.execute("CREATE TABLE employees(id INTEGER PRIMARY KEY, employee BLOB NOT NULL)")
try connection.run("INSERT INTO employees(employee) VALUES(?)", phil)

if let employee1: Employee? = try connection.query("SELECT employee FROM employees WHERE id = 1) {
    print(employee.firstName)
}

// Output
// "phil"
```

> You need to think through whether it makes sense for you to use `Codable` bindings or not.
> While they are very convenient, the information inside them cannot be queried.
> In the above example, you could not run a query such as `SELECT count(1) FROM employees where firstName = 'Phil'`.
> If your use case does not require you to run such a search, then `Codable` bindings may be a useful choice.

#### Codable Collections

SQift also supports `Codable` collections through the `ArrayBinding`, `SetBinding`, and `DictionaryBinding` types.

```swift
let points: ArrayBinding = [
    CGPoint(x: 1.0, y: 2.0),
    CGPoint(x: 3.0, y: 4.0),
    CGPoint(x: 5.0, y: 6.0),
    CGPoint(x: 7.0, y: 8.0),
    CGPoint(x: 9.0, y: 10.0)
]

try connection.execute("CREATE TABLE stream(id INTEGER PRIMARY KEY, data BLOB NOT NULL)")
try connection.run("INSERT INTO stream(data) VALUES(?)", points)

let pointsQueried: ArrayBinding<CGPoint>? = try connection.query("SELECT data FROM stream WHERE id = 1")

pointsQueried?.elements.forEach { print("(\($0.x), \($0.y))") }

// Output
// (1.0, 2.0)
// (3.0, 4.0)
// (5.0, 6.0)
// (7.0, 8.0)
// (9.0, 10.0)
```

> Codable collections can be useful in situations where you are writing large streams of data that are never partially queried.
> If you only write the data in one pass, and only query the data as the entire set, codable collections might be a good option.

### Transactions

Changes cannot be made to the database except within a transaction.
By default, any command that changes the database will automatically start a transaction if one is not already in effect.
Transactions can also be started manually in SQift when multiple operations need to be run inside a single transaction.

```swift
try connection.execute("CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INTEGER)")

try connection.transaction {
    try connection.prepare("INSERT INTO cars VALUES(?, ?, ?)").bind(1, "Audi", 52642).run()
    try connection.prepare("INSERT IN cars VALUES(?, ?, ?)").bind(2, "Mercedes", 57127).run()
}
```

> If any error occurs within the transaction, all the changes are automatically rolled back by SQift.

### Tracing

When debugging SQL statements, sometimes it can be helpful to be able to print out what is actually being executed by SQLite.
SQift allows you to do this through the `traceEvent` API by registering a closure to run for each statement execution.

```swift
let connection = try Connection(storageLocation: storageLocation)

connection.traceEvent { event in
    if case .statement(_, let sql) = event {
        print(sql)
    }
}

try connection.execute("CREATE TABLE employees(id INTEGER PRIMARY KEY, name TEXT)")
try connection.prepare("INSERT INTO employees VALUES(?, ?)").bind(1, "Bill Bowerman").run()
try connection.prepare("INSERT INTO employees VALUES(?, ?)").bind(2, "Phil Knight").run()
let employees: [Employee] = try connection.query("SELECT * FROM employees")

// Output
// "CREATE TABLE employees(id INTEGER PRIMARY KEY, name TEXT)"
// "INSERT INTO employees VALUES(1, 'Bill Bowerman')"
// "INSERT INTO employees VALUES(2, 'Phil Knight')"
// "SELECT * FROM employees"
```

> The `traceEvent` API allows you to be more selective about the types of statements you want to trace.
> You can select which types of statements you want by using the trace event masks.

### Collations

SQift supports custom collation functions for cases where the three built-in collating functions are not sufficient.
A couple real-world examples of custom cases might include: diacritic aware sorting and numerical sorting.

```swift
let connection = try Connection(storageLocation: storageLocation)

connection.createCollation(named: "NUMERIC") { lhs, rhs in
    return lhs.compare(rhs, options: .numeric, locale: .autoupdatingCurrent)
}

try connection.execute("CREATE TABLE values(text TEXT COLLATE 'NUMERIC' NOT NULL)")

let values = ["string 1", "string 21", "string 12", "string 11", "string 02"]

try values.forEach { try connection.run("INSERT INTO values(text) VALUES(?)", $0) }
let extractedValues: [String] = try connection.query("SELECT * FROM values ORDER BY text")

extractedValues.forEach { print($0) }

// Output
// "string 1"
// "string 02"
// "string 11"
// "string 12"
// "string 21"
```

### Functions

While SQLite is a very robust library, sometimes you will run into cases where you need to extend the functionality of SQLite where it is limited.
For example, you may need to create a custom function to determine what month of a calendar year a particular date falls within.
SQLite cannot do this directly since it lacks calendar support.

SQift supports custom scalar and aggregate functions.
The following is a simple example of how you could extend SQLite to support a `strip_unicode` function.

```swift
try connection.addScalarFunction(named: "strip_unicode", argumentCount: 1) { _, values in
    guard
        let value = values.first, value.isText,
        let valueData = value.text.data(using: .ascii, allowLossyConversion: true),
        let asciiValue = String(data: valueData, encoding: .ascii)
    else { return .null }

    return .text(asciiValue)
}

let sql = "SELECT strip_unicode(?)"

let result1: String? = try connection.prepare(sql, "å").query()
let result2: String? = try connection.prepare(sql, "ć").query()
let result3: String? = try connection.prepare(sql, "áč").query()

// result1 = "a"
// result2 = "c"
// result3 = "ac"
```

> For more advanced examples of scalar and aggregate functions, please refer to the test suite.

---

## Advanced

### Hooks

SQift has support built in for commit, rollback, update, and authorizer hooks.
The commit hook is used to determine whether a commit should be executed or rolled back.
The rollback hook is called when a commit is rolled back.

```swift
var shouldCancelCommit = false

connection.commitHook { return shouldCancelCommit }
connection.rollbackHook { print("rollback occurred") }
```

Update hooks can be used to react to `.insert`, `.update`, or `.delete` operations.

```swift
connection.updateHook { type, databaseName, tableName, rowID in
    var message = "\(type) row \(rowID)"

    if let databaseName = databaseName { message += " on \(databaseName)" }
    if let tableName = tableName { message += ".\(tableName)" }

    print(message)
    
    // Could update the file system, invalidate a cache, send notifications, etc.
}

try connection.execute("""
    INSERT INTO employee(name) VALUES('Phil Knight');
    UPDATE person SET name = 'Bill Bowerman' WHERE id = 1;
    DELETE FROM person WHERE id = 1
    """
)

// Output
// "insert row 1 on main.person"
// "update row 1 on main.person"
// "delete row 1 on main.person"
```

The authorizer hook is the most complex of the four.
It allows you to control what statements are allowed to run on a connection.
For example, you could disable all actions on a particular connection other than select statements.

```swift
try connection.authorizer { action, p1, p2, p3, p4 in
    guard action == .select else { return .deny }
    return .ok
}
```

### Checkpoints

Databases with a `WAL` journal mode use checkpoint operations to move updates from the WAL file into the database.
SQift supports checkpoints and busy timeouts and handlers which can be useful in certain situations.
For example, you may want to use a `WAL` database for performance reasons, then transfer it to a remote server or different device.
Before doing this, it is wise to checkpoint the database and also vacuum it.

```swift
try connection.busyHandler(.timeout(1.0)) // 1 second
let checkpointResult = try connection.checkpoint(mode: .truncate)

try connection.execute("VACUUM")
```

> Checkpointing is a very complex process.
> Before using the `checkpoint` APIs, make sure to read through the SQLite [documentation](https://sqlite.org/c3ref/wal_checkpoint_v2.html).

### Thread Safety

Thread-safety is a complex topic when it comes to SQLite.
As a general rule, it is NEVER safe to access a database `Connection` from multiple threads simultaneously.
Each connection should be accessed serially to guarantee safety. 

If you wish to access the database in parallel, there are a few things you need to know.
First off, you'll need to use Write-Ahead Logging by setting the journal mode to `WAL`.
By changing the database to a `WAL` journal mode, the database can be read during a write and written during a read in parallel using multiple connections.

```swift
try connection.execute("PRAGMA journal_mode = WAL")
```

Another important note is that SQLite can only perform write operations serially, no matter how many connections you create.
Therefore, you should only ever create a single connection for writing if possible.
You can use as many reader connections as you wish.
For more information about thread-safety and WAL journal modes, please refer to the following:

- [Write-Ahead Logging](https://www.sqlite.org/wal.html)
- [SQLite and Multiple Threads](http://www.sqlite.org/threadsafe.html)
- [SQLite WAL mode with multiple transactions in multiple threads](http://stackoverflow.com/questions/14234007/sqlite-wal-mode-with-multiple-transactions-in-multiple-threads)

#### Connection Queue

The `ConnectionQueue` class in SQift was designed to help guarantee thread-safety for a database `Connection` that could be accessed from multiple threads.
It executes all operations on an internal serial dispatch queue.
This ensures all operations on the connection operation in a serial fashion.
The `ConnectionQueue` also supports executing logic inside a transaction and savepoint.

```swift
let queue = try ConnectionQueue(connection: Connection(storageLocation: .onDisk("path_to_db")))

try queue.execute { connection in
    try connection.execute("PRAGMA foreign_keys = true")
    try connection.execute("PRAGMA journal_mode = WAL")
    try connection.execute("CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INTEGER)")
}

try queue.executeInTransaction { connection in
    try connection.execute("INSERT INTO cars VALUES(1, 'Audi', 52642)")
    try connection.execute("INSERT INTO cars VALUES(2, 'Mercedes', 57127)")
}

try queue.executeInSavepoint("drop_cars_table") { connection in
	try connection.execute("DROP TABLE cars")
}
```

#### Connection Pool

The `ConnectionPool` class allows multiple read-only connections to access a database simultaneously in a thread-safe manner.
Internally, the pool manages two different sets of connections, ones that are available and ones that are currently busy executing SQL logic.
The pool will reuse available connections when they are available, and initializes new connections when all available connections are busy until the max connection count is reached.

```swift
let pool = try ConnectionPool(storageLocation: .onDisk("path_to_db"))

try pool.execute { connection in
    let count: Int = try connection.query("SELECT count(*) FROM cars")
}
```

Since SQLite has no limit on the maximum number of open connections to a single database, the `ConnectionPool` will initialize as many connections as needed within a small amount of time.
Each time a connection is executed, the internal drain delay timer starts up.
When the drain delay timer fires, it will drain the available connections if there are no more busy connections.
If there are still busy connections, the timer is restarted.
This allows the `ConnectionPool` to spin up as many connections as necessary for very small amounts of time.

> The thread-safety is guaranteed by the connection pool by always executing the SQL closure inside a connection queue.
> This ensures all SQL closures executed on the connection are done so in a serial fashion, thus guaranteeing the thread-safety of each connection.

#### Database

The `Database` class is a lightweight way to create a single writable connection queue and connection pool for all read statements.
The read and write APIs are designed to make it simple to execute SQL statements on the appropriate type of `Connection` in a thread-safe manner.

```swift
let database = try Database(storageLocation: .onDisk("path_to_db"))

try database.executeWrite { connection in
    try connection.execute("PRAGMA foreign_keys = true")
    try connection.execute("PRAGMA journal_mode = WAL")
    try connection.execute("CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INTEGER)")
}

try database.executeRead { connection in
    let count: Int = try connection.query("SELECT count(*) FROM cars")
}
```

This is the easiest way to operate in a 100% thread-safe manner without having to deal with the underlying complexities of the `ConnectionQueue` and `ConnectionPool` classes.

Another important consideration when using the `Database` type is whether or not to use the shared cache.
If you are using a `WAL` journal mode, it is best to set the `sharedCache` parameter to `true`.
This allows the reader pool to have access to the recent changes made by the writer connection at all times.
If you don't use the shared cache, the readers will not always have access to the latest written changes.
This can happen when other long lived read operations are running while changes are being written by a different connection.

> We would like to encourage everyone to use a `Database` object rather than working directly with connection queues or connection pools.

#### Table Lock Policy

Table lock errors are `SQLITE_ERROR` types thrown by `execute`, `prepare`, and `step` operations.
These errors can occur when the database is configured with a WAL journal mode as well as a shared cache.
When one connection has obtained a lock on a table, another connection running on a different thread will receive table lock errors until the previous lock is released.
In these situations, there are a couple of ways to proceed.
The error can either be immediately thrown and handled by the client, or the calling thread can poll the operation until the lock is released.

The `TableLockPolicy` defines two different ways to handle table lock errors.
The first option is to poll on the calling thread at a specified interval until the lock is released.
The other option is to immediately fast fail by throwing the table lock error as soon as it is encountered.
`Connection`, `ConnectionPool`, and `Database` types are set to `.fastFail` by default.

In order to enable polling for table lock errors, all that needs to be done is to set the policy in the `Connection` or `Database` initializer.

```swift
let connection = try Connection(storageLocation: storageLocation, tableLockPolicy: .poll(0.01))
let database = try Database(storageLocation: .onDisk("path_to_db"), tableLockPolicy: .poll(0.01))
```

> When using a WAL journal mode and a shared cache, it is recommended to use a `.poll` table lock policy with a poll interval of `10 ms`. 

### Migrations

Production applications generally need to migrate the database schema from time-to-time.
Whether it requires some new tables or possibly alterations to a table, you need to have a way to manage the migration logic.
SQift has migration support already built-in for you through the `Migrator` class.
All you need to do is create the `Migrator` instance and tell it to run.
Everything else is handled internally by SQift.

```swift
let connection = try Connection(storageLocation: .onDisk("path_to_db"))
let migrator = Migrator(connection: connection, desiredSchemaVersion: 2)

try migrator.runMigrationsIfNecessary(
    migrationSQLForSchemaVersion: { version in
        var SQL: String = ""

        switch version {
        case 1:
            return "CREATE TABLE cars(id INTEGER PRIMARY KEY, name TEXT, price INTEGER)"

        case 2:
            return "CREATE TABLE person(id INTEGER PRIMARY KEY, name TEXT, address TEXT)"

        default:
            break
        }

        return SQL
    },
    willMigrateToSchemaVersion: { version in
        print("Will migrate to schema version: \(version)")
    },
    didMigrateToSchemaVersion: { version in
        print("Did migrate to schema version: \(version)")
    }
)
```

All migrations must start at 1 and increment by 1 with each iteration.
For example, the first time you create a `Migrator`, you want to set the `desiredSchemaVersion` to 1 and implement the `migrationSQLForSchemaVersion` closure to return your initial database schema SQL.
Then, each time you need to migrate your database, bump the `desiredSchemaVersion` by 1 and add the new case to your `migrationSQLForSchemaVersion` schema closure.
In a production application, it would be easiest to write actual SQL files, add them to your bundle and load the SQL string from the file for the required version.

### Backups

It can often be wise to run scheduled backups of your database allowing users to restore from a backup if corruption is detected.
SQift makes it extremely to backup a database safely using the SQLite backup APIs.

```swift
let sourceConnection = try Connection(storageLocation: sourceLocation)
let destinationConnection = try Connection(storageLocation: destinationLocation)

let progress = try sourceConnection.backup(to: destinationConnection) { result in
    print(result)
}
```

The `progress` instance vended by the `backup` API can be used to monitor progress as well as cancel the backup operation.

> The backup operation, by default, happens as an iterative process.
> It backs up the specified page size in each operation until it completes.
> Passing a `pageSize` of `-1` causes the backup to be performed in a single operation.
> It is recommended to use the default `pageSize` of `100` and allow the operation to iterate until complete.

---

## FAQ

### Why not use CoreData?

There are many trade-offs between CoreData and SQift.
SQift was certainly not created as a replacement for CoreData.
It was created to make working with SQLite from Swift as easy and painless as possible.
Anyone trying to decide between using CoreData and using SQift needs to consider the pros and cons carefully before making a decision.
Both have significant learning curves and require significant amounts of forethought and architectural design before being integrated to an application or framework.

### Should I use SQift in my project?

Maybe.
The most important question to ask first is whether you really need a database.
There are many other ways to store data which are much less complicated.
If you do have a large amount of data that needs to be indexed for queries, then a database is probably the best option.

Once you know you need a database, then you need to decide whether you need a key-value store, or full relational query power.
If you only need a key-value store, there are other libraries out there that are less complex and more tailored to your needs.
If you need the full power of SQLite, then SQift is going to be a good option.

### Any plans to add a Swift DSL on top of SQL in SQift?

This is something that we've considered multiple times and haven't dove into yet.
Currently, we do not have any plans to build a DSL, but it's not off the table.
If we do decide to try to add a DSL to SQift, we'll need to make sure we do not remove users too far from SQL.

The main goal of SQift is to make it as easy and convenient as possible to use SQLite with Swift.
Convenience, however, does not mean abstraction.
SQLite is very complicated, and the goal of SQift is not to simplify it, but enable it.
Anyone looking to use SQift in their project needs to have a firm understanding of SQLite and how it works.
This is absolutely by design.

---

## License

SQift is released under the New BSD License.
See LICENSE for details.

## Creators

- [Dave Camp](https://github.com/atomiccat) ([@thinbits](https://twitter.com/thinbits))
- [Christian Noon](https://github.com/cnoon) ([@Christian_Noon](https://twitter.com/Christian_Noon))


================================================
FILE: SQift.podspec
================================================
Pod::Spec.new do |s|
  s.name = "SQift"
  s.version = "5.1"
  s.license = "MIT"
  s.summary = "A lightweight Swift wrapper for SQLite."
  s.homepage = "https://github.com/Nike-Inc/SQift"
  s.authors = {
    "Dave Camp" => "dave.camp@nike.com",
    "Christian Noon" => "christian.noon@nike.com",
    "Ben Scheirman" => "ben.scheirman@nike.com"
  }

  s.source = { git: "https://github.com/Nike-Inc/SQift.git", tag: s.version }
  s.source_files = "Source/**/*.swift"
  s.swift_version = "5.0"

  s.ios.deployment_target = "10.0"
  s.osx.deployment_target = "10.12"
  s.tvos.deployment_target = "10.0"
  s.watchos.deployment_target = "3.0"

  s.libraries = "sqlite3"
end


================================================
FILE: SQift.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 50;
	objects = {

/* Begin PBXAggregateTarget section */
		4C7F1E9B1CD3507C00098A83 /* Cleanup Whitespace */ = {
			isa = PBXAggregateTarget;
			buildConfigurationList = 4C7F1E9E1CD3507C00098A83 /* Build configuration list for PBXAggregateTarget "Cleanup Whitespace" */;
			buildPhases = (
				4C7F1E9F1CD3508200098A83 /* Cleanup Whitespace */,
			);
			dependencies = (
			);
			name = "Cleanup Whitespace";
			productName = "Cleanup Whitespace";
		};
/* End PBXAggregateTarget section */

/* Begin PBXBuildFile section */
		4C13EF9F1F7C116D0069CF58 /* ProcessInfoExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C13EF9E1F7C116D0069CF58 /* ProcessInfoExtension.swift */; };
		4C13EFA01F7C116D0069CF58 /* ProcessInfoExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C13EF9E1F7C116D0069CF58 /* ProcessInfoExtension.swift */; };
		4C13EFA11F7C116D0069CF58 /* ProcessInfoExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C13EF9E1F7C116D0069CF58 /* ProcessInfoExtension.swift */; };
		4C29B2EE1BFB25C00086A2EF /* SQift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C29B2E41BFB25C00086A2EF /* SQift.framework */; };
		4C29B3201BFB28330086A2EF /* SQift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C29B3161BFB28330086A2EF /* SQift.framework */; };
		4C34E4241F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4231F58D76E006FE2CC /* ExpressibleByRowError.swift */; };
		4C34E4251F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4231F58D76E006FE2CC /* ExpressibleByRowError.swift */; };
		4C34E4261F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4231F58D76E006FE2CC /* ExpressibleByRowError.swift */; };
		4C34E4271F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4231F58D76E006FE2CC /* ExpressibleByRowError.swift */; };
		4C34E4291F58D781006FE2CC /* ExpressibleByRowErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4281F58D781006FE2CC /* ExpressibleByRowErrorTests.swift */; };
		4C34E42A1F58D781006FE2CC /* ExpressibleByRowErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4281F58D781006FE2CC /* ExpressibleByRowErrorTests.swift */; };
		4C34E42B1F58D781006FE2CC /* ExpressibleByRowErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4281F58D781006FE2CC /* ExpressibleByRowErrorTests.swift */; };
		4C34E42D1F58D7F6006FE2CC /* DispatchQueueExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E42C1F58D7F6006FE2CC /* DispatchQueueExtension.swift */; };
		4C34E42E1F58D7F6006FE2CC /* DispatchQueueExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E42C1F58D7F6006FE2CC /* DispatchQueueExtension.swift */; };
		4C34E42F1F58D7F6006FE2CC /* DispatchQueueExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E42C1F58D7F6006FE2CC /* DispatchQueueExtension.swift */; };
		4C34E4311F58D8B4006FE2CC /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4301F58D8B4006FE2CC /* Statement.swift */; };
		4C34E4321F58D8B4006FE2CC /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4301F58D8B4006FE2CC /* Statement.swift */; };
		4C34E4331F58D8B4006FE2CC /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4301F58D8B4006FE2CC /* Statement.swift */; };
		4C34E4341F58D8B4006FE2CC /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4301F58D8B4006FE2CC /* Statement.swift */; };
		4C34E4361F58D8EA006FE2CC /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4351F58D8EA006FE2CC /* StatementTests.swift */; };
		4C34E4371F58D8EA006FE2CC /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4351F58D8EA006FE2CC /* StatementTests.swift */; };
		4C34E4381F58D8EA006FE2CC /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4351F58D8EA006FE2CC /* StatementTests.swift */; };
		4C34E43A1F58D933006FE2CC /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4391F58D928006FE2CC /* BaseTestCase.swift */; };
		4C34E43B1F58D933006FE2CC /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4391F58D928006FE2CC /* BaseTestCase.swift */; };
		4C34E43C1F58D934006FE2CC /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4391F58D928006FE2CC /* BaseTestCase.swift */; };
		4C34E43E1F58D97C006FE2CC /* Checkpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E43D1F58D97C006FE2CC /* Checkpoint.swift */; };
		4C34E43F1F58D97C006FE2CC /* Checkpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E43D1F58D97C006FE2CC /* Checkpoint.swift */; };
		4C34E4401F58D97C006FE2CC /* Checkpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E43D1F58D97C006FE2CC /* Checkpoint.swift */; };
		4C34E4411F58D97C006FE2CC /* Checkpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E43D1F58D97C006FE2CC /* Checkpoint.swift */; };
		4C34E4431F58D990006FE2CC /* CheckpointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4421F58D990006FE2CC /* CheckpointTests.swift */; };
		4C34E4441F58D990006FE2CC /* CheckpointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4421F58D990006FE2CC /* CheckpointTests.swift */; };
		4C34E4451F58D990006FE2CC /* CheckpointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4421F58D990006FE2CC /* CheckpointTests.swift */; };
		4C34E4471F58D9D8006FE2CC /* BusyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4461F58D9D8006FE2CC /* BusyTests.swift */; };
		4C34E4481F58D9D8006FE2CC /* BusyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4461F58D9D8006FE2CC /* BusyTests.swift */; };
		4C34E4491F58D9D8006FE2CC /* BusyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4461F58D9D8006FE2CC /* BusyTests.swift */; };
		4C34E44B1F58D9E3006FE2CC /* Busy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44A1F58D9E3006FE2CC /* Busy.swift */; };
		4C34E44C1F58D9E3006FE2CC /* Busy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44A1F58D9E3006FE2CC /* Busy.swift */; };
		4C34E44D1F58D9E3006FE2CC /* Busy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44A1F58D9E3006FE2CC /* Busy.swift */; };
		4C34E44E1F58D9E3006FE2CC /* Busy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44A1F58D9E3006FE2CC /* Busy.swift */; };
		4C34E4501F58DA23006FE2CC /* Hook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44F1F58DA23006FE2CC /* Hook.swift */; };
		4C34E4511F58DA23006FE2CC /* Hook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44F1F58DA23006FE2CC /* Hook.swift */; };
		4C34E4521F58DA23006FE2CC /* Hook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44F1F58DA23006FE2CC /* Hook.swift */; };
		4C34E4531F58DA23006FE2CC /* Hook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E44F1F58DA23006FE2CC /* Hook.swift */; };
		4C34E4551F58DA30006FE2CC /* HookTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4541F58DA30006FE2CC /* HookTests.swift */; };
		4C34E4561F58DA30006FE2CC /* HookTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4541F58DA30006FE2CC /* HookTests.swift */; };
		4C34E4571F58DA30006FE2CC /* HookTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4541F58DA30006FE2CC /* HookTests.swift */; };
		4C34E4591F58DA6F006FE2CC /* BackupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4581F58DA6F006FE2CC /* BackupTests.swift */; };
		4C34E45A1F58DA6F006FE2CC /* BackupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4581F58DA6F006FE2CC /* BackupTests.swift */; };
		4C34E45B1F58DA6F006FE2CC /* BackupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4581F58DA6F006FE2CC /* BackupTests.swift */; };
		4C34E45D1F58DA79006FE2CC /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E45C1F58DA79006FE2CC /* Backup.swift */; };
		4C34E45E1F58DA79006FE2CC /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E45C1F58DA79006FE2CC /* Backup.swift */; };
		4C34E45F1F58DA79006FE2CC /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E45C1F58DA79006FE2CC /* Backup.swift */; };
		4C34E4601F58DA79006FE2CC /* Backup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E45C1F58DA79006FE2CC /* Backup.swift */; };
		4C34E4621F58DABC006FE2CC /* Authorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4611F58DABC006FE2CC /* Authorizer.swift */; };
		4C34E4631F58DABC006FE2CC /* Authorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4611F58DABC006FE2CC /* Authorizer.swift */; };
		4C34E4641F58DABC006FE2CC /* Authorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4611F58DABC006FE2CC /* Authorizer.swift */; };
		4C34E4651F58DABC006FE2CC /* Authorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4611F58DABC006FE2CC /* Authorizer.swift */; };
		4C34E4671F58DAC7006FE2CC /* AuthorizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4661F58DAC7006FE2CC /* AuthorizerTests.swift */; };
		4C34E4681F58DAC7006FE2CC /* AuthorizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4661F58DAC7006FE2CC /* AuthorizerTests.swift */; };
		4C34E4691F58DAC7006FE2CC /* AuthorizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C34E4661F58DAC7006FE2CC /* AuthorizerTests.swift */; };
		4C61208F1F58BAEB00C289C0 /* SQift.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6120791F58BAD500C289C0 /* SQift.h */; settings = {ATTRIBUTES = (Public, ); }; };
		4C6120911F58BAEC00C289C0 /* SQift.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6120791F58BAD500C289C0 /* SQift.h */; settings = {ATTRIBUTES = (Public, ); }; };
		4C6120931F58BAEC00C289C0 /* SQift.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6120791F58BAD500C289C0 /* SQift.h */; settings = {ATTRIBUTES = (Public, ); }; };
		4C6120951F58BAED00C289C0 /* SQift.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C6120791F58BAD500C289C0 /* SQift.h */; settings = {ATTRIBUTES = (Public, ); }; };
		4C6120CD1F58BB5100C289C0 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207F1F58BAD500C289C0 /* Connection.swift */; };
		4C6120CE1F58BB5100C289C0 /* ConnectionPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120801F58BAD500C289C0 /* ConnectionPool.swift */; };
		4C6120CF1F58BB5100C289C0 /* ConnectionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120811F58BAD500C289C0 /* ConnectionQueue.swift */; };
		4C6120D01F58BB5100C289C0 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120831F58BAD500C289C0 /* Collation.swift */; };
		4C6120D11F58BB5100C289C0 /* Function.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120841F58BAD500C289C0 /* Function.swift */; };
		4C6120D21F58BB5100C289C0 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120851F58BAD500C289C0 /* Query.swift */; };
		4C6120D41F58BB5100C289C0 /* Trace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120871F58BAD500C289C0 /* Trace.swift */; };
		4C6120D51F58BB5100C289C0 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120881F58BAD500C289C0 /* Transaction.swift */; };
		4C6120D61F58BB5100C289C0 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208A1F58BAD500C289C0 /* Database.swift */; };
		4C6120D71F58BB5100C289C0 /* Migrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208B1F58BAD500C289C0 /* Migrator.swift */; };
		4C6120D81F58BB5100C289C0 /* StorageLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208C1F58BAD500C289C0 /* StorageLocation.swift */; };
		4C6120D91F58BB5100C289C0 /* SQLiteError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208E1F58BAD500C289C0 /* SQLiteError.swift */; };
		4C6120DA1F58BB5100C289C0 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120751F58BAD500C289C0 /* StringExtension.swift */; };
		4C6120DB1F58BB5100C289C0 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207C1F58BAD500C289C0 /* Binding.swift */; };
		4C6120DC1F58BB5100C289C0 /* Row.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207D1F58BAD500C289C0 /* Row.swift */; };
		4C6120DD1F58BB5200C289C0 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207F1F58BAD500C289C0 /* Connection.swift */; };
		4C6120DE1F58BB5200C289C0 /* ConnectionPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120801F58BAD500C289C0 /* ConnectionPool.swift */; };
		4C6120DF1F58BB5200C289C0 /* ConnectionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120811F58BAD500C289C0 /* ConnectionQueue.swift */; };
		4C6120E01F58BB5200C289C0 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120831F58BAD500C289C0 /* Collation.swift */; };
		4C6120E11F58BB5200C289C0 /* Function.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120841F58BAD500C289C0 /* Function.swift */; };
		4C6120E21F58BB5200C289C0 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120851F58BAD500C289C0 /* Query.swift */; };
		4C6120E41F58BB5200C289C0 /* Trace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120871F58BAD500C289C0 /* Trace.swift */; };
		4C6120E51F58BB5200C289C0 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120881F58BAD500C289C0 /* Transaction.swift */; };
		4C6120E61F58BB5200C289C0 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208A1F58BAD500C289C0 /* Database.swift */; };
		4C6120E71F58BB5200C289C0 /* Migrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208B1F58BAD500C289C0 /* Migrator.swift */; };
		4C6120E81F58BB5200C289C0 /* StorageLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208C1F58BAD500C289C0 /* StorageLocation.swift */; };
		4C6120E91F58BB5200C289C0 /* SQLiteError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208E1F58BAD500C289C0 /* SQLiteError.swift */; };
		4C6120EA1F58BB5200C289C0 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120751F58BAD500C289C0 /* StringExtension.swift */; };
		4C6120EB1F58BB5200C289C0 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207C1F58BAD500C289C0 /* Binding.swift */; };
		4C6120EC1F58BB5200C289C0 /* Row.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207D1F58BAD500C289C0 /* Row.swift */; };
		4C6120ED1F58BB5200C289C0 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207F1F58BAD500C289C0 /* Connection.swift */; };
		4C6120EE1F58BB5200C289C0 /* ConnectionPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120801F58BAD500C289C0 /* ConnectionPool.swift */; };
		4C6120EF1F58BB5200C289C0 /* ConnectionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120811F58BAD500C289C0 /* ConnectionQueue.swift */; };
		4C6120F01F58BB5200C289C0 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120831F58BAD500C289C0 /* Collation.swift */; };
		4C6120F11F58BB5200C289C0 /* Function.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120841F58BAD500C289C0 /* Function.swift */; };
		4C6120F21F58BB5200C289C0 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120851F58BAD500C289C0 /* Query.swift */; };
		4C6120F41F58BB5200C289C0 /* Trace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120871F58BAD500C289C0 /* Trace.swift */; };
		4C6120F51F58BB5200C289C0 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120881F58BAD500C289C0 /* Transaction.swift */; };
		4C6120F61F58BB5200C289C0 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208A1F58BAD500C289C0 /* Database.swift */; };
		4C6120F71F58BB5200C289C0 /* Migrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208B1F58BAD500C289C0 /* Migrator.swift */; };
		4C6120F81F58BB5200C289C0 /* StorageLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208C1F58BAD500C289C0 /* StorageLocation.swift */; };
		4C6120F91F58BB5200C289C0 /* SQLiteError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208E1F58BAD500C289C0 /* SQLiteError.swift */; };
		4C6120FA1F58BB5200C289C0 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120751F58BAD500C289C0 /* StringExtension.swift */; };
		4C6120FB1F58BB5200C289C0 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207C1F58BAD500C289C0 /* Binding.swift */; };
		4C6120FC1F58BB5200C289C0 /* Row.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207D1F58BAD500C289C0 /* Row.swift */; };
		4C6120FD1F58BB5300C289C0 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207F1F58BAD500C289C0 /* Connection.swift */; };
		4C6120FE1F58BB5300C289C0 /* ConnectionPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120801F58BAD500C289C0 /* ConnectionPool.swift */; };
		4C6120FF1F58BB5300C289C0 /* ConnectionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120811F58BAD500C289C0 /* ConnectionQueue.swift */; };
		4C6121001F58BB5300C289C0 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120831F58BAD500C289C0 /* Collation.swift */; };
		4C6121011F58BB5300C289C0 /* Function.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120841F58BAD500C289C0 /* Function.swift */; };
		4C6121021F58BB5300C289C0 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120851F58BAD500C289C0 /* Query.swift */; };
		4C6121041F58BB5300C289C0 /* Trace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120871F58BAD500C289C0 /* Trace.swift */; };
		4C6121051F58BB5300C289C0 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120881F58BAD500C289C0 /* Transaction.swift */; };
		4C6121061F58BB5300C289C0 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208A1F58BAD500C289C0 /* Database.swift */; };
		4C6121071F58BB5300C289C0 /* Migrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208B1F58BAD500C289C0 /* Migrator.swift */; };
		4C6121081F58BB5300C289C0 /* StorageLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208C1F58BAD500C289C0 /* StorageLocation.swift */; };
		4C6121091F58BB5300C289C0 /* SQLiteError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61208E1F58BAD500C289C0 /* SQLiteError.swift */; };
		4C61210A1F58BB5300C289C0 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6120751F58BAD500C289C0 /* StringExtension.swift */; };
		4C61210B1F58BB5300C289C0 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207C1F58BAD500C289C0 /* Binding.swift */; };
		4C61210C1F58BB5300C289C0 /* Row.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61207D1F58BAD500C289C0 /* Row.swift */; };
		4C61213F1F58BBE300C289C0 /* FileManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121271F58BBCD00C289C0 /* FileManagerExtension.swift */; };
		4C6121401F58BBE300C289C0 /* TestTables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121251F58BBCD00C289C0 /* TestTables.swift */; };
		4C6121411F58BBE300C289C0 /* ConnectionPoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212A1F58BBCE00C289C0 /* ConnectionPoolTests.swift */; };
		4C6121421F58BBE300C289C0 /* ConnectionQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212B1F58BBCE00C289C0 /* ConnectionQueueTests.swift */; };
		4C6121431F58BBE300C289C0 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212C1F58BBCE00C289C0 /* ConnectionTests.swift */; };
		4C6121441F58BBE300C289C0 /* CollationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212E1F58BBCE00C289C0 /* CollationTests.swift */; };
		4C6121451F58BBE300C289C0 /* FunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212F1F58BBCE00C289C0 /* FunctionTests.swift */; };
		4C6121461F58BBE300C289C0 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121301F58BBCE00C289C0 /* QueryTests.swift */; };
		4C6121471F58BBE300C289C0 /* TraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121311F58BBCE00C289C0 /* TraceTests.swift */; };
		4C6121481F58BBE300C289C0 /* TransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121321F58BBCE00C289C0 /* TransactionTests.swift */; };
		4C6121491F58BBE300C289C0 /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121341F58BBCE00C289C0 /* DatabaseTests.swift */; };
		4C61214A1F58BBE300C289C0 /* MigratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121351F58BBCE00C289C0 /* MigratorTests.swift */; };
		4C61214B1F58BBE300C289C0 /* SQLiteErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121371F58BBCE00C289C0 /* SQLiteErrorTests.swift */; };
		4C61214C1F58BBE300C289C0 /* StringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121391F58BBCE00C289C0 /* StringExtensionTests.swift */; };
		4C61214D1F58BBE300C289C0 /* BindingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61213B1F58BBCE00C289C0 /* BindingTests.swift */; };
		4C61214E1F58BBE300C289C0 /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61213C1F58BBCE00C289C0 /* RowTests.swift */; };
		4C61214F1F58BBE400C289C0 /* FileManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121271F58BBCD00C289C0 /* FileManagerExtension.swift */; };
		4C6121501F58BBE400C289C0 /* TestTables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121251F58BBCD00C289C0 /* TestTables.swift */; };
		4C6121511F58BBE400C289C0 /* ConnectionPoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212A1F58BBCE00C289C0 /* ConnectionPoolTests.swift */; };
		4C6121521F58BBE400C289C0 /* ConnectionQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212B1F58BBCE00C289C0 /* ConnectionQueueTests.swift */; };
		4C6121531F58BBE400C289C0 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212C1F58BBCE00C289C0 /* ConnectionTests.swift */; };
		4C6121541F58BBE400C289C0 /* CollationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212E1F58BBCE00C289C0 /* CollationTests.swift */; };
		4C6121551F58BBE400C289C0 /* FunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212F1F58BBCE00C289C0 /* FunctionTests.swift */; };
		4C6121561F58BBE400C289C0 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121301F58BBCE00C289C0 /* QueryTests.swift */; };
		4C6121571F58BBE400C289C0 /* TraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121311F58BBCE00C289C0 /* TraceTests.swift */; };
		4C6121581F58BBE400C289C0 /* TransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121321F58BBCE00C289C0 /* TransactionTests.swift */; };
		4C6121591F58BBE400C289C0 /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121341F58BBCE00C289C0 /* DatabaseTests.swift */; };
		4C61215A1F58BBE400C289C0 /* MigratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121351F58BBCE00C289C0 /* MigratorTests.swift */; };
		4C61215B1F58BBE400C289C0 /* SQLiteErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121371F58BBCE00C289C0 /* SQLiteErrorTests.swift */; };
		4C61215C1F58BBE400C289C0 /* StringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121391F58BBCE00C289C0 /* StringExtensionTests.swift */; };
		4C61215D1F58BBE400C289C0 /* BindingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61213B1F58BBCE00C289C0 /* BindingTests.swift */; };
		4C61215E1F58BBE400C289C0 /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61213C1F58BBCE00C289C0 /* RowTests.swift */; };
		4C61215F1F58BBE400C289C0 /* FileManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121271F58BBCD00C289C0 /* FileManagerExtension.swift */; };
		4C6121601F58BBE400C289C0 /* TestTables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121251F58BBCD00C289C0 /* TestTables.swift */; };
		4C6121611F58BBE400C289C0 /* ConnectionPoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212A1F58BBCE00C289C0 /* ConnectionPoolTests.swift */; };
		4C6121621F58BBE400C289C0 /* ConnectionQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212B1F58BBCE00C289C0 /* ConnectionQueueTests.swift */; };
		4C6121631F58BBE400C289C0 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212C1F58BBCE00C289C0 /* ConnectionTests.swift */; };
		4C6121641F58BBE400C289C0 /* CollationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212E1F58BBCE00C289C0 /* CollationTests.swift */; };
		4C6121651F58BBE400C289C0 /* FunctionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61212F1F58BBCE00C289C0 /* FunctionTests.swift */; };
		4C6121661F58BBE400C289C0 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121301F58BBCE00C289C0 /* QueryTests.swift */; };
		4C6121671F58BBE400C289C0 /* TraceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121311F58BBCE00C289C0 /* TraceTests.swift */; };
		4C6121681F58BBE400C289C0 /* TransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121321F58BBCE00C289C0 /* TransactionTests.swift */; };
		4C6121691F58BBE400C289C0 /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121341F58BBCE00C289C0 /* DatabaseTests.swift */; };
		4C61216A1F58BBE400C289C0 /* MigratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121351F58BBCE00C289C0 /* MigratorTests.swift */; };
		4C61216B1F58BBE400C289C0 /* SQLiteErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121371F58BBCE00C289C0 /* SQLiteErrorTests.swift */; };
		4C61216C1F58BBE400C289C0 /* StringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6121391F58BBCE00C289C0 /* StringExtensionTests.swift */; };
		4C61216D1F58BBE400C289C0 /* BindingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61213B1F58BBCE00C289C0 /* BindingTests.swift */; };
		4C61216E1F58BBE400C289C0 /* RowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C61213C1F58BBCE00C289C0 /* RowTests.swift */; };
		4C7EC8C920461EFF000FC1EF /* TableLockPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8C820461EFF000FC1EF /* TableLockPolicy.swift */; };
		4C7EC8CA20461EFF000FC1EF /* TableLockPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8C820461EFF000FC1EF /* TableLockPolicy.swift */; };
		4C7EC8CB20461EFF000FC1EF /* TableLockPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8C820461EFF000FC1EF /* TableLockPolicy.swift */; };
		4C7EC8CC20461EFF000FC1EF /* TableLockPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8C820461EFF000FC1EF /* TableLockPolicy.swift */; };
		4C7EC8CE20462706000FC1EF /* TableLockPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8CD20462706000FC1EF /* TableLockPolicyTests.swift */; };
		4C7EC8CF20462706000FC1EF /* TableLockPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8CD20462706000FC1EF /* TableLockPolicyTests.swift */; };
		4C7EC8D020462706000FC1EF /* TableLockPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7EC8CD20462706000FC1EF /* TableLockPolicyTests.swift */; };
		4CA8C2291BF6A49400822606 /* SQift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CA8C21E1BF6A49400822606 /* SQift.framework */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		4C29B2EF1BFB25C00086A2EF /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 4CA8C2151BF6A49400822606 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 4C29B2E31BFB25C00086A2EF;
			remoteInfo = "SQift OSX";
		};
		4C29B3211BFB28330086A2EF /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 4CA8C2151BF6A49400822606 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 4C29B3151BFB28330086A2EF;
			remoteInfo = "SQift tvOS";
		};
		4CA8C22A1BF6A49400822606 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = 4CA8C2151BF6A49400822606 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 4CA8C21D1BF6A49400822606;
			remoteInfo = SQift;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		2F73CA762B50B32D000BEA64 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
		4C13EF9E1F7C116D0069CF58 /* ProcessInfoExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessInfoExtension.swift; sourceTree = "<group>"; };
		4C29B2E41BFB25C00086A2EF /* SQift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		4C29B2ED1BFB25C00086A2EF /* SQift Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQift Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
		4C29B3161BFB28330086A2EF /* SQift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		4C29B31F1BFB28330086A2EF /* SQift Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQift Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
		4C34E4231F58D76E006FE2CC /* ExpressibleByRowError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpressibleByRowError.swift; sourceTree = "<group>"; };
		4C34E4281F58D781006FE2CC /* ExpressibleByRowErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpressibleByRowErrorTests.swift; sourceTree = "<group>"; };
		4C34E42C1F58D7F6006FE2CC /* DispatchQueueExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchQueueExtension.swift; sourceTree = "<group>"; };
		4C34E4301F58D8B4006FE2CC /* Statement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statement.swift; sourceTree = "<group>"; };
		4C34E4351F58D8EA006FE2CC /* StatementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatementTests.swift; sourceTree = "<group>"; };
		4C34E4391F58D928006FE2CC /* BaseTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTestCase.swift; sourceTree = "<group>"; };
		4C34E43D1F58D97C006FE2CC /* Checkpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkpoint.swift; sourceTree = "<group>"; };
		4C34E4421F58D990006FE2CC /* CheckpointTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckpointTests.swift; sourceTree = "<group>"; };
		4C34E4461F58D9D8006FE2CC /* BusyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BusyTests.swift; sourceTree = "<group>"; };
		4C34E44A1F58D9E3006FE2CC /* Busy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Busy.swift; sourceTree = "<group>"; };
		4C34E44F1F58DA23006FE2CC /* Hook.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hook.swift; sourceTree = "<group>"; };
		4C34E4541F58DA30006FE2CC /* HookTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HookTests.swift; sourceTree = "<group>"; };
		4C34E4581F58DA6F006FE2CC /* BackupTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupTests.swift; sourceTree = "<group>"; };
		4C34E45C1F58DA79006FE2CC /* Backup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backup.swift; sourceTree = "<group>"; };
		4C34E4611F58DABC006FE2CC /* Authorizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authorizer.swift; sourceTree = "<group>"; };
		4C34E4661F58DAC7006FE2CC /* AuthorizerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizerTests.swift; sourceTree = "<group>"; };
		4C3C4CFA1BFB2B6F0080A0C6 /* SQift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		4C5036FE1F69B13700B54640 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
		4C6120751F58BAD500C289C0 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = "<group>"; };
		4C6120781F58BAD500C289C0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		4C6120791F58BAD500C289C0 /* SQift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SQift.h; sourceTree = "<group>"; };
		4C61207C1F58BAD500C289C0 /* Binding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Binding.swift; sourceTree = "<group>"; };
		4C61207D1F58BAD500C289C0 /* Row.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Row.swift; sourceTree = "<group>"; };
		4C61207F1F58BAD500C289C0 /* Connection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = "<group>"; };
		4C6120801F58BAD500C289C0 /* ConnectionPool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionPool.swift; sourceTree = "<group>"; };
		4C6120811F58BAD500C289C0 /* ConnectionQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionQueue.swift; sourceTree = "<group>"; };
		4C6120831F58BAD500C289C0 /* Collation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Collation.swift; sourceTree = "<group>"; };
		4C6120841F58BAD500C289C0 /* Function.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Function.swift; sourceTree = "<group>"; };
		4C6120851F58BAD500C289C0 /* Query.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = "<group>"; };
		4C6120871F58BAD500C289C0 /* Trace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Trace.swift; sourceTree = "<group>"; };
		4C6120881F58BAD500C289C0 /* Transaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Transaction.swift; sourceTree = "<group>"; };
		4C61208A1F58BAD500C289C0 /* Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = "<group>"; };
		4C61208B1F58BAD500C289C0 /* Migrator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Migrator.swift; sourceTree = "<group>"; };
		4C61208C1F58BAD500C289C0 /* StorageLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageLocation.swift; sourceTree = "<group>"; };
		4C61208E1F58BAD500C289C0 /* SQLiteError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SQLiteError.swift; sourceTree = "<group>"; };
		4C6121251F58BBCD00C289C0 /* TestTables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestTables.swift; sourceTree = "<group>"; };
		4C6121271F58BBCD00C289C0 /* FileManagerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManagerExtension.swift; sourceTree = "<group>"; };
		4C61212A1F58BBCE00C289C0 /* ConnectionPoolTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionPoolTests.swift; sourceTree = "<group>"; };
		4C61212B1F58BBCE00C289C0 /* ConnectionQueueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionQueueTests.swift; sourceTree = "<group>"; };
		4C61212C1F58BBCE00C289C0 /* ConnectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionTests.swift; sourceTree = "<group>"; };
		4C61212E1F58BBCE00C289C0 /* CollationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollationTests.swift; sourceTree = "<group>"; };
		4C61212F1F58BBCE00C289C0 /* FunctionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FunctionTests.swift; sourceTree = "<group>"; };
		4C6121301F58BBCE00C289C0 /* QueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryTests.swift; sourceTree = "<group>"; };
		4C6121311F58BBCE00C289C0 /* TraceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TraceTests.swift; sourceTree = "<group>"; };
		4C6121321F58BBCE00C289C0 /* TransactionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionTests.swift; sourceTree = "<group>"; };
		4C6121341F58BBCE00C289C0 /* DatabaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTests.swift; sourceTree = "<group>"; };
		4C6121351F58BBCE00C289C0 /* MigratorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigratorTests.swift; sourceTree = "<group>"; };
		4C6121371F58BBCE00C289C0 /* SQLiteErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SQLiteErrorTests.swift; sourceTree = "<group>"; };
		4C6121391F58BBCE00C289C0 /* StringExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtensionTests.swift; sourceTree = "<group>"; };
		4C61213B1F58BBCE00C289C0 /* BindingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BindingTests.swift; sourceTree = "<group>"; };
		4C61213C1F58BBCE00C289C0 /* RowTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RowTests.swift; sourceTree = "<group>"; };
		4C61213E1F58BBCE00C289C0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		4C7EC8C820461EFF000FC1EF /* TableLockPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableLockPolicy.swift; sourceTree = "<group>"; };
		4C7EC8CD20462706000FC1EF /* TableLockPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableLockPolicyTests.swift; sourceTree = "<group>"; };
		4C8A44472363BCF8008C7BBC /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
		4C8A44482363BCF8008C7BBC /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
		4C8A44492363BCF8008C7BBC /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = "<group>"; };
		4C8A44522363BD57008C7BBC /* SQift 4.0 Migration Guide.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "SQift 4.0 Migration Guide.md"; path = "Documentation/SQift 4.0 Migration Guide.md"; sourceTree = "<group>"; };
		4CA8C21E1BF6A49400822606 /* SQift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		4CA8C2281BF6A49400822606 /* SQift Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQift Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
		4CB1AE431FA1169000976A5C /* NOTICE */ = {isa = PBXFileReference; lastKnownFileType = text; path = NOTICE; sourceTree = "<group>"; };
		4CD9E069207C47FB00D02902 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = "<group>"; };
		4CE5E8681F59E88E00D47037 /* SQift.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = SQift.podspec; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		4C29B2E01BFB25C00086A2EF /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B2EA1BFB25C00086A2EF /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C29B2EE1BFB25C00086A2EF /* SQift.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B3121BFB28330086A2EF /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B31C1BFB28330086A2EF /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C29B3201BFB28330086A2EF /* SQift.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C3C4CF61BFB2B6F0080A0C6 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C21A1BF6A49400822606 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C2251BF6A49400822606 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4CA8C2291BF6A49400822606 /* SQift.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		4C6120741F58BAD500C289C0 /* Extensions */ = {
			isa = PBXGroup;
			children = (
				4C6120751F58BAD500C289C0 /* StringExtension.swift */,
			);
			path = Extensions;
			sourceTree = "<group>";
		};
		4C6120761F58BAD500C289C0 /* Supporting Files */ = {
			isa = PBXGroup;
			children = (
				4C6120781F58BAD500C289C0 /* Info.plist */,
				4C6120791F58BAD500C289C0 /* SQift.h */,
			);
			path = "Supporting Files";
			sourceTree = "<group>";
		};
		4C61207B1F58BAD500C289C0 /* Row */ = {
			isa = PBXGroup;
			children = (
				4C61207C1F58BAD500C289C0 /* Binding.swift */,
				4C61207D1F58BAD500C289C0 /* Row.swift */,
			);
			path = Row;
			sourceTree = "<group>";
		};
		4C61207E1F58BAD500C289C0 /* Connection */ = {
			isa = PBXGroup;
			children = (
				4C61207F1F58BAD500C289C0 /* Connection.swift */,
				4C6120801F58BAD500C289C0 /* ConnectionPool.swift */,
				4C6120811F58BAD500C289C0 /* ConnectionQueue.swift */,
				4C34E4301F58D8B4006FE2CC /* Statement.swift */,
				4C6120821F58BAD500C289C0 /* Functions */,
			);
			path = Connection;
			sourceTree = "<group>";
		};
		4C6120821F58BAD500C289C0 /* Functions */ = {
			isa = PBXGroup;
			children = (
				4C34E4611F58DABC006FE2CC /* Authorizer.swift */,
				4C34E45C1F58DA79006FE2CC /* Backup.swift */,
				4C34E44A1F58D9E3006FE2CC /* Busy.swift */,
				4C34E43D1F58D97C006FE2CC /* Checkpoint.swift */,
				4C6120831F58BAD500C289C0 /* Collation.swift */,
				4C6120841F58BAD500C289C0 /* Function.swift */,
				4C34E44F1F58DA23006FE2CC /* Hook.swift */,
				4C6120851F58BAD500C289C0 /* Query.swift */,
				4C6120871F58BAD500C289C0 /* Trace.swift */,
				4C6120881F58BAD500C289C0 /* Transaction.swift */,
			);
			path = Functions;
			sourceTree = "<group>";
		};
		4C6120891F58BAD500C289C0 /* Database */ = {
			isa = PBXGroup;
			children = (
				4C61208A1F58BAD500C289C0 /* Database.swift */,
				4C61208B1F58BAD500C289C0 /* Migrator.swift */,
				4C61208C1F58BAD500C289C0 /* StorageLocation.swift */,
				4C7EC8C820461EFF000FC1EF /* TableLockPolicy.swift */,
			);
			path = Database;
			sourceTree = "<group>";
		};
		4C61208D1F58BAD500C289C0 /* Errors */ = {
			isa = PBXGroup;
			children = (
				4C34E4231F58D76E006FE2CC /* ExpressibleByRowError.swift */,
				4C61208E1F58BAD500C289C0 /* SQLiteError.swift */,
			);
			path = Errors;
			sourceTree = "<group>";
		};
		4C6121241F58BBCD00C289C0 /* Helpers */ = {
			isa = PBXGroup;
			children = (
				4C6121251F58BBCD00C289C0 /* TestTables.swift */,
			);
			path = Helpers;
			sourceTree = "<group>";
		};
		4C6121261F58BBCD00C289C0 /* Extensions */ = {
			isa = PBXGroup;
			children = (
				4C34E42C1F58D7F6006FE2CC /* DispatchQueueExtension.swift */,
				4C6121271F58BBCD00C289C0 /* FileManagerExtension.swift */,
				4C13EF9E1F7C116D0069CF58 /* ProcessInfoExtension.swift */,
			);
			path = Extensions;
			sourceTree = "<group>";
		};
		4C6121281F58BBCE00C289C0 /* Tests */ = {
			isa = PBXGroup;
			children = (
				4C34E4391F58D928006FE2CC /* BaseTestCase.swift */,
				4C6121291F58BBCE00C289C0 /* Connection */,
				4C6121331F58BBCE00C289C0 /* Database */,
				4C6121361F58BBCE00C289C0 /* Errors */,
				4C6121381F58BBCE00C289C0 /* Extensions */,
				4C61213A1F58BBCE00C289C0 /* Rows */,
			);
			path = Tests;
			sourceTree = "<group>";
		};
		4C6121291F58BBCE00C289C0 /* Connection */ = {
			isa = PBXGroup;
			children = (
				4C61212A1F58BBCE00C289C0 /* ConnectionPoolTests.swift */,
				4C61212B1F58BBCE00C289C0 /* ConnectionQueueTests.swift */,
				4C61212C1F58BBCE00C289C0 /* ConnectionTests.swift */,
				4C34E4351F58D8EA006FE2CC /* StatementTests.swift */,
				4C61212D1F58BBCE00C289C0 /* Functions */,
			);
			path = Connection;
			sourceTree = "<group>";
		};
		4C61212D1F58BBCE00C289C0 /* Functions */ = {
			isa = PBXGroup;
			children = (
				4C34E4661F58DAC7006FE2CC /* AuthorizerTests.swift */,
				4C34E4581F58DA6F006FE2CC /* BackupTests.swift */,
				4C34E4461F58D9D8006FE2CC /* BusyTests.swift */,
				4C34E4421F58D990006FE2CC /* CheckpointTests.swift */,
				4C61212E1F58BBCE00C289C0 /* CollationTests.swift */,
				4C61212F1F58BBCE00C289C0 /* FunctionTests.swift */,
				4C34E4541F58DA30006FE2CC /* HookTests.swift */,
				4C6121301F58BBCE00C289C0 /* QueryTests.swift */,
				4C6121311F58BBCE00C289C0 /* TraceTests.swift */,
				4C6121321F58BBCE00C289C0 /* TransactionTests.swift */,
			);
			path = Functions;
			sourceTree = "<group>";
		};
		4C6121331F58BBCE00C289C0 /* Database */ = {
			isa = PBXGroup;
			children = (
				4C6121341F58BBCE00C289C0 /* DatabaseTests.swift */,
				4C6121351F58BBCE00C289C0 /* MigratorTests.swift */,
				4C7EC8CD20462706000FC1EF /* TableLockPolicyTests.swift */,
			);
			path = Database;
			sourceTree = "<group>";
		};
		4C6121361F58BBCE00C289C0 /* Errors */ = {
			isa = PBXGroup;
			children = (
				4C34E4281F58D781006FE2CC /* ExpressibleByRowErrorTests.swift */,
				4C6121371F58BBCE00C289C0 /* SQLiteErrorTests.swift */,
			);
			path = Errors;
			sourceTree = "<group>";
		};
		4C6121381F58BBCE00C289C0 /* Extensions */ = {
			isa = PBXGroup;
			children = (
				4C6121391F58BBCE00C289C0 /* StringExtensionTests.swift */,
			);
			path = Extensions;
			sourceTree = "<group>";
		};
		4C61213A1F58BBCE00C289C0 /* Rows */ = {
			isa = PBXGroup;
			children = (
				4C61213B1F58BBCE00C289C0 /* BindingTests.swift */,
				4C61213C1F58BBCE00C289C0 /* RowTests.swift */,
			);
			path = Rows;
			sourceTree = "<group>";
		};
		4C61213D1F58BBCE00C289C0 /* Supporting Files */ = {
			isa = PBXGroup;
			children = (
				4C61213E1F58BBCE00C289C0 /* Info.plist */,
			);
			path = "Supporting Files";
			sourceTree = "<group>";
		};
		4C8A44462363BCB7008C7BBC /* Documentation */ = {
			isa = PBXGroup;
			children = (
				4C8A44482363BCF8008C7BBC /* CHANGELOG.md */,
				4C8A44492363BCF8008C7BBC /* CONTRIBUTING.md */,
				4C8A44472363BCF8008C7BBC /* README.md */,
				4C8A44512363BD3C008C7BBC /* Migration Guides */,
			);
			name = Documentation;
			sourceTree = "<group>";
		};
		4C8A44512363BD3C008C7BBC /* Migration Guides */ = {
			isa = PBXGroup;
			children = (
				4C8A44522363BD57008C7BBC /* SQift 4.0 Migration Guide.md */,
			);
			name = "Migration Guides";
			sourceTree = "<group>";
		};
		4CA8C2141BF6A49400822606 = {
			isa = PBXGroup;
			children = (
				4CE5E8661F59E87800D47037 /* Deployment */,
				4C8A44462363BCB7008C7BBC /* Documentation */,
				4CD9E068207C47EC00D02902 /* Integration */,
				4CA8C2381BF6A4C100822606 /* Source */,
				4CA8C23D1BF6A4C700822606 /* Tests */,
				4CA8C21F1BF6A49400822606 /* Products */,
			);
			sourceTree = "<group>";
			usesTabs = 0;
			wrapsLines = 1;
		};
		4CA8C21F1BF6A49400822606 /* Products */ = {
			isa = PBXGroup;
			children = (
				4CA8C21E1BF6A49400822606 /* SQift.framework */,
				4CA8C2281BF6A49400822606 /* SQift Tests.xctest */,
				4C29B2E41BFB25C00086A2EF /* SQift.framework */,
				4C29B2ED1BFB25C00086A2EF /* SQift Tests.xctest */,
				4C29B3161BFB28330086A2EF /* SQift.framework */,
				4C29B31F1BFB28330086A2EF /* SQift Tests.xctest */,
				4C3C4CFA1BFB2B6F0080A0C6 /* SQift.framework */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		4CA8C2381BF6A4C100822606 /* Source */ = {
			isa = PBXGroup;
			children = (
				4C61207E1F58BAD500C289C0 /* Connection */,
				4C6120891F58BAD500C289C0 /* Database */,
				4C61208D1F58BAD500C289C0 /* Errors */,
				4C6120741F58BAD500C289C0 /* Extensions */,
				4C61207B1F58BAD500C289C0 /* Row */,
				4C6120761F58BAD500C289C0 /* Supporting Files */,
			);
			path = Source;
			sourceTree = "<group>";
		};
		4CA8C23D1BF6A4C700822606 /* Tests */ = {
			isa = PBXGroup;
			children = (
				4C6121261F58BBCD00C289C0 /* Extensions */,
				4C6121241F58BBCD00C289C0 /* Helpers */,
				4C61213D1F58BBCE00C289C0 /* Supporting Files */,
				4C6121281F58BBCE00C289C0 /* Tests */,
			);
			path = Tests;
			sourceTree = "<group>";
		};
		4CD9E068207C47EC00D02902 /* Integration */ = {
			isa = PBXGroup;
			children = (
				4CD9E069207C47FB00D02902 /* .travis.yml */,
			);
			name = Integration;
			sourceTree = "<group>";
		};
		4CE5E8661F59E87800D47037 /* Deployment */ = {
			isa = PBXGroup;
			children = (
				4C5036FE1F69B13700B54640 /* LICENSE */,
				4CB1AE431FA1169000976A5C /* NOTICE */,
				4CE5E8681F59E88E00D47037 /* SQift.podspec */,
				2F73CA762B50B32D000BEA64 /* Package.swift */,
			);
			name = Deployment;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXHeadersBuildPhase section */
		4C29B2E11BFB25C00086A2EF /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120911F58BAEC00C289C0 /* SQift.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B3131BFB28330086A2EF /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120931F58BAEC00C289C0 /* SQift.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C3C4CF71BFB2B6F0080A0C6 /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120951F58BAED00C289C0 /* SQift.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C21B1BF6A49400822606 /* Headers */ = {
			isa = PBXHeadersBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C61208F1F58BAEB00C289C0 /* SQift.h in Headers */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXHeadersBuildPhase section */

/* Begin PBXNativeTarget section */
		4C29B2E31BFB25C00086A2EF /* SQift macOS */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4C29B2F91BFB25C00086A2EF /* Build configuration list for PBXNativeTarget "SQift macOS" */;
			buildPhases = (
				4C29B2DF1BFB25C00086A2EF /* Sources */,
				4C29B2E01BFB25C00086A2EF /* Frameworks */,
				4C29B2E11BFB25C00086A2EF /* Headers */,
				4C29B2E21BFB25C00086A2EF /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "SQift macOS";
			productName = "SQift OSX";
			productReference = 4C29B2E41BFB25C00086A2EF /* SQift.framework */;
			productType = "com.apple.product-type.framework";
		};
		4C29B2EC1BFB25C00086A2EF /* SQift macOS Tests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4C29B2FA1BFB25C00086A2EF /* Build configuration list for PBXNativeTarget "SQift macOS Tests" */;
			buildPhases = (
				4C29B2E91BFB25C00086A2EF /* Sources */,
				4C29B2EA1BFB25C00086A2EF /* Frameworks */,
				4C29B2EB1BFB25C00086A2EF /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				4C29B2F01BFB25C00086A2EF /* PBXTargetDependency */,
			);
			name = "SQift macOS Tests";
			productName = "SQift OSXTests";
			productReference = 4C29B2ED1BFB25C00086A2EF /* SQift Tests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		4C29B3151BFB28330086A2EF /* SQift tvOS */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4C29B3271BFB28330086A2EF /* Build configuration list for PBXNativeTarget "SQift tvOS" */;
			buildPhases = (
				4C29B3111BFB28330086A2EF /* Sources */,
				4C29B3121BFB28330086A2EF /* Frameworks */,
				4C29B3131BFB28330086A2EF /* Headers */,
				4C29B3141BFB28330086A2EF /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "SQift tvOS";
			productName = "SQift tvOS";
			productReference = 4C29B3161BFB28330086A2EF /* SQift.framework */;
			productType = "com.apple.product-type.framework";
		};
		4C29B31E1BFB28330086A2EF /* SQift tvOS Tests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4C29B32A1BFB28330086A2EF /* Build configuration list for PBXNativeTarget "SQift tvOS Tests" */;
			buildPhases = (
				4C29B31B1BFB28330086A2EF /* Sources */,
				4C29B31C1BFB28330086A2EF /* Frameworks */,
				4C29B31D1BFB28330086A2EF /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				4C29B3221BFB28330086A2EF /* PBXTargetDependency */,
			);
			name = "SQift tvOS Tests";
			productName = "SQift tvOSTests";
			productReference = 4C29B31F1BFB28330086A2EF /* SQift Tests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		4C3C4CF91BFB2B6F0080A0C6 /* SQift watchOS */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4C3C4D011BFB2B6F0080A0C6 /* Build configuration list for PBXNativeTarget "SQift watchOS" */;
			buildPhases = (
				4C3C4CF51BFB2B6F0080A0C6 /* Sources */,
				4C3C4CF61BFB2B6F0080A0C6 /* Frameworks */,
				4C3C4CF71BFB2B6F0080A0C6 /* Headers */,
				4C3C4CF81BFB2B6F0080A0C6 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "SQift watchOS";
			productName = "SQift watchOS";
			productReference = 4C3C4CFA1BFB2B6F0080A0C6 /* SQift.framework */;
			productType = "com.apple.product-type.framework";
		};
		4CA8C21D1BF6A49400822606 /* SQift iOS */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4CA8C2321BF6A49400822606 /* Build configuration list for PBXNativeTarget "SQift iOS" */;
			buildPhases = (
				4CA8C2191BF6A49400822606 /* Sources */,
				4CA8C21A1BF6A49400822606 /* Frameworks */,
				4CA8C21B1BF6A49400822606 /* Headers */,
				4CA8C21C1BF6A49400822606 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "SQift iOS";
			productName = SQift;
			productReference = 4CA8C21E1BF6A49400822606 /* SQift.framework */;
			productType = "com.apple.product-type.framework";
		};
		4CA8C2271BF6A49400822606 /* SQift iOS Tests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 4CA8C2351BF6A49400822606 /* Build configuration list for PBXNativeTarget "SQift iOS Tests" */;
			buildPhases = (
				4CA8C2241BF6A49400822606 /* Sources */,
				4CA8C2251BF6A49400822606 /* Frameworks */,
				4CA8C2261BF6A49400822606 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				4CA8C22B1BF6A49400822606 /* PBXTargetDependency */,
			);
			name = "SQift iOS Tests";
			productName = SQiftTests;
			productReference = 4CA8C2281BF6A49400822606 /* SQift Tests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		4CA8C2151BF6A49400822606 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 0710;
				LastUpgradeCheck = 0930;
				ORGANIZATIONNAME = Nike;
				TargetAttributes = {
					4C29B2E31BFB25C00086A2EF = {
						CreatedOnToolsVersion = 7.1;
						LastSwiftMigration = 0900;
						ProvisioningStyle = Manual;
					};
					4C29B2EC1BFB25C00086A2EF = {
						CreatedOnToolsVersion = 7.1;
						LastSwiftMigration = 0900;
					};
					4C29B3151BFB28330086A2EF = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeamName = "Nike, Inc.";
						LastSwiftMigration = 1020;
						ProvisioningStyle = Manual;
					};
					4C29B31E1BFB28330086A2EF = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeamName = "Nike, Inc.";
						LastSwiftMigration = 1020;
					};
					4C3C4CF91BFB2B6F0080A0C6 = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeamName = "Nike, Inc.";
						LastSwiftMigration = 1020;
						ProvisioningStyle = Manual;
					};
					4C7F1E9B1CD3507C00098A83 = {
						CreatedOnToolsVersion = 7.3;
					};
					4CA8C21D1BF6A49400822606 = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeamName = "Nike, Inc.";
						LastSwiftMigration = 1020;
						ProvisioningStyle = Manual;
					};
					4CA8C2271BF6A49400822606 = {
						CreatedOnToolsVersion = 7.1;
						DevelopmentTeamName = "Nike, Inc.";
						LastSwiftMigration = 1020;
					};
				};
			};
			buildConfigurationList = 4CA8C2181BF6A49400822606 /* Build configuration list for PBXProject "SQift" */;
			compatibilityVersion = "Xcode 9.3";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = 4CA8C2141BF6A49400822606;
			productRefGroup = 4CA8C21F1BF6A49400822606 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				4CA8C21D1BF6A49400822606 /* SQift iOS */,
				4CA8C2271BF6A49400822606 /* SQift iOS Tests */,
				4C29B2E31BFB25C00086A2EF /* SQift macOS */,
				4C29B2EC1BFB25C00086A2EF /* SQift macOS Tests */,
				4C29B3151BFB28330086A2EF /* SQift tvOS */,
				4C29B31E1BFB28330086A2EF /* SQift tvOS Tests */,
				4C3C4CF91BFB2B6F0080A0C6 /* SQift watchOS */,
				4C7F1E9B1CD3507C00098A83 /* Cleanup Whitespace */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		4C29B2E21BFB25C00086A2EF /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B2EB1BFB25C00086A2EF /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B3141BFB28330086A2EF /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B31D1BFB28330086A2EF /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C3C4CF81BFB2B6F0080A0C6 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C21C1BF6A49400822606 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C2261BF6A49400822606 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
		4C7F1E9F1CD3508200098A83 /* Cleanup Whitespace */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Cleanup Whitespace";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "#!/bin/sh\ndirectories=(Source Tests)\n\nfor directory in \"${directories[@]}\"\ndo\necho \"Cleaning whitespace in directory: $directory\"\nfind $directory -iregex '.*\\.swift' -exec sed -E -i '' -e 's/^ +$//g' {} \\;\ndone\n";
		};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		4C29B2DF1BFB25C00086A2EF /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120DF1F58BB5200C289C0 /* ConnectionQueue.swift in Sources */,
				4C34E4271F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */,
				4C34E4521F58DA23006FE2CC /* Hook.swift in Sources */,
				4C6120E91F58BB5200C289C0 /* SQLiteError.swift in Sources */,
				4C6120E81F58BB5200C289C0 /* StorageLocation.swift in Sources */,
				4C6120EB1F58BB5200C289C0 /* Binding.swift in Sources */,
				4C6120DD1F58BB5200C289C0 /* Connection.swift in Sources */,
				4C6120E71F58BB5200C289C0 /* Migrator.swift in Sources */,
				4C6120DE1F58BB5200C289C0 /* ConnectionPool.swift in Sources */,
				4C6120E01F58BB5200C289C0 /* Collation.swift in Sources */,
				4C34E4651F58DABC006FE2CC /* Authorizer.swift in Sources */,
				4C7EC8CA20461EFF000FC1EF /* TableLockPolicy.swift in Sources */,
				4C6120EA1F58BB5200C289C0 /* StringExtension.swift in Sources */,
				4C6120E41F58BB5200C289C0 /* Trace.swift in Sources */,
				4C34E4401F58D97C006FE2CC /* Checkpoint.swift in Sources */,
				4C34E4321F58D8B4006FE2CC /* Statement.swift in Sources */,
				4C6120E21F58BB5200C289C0 /* Query.swift in Sources */,
				4C34E45F1F58DA79006FE2CC /* Backup.swift in Sources */,
				4C6120EC1F58BB5200C289C0 /* Row.swift in Sources */,
				4C6120E11F58BB5200C289C0 /* Function.swift in Sources */,
				4C6120E61F58BB5200C289C0 /* Database.swift in Sources */,
				4C34E44B1F58D9E3006FE2CC /* Busy.swift in Sources */,
				4C6120E51F58BB5200C289C0 /* Transaction.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B2E91BFB25C00086A2EF /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6121551F58BBE400C289C0 /* FunctionTests.swift in Sources */,
				4C34E42B1F58D781006FE2CC /* ExpressibleByRowErrorTests.swift in Sources */,
				4C6121501F58BBE400C289C0 /* TestTables.swift in Sources */,
				4C61215C1F58BBE400C289C0 /* StringExtensionTests.swift in Sources */,
				4C34E4471F58D9D8006FE2CC /* BusyTests.swift in Sources */,
				4C34E4591F58DA6F006FE2CC /* BackupTests.swift in Sources */,
				4C61215B1F58BBE400C289C0 /* SQLiteErrorTests.swift in Sources */,
				4C61215E1F58BBE400C289C0 /* RowTests.swift in Sources */,
				4C34E4681F58DAC7006FE2CC /* AuthorizerTests.swift in Sources */,
				4C6121571F58BBE400C289C0 /* TraceTests.swift in Sources */,
				4C6121531F58BBE400C289C0 /* ConnectionTests.swift in Sources */,
				4C6121581F58BBE400C289C0 /* TransactionTests.swift in Sources */,
				4C34E4441F58D990006FE2CC /* CheckpointTests.swift in Sources */,
				4C6121521F58BBE400C289C0 /* ConnectionQueueTests.swift in Sources */,
				4C7EC8CF20462706000FC1EF /* TableLockPolicyTests.swift in Sources */,
				4C61215A1F58BBE400C289C0 /* MigratorTests.swift in Sources */,
				4C34E4361F58D8EA006FE2CC /* StatementTests.swift in Sources */,
				4C34E43B1F58D933006FE2CC /* BaseTestCase.swift in Sources */,
				4C6121561F58BBE400C289C0 /* QueryTests.swift in Sources */,
				4C6121591F58BBE400C289C0 /* DatabaseTests.swift in Sources */,
				4C13EFA01F7C116D0069CF58 /* ProcessInfoExtension.swift in Sources */,
				4C61214F1F58BBE400C289C0 /* FileManagerExtension.swift in Sources */,
				4C6121511F58BBE400C289C0 /* ConnectionPoolTests.swift in Sources */,
				4C6121541F58BBE400C289C0 /* CollationTests.swift in Sources */,
				4C34E4561F58DA30006FE2CC /* HookTests.swift in Sources */,
				4C61215D1F58BBE400C289C0 /* BindingTests.swift in Sources */,
				4C34E42D1F58D7F6006FE2CC /* DispatchQueueExtension.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B3111BFB28330086A2EF /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120EF1F58BB5200C289C0 /* ConnectionQueue.swift in Sources */,
				4C34E4261F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */,
				4C34E4531F58DA23006FE2CC /* Hook.swift in Sources */,
				4C6120F91F58BB5200C289C0 /* SQLiteError.swift in Sources */,
				4C6120F81F58BB5200C289C0 /* StorageLocation.swift in Sources */,
				4C6120FB1F58BB5200C289C0 /* Binding.swift in Sources */,
				4C6120ED1F58BB5200C289C0 /* Connection.swift in Sources */,
				4C6120F71F58BB5200C289C0 /* Migrator.swift in Sources */,
				4C6120EE1F58BB5200C289C0 /* ConnectionPool.swift in Sources */,
				4C6120F01F58BB5200C289C0 /* Collation.swift in Sources */,
				4C34E4621F58DABC006FE2CC /* Authorizer.swift in Sources */,
				4C7EC8CB20461EFF000FC1EF /* TableLockPolicy.swift in Sources */,
				4C6120FA1F58BB5200C289C0 /* StringExtension.swift in Sources */,
				4C6120F41F58BB5200C289C0 /* Trace.swift in Sources */,
				4C34E4411F58D97C006FE2CC /* Checkpoint.swift in Sources */,
				4C34E4341F58D8B4006FE2CC /* Statement.swift in Sources */,
				4C6120F21F58BB5200C289C0 /* Query.swift in Sources */,
				4C34E4601F58DA79006FE2CC /* Backup.swift in Sources */,
				4C6120FC1F58BB5200C289C0 /* Row.swift in Sources */,
				4C6120F11F58BB5200C289C0 /* Function.swift in Sources */,
				4C6120F61F58BB5200C289C0 /* Database.swift in Sources */,
				4C34E44D1F58D9E3006FE2CC /* Busy.swift in Sources */,
				4C6120F51F58BB5200C289C0 /* Transaction.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C29B31B1BFB28330086A2EF /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6121651F58BBE400C289C0 /* FunctionTests.swift in Sources */,
				4C34E4291F58D781006FE2CC /* ExpressibleByRowErrorTests.swift in Sources */,
				4C6121601F58BBE400C289C0 /* TestTables.swift in Sources */,
				4C61216C1F58BBE400C289C0 /* StringExtensionTests.swift in Sources */,
				4C34E4481F58D9D8006FE2CC /* BusyTests.swift in Sources */,
				4C34E45B1F58DA6F006FE2CC /* BackupTests.swift in Sources */,
				4C61216B1F58BBE400C289C0 /* SQLiteErrorTests.swift in Sources */,
				4C61216E1F58BBE400C289C0 /* RowTests.swift in Sources */,
				4C34E4691F58DAC7006FE2CC /* AuthorizerTests.swift in Sources */,
				4C6121671F58BBE400C289C0 /* TraceTests.swift in Sources */,
				4C6121631F58BBE400C289C0 /* ConnectionTests.swift in Sources */,
				4C6121681F58BBE400C289C0 /* TransactionTests.swift in Sources */,
				4C34E4431F58D990006FE2CC /* CheckpointTests.swift in Sources */,
				4C6121621F58BBE400C289C0 /* ConnectionQueueTests.swift in Sources */,
				4C7EC8D020462706000FC1EF /* TableLockPolicyTests.swift in Sources */,
				4C61216A1F58BBE400C289C0 /* MigratorTests.swift in Sources */,
				4C34E4371F58D8EA006FE2CC /* StatementTests.swift in Sources */,
				4C34E43C1F58D934006FE2CC /* BaseTestCase.swift in Sources */,
				4C6121661F58BBE400C289C0 /* QueryTests.swift in Sources */,
				4C6121691F58BBE400C289C0 /* DatabaseTests.swift in Sources */,
				4C13EFA11F7C116D0069CF58 /* ProcessInfoExtension.swift in Sources */,
				4C61215F1F58BBE400C289C0 /* FileManagerExtension.swift in Sources */,
				4C6121611F58BBE400C289C0 /* ConnectionPoolTests.swift in Sources */,
				4C6121641F58BBE400C289C0 /* CollationTests.swift in Sources */,
				4C34E4571F58DA30006FE2CC /* HookTests.swift in Sources */,
				4C61216D1F58BBE400C289C0 /* BindingTests.swift in Sources */,
				4C34E42E1F58D7F6006FE2CC /* DispatchQueueExtension.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4C3C4CF51BFB2B6F0080A0C6 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120FF1F58BB5300C289C0 /* ConnectionQueue.swift in Sources */,
				4C34E4241F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */,
				4C34E4501F58DA23006FE2CC /* Hook.swift in Sources */,
				4C6121091F58BB5300C289C0 /* SQLiteError.swift in Sources */,
				4C6121081F58BB5300C289C0 /* StorageLocation.swift in Sources */,
				4C61210B1F58BB5300C289C0 /* Binding.swift in Sources */,
				4C6120FD1F58BB5300C289C0 /* Connection.swift in Sources */,
				4C6121071F58BB5300C289C0 /* Migrator.swift in Sources */,
				4C6120FE1F58BB5300C289C0 /* ConnectionPool.swift in Sources */,
				4C6121001F58BB5300C289C0 /* Collation.swift in Sources */,
				4C34E4641F58DABC006FE2CC /* Authorizer.swift in Sources */,
				4C7EC8CC20461EFF000FC1EF /* TableLockPolicy.swift in Sources */,
				4C61210A1F58BB5300C289C0 /* StringExtension.swift in Sources */,
				4C6121041F58BB5300C289C0 /* Trace.swift in Sources */,
				4C34E43E1F58D97C006FE2CC /* Checkpoint.swift in Sources */,
				4C34E4331F58D8B4006FE2CC /* Statement.swift in Sources */,
				4C6121021F58BB5300C289C0 /* Query.swift in Sources */,
				4C34E45E1F58DA79006FE2CC /* Backup.swift in Sources */,
				4C61210C1F58BB5300C289C0 /* Row.swift in Sources */,
				4C6121011F58BB5300C289C0 /* Function.swift in Sources */,
				4C6121061F58BB5300C289C0 /* Database.swift in Sources */,
				4C34E44C1F58D9E3006FE2CC /* Busy.swift in Sources */,
				4C6121051F58BB5300C289C0 /* Transaction.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C2191BF6A49400822606 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6120CF1F58BB5100C289C0 /* ConnectionQueue.swift in Sources */,
				4C34E4251F58D76E006FE2CC /* ExpressibleByRowError.swift in Sources */,
				4C34E4511F58DA23006FE2CC /* Hook.swift in Sources */,
				4C6120D91F58BB5100C289C0 /* SQLiteError.swift in Sources */,
				4C6120D81F58BB5100C289C0 /* StorageLocation.swift in Sources */,
				4C6120DB1F58BB5100C289C0 /* Binding.swift in Sources */,
				4C6120CD1F58BB5100C289C0 /* Connection.swift in Sources */,
				4C6120D71F58BB5100C289C0 /* Migrator.swift in Sources */,
				4C6120CE1F58BB5100C289C0 /* ConnectionPool.swift in Sources */,
				4C6120D01F58BB5100C289C0 /* Collation.swift in Sources */,
				4C34E4631F58DABC006FE2CC /* Authorizer.swift in Sources */,
				4C7EC8C920461EFF000FC1EF /* TableLockPolicy.swift in Sources */,
				4C6120DA1F58BB5100C289C0 /* StringExtension.swift in Sources */,
				4C6120D41F58BB5100C289C0 /* Trace.swift in Sources */,
				4C34E43F1F58D97C006FE2CC /* Checkpoint.swift in Sources */,
				4C34E4311F58D8B4006FE2CC /* Statement.swift in Sources */,
				4C6120D21F58BB5100C289C0 /* Query.swift in Sources */,
				4C34E45D1F58DA79006FE2CC /* Backup.swift in Sources */,
				4C6120DC1F58BB5100C289C0 /* Row.swift in Sources */,
				4C6120D11F58BB5100C289C0 /* Function.swift in Sources */,
				4C6120D61F58BB5100C289C0 /* Database.swift in Sources */,
				4C34E44E1F58D9E3006FE2CC /* Busy.swift in Sources */,
				4C6120D51F58BB5100C289C0 /* Transaction.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		4CA8C2241BF6A49400822606 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				4C6121451F58BBE300C289C0 /* FunctionTests.swift in Sources */,
				4C34E42A1F58D781006FE2CC /* ExpressibleByRowErrorTests.swift in Sources */,
				4C6121401F58BBE300C289C0 /* TestTables.swift in Sources */,
				4C61214C1F58BBE300C289C0 /* StringExtensionTests.swift in Sources */,
				4C34E4491F58D9D8006FE2CC /* BusyTests.swift in Sources */,
				4C34E45A1F58DA6F006FE2CC /* BackupTests.swift in Sources */,
				4C61214B1F58BBE300C289C0 /* SQLiteErrorTests.swift in Sources */,
				4C61214E1F58BBE300C289C0 /* RowTests.swift in Sources */,
				4C34E4671F58DAC7006FE2CC /* AuthorizerTests.swift in Sources */,
				4C6121471F58BBE300C289C0 /* TraceTests.swift in Sources */,
				4C6121431F58BBE300C289C0 /* ConnectionTests.swift in Sources */,
				4C6121481F58BBE300C289C0 /* TransactionTests.swift in Sources */,
				4C34E4451F58D990006FE2CC /* CheckpointTests.swift in Sources */,
				4C6121421F58BBE300C289C0 /* ConnectionQueueTests.swift in Sources */,
				4C7EC8CE20462706000FC1EF /* TableLockPolicyTests.swift in Sources */,
				4C61214A1F58BBE300C289C0 /* MigratorTests.swift in Sources */,
				4C34E4381F58D8EA006FE2CC /* StatementTests.swift in Sources */,
				4C34E43A1F58D933006FE2CC /* BaseTestCase.swift in Sources */,
				4C6121461F58BBE300C289C0 /* QueryTests.swift in Sources */,
				4C6121491F58BBE300C289C0 /* DatabaseTests.swift in Sources */,
				4C13EF9F1F7C116D0069CF58 /* ProcessInfoExtension.swift in Sources */,
				4C61213F1F58BBE300C289C0 /* FileManagerExtension.swift in Sources */,
				4C6121411F58BBE300C289C0 /* ConnectionPoolTests.swift in Sources */,
				4C6121441F58BBE300C289C0 /* CollationTests.swift in Sources */,
				4C34E4551F58DA30006FE2CC /* HookTests.swift in Sources */,
				4C61214D1F58BBE300C289C0 /* BindingTests.swift in Sources */,
				4C34E42F1F58D7F6006FE2CC /* DispatchQueueExtension.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		4C29B2F01BFB25C00086A2EF /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 4C29B2E31BFB25C00086A2EF /* SQift macOS */;
			targetProxy = 4C29B2EF1BFB25C00086A2EF /* PBXContainerItemProxy */;
		};
		4C29B3221BFB28330086A2EF /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 4C29B3151BFB28330086A2EF /* SQift tvOS */;
			targetProxy = 4C29B3211BFB28330086A2EF /* PBXContainerItemProxy */;
		};
		4CA8C22B1BF6A49400822606 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 4CA8C21D1BF6A49400822606 /* SQift iOS */;
			targetProxy = 4CA8C22A1BF6A49400822606 /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin XCBuildConfiguration section */
		4C29B2F51BFB25C00086A2EF /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				CODE_SIGN_IDENTITY = "";
				COMBINE_HIDPI_IMAGES = YES;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				FRAMEWORK_VERSION = A;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
					"SQLITE_HAS_CODEC=1",
				);
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/../Frameworks",
					"@loader_path/Frameworks",
				);
				MACOSX_DEPLOYMENT_TARGET = 10.12;
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SDKROOT = macosx;
				SKIP_INSTALL = YES;
			};
			name = Debug;
		};
		4C29B2F61BFB25C00086A2EF /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				CODE_SIGN_IDENTITY = "";
				COMBINE_HIDPI_IMAGES = YES;
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				FRAMEWORK_VERSION = A;
				GCC_PREPROCESSOR_DEFINITIONS = "SQLITE_HAS_CODEC=1";
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/../Frameworks",
					"@loader_path/Frameworks",
				);
				MACOSX_DEPLOYMENT_TARGET = 10.12;
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SDKROOT = macosx;
				SKIP_INSTALL = YES;
			};
			name = Release;
		};
		4C29B2F71BFB25C00086A2EF /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
				CODE_SIGN_IDENTITY = "";
				COMBINE_HIDPI_IMAGES = YES;
				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/../Frameworks",
					"@loader_path/../Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.nike.SQift-Tests";
				PRODUCT_NAME = "SQift Tests";
				SDKROOT = macosx;
			};
			name = Debug;
		};
		4C29B2F81BFB25C00086A2EF /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
				CODE_SIGN_IDENTITY = "";
				COMBINE_HIDPI_IMAGES = YES;
				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/../Frameworks",
					"@loader_path/../Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.nike.SQift-Tests";
				PRODUCT_NAME = "SQift Tests";
				SDKROOT = macosx;
			};
			name = Release;
		};
		4C29B3281BFB28330086A2EF /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
					"SQLITE_HAS_CODEC=1",
				);
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SDKROOT = appletvos;
				SKIP_INSTALL = YES;
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 3;
				TVOS_DEPLOYMENT_TARGET = 10.0;
			};
			name = Debug;
		};
		4C29B3291BFB28330086A2EF /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREPROCESSOR_DEFINITIONS = "SQLITE_HAS_CODEC=1";
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SDKROOT = appletvos;
				SKIP_INSTALL = YES;
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 3;
				TVOS_DEPLOYMENT_TARGET = 10.0;
			};
			name = Release;
		};
		4C29B32B1BFB28330086A2EF /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
				CODE_SIGN_STYLE = Manual;
				DEVELOPMENT_TEAM = "";
				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.nike.SQift-Tests";
				PRODUCT_NAME = "SQift Tests";
				PROVISIONING_PROFILE_SPECIFIER = "";
				SDKROOT = appletvos;
				SWIFT_VERSION = 5.0;
				TVOS_DEPLOYMENT_TARGET = 10.0;
			};
			name = Debug;
		};
		4C29B32C1BFB28330086A2EF /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
				CODE_SIGN_STYLE = Manual;
				DEVELOPMENT_TEAM = "";
				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.nike.SQift-Tests";
				PRODUCT_NAME = "SQift Tests";
				PROVISIONING_PROFILE_SPECIFIER = "";
				SDKROOT = appletvos;
				SWIFT_VERSION = 5.0;
				TVOS_DEPLOYMENT_TARGET = 10.0;
			};
			name = Release;
		};
		4C3C4CFF1BFB2B6F0080A0C6 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
					"SQLITE_HAS_CODEC=1",
				);
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SDKROOT = watchos;
				SKIP_INSTALL = YES;
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 4;
				WATCHOS_DEPLOYMENT_TARGET = 3.0;
			};
			name = Debug;
		};
		4C3C4D001BFB2B6F0080A0C6 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREPROCESSOR_DEFINITIONS = "SQLITE_HAS_CODEC=1";
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SDKROOT = watchos;
				SKIP_INSTALL = YES;
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 4;
				WATCHOS_DEPLOYMENT_TARGET = 3.0;
			};
			name = Release;
		};
		4C7F1E9C1CD3507C00098A83 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				PRODUCT_NAME = "$(TARGET_NAME)";
			};
			name = Debug;
		};
		4C7F1E9D1CD3507C00098A83 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				PRODUCT_NAME = "$(TARGET_NAME)";
			};
			name = Release;
		};
		4CA8C2301BF6A49400822606 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				CURRENT_PROJECT_VERSION = 1;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				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;
				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
				MACOSX_DEPLOYMENT_TARGET = 10.12;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2,3";
				TVOS_DEPLOYMENT_TARGET = 10.0;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
				WATCHOS_DEPLOYMENT_TARGET = 3.0;
			};
			name = Debug;
		};
		4CA8C2311BF6A49400822606 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				CURRENT_PROJECT_VERSION = 1;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				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;
				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
				MACOSX_DEPLOYMENT_TARGET = 10.12;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_OPTIMIZATION_LEVEL = "-O";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2,3";
				TVOS_DEPLOYMENT_TARGET = 10.0;
				VALIDATE_PRODUCT = YES;
				VERSIONING_SYSTEM = "apple-generic";
				VERSION_INFO_PREFIX = "";
				WATCHOS_DEPLOYMENT_TARGET = 3.0;
			};
			name = Release;
		};
		4CA8C2331BF6A49400822606 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
					"SQLITE_HAS_CODEC=1",
				);
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SKIP_INSTALL = YES;
				SWIFT_VERSION = 5.0;
			};
			name = Debug;
		};
		4CA8C2341BF6A49400822606 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				APPLICATION_EXTENSION_API_ONLY = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
				DEFINES_MODULE = YES;
				DYLIB_COMPATIBILITY_VERSION = 1;
				DYLIB_CURRENT_VERSION = 1;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				GCC_PREPROCESSOR_DEFINITIONS = "SQLITE_HAS_CODEC=1";
				INFOPLIST_FILE = "Source/Supporting Files/Info.plist";
				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				OTHER_LDFLAGS = "-lsqlite3";
				PRODUCT_BUNDLE_IDENTIFIER = com.nike.SQift;
				PRODUCT_NAME = SQift;
				SKIP_INSTALL = YES;
				SWIFT_VERSION = 5.0;
			};
			name = Release;
		};
		4CA8C2361BF6A49400822606 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
				CODE_SIGN_STYLE = Manual;
				DEVELOPMENT_TEAM = "";
				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.nike.SQift-Tests";
				PRODUCT_NAME = "SQift Tests";
				PROVISIONING_PROFILE_SPECIFIER = "";
				SWIFT_VERSION = 5.0;
			};
			name = Debug;
		};
		4CA8C2371BF6A49400822606 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
				CODE_SIGN_STYLE = Manual;
				DEVELOPMENT_TEAM = "";
				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.nike.SQift-Tests";
				PRODUCT_NAME = "SQift Tests";
				PROVISIONING_PROFILE_SPECIFIER = "";
				SWIFT_VERSION = 5.0;
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		4C29B2F91BFB25C00086A2EF /* Build configuration list for PBXNativeTarget "SQift macOS" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4C29B2F51BFB25C00086A2EF /* Debug */,
				4C29B2F61BFB25C00086A2EF /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4C29B2FA1BFB25C00086A2EF /* Build configuration list for PBXNativeTarget "SQift macOS Tests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4C29B2F71BFB25C00086A2EF /* Debug */,
				4C29B2F81BFB25C00086A2EF /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4C29B3271BFB28330086A2EF /* Build configuration list for PBXNativeTarget "SQift tvOS" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4C29B3281BFB28330086A2EF /* Debug */,
				4C29B3291BFB28330086A2EF /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4C29B32A1BFB28330086A2EF /* Build configuration list for PBXNativeTarget "SQift tvOS Tests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4C29B32B1BFB28330086A2EF /* Debug */,
				4C29B32C1BFB28330086A2EF /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4C3C4D011BFB2B6F0080A0C6 /* Build configuration list for PBXNativeTarget "SQift watchOS" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4C3C4CFF1BFB2B6F0080A0C6 /* Debug */,
				4C3C4D001BFB2B6F0080A0C6 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4C7F1E9E1CD3507C00098A83 /* Build configuration list for PBXAggregateTarget "Cleanup Whitespace" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4C7F1E9C1CD3507C00098A83 /* Debug */,
				4C7F1E9D1CD3507C00098A83 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4CA8C2181BF6A49400822606 /* Build configuration list for PBXProject "SQift" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4CA8C2301BF6A49400822606 /* Debug */,
				4CA8C2311BF6A49400822606 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4CA8C2321BF6A49400822606 /* Build configuration list for PBXNativeTarget "SQift iOS" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4CA8C2331BF6A49400822606 /* Debug */,
				4CA8C2341BF6A49400822606 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		4CA8C2351BF6A49400822606 /* Build configuration list for PBXNativeTarget "SQift iOS Tests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				4CA8C2361BF6A49400822606 /* Debug */,
				4CA8C2371BF6A49400822606 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 4CA8C2151BF6A49400822606 /* Project object */;
}


================================================
FILE: SQift.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:SQift.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: SQift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?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>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: SQift.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?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/>
</plist>


================================================
FILE: SQift.xcodeproj/xcshareddata/xcschemes/Cleanup Whitespace.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "0930"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C7F1E9B1CD3507C00098A83"
               BuildableName = "Cleanup Whitespace"
               BlueprintName = "Cleanup Whitespace"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
      </Testables>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C7F1E9B1CD3507C00098A83"
            BuildableName = "Cleanup Whitespace"
            BlueprintName = "Cleanup Whitespace"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C7F1E9B1CD3507C00098A83"
            BuildableName = "Cleanup Whitespace"
            BlueprintName = "Cleanup Whitespace"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: SQift.xcodeproj/xcshareddata/xcschemes/SQift iOS CI.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "0930"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
               BuildableName = "SQift.framework"
               BlueprintName = "SQift iOS"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "NO"
            buildForProfiling = "NO"
            buildForArchiving = "NO"
            buildForAnalyzing = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4CA8C2271BF6A49400822606"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift iOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Release"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "NO">
      <CodeCoverageTargets>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift iOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </CodeCoverageTargets>
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4CA8C2271BF6A49400822606"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift iOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
      <EnvironmentVariables>
         <EnvironmentVariable
            key = "RUNNING_ON_CI"
            value = "YES"
            isEnabled = "YES">
         </EnvironmentVariable>
      </EnvironmentVariables>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Release"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift iOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift iOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: SQift.xcodeproj/xcshareddata/xcschemes/SQift iOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "0930"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
               BuildableName = "SQift.framework"
               BlueprintName = "SQift iOS"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "NO"
            buildForProfiling = "NO"
            buildForArchiving = "NO"
            buildForAnalyzing = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4CA8C2271BF6A49400822606"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift iOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "NO"
      codeCoverageEnabled = "YES"
      onlyGenerateCoverageForSpecifiedTargets = "YES">
      <EnvironmentVariables>
         <EnvironmentVariable
            key = "RUNNING_ON_CI"
            value = "NO"
            isEnabled = "YES">
         </EnvironmentVariable>
      </EnvironmentVariables>
      <CodeCoverageTargets>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift iOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </CodeCoverageTargets>
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4CA8C2271BF6A49400822606"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift iOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift iOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4CA8C21D1BF6A49400822606"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift iOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: SQift.xcodeproj/xcshareddata/xcschemes/SQift macOS CI.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "0930"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
               BuildableName = "SQift.framework"
               BlueprintName = "SQift macOS"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "NO"
            buildForProfiling = "NO"
            buildForArchiving = "NO"
            buildForAnalyzing = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B2EC1BFB25C00086A2EF"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift macOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Release"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "NO">
      <CodeCoverageTargets>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </CodeCoverageTargets>
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B2EC1BFB25C00086A2EF"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift macOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <EnvironmentVariables>
         <EnvironmentVariable
            key = "RUNNING_ON_CI"
            value = "YES"
            isEnabled = "YES">
         </EnvironmentVariable>
      </EnvironmentVariables>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Release"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: SQift.xcodeproj/xcshareddata/xcschemes/SQift macOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "0930"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
               BuildableName = "SQift.framework"
               BlueprintName = "SQift macOS"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "NO"
            buildForProfiling = "NO"
            buildForArchiving = "NO"
            buildForAnalyzing = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B2EC1BFB25C00086A2EF"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift macOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      codeCoverageEnabled = "YES"
      onlyGenerateCoverageForSpecifiedTargets = "YES"
      shouldUseLaunchSchemeArgsEnv = "NO">
      <CodeCoverageTargets>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </CodeCoverageTargets>
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B2EC1BFB25C00086A2EF"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift macOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <EnvironmentVariables>
         <EnvironmentVariable
            key = "RUNNING_ON_CI"
            value = "NO"
            isEnabled = "YES">
         </EnvironmentVariable>
      </EnvironmentVariables>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B2E31BFB25C00086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift macOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: SQift.xcodeproj/xcshareddata/xcschemes/SQift tvOS CI.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "0930"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B3151BFB28330086A2EF"
               BuildableName = "SQift.framework"
               BlueprintName = "SQift tvOS"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "NO"
            buildForProfiling = "NO"
            buildForArchiving = "NO"
            buildForAnalyzing = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B31E1BFB28330086A2EF"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift tvOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Release"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "NO">
      <CodeCoverageTargets>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "4C29B3151BFB28330086A2EF"
            BuildableName = "SQift.framework"
            BlueprintName = "SQift tvOS"
            ReferencedContainer = "container:SQift.xcodeproj">
         </BuildableReference>
      </CodeCoverageTargets>
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "4C29B31E1BFB28330086A2EF"
               BuildableName = "SQift Tests.xctest"
               BlueprintName = "SQift tvOS Tests"
               ReferencedContainer = "container:SQift.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
  
gitextract_d_hd5gf5/

├── .gitignore
├── .gitmodules
├── .ruby-version
├── .swiftpm/
│   └── xcode/
│       └── package.xcworkspace/
│           └── contents.xcworkspacedata
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Documentation/
│   └── SQift 4.0 Migration Guide.md
├── Gemfile
├── LICENSE
├── NOTICE
├── Package.swift
├── README.md
├── SQift.podspec
├── SQift.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── xcshareddata/
│       └── xcschemes/
│           ├── Cleanup Whitespace.xcscheme
│           ├── SQift iOS CI.xcscheme
│           ├── SQift iOS.xcscheme
│           ├── SQift macOS CI.xcscheme
│           ├── SQift macOS.xcscheme
│           ├── SQift tvOS CI.xcscheme
│           ├── SQift tvOS.xcscheme
│           └── SQift watchOS.xcscheme
├── Source/
│   ├── Connection/
│   │   ├── Connection.swift
│   │   ├── ConnectionPool.swift
│   │   ├── ConnectionQueue.swift
│   │   ├── Functions/
│   │   │   ├── Authorizer.swift
│   │   │   ├── Backup.swift
│   │   │   ├── Busy.swift
│   │   │   ├── Checkpoint.swift
│   │   │   ├── Collation.swift
│   │   │   ├── Function.swift
│   │   │   ├── Hook.swift
│   │   │   ├── Query.swift
│   │   │   ├── Trace.swift
│   │   │   └── Transaction.swift
│   │   └── Statement.swift
│   ├── Database/
│   │   ├── Database.swift
│   │   ├── Migrator.swift
│   │   ├── StorageLocation.swift
│   │   └── TableLockPolicy.swift
│   ├── Errors/
│   │   ├── ExpressibleByRowError.swift
│   │   └── SQLiteError.swift
│   ├── Extensions/
│   │   └── StringExtension.swift
│   ├── Row/
│   │   ├── Binding.swift
│   │   └── Row.swift
│   └── Supporting Files/
│       ├── Info.plist
│       └── SQift.h
└── Tests/
    ├── Extensions/
    │   ├── DispatchQueueExtension.swift
    │   ├── FileManagerExtension.swift
    │   └── ProcessInfoExtension.swift
    ├── Helpers/
    │   └── TestTables.swift
    ├── Supporting Files/
    │   └── Info.plist
    └── Tests/
        ├── BaseTestCase.swift
        ├── Connection/
        │   ├── ConnectionPoolTests.swift
        │   ├── ConnectionQueueTests.swift
        │   ├── ConnectionTests.swift
        │   ├── Functions/
        │   │   ├── AuthorizerTests.swift
        │   │   ├── BackupTests.swift
        │   │   ├── BusyTests.swift
        │   │   ├── CheckpointTests.swift
        │   │   ├── CollationTests.swift
        │   │   ├── FunctionTests.swift
        │   │   ├── HookTests.swift
        │   │   ├── QueryTests.swift
        │   │   ├── TraceTests.swift
        │   │   └── TransactionTests.swift
        │   └── StatementTests.swift
        ├── Database/
        │   ├── DatabaseTests.swift
        │   ├── MigratorTests.swift
        │   └── TableLockPolicyTests.swift
        ├── Errors/
        │   ├── ExpressibleByRowErrorTests.swift
        │   └── SQLiteErrorTests.swift
        ├── Extensions/
        │   └── StringExtensionTests.swift
        └── Rows/
            ├── BindingTests.swift
            └── RowTests.swift
Condensed preview — 79 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (619K chars).
[
  {
    "path": ".gitignore",
    "chars": 385,
    "preview": "# Mac OS X\n.DS_Store\n\n# Xcode\n\n## Build generated\nbuild/\nDerivedData\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.m..."
  },
  {
    "path": ".gitmodules",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".ruby-version",
    "chars": 6,
    "preview": "3.3.0\n"
  },
  {
    "path": ".swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef..."
  },
  {
    "path": ".travis.yml",
    "chars": 2449,
    "preview": "os: osx\nosx_image: xcode10.2\nbranches:\n  only:\n    - master\n\nenv:\n  global:\n  - LC_CTYPE=en_US.UTF-8\n  - LANG=en_US.UTF-..."
  },
  {
    "path": "CHANGELOG.md",
    "chars": 18727,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n`SQift` adheres to [Semantic Versionin..."
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2031,
    "preview": "# How to contribute\n\nThere are a few guidelines that we need contributors to follow so that we are able to process reque..."
  },
  {
    "path": "Documentation/SQift 4.0 Migration Guide.md",
    "chars": 2377,
    "preview": "#  SQift 4.0 Migration Guide\n\nSQift 4.0 is the latest major release of SQift, a lightweight Swift wrapper for SQLite.  A..."
  },
  {
    "path": "Gemfile",
    "chars": 188,
    "preview": "#\n#  Gemfile\n#  SQift\n#\n#  Created by William Thompson on 4/30/19\n#  Copyright © 2019 Nike. All rights reserved.\n#\n\nsour..."
  },
  {
    "path": "LICENSE",
    "chars": 1519,
    "preview": "BSD License\nFor Nike SQift software\n\nCopyright (c) 2015-present, Nike, Inc.\nAll rights reserved.\n\nRedistribution and use..."
  },
  {
    "path": "NOTICE",
    "chars": 11806,
    "preview": "SQift\nCopyright 2017-present, Nike, Inc. (http://nike.com)\nAll rights reserved.\nThe Nike SQift source code is licensed u..."
  },
  {
    "path": "Package.swift",
    "chars": 734,
    "preview": "// swift-tools-version: 5.8\n// The swift-tools-version declares the minimum version of Swift required to build this pack..."
  },
  {
    "path": "README.md",
    "chars": 35250,
    "preview": "# SQift\n\n[![Build Status](https://travis-ci.org/Nike-Inc/SQift.svg?branch=master)](https://travis-ci.org/Nike-Inc/SQift)..."
  },
  {
    "path": "SQift.podspec",
    "chars": 668,
    "preview": "Pod::Spec.new do |s|\n  s.name = \"SQift\"\n  s.version = \"5.1\"\n  s.license = \"MIT\"\n  s.summary = \"A lightweight Swift wrapp..."
  },
  {
    "path": "SQift.xcodeproj/project.pbxproj",
    "chars": 92529,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXAggregateTarget sec..."
  },
  {
    "path": "SQift.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 150,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:SQift.xcodeproj..."
  },
  {
    "path": "SQift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P..."
  },
  {
    "path": "SQift.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 181,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/Cleanup Whitespace.xcscheme",
    "chars": 2774,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift iOS CI.xcscheme",
    "chars": 4443,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift iOS.xcscheme",
    "chars": 4420,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift macOS CI.xcscheme",
    "chars": 4818,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift macOS.xcscheme",
    "chars": 4901,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift tvOS CI.xcscheme",
    "chars": 4811,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift tvOS.xcscheme",
    "chars": 4894,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "SQift.xcodeproj/xcshareddata/xcschemes/SQift watchOS.xcscheme",
    "chars": 2856,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction..."
  },
  {
    "path": "Source/Connection/Connection.swift",
    "chars": 13418,
    "preview": "//\n//  Connection.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is li..."
  },
  {
    "path": "Source/Connection/ConnectionPool.swift",
    "chars": 6146,
    "preview": "//\n//  ConnectionPool.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code i..."
  },
  {
    "path": "Source/Connection/ConnectionQueue.swift",
    "chars": 3895,
    "preview": "//\n//  ConnectionQueue.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Source/Connection/Functions/Authorizer.swift",
    "chars": 7406,
    "preview": "//\n//  Authorizer.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is li..."
  },
  {
    "path": "Source/Connection/Functions/Backup.swift",
    "chars": 4974,
    "preview": "//\n//  Backup.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is licens..."
  },
  {
    "path": "Source/Connection/Functions/Busy.swift",
    "chars": 5300,
    "preview": "//\n//  Busy.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is licensed..."
  },
  {
    "path": "Source/Connection/Functions/Checkpoint.swift",
    "chars": 4242,
    "preview": "//\n//  Checkpoint.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is li..."
  },
  {
    "path": "Source/Connection/Functions/Collation.swift",
    "chars": 2882,
    "preview": "//\n//  Collation.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lic..."
  },
  {
    "path": "Source/Connection/Functions/Function.swift",
    "chars": 22119,
    "preview": "//\n//  Function.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lice..."
  },
  {
    "path": "Source/Connection/Functions/Hook.swift",
    "chars": 6463,
    "preview": "//\n//  Hook.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is licensed..."
  },
  {
    "path": "Source/Connection/Functions/Query.swift",
    "chars": 30679,
    "preview": "//\n//  Query.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is license..."
  },
  {
    "path": "Source/Connection/Functions/Trace.swift",
    "chars": 6619,
    "preview": "//\n//  Trace.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is license..."
  },
  {
    "path": "Source/Connection/Functions/Transaction.swift",
    "chars": 2894,
    "preview": "//\n//  Transaction.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is l..."
  },
  {
    "path": "Source/Connection/Statement.swift",
    "chars": 18294,
    "preview": "//\n//  Statement.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lic..."
  },
  {
    "path": "Source/Database/Database.swift",
    "chars": 6586,
    "preview": "//\n//  Database.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lice..."
  },
  {
    "path": "Source/Database/Migrator.swift",
    "chars": 6840,
    "preview": "//\n//  Migrator.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lice..."
  },
  {
    "path": "Source/Database/StorageLocation.swift",
    "chars": 975,
    "preview": "//\n//  StorageLocation.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Source/Database/TableLockPolicy.swift",
    "chars": 1864,
    "preview": "//\n//  TableLockPolicy.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Source/Errors/ExpressibleByRowError.swift",
    "chars": 1620,
    "preview": "//\n//  ExpressibleByRowError.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source..."
  },
  {
    "path": "Source/Errors/SQLiteError.swift",
    "chars": 1894,
    "preview": "//\n//  SQLiteError.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is l..."
  },
  {
    "path": "Source/Extensions/StringExtension.swift",
    "chars": 1014,
    "preview": "//\n//  StringExtension.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Source/Row/Binding.swift",
    "chars": 16714,
    "preview": "//\n//  Binding.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is licen..."
  },
  {
    "path": "Source/Row/Row.swift",
    "chars": 9282,
    "preview": "//\n//  Row.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is licensed..."
  },
  {
    "path": "Source/Supporting Files/Info.plist",
    "chars": 808,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P..."
  },
  {
    "path": "Source/Supporting Files/SQift.h",
    "chars": 348,
    "preview": "//\n//  SQift.h\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is licensed un..."
  },
  {
    "path": "Tests/Extensions/DispatchQueueExtension.swift",
    "chars": 764,
    "preview": "//\n//  DispatchQueueExtension.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This sourc..."
  },
  {
    "path": "Tests/Extensions/FileManagerExtension.swift",
    "chars": 764,
    "preview": "//\n//  FileManagerExtension.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source..."
  },
  {
    "path": "Tests/Extensions/ProcessInfoExtension.swift",
    "chars": 570,
    "preview": "//\n//  ProcessInfoExtension.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source..."
  },
  {
    "path": "Tests/Helpers/TestTables.swift",
    "chars": 3475,
    "preview": "//\n//  TestTables.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is li..."
  },
  {
    "path": "Tests/Supporting Files/Info.plist",
    "chars": 733,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P..."
  },
  {
    "path": "Tests/Tests/BaseTestCase.swift",
    "chars": 1359,
    "preview": "//\n//  BaseTestCase.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is..."
  },
  {
    "path": "Tests/Tests/Connection/ConnectionPoolTests.swift",
    "chars": 7599,
    "preview": "//\n//  ConnectionPoolTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source c..."
  },
  {
    "path": "Tests/Tests/Connection/ConnectionQueueTests.swift",
    "chars": 5046,
    "preview": "//\n//  ConnectionQueueTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source..."
  },
  {
    "path": "Tests/Tests/Connection/ConnectionTests.swift",
    "chars": 10385,
    "preview": "//\n//  ConnectionTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/AuthorizerTests.swift",
    "chars": 6367,
    "preview": "//\n//  AuthorizerTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/BackupTests.swift",
    "chars": 13852,
    "preview": "//\n//  BackupTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is l..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/BusyTests.swift",
    "chars": 5990,
    "preview": "//\n//  BusyTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lic..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/CheckpointTests.swift",
    "chars": 3473,
    "preview": "//\n//  CheckpointTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/CollationTests.swift",
    "chars": 3082,
    "preview": "//\n//  CollationTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code i..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/FunctionTests.swift",
    "chars": 35769,
    "preview": "//\n//  FunctionTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/HookTests.swift",
    "chars": 3559,
    "preview": "//\n//  HookTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lic..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/QueryTests.swift",
    "chars": 9229,
    "preview": "//\n//  QueryTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is li..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/TraceTests.swift",
    "chars": 5750,
    "preview": "//\n//  TraceTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is li..."
  },
  {
    "path": "Tests/Tests/Connection/Functions/TransactionTests.swift",
    "chars": 5158,
    "preview": "//\n//  TransactionTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Tests/Tests/Connection/StatementTests.swift",
    "chars": 4069,
    "preview": "//\n//  StatementTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code i..."
  },
  {
    "path": "Tests/Tests/Database/DatabaseTests.swift",
    "chars": 7259,
    "preview": "//\n//  DatabaseTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is..."
  },
  {
    "path": "Tests/Tests/Database/MigratorTests.swift",
    "chars": 13449,
    "preview": "//\n//  MigratorTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is..."
  },
  {
    "path": "Tests/Tests/Database/TableLockPolicyTests.swift",
    "chars": 11479,
    "preview": "//\n//  TableLockPolicyTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source..."
  },
  {
    "path": "Tests/Tests/Errors/ExpressibleByRowErrorTests.swift",
    "chars": 1801,
    "preview": "//\n//  ExpressibleByRowErrorTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This s..."
  },
  {
    "path": "Tests/Tests/Errors/SQLiteErrorTests.swift",
    "chars": 7738,
    "preview": "//\n//  SQLiteErrorTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code..."
  },
  {
    "path": "Tests/Tests/Extensions/StringExtensionTests.swift",
    "chars": 1010,
    "preview": "//\n//  StringExtensionTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source..."
  },
  {
    "path": "Tests/Tests/Rows/BindingTests.swift",
    "chars": 19595,
    "preview": "//\n//  BindingTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is..."
  },
  {
    "path": "Tests/Tests/Rows/RowTests.swift",
    "chars": 12621,
    "preview": "//\n//  RowTests.swift\n//\n//  Copyright 2015-present, Nike, Inc.\n//  All rights reserved.\n//\n//  This source code is lice..."
  }
]

About this extraction

This page contains the full source code of the Nike-Inc/SQift GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 79 files (574.7 KB), approximately 146.1k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!