Compare commits

...
Sign in to create a new pull request.

128 commits

Author SHA1 Message Date
Conrad Kramer
85640ffce1 Switch to gRPC client in Swift app
Some checks are pending
Build AppImage / Build AppImage (push) Waiting to run
Build Apple Apps / Build App (iOS) (push) Waiting to run
Build Apple Apps / Build App (iOS Simulator) (push) Waiting to run
Build Apple Apps / Build App (macOS) (push) Waiting to run
Build Docker / Build Docker Image (push) Waiting to run
Build Rust Crate / Build Crate (macOS (Intel)) (push) Waiting to run
Build Rust Crate / Build Crate (macOS) (push) Waiting to run
Build Rust Crate / Build Crate (Linux) (push) Waiting to run
Build Rust Crate / Build Crate (Windows) (push) Waiting to run
2024-09-09 10:38:13 -07:00
Conrad Kramer
25a0f7c421 Add Developer ID Profiles to build 2024-09-07 20:35:28 -07:00
Jett Chen
e4b0f1660b GRPC Server Support
- Deprecates old json-rpc system
- Add GRPC daemon over uds
2024-09-08 11:33:11 +08:00
Conrad Kramer
3fbb520a10 Fix SwiftLint errors 2024-09-07 18:00:04 -07:00
Conrad Kramer
fa1ef6fcda Download provisioning profiles in release pipeline 2024-09-07 18:00:04 -07:00
Conrad Kramer
62a5739d86 Update pipelines with various fixes 2024-09-07 17:07:04 -07:00
Jett Chen
aa634d03e2 update protobuf definition file 2024-07-13 18:14:00 -07:00
Jett Chen
951b4ddae2 add protobuf definition file 2024-07-13 18:09:09 -07:00
Conrad Kramer
3dedca4de3 Update build settings 2024-07-06 17:20:46 -07:00
Conrad Kramer
3c70bc2a5c Remove SwiftLint from Xcode project 2024-07-06 12:18:58 -07:00
Conrad Kramer
bca07c33b8 Start authentication flow 2024-07-06 12:18:58 -07:00
Jett Chen
abf1101484
Wireguard Configuration in SQLite (#263)
#241
2024-04-21 18:01:47 -04:00
Conrad Kramer
df549d48e6 Implement Slack authentication on iOS 2024-04-03 15:12:11 -07:00
Conrad Kramer
ec8cc533ab Add apple-app-site-association file 2024-03-30 17:18:46 -07:00
Kartikey S. Chauhan
a97063f9b7 Initial website setup
- Created project structure with necessary directories and files
- Set up Next.js with Tailwind CSS and Font Awesome
- Added base HTML structure and layout components
- Configured routing and created the homepage
- Styled the homepage with basic styling
- Added FontAwesome icons
- Configured font imports and styles
- Integrated HackClub branding elements

This commit establishes the foundation for our website, including the project structure, styling, and initial content.
2024-03-30 17:02:11 -07:00
Conrad Kramer
cb1bc1c8aa Update release pipelines to upload release artifacts 2024-03-23 13:41:07 -07:00
Conrad Kramer
4334f8c9c9 Configure CARGO_TARGET_DIR to be inside of DerivedData 2024-03-16 10:34:59 -07:00
Conrad Kramer
0fe630878d Introduce initial UI for connecting to networks 2024-03-10 18:59:31 -04:00
Conrad Kramer
51fd638b72 Update for Xcode 15.2 2024-03-10 18:59:31 -04:00
David Zhong
c755f752a0
Implement launching a local daemon (#261)
Allow AppImage and non-systemd systems to launch a local burrow daemon.
2024-03-09 17:52:59 -08:00
Jett Chen
c4c342dc8b Add implementation for stop command
This adds implementation for stopping the tunnel
via the `Stop` command.
2024-02-25 04:14:32 +08:00
Ben
29d2bfae3f Remove redundant type annotation 2024-02-24 12:53:59 -05:00
Jett Chen
2088ae6ede Add Support for IPV6 and Arbitrary Server Address
Add IPV6 support for Apple Devices
Note: Works in GUI not CLI
Adds Support for Arbitrary Server Address
2024-02-24 12:44:31 -05:00
David Zhong
cca5999214 Bump Rust version in Dockerfile
clap-rs recently bumped their MSRV to 1.74 breaking the docker build.
2024-02-15 19:42:57 -08:00
David Zhong
ab73183b2b
Add ability to build GTK app AppImage (#240)
#238 Add AppImage build support

Implements

- Downgrade to libadwaita 1.3 for wider distro support
- Add build script, workflow, and docs for AppImage
- Add build docs for Debian (apt) and Void Linux
- Building AppImage in CI
2024-02-15 19:27:14 -08:00
dav
44ecf042a3 GTK App Getting Started Instructions 2024-02-02 21:20:12 -08:00
Conrad Kramer
7cc1f3119e Simplified process startup on macOS and Linux 2024-01-27 07:53:30 -05:00
Jasper Mayone
9e03c9680c
Added Xcode Path Switching to Getting Started 2024-01-26 06:33:26 +00:00
Jett Chen
079c4f676d Update locking 2024-01-26 01:13:12 -05:00
Jett Chen
0b46ac57b7 Add tokio console and more debugging feats 2024-01-26 01:13:12 -05:00
Jett Chen
7d8958e0e7 Add handling for connection expiration 2024-01-26 01:13:12 -05:00
David Zhong
6990f90c2e
Implement Gtk Network Status (#165)
Implemented
- Switch reacts to burrow socket and network changes 
- meson as build system
- Basic diagnostics to ensure burrow is installed properly
- Flatpak / Meson Building
2024-01-26 01:10:24 -05:00
Conrad Kramer
baa81eb939 Cancel in-progress runs when pushing new code 2024-01-20 11:38:46 -08:00
Jett Chen
dfd4dbc81e
Wireguard Timer Support (#167) 2024-01-20 19:38:15 +00:00
Conrad Kramer
fd9b3413ac Update CODEOWNERS to reflect current owners 2024-01-20 10:10:02 -08:00
Conrad Kramer
e04d24a3f7 Updated to Xcode 15.2 2024-01-20 10:02:19 -08:00
Conrad Kramer
2b9ecb7b6a Update Tunnel on the main thread
Also updated it to use the new Swift Observable macro
2024-01-20 10:02:19 -08:00
Jett Chen
b008762a5b Implement Wireguard
Implements Wireguard
2023-12-23 11:26:05 -08:00
dav
60257b256a Intial GTK, swtich to Relm, basic Flatpak Build 2023-11-18 12:42:52 -08:00
reesericci
f1d7a98491 Initialized burrow-gtk project 2023-11-18 12:42:52 -08:00
Jasper Mayone
f31133f4dc update codeowners 2023-11-18 13:13:11 -05:00
Cara Salter
ff819af752 Update CODEOWNERS
Update ben's GitHub username

@ma1ted -> \@malted
2023-11-15 15:46:56 -08:00
Cara Salter
91a15ec908 Remove myself from Apple PRs
I do not have the required experience with Swift/iOS/macOS development
to be an approving reviewer for Apple PRs
2023-11-15 15:46:56 -08:00
Jett Chen
759311e4f4 remove continuation from BurrowIPC
This removes usage of continuation from BurrowIPC by
moving it to NWConnections.
2023-10-23 12:22:02 +08:00
Jett Chen
c9f104e523 Generate NetworkSettings with IPC
This generates and applies NetworkSettings object with unix socket IPC.

- domain socket, json-rpc based communication
- switches to anyhow for burrow crate
- adds support for starting daemons on macos
2023-10-14 10:25:24 -07:00
dav
6368ca7f74 Add Burrow Crate Description 2023-10-07 23:37:44 -07:00
dav
c059512b8b RPM CI Should be cargo generate-rpm 2023-10-07 23:37:44 -07:00
dav
674deb08ba Fix RPM CI 2023-10-07 23:37:44 -07:00
dav
6a77df3e20 Remove license-file field 2023-10-07 23:37:44 -07:00
dav
391802b8ca Build RPM for Pull Requests too 2023-10-07 23:37:44 -07:00
dav
fb5cff0d5a Add Github Workflow for RPM Builds 2023-10-07 23:37:44 -07:00
dav
26d97c6a11 Super Basic RPM Install Config 2023-10-07 23:37:44 -07:00
Jett Chen
e643d9dd41 Switch logging to use tracing instead of log
Tracing has support for intervals and a great os_log integration.
2023-09-03 01:06:34 +08:00
dav
60cfd95789 Add rust build caching to ci 2023-08-26 12:23:41 -07:00
dav
f869cbdb53 Implement sending commands via Unix sockets 2023-08-26 11:51:56 -07:00
Sam Poder
c8df4b860d Set/get broadcast address in TunInterface
Modelled after TunInterface's IPV4 logic.
Uses SIOCGIFBRDADDR & SIOCSIFBRDADDR.
View https://man7.org/linux/man-pages/man7/netdevice.7.html.
2023-08-26 10:00:18 -07:00
Jett Chen
22e41203fb Update project structure in readme
Async tun is now located at tun/src/tokio .
2023-08-16 13:41:21 -04:00
Jett Chen
3ef13b09a3 Add C Swift Bindings
This adds C Swift bindings for burrow via compiling burrow
with a matching header file.
2023-08-16 13:28:20 -04:00
Sam Poder
d821f3d03c Only run Tokio tests on non-Windows platforms 2023-08-08 08:03:15 -07:00
Conrad Kramer
17af030893 Run tests on Github Actions 2023-08-08 08:03:15 -07:00
Sam Poder
1907b11545 Move tests into a separate directory
Also run these tests on Github Actions as part of the PR request
flow.
2023-08-08 08:03:15 -07:00
Conrad Kramer
a2e93278c1 Create Dockerfile
Also adds a Github workflow to publish a Docker image
2023-07-04 20:15:27 -04:00
Sam Poder
631bbc8fb3 Expand description about Hack Club
This description is more inline with our copy in other places
2023-07-03 19:22:39 -04:00
Sam Poder
9eb661ebd5 Log when TunInterface is configured
This uses info from the log package.
2023-07-03 09:39:24 -04:00
JettChenT
beae8c0f79 Add Read and Write for Async TunInterface
Those features are implemented using AsyncFD. While write doesn't
require a mutable reference to self, read does.

Make Async Tun a feature

remove async tun from workspace

rename write/read to send/recv
2023-07-03 09:30:52 -04:00
dav
d3882bd008 TunInterfaceOptions -> TunOptions 2023-06-28 16:13:08 -04:00
dav
f20f56062c Fix unused import warning for Windows 2023-06-28 16:13:08 -04:00
dav
84f1d91d5c Implement TunInterfaceOptions 2023-06-28 16:13:08 -04:00
Sam Poder
da065b503f Log "Set" Actions in Tun (Linux)
I've used the log library and its info method.

I've also added but not used env-logger.
2023-06-27 15:42:36 -04:00
Conrad Kramer
32e4e9d1d7 Refactored MenuView into MenuItemToggleView
This change fixes some subtle state bugs in the switch handling by
making isOn a direct function of the Tunnel.
2023-06-23 20:29:52 -04:00
SerenityUX
5438542284 Added initial menu bar to macOS 2023-06-23 20:29:52 -04:00
Sam Poder
923bc9511d Ignore body is missing errors
It seems excessive to require an extended description to each commit,
such as the extended description being given here.
2023-06-23 16:21:58 -04:00
Dev380
e1b03fd0a8 Delete empty queue.rs
The queue.rs seems to be empty with no apparent purpose even as a stub so this commit removes it.
2023-06-23 16:02:16 -04:00
Soumya Kushwaha
efee4afc8d Add contributors section to README
This highlights people's contributions to Burrow.
2023-06-11 17:05:42 +02:00
Malted
f3d086effc 📝 Add long description to clap help
Replaces the None value with a descriptive str
2023-06-11 15:46:26 +01:00
Malted
1ec7ea7d3c 🐛 Update the target for the nix crate
I'm a silly little goose and forger 💀  it before
2023-06-10 22:01:17 +01:00
Malted
ba22ebc79f 🐛 Include function on all Darwin platforms
Builds the relevant ensure root function on all Apple devices
2023-06-10 22:01:17 +01:00
Malted
40cc0ba049 🛂 Check for required permissions
On Linux, checks for the `CAP_NET_ADMIN` capability.
On macOS, checks for root.
2023-06-10 22:01:17 +01:00
Malted
6bd8051c78 🔧 Add cargo release aliases
Adds the alias field with bb and rr defined as release aliases
2023-06-10 22:01:17 +01:00
Cara Salter
45fc74a3ba Add period to end of line
Improves consistency and grammatical correctness
2023-06-06 19:08:37 -04:00
Andromeda
4cc13ac2d3 Update README.md
Fixed git lint, implemented recommended changes
2023-06-06 19:08:37 -04:00
Andromeda
a73599c268 Update README.md
Co-authored-by: Cara Salter <cara@devcara.com>
2023-06-06 19:08:37 -04:00
Andromeda
a99fd36081 Update README.md
Fixed git lint, implemented recommended changes
2023-06-06 19:08:37 -04:00
Andromeda
a030a12bea Update README.md
Co-authored-by: Cara Salter <cara@devcara.com>
2023-06-06 19:08:37 -04:00
Andromeda
8221c224fd Update README.md
Fixed git lint, implemented recommended changes
2023-06-06 19:08:37 -04:00
Andromeda
a4f8b61f53 Update README.md
Fixed git lint, implemented recommended changes
2023-06-06 19:08:37 -04:00
Andromeda
ee066a2d36 Update README.md
Fixed git lint, implemented recommended changes
2023-06-06 19:08:37 -04:00
Andromeda
706024617d Update README.md
Fixed git lint, implemented recommended changes
2023-06-06 19:08:37 -04:00
Sam Poder
f2af721deb Update tun/src/unix/linux/mod.rs
This fixes an accidental change I made, sorry!
2023-06-06 18:16:08 -04:00
Sam Poder
a73228cee0 Add Start Command
Command that will start burrow.
2023-06-06 18:16:08 -04:00
Sam Poder
e8704a2560 Add Start Command
This uses the subcommands feature, it was requested by Conrad.
2023-06-06 18:16:08 -04:00
Sam Poder
008ea9ec65 Enable derive on Clap
This let's us use the derive feature.
2023-06-06 18:16:08 -04:00
Sam Poder
d65b9a4c68 Begin CLI Work
Uses the Parser module + it sets up a help & version.
2023-06-06 18:16:08 -04:00
JettChenT
82c4d218d7 Add read and write functions for TunInterface
This adds read and write functionality for TunInterface.
2023-06-05 01:15:36 -07:00
Conrad Kramer
9aa1951575 Update CODEOWNERS
It should include Cara and Ben now
2023-06-05 01:12:21 -07:00
Conrad Kramer
9dc10544b9 Embed wintun inside of the Windows binary
Burrow writes the driver to a temporary file and then loads it.
2023-06-05 01:12:21 -07:00
Conrad Kramer
a502e2132c Only run build script when necessary
The build script should only run if one of the generated files
is changed.
2023-06-05 01:12:21 -07:00
Conrad Kramer
cc30fcd34c Create set_ipv6_addr
This adds a new method for setting an ipv6 address on an interface
2023-06-03 13:14:47 -04:00
Conrad Kramer
b94356dfb7 Set clippy as the default build task
Also configure CodeLLDB as a recommended extension.
2023-06-03 13:00:06 -04:00
Conrad Kramer
e51f9eb4fd Update Getting Started document
This adds Windows and macOS instructions among other improvements.
2023-06-03 13:00:06 -04:00
sporeball
bf36a822a0 Create initial GETTING_STARTED.md
This is the very first draft
2023-06-03 13:00:06 -04:00
Conrad Kramer
3c226c81cc Use fewer dependencies in Windows build script
This removes the dependencies on the platform crate as well as the
sha256 crate, opting for the sri crate instead to check file integrity.
2023-05-29 17:13:47 -04:00
JettChenT
5baf86d975 add cfg test
this adds cfg-test for
test modules
2023-05-26 14:02:10 -04:00
Conrad Kramer
cdea9eba8c Run apt-get update in CI
This fixes a build failure caused by an outdated package cache.
2023-05-25 00:14:34 -04:00
JettChenT
727798a7da TunInterface implementations for MacOS
This adds TunInterface Implementations for MacOS.
With reference to the XNU kernel source and the
linux implementation
2023-05-25 00:01:39 -04:00
Conrad Kramer
2e91838f46 Run burrow as root on Unix platform
This is needed because you need to be root in order to create a tun
interface on macOS, and you need CAP_NET_ADMIN on Linux.
2023-05-13 13:15:41 -04:00
Conrad Kramer
8007e88b53 Enable IPv4 configuration on macOS
This enables getting and setting the IPv4 address on tun interfaces
on macOS
2023-05-13 13:15:41 -04:00
Conrad Kramer
101470d17c Fix requesting VPN permission on macOS
The protocol configuration is copied when set, so it should be set
after it is configured
2023-05-13 13:15:41 -04:00
Conrad Kramer
c8bdf1bcbe Remove unneeded Github Actions step
Xcode will both use and create the cache during the build.
2023-05-13 13:15:41 -04:00
Conrad Kramer
bea8af0d66 Cache Swift packages in Github Actions
This is helpful now that SwiftLint is a package dependency.
2023-05-09 23:01:36 -04:00
Conrad Kramer
3c30a4b336 Enable SwiftLint inside of Xcode
This commit also fixes all linter warnings and errors.
2023-05-09 23:01:36 -04:00
Conrad Kramer
941d465570 Document the Rust Xcode build script
The Bash source is a little hard to read.
2023-05-09 23:01:36 -04:00
Conrad Kramer
cf95ac819c Share *RawFd trait implementations on Unix
They were previously only present on Apple platforms.
2023-05-09 23:01:36 -04:00
Conrad Kramer
c1507ba37f Fix SwiftUI view model updating
The reflection data is needed by SwiftUI in order to operate correctly.
2023-05-09 23:01:36 -04:00
Conrad Kramer
b3a540fc48 Add support for starting and stopping the tunnel
This commit introduces the Tunnel view model object which has
support for asking for permission, starting and stopping the
tunnel. It automatically updates its state and publishes
changes as an ObservableObject.
2023-05-09 23:01:36 -04:00
Conrad Kramer
eeb0130156 Add Swift module for libburrow
This commit also renames the app target to App.
2023-05-09 23:01:36 -04:00
Cara Salter
5e265632a3 tun/test: Add #[throws] to netmask test
Enables tests to avoid using `.unwrap()`.

Co-authored-by: Conrad Kramer <conrad@conradkramer.com>
2023-04-29 20:14:18 -04:00
Cara Salter
4a0d53bdd3 tun: Fix implementation tests for netmask
Note that there needs to be an address set on the interface prior to
assigning a netmask.
2023-04-29 20:14:18 -04:00
Cara Salter
6ea4b596c2 tun: Initial work on getting/setting netmask
Seems to run into an issue with setting netmasks like 255.0.0.0 with an
"AddressNotAvailable" error
2023-04-29 20:14:18 -04:00
Cara Salter
c444bf293e tun: Create integration tests for MTU
Tests are good, y'all :)
2023-04-29 19:07:29 -04:00
Cara Salter
a13b2243e6 tun: Enable setting/getting of MTU
Works similarly to getting and setting IP addresses, can pretty much be
copy-pasted for the rest of the settings.
2023-04-29 19:07:29 -04:00
Conrad Kramer
4b0965b846 Build burrow library into iOS and macOS app
This commit adds a build script, build-rust.sh, which compiles the
burrow crate from inside of Xcode. The network extension then links
against this crate.
2023-04-29 16:46:23 -04:00
Conrad Kramer
d966c0ff77 Add packet tunnel provider entitlement
This entitlement is required to communicate with the VPN API on iOS and
macOS.
2023-04-29 16:46:23 -04:00
Conrad Kramer
4bf0fb639c Switch to the Hack Club development team
This change switches the project over to the Hack Club developer team in
the Hack Club developer account. This is needed to get the app in
TestFlight.
2023-04-29 16:46:23 -04:00
Conrad Kramer
1ffa01df5b Commit Xcode schemes to version control
This commit adds the Burrow and NetworkExtension schemes to version
control so that they can be shared across developers.
2023-04-29 16:46:23 -04:00
Conrad Kramer
1378eb7eb3 Implement IPv4 address configuration on Linux
This involved refactoring the crate structure to share code between
macOS and Linux. The new methods have not yet been implemented on
macOS, but they have todo!() placeholders.
2023-04-22 14:28:42 -04:00
Malted
45499da9c2 🔥 Show .gitignored files in VS Code
This disables a workspace setting that hid .gitignored files
2023-04-22 12:39:40 -04:00
Soumya Kushwaha
25b5ee2458 Create LICENSE.md
This commit adds the GPL-3 license to the repository.
2023-04-18 21:56:01 -04:00
275 changed files with 19728 additions and 1061 deletions

6
.cargo/config.toml Normal file
View file

@ -0,0 +1,6 @@
[target.'cfg(unix)']
runner = "sudo -E"
[alias] # command aliases
rr = "run --release"
bb = "build --release"

5
.dockerignore Normal file
View file

@ -0,0 +1,5 @@
# Xcode
Apple/
# Rust
target/

5
.github/CODEOWNERS vendored
View file

@ -1 +1,4 @@
* @conradev * @conradev @malted @JettChenT @jdogcoder
burrow/ @conradev @malted @JettChenT @jdogcoder @Muirrum
tun/ @conradev @malted @JettChenT @jdogcoder @Muirrum
burrow-gtk/ @conradev @malted @JettChenT @jdogcoder @davnotdev

View file

@ -26,18 +26,18 @@ runs:
run: | run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8 echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
xcodebuild archive \ xcodebuild clean archive \
-allowProvisioningUpdates \ -allowProvisioningUpdates \
-allowProvisioningDeviceRegistration \ -allowProvisioningDeviceRegistration \
-skipPackagePluginValidation \
-skipMacroValidation \
-onlyUsePackageVersionsFromResolvedFile \
-authenticationKeyID ${{ inputs.app-store-key-id }} \ -authenticationKeyID ${{ inputs.app-store-key-id }} \
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \ -authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \ -authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
-onlyUsePackageVersionsFromResolvedFile \
-scheme '${{ inputs.scheme }}' \ -scheme '${{ inputs.scheme }}' \
-destination '${{ inputs.destination }}' \ -destination '${{ inputs.destination }}' \
-archivePath '${{ inputs.archive-path }}' \ -archivePath '${{ inputs.archive-path }}' \
-resultBundlePath BuildResults.xcresult -resultBundlePath BuildResults.xcresult
./Tools/xcresulttool-github BuildResults.xcresult
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8 rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8

View file

@ -18,18 +18,36 @@ inputs:
runs: runs:
using: composite using: composite
steps: steps:
- shell: bash - name: Xcode Cache
uses: actions/cache@v3
with:
path: |
Apple/PackageCache
Apple/SourcePackages
Apple/DerivedData
key: ${{ runner.os }}-${{ inputs.scheme }}-${{ hashFiles('**/Package.resolved') }}
restore-keys: |
${{ runner.os }}-${{ inputs.scheme }}-${{ hashFiles('**/Package.resolved') }}
${{ runner.os }}-${{ inputs.scheme }}-
${{ runner.os }}-
- name: Build
shell: bash
working-directory: Apple working-directory: Apple
run: | run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8 echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
xcodebuild clean build-for-testing \ xcodebuild build-for-testing \
-allowProvisioningUpdates \ -allowProvisioningUpdates \
-allowProvisioningDeviceRegistration \ -allowProvisioningDeviceRegistration \
-skipPackagePluginValidation \
-skipMacroValidation \
-onlyUsePackageVersionsFromResolvedFile \
-authenticationKeyID ${{ inputs.app-store-key-id }} \ -authenticationKeyID ${{ inputs.app-store-key-id }} \
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \ -authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \ -authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \
-onlyUsePackageVersionsFromResolvedFile \ -clonedSourcePackagesDirPath SourcePackages \
-packageCachePath $PWD/PackageCache \
-derivedDataPath $PWD/DerivedData \
-scheme '${{ inputs.scheme }}' \ -scheme '${{ inputs.scheme }}' \
-destination '${{ inputs.destination }}' \ -destination '${{ inputs.destination }}' \
-resultBundlePath BuildResults.xcresult -resultBundlePath BuildResults.xcresult

View file

@ -0,0 +1,30 @@
name: Download Provisioning Profiles
inputs:
app-store-key:
description: App Store key in PEM PKCS#8 format
required: true
app-store-key-id:
description: App Store key ID
required: true
app-store-key-issuer-id:
description: App Store key issuer ID
required: true
runs:
using: composite
steps:
- shell: bash
env:
FASTLANE_OPT_OUT_USAGE: 'YES'
run: |
APP_STORE_KEY=$(echo "${{ inputs.app-store-key }}" | jq -sR .)
cat << EOF > api-key.json
{
"key_id": "${{ inputs.app-store-key-id }}",
"issuer_id": "${{ inputs.app-store-key-issuer-id }}",
"key": $APP_STORE_KEY
}
EOF
fastlane sigh download_all --api_key_path api-key.json
rm -rf api-key.json

View file

@ -1,4 +1,4 @@
name: Notarize name: Export
inputs: inputs:
app-store-key: app-store-key:
description: App Store key in PEM PKCS#8 format description: App Store key in PEM PKCS#8 format
@ -12,11 +12,8 @@ inputs:
archive-path: archive-path:
description: Xcode archive path description: Xcode archive path
required: true required: true
destination: export-options:
description: The Xcode export destination. This can either be "export" or "upload" description: The export options in JSON format
required: true
method:
description: The Xcode export method. This can be one of app-store, validation, ad-hoc, package, enterprise, development, developer-id, or mac-application.
required: true required: true
export-path: export-path:
description: The path to export the archive to description: The path to export the archive to
@ -24,19 +21,20 @@ inputs:
runs: runs:
using: composite using: composite
steps: steps:
- id: notarize - shell: bash
shell: bash
working-directory: Apple working-directory: Apple
run: | run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8 echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
echo '{"destination":"${{ inputs.destination }}","method":"${{ inputs.method }}"}' \ echo '${{ inputs.export-options }}' | plutil -convert xml1 -o ExportOptions.plist -
| plutil -convert xml1 -o ExportOptions.plist -
xcodebuild \ xcodebuild \
-exportArchive \ -exportArchive \
-allowProvisioningUpdates \ -allowProvisioningUpdates \
-allowProvisioningDeviceRegistration \ -allowProvisioningDeviceRegistration \
-skipPackagePluginValidation \
-skipMacroValidation \
-onlyUsePackageVersionsFromResolvedFile \
-authenticationKeyID ${{ inputs.app-store-key-id }} \ -authenticationKeyID ${{ inputs.app-store-key-id }} \
-authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \ -authenticationKeyIssuerID ${{ inputs.app-store-key-issuer-id }} \
-authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \ -authenticationKeyPath "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" \

25
.github/actions/notarize/action.yml vendored Normal file
View file

@ -0,0 +1,25 @@
name: Notarize
inputs:
app-store-key:
description: App Store key in PEM PKCS#8 format
required: true
app-store-key-id:
description: App Store key ID
required: true
app-store-key-issuer-id:
description: App Store key issuer ID
required: true
runs:
using: composite
steps:
- id: notarize
shell: bash
working-directory: Apple
run: |
echo "${{ inputs.app-store-key }}" > AuthKey_${{ inputs.app-store-key-id }}.p8
ditto -c -k --keepParent Release/Burrow.app Upload.zip
xcrun notarytool submit --wait --issuer ${{ inputs.app-store-key-issuer-id }} --key-id ${{ inputs.app-store-key-id }} --key "${PWD}/AuthKey_${{ inputs.app-store-key-id }}.p8" Upload.zip
xcrun stapler staple Release/Burrow.app
rm -rf AuthKey_${{ inputs.app-store-key-id }}.p8 Release

View file

@ -18,9 +18,6 @@ inputs:
runs: runs:
using: composite using: composite
steps: steps:
- shell: bash
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- shell: bash - shell: bash
working-directory: Apple working-directory: Apple
run: | run: |
@ -28,10 +25,10 @@ runs:
-scheme '${{ inputs.scheme }}' \ -scheme '${{ inputs.scheme }}' \
-destination '${{ inputs.destination }}' \ -destination '${{ inputs.destination }}' \
${{ inputs.test-plan && '-testPlan ' }}${{ inputs.test-plan }} \ ${{ inputs.test-plan && '-testPlan ' }}${{ inputs.test-plan }} \
-resultBundlePath "${{ inputs.artifact-prefix }}-${{ steps.vars.outputs.sha_short }}.xcresult" -resultBundlePath "${{ inputs.artifact-prefix }}.xcresult"
- uses: kishikawakatsumi/xcresulttool@v1 - uses: kishikawakatsumi/xcresulttool@v1
if: always() if: always()
with: with:
path: Apple/${{ inputs.artifact-prefix }}-${{ steps.vars.outputs.sha_short }}.xcresult path: Apple/${{ inputs.artifact-prefix }}.xcresult
title: ${{ inputs.check-name }} title: ${{ inputs.check-name }}
show-passed-tests: false show-passed-tests: false

29
.github/workflows/build-appimage.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Build AppImage
on:
push:
branches:
- main
pull_request:
branches:
- "*"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
appimage:
name: Build AppImage
runs-on: ubuntu-latest
container: docker
steps:
- uses: actions/checkout@v4
- name: Build AppImage
run: |
docker build -t appimage-builder . -f burrow-gtk/build-aux/Dockerfile
docker create --name temp appimage-builder
docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage .
docker rm temp
- uses: actions/upload-artifact@v4
name: Upload to GitHub
with:
name: AppImage
path: Burrow-x86_64.AppImage

View file

@ -1,4 +1,4 @@
name: Apple Build name: Build Apple Apps
on: on:
push: push:
branches: branches:
@ -6,28 +6,40 @@ on:
pull_request: pull_request:
branches: branches:
- "*" - "*"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs: jobs:
build: build:
name: Build App (${{ matrix.platform }}) name: Build App (${{ matrix.platform }})
runs-on: macos-12 runs-on: macos-14
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- scheme: Burrow - scheme: App
destination: generic/platform=iOS destination: generic/platform=iOS
platform: iOS platform: iOS
sdk-name: iphoneos sdk-name: iphoneos
- scheme: Burrow rust-targets:
destination: platform=iOS Simulator,OS=16.2,name=iPhone 14 Pro - aarch64-apple-ios
- scheme: App
destination: platform=iOS Simulator,OS=18.0,name=iPhone 15 Pro
platform: iOS Simulator platform: iOS Simulator
sdk-name: iphonesimulator sdk-name: iphonesimulator
- scheme: Burrow rust-targets:
- aarch64-apple-ios-sim
- x86_64-apple-ios
- scheme: App
destination: platform=macOS destination: platform=macOS
platform: macOS platform: macOS
sdk-name: macos sdk-name: macos
rust-targets:
- x86_64-apple-darwin
- aarch64-apple-darwin
env: env:
DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_16.0.app/Contents/Developer
PROTOC_PATH: /opt/homebrew/bin/protoc
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -39,6 +51,13 @@ jobs:
with: with:
certificate: ${{ secrets.DEVELOPER_CERT }} certificate: ${{ secrets.DEVELOPER_CERT }}
password: ${{ secrets.DEVELOPER_CERT_PASSWORD }} password: ${{ secrets.DEVELOPER_CERT_PASSWORD }}
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ join(matrix.rust-targets, ', ') }}
- name: Install Protobuf
shell: bash
run: brew install protobuf
- name: Build - name: Build
id: build id: build
uses: ./.github/actions/build-for-testing uses: ./.github/actions/build-for-testing
@ -48,7 +67,7 @@ jobs:
app-store-key: ${{ secrets.APPSTORE_KEY }} app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }} app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }} app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
- name: Xcode Unit Test - name: Run Unit Tests
if: ${{ matrix.xcode-unit-test != '' }} if: ${{ matrix.xcode-unit-test != '' }}
continue-on-error: true continue-on-error: true
uses: ./.github/actions/test-without-building uses: ./.github/actions/test-without-building
@ -58,7 +77,7 @@ jobs:
test-plan: ${{ matrix.xcode-unit-test }} test-plan: ${{ matrix.xcode-unit-test }}
artifact-prefix: unit-tests-${{ matrix.sdk-name }} artifact-prefix: unit-tests-${{ matrix.sdk-name }}
check-name: Xcode Unit Tests (${{ matrix.platform }}) check-name: Xcode Unit Tests (${{ matrix.platform }})
- name: Xcode UI Test - name: Run UI Tests
if: ${{ matrix.xcode-ui-test != '' }} if: ${{ matrix.xcode-ui-test != '' }}
continue-on-error: true continue-on-error: true
uses: ./.github/actions/test-without-building uses: ./.github/actions/test-without-building

49
.github/workflows/build-docker.yml vendored Normal file
View file

@ -0,0 +1,49 @@
name: Build Docker
on:
push:
branches:
- main
pull_request:
branches:
- "*"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build Docker Image
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Setup QEMU
uses: docker/setup-qemu-action@v2
with:
platforms: arm64
- name: Setup BuildKit
uses: docker/setup-buildx-action@v2
- name: Authenticate
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract Metadata
id: meta
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha
type=match,pattern=builds/(.*),group=1
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and Push
uses: docker/build-push-action@v4
with:
platforms: ${{ github.event_name != 'pull_request' && 'linux/amd64,linux/arm64' || 'linux/amd64' }}
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

16
.github/workflows/build-flatpak.yml vendored Normal file
View file

@ -0,0 +1,16 @@
on: workflow_dispatch
name: Build Flatpak
jobs:
flatpak:
name: Build Flatpak
runs-on: ubuntu-latest
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-45
options: --privileged
steps:
- uses: actions/checkout@v4
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
with:
bundle: Burrow.flatpak
manifest-path: burrow-gtk/build-aux/com.hackclub.burrow.devel.json
cache-key: flatpak-builder-${{ github.sha }}

17
.github/workflows/build-rpm.yml vendored Normal file
View file

@ -0,0 +1,17 @@
on: workflow_dispatch
name: Build RPM
jobs:
build:
name: Build RPM
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- name: Install RPM
run: cargo install cargo-generate-rpm
- name: Build RPM
run: |
cargo build --release
strip -s target/release/burrow
- name: Build RPM
run: cargo generate-rpm -p burrow

View file

@ -1,4 +1,4 @@
name: Rust Build name: Build Rust Crate
on: on:
push: push:
branches: branches:
@ -17,28 +17,38 @@ jobs:
platform: Linux platform: Linux
packages: packages:
- gcc-aarch64-linux-gnu - gcc-aarch64-linux-gnu
targets: test-targets:
- x86_64-unknown-linux-gnu - x86_64-unknown-linux-gnu
- aarch64-unknown-linux-gnu
- os: macos-12
platform: macOS
targets: targets:
- aarch64-unknown-linux-gnu
- os: macos-13
platform: macOS (Intel)
xcode: /Applications/Xcode_15.2.app
test-targets:
- x86_64-apple-darwin - x86_64-apple-darwin
targets:
- x86_64-apple-ios
- os: macos-14
platform: macOS
xcode: /Applications/Xcode_16.0.app
test-targets:
- aarch64-apple-darwin - aarch64-apple-darwin
targets:
- aarch64-apple-ios - aarch64-apple-ios
- aarch64-apple-ios-sim - aarch64-apple-ios-sim
- x86_64-apple-ios
- os: windows-2022 - os: windows-2022
platform: Windows platform: Windows
targets: test-targets:
- x86_64-pc-windows-msvc - x86_64-pc-windows-msvc
targets:
- aarch64-pc-windows-msvc - aarch64-pc-windows-msvc
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
env: env:
DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer DEVELOPER_DIR: ${{ matrix.xcode }}/Contents/Developer
CARGO_INCREMENTAL: 0 CARGO_INCREMENTAL: 0
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
RUST_BACKTRACE: short RUST_BACKTRACE: short
PROTOC_VERSION: 3.25.1
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -48,13 +58,28 @@ jobs:
- name: Install Packages - name: Install Packages
if: matrix.os == 'ubuntu-latest' if: matrix.os == 'ubuntu-latest'
shell: bash shell: bash
run: sudo apt-get install -y ${{ join(matrix.packages, ' ') }} run: |
sudo apt-get update
sudo apt-get install -y ${{ join(matrix.packages, ' ') }}
- name: Configure LLVM
if: matrix.os == 'windows-2022'
shell: bash
run: echo "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\Llvm\x64\bin" >> $GITHUB_PATH
- name: Install protoc
uses: taiki-e/install-action@v2
with:
tool: protoc@${{ env.PROTOC_VERSION }}
- name: Install Rust - name: Install Rust
uses: dtolnay/rust-toolchain@master uses: dtolnay/rust-toolchain@stable
with: with:
toolchain: stable toolchain: stable
components: rustfmt components: rustfmt
targets: ${{ join(matrix.targets, ', ') }} targets: ${{ join(matrix.targets, ', ') }}
- name: Setup Rust Cache
uses: Swatinem/rust-cache@v2
- name: Build - name: Build
shell: bash shell: bash
run: cargo build --verbose --workspace --all-features --target ${{ join(matrix.targets, ' --target ') }} run: cargo build --verbose --workspace --all-features --target ${{ join(matrix.targets, ' --target ') }} --target ${{ join(matrix.test-targets, ' --target ') }}
- name: Test
shell: bash
run: cargo test --verbose --workspace --all-features --target ${{ join(matrix.test-targets, ' --target ') }}

View file

@ -8,13 +8,14 @@ jobs:
name: Git Lint name: Git Lint
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - name: Checkout
with: uses: actions/checkout@v4
ref: ${{ github.event.pull_request.head.sha }} with:
fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }}
- name: Install Gitlint fetch-depth: 0
shell: bash - name: Install
run: python -m pip install gitlint shell: bash
- name: Run Gitlint run: python -m pip install gitlint
shell: bash - name: Lint
run: gitlint --commits "${{ github.event.pull_request.base.sha }}..HEAD" shell: bash
run: gitlint --commits "${{ github.event.pull_request.base.sha }}..HEAD"

View file

@ -1,8 +1,5 @@
name: Swift Lint name: Swift Lint
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches:
- "*" - "*"
@ -14,8 +11,6 @@ jobs:
image: ghcr.io/realm/swiftlint:latest image: ghcr.io/realm/swiftlint:latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with:
ssh-key: ${{ secrets.DEPLOY_KEY }}
- name: Lint - name: Lint
run: swiftlint lint --reporter github-actions-logging run: swiftlint lint --strict --reporter github-actions-logging

View file

@ -1,65 +1,119 @@
name: Build Apple Release name: Release (Apple)
on: on:
release: release:
types: types:
- created - created
jobs: jobs:
build: build:
name: Build ${{ matrix.configuration['platform'] }} Release name: Build ${{ matrix.platform }} Release
runs-on: macos-12 runs-on: macos-14
permissions:
contents: write
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
configuration: include:
- scheme: App (iOS) - platform: iOS
destination: generic/platform=iOS rust-targets:
platform: iOS - aarch64-apple-ios
method: ad-hoc - platform: macOS
artifact-file: Apple/Release/Burrow.ipa rust-targets:
- scheme: App (macOS) - x86_64-apple-darwin
destination: generic/platform=macOS - aarch64-apple-darwin
platform: macOS
method: mac-application
artifact-file: Burrow.app.txz
env: env:
DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer DEVELOPER_DIR: /Applications/Xcode_16.0.app/Contents/Developer
PROTOC_PATH: /opt/homebrew/bin/protoc
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
ssh-key: ${{ secrets.DEPLOY_KEY }} fetch-depth: 0
submodules: recursive
- name: Import Certificate - name: Import Certificate
uses: ./.github/actions/import-cert uses: ./.github/actions/import-cert
with: with:
certificate: ${{ secrets.DEVELOPER_CERT }} certificate: ${{ secrets.DEVELOPER_CERT }}
password: ${{ secrets.DEVELOPER_CERT_PASSWORD }} password: ${{ secrets.DEVELOPER_CERT_PASSWORD }}
- name: Download Provisioning Profiles
uses: ./.github/actions/download-profiles
with:
app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
- name: Install Provisioning Profiles
shell: bash
run: |
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles/
cp -f Apple/Profiles/* ~/Library/MobileDevice/Provisioning\ Profiles/
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ join(matrix.rust-targets, ', ') }}
- name: Install Protobuf
shell: bash
run: brew install protobuf
- name: Configure Version
id: version
shell: bash
run: echo "BUILD_NUMBER=$(Tools/version.sh)" >> $GITHUB_OUTPUT
- name: Archive - name: Archive
uses: ./.github/actions/archive uses: ./.github/actions/archive
with: with:
scheme: ${{ matrix.configuration['scheme'] }} scheme: App
destination: ${{ matrix.configuration['destination'] }} destination: generic/platform=${{ matrix.platform }}
app-store-key: ${{ secrets.APPSTORE_KEY }} app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }} app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }} app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive archive-path: Burrow.xcarchive
- name: Export Locally - name: Export
uses: ./.github/actions/export uses: ./.github/actions/export
with: with:
method: ${{ matrix.configuration['method'] }} method: ${{ matrix.platform == 'macOS' && 'developer-id' || 'ad-hoc' }}
destination: export destination: export
app-store-key: ${{ secrets.APPSTORE_KEY }} app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }} app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }} app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive archive-path: Burrow.xcarchive
export-options: |
{"teamID":"P6PV2R9443","destination":"export","method":"developer-id","provisioningProfiles":{"com.hackclub.burrow":"Burrow Developer ID","com.hackclub.burrow.network":"Burrow Network Developer ID"},"signingCertificate":"Developer ID Application","signingStyle":"manual"}
export-path: Release export-path: Release
- name: Compress - name: Notarize
if: ${{ matrix.configuration['platform'] == 'macOS' }} if: ${{ matrix.platform == 'macOS' }}
uses: ./.github/actions/notarize
with:
app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
- name: Compress (iOS)
if: ${{ matrix.platform == 'iOS' }}
shell: bash shell: bash
run: tar --options xz:compression-level=9 -C Apple/Release -cJf Burrow.app.txz ./ run: |
- name: Attach Artifact cp Apple/Release/Burrow.ipa Burrow.ipa
uses: SierraSoftworks/gh-releases@v1.0.6 aa archive -a lzma -b 8m -d Apple -subdir Burrow.xcarchive -o Burrow-${{ matrix.platform }}.xcarchive.aar
rm -rf Apple/Release
- name: Compress (macOS)
if: ${{ matrix.platform == 'macOS' }}
shell: bash
run: |
aa archive -a lzma -b 8m -d Apple/Release -subdir Burrow.app -o Burrow.app.aar
aa archive -a lzma -b 8m -d Apple -subdir Burrow.xcarchive -o Burrow-${{ matrix.platform }}.xcarchive.aar
rm -rf Apple/Release
- name: Upload to GitHub
uses: SierraSoftworks/gh-releases@v1.0.7
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
overwrite: 'false' release_tag: ${{ github.ref_name }}
files: ${{ matrix.configuration['artifact-file'] }} overwrite: 'true'
files: |
${{ matrix.platform == 'macOS' && 'Burrow.aap.aar' || 'Burrow.ipa' }}
Burrow-${{ matrix.platform }}.xcarchive.aar
- name: Upload to App Store Connect
if: ${{ matrix.platform == 'iOS' }}
uses: ./.github/actions/export
with:
app-store-key: ${{ secrets.APPSTORE_KEY }}
app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
archive-path: Burrow.xcarchive
export-options: |
{"method": "app-store", "destination": "upload"}
export-path: Release

View file

@ -0,0 +1,23 @@
name: Create Release If Needed
on:
workflow_dispatch:
schedule:
- cron: '0 10 * * *'
concurrency:
group: ${{ github.workflow }}
jobs:
create:
name: Create Release If Needed
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ github.token }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- shell: bash
run: |
if [[ $(Tools/version.sh status) == "dirty" ]]; then
gh workflow run release-now.yml
fi

29
.github/workflows/release-linux.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Release (Linux)
on:
release:
types:
- created
jobs:
appimage:
name: Build AppImage
runs-on: ubuntu-latest
container: docker
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build AppImage
run: |
docker build -t appimage-builder . -f burrow-gtk/build-aux/Dockerfile
docker create --name temp appimage-builder
docker cp temp:/app/burrow-gtk/build-appimage/Burrow-x86_64.AppImage .
docker rm temp
- name: Attach Artifacts
uses: SierraSoftworks/gh-releases@v1.0.7
with:
token: ${{ secrets.GITHUB_TOKEN }}
release_tag: ${{ github.ref_name }}
overwrite: "true"
files: |
Burrow-x86_64.AppImage

17
.github/workflows/release-now.yml vendored Normal file
View file

@ -0,0 +1,17 @@
name: Create Release
on: workflow_dispatch
concurrency:
group: ${{ github.workflow }}
jobs:
create:
env:
GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- shell: bash
run: Tools/version.sh increment

12
.gitignore vendored
View file

@ -1,5 +1,17 @@
# Xcode # Xcode
xcuserdata xcuserdata
# Swift
Apple/Package/.swiftpm/
# Rust # Rust
target/ target/
.env
.DS_STORE
.idea/
tmp/
*.db
*.sock

View file

@ -1,5 +1,5 @@
[general] [general]
ignore=body-changed-file-mention ignore=body-changed-file-mention,body-is-missing
ignore-merge-commits=false ignore-merge-commits=false
ignore-fixup-commits=false ignore-fixup-commits=false
ignore-squash-commits=false ignore-squash-commits=false

12
.rustfmt.toml Normal file
View file

@ -0,0 +1,12 @@
condense_wildcard_suffixes = true
format_macro_matchers = true
imports_layout = "HorizontalVertical"
imports_granularity = "Crate"
newline_style = "Unix"
overflow_delimited_expr = true
reorder_impl_items = true
group_imports = "StdExternalCrate"
trailing_semicolon = false
use_field_init_shorthand = true
use_try_shorthand = true
struct_lit_width = 30

View file

@ -30,7 +30,6 @@ opt_in_rules:
- function_default_parameter_at_end - function_default_parameter_at_end
- ibinspectable_in_extension - ibinspectable_in_extension
- identical_operands - identical_operands
- implicitly_unwrapped_optional
- indentation_width - indentation_width
- joined_default_parameter - joined_default_parameter
- last_where - last_where
@ -46,7 +45,6 @@ opt_in_rules:
- multiline_parameters - multiline_parameters
- multiline_parameters_brackets - multiline_parameters_brackets
- no_extension_access_modifier - no_extension_access_modifier
- no_grouping_extension
- nslocalizedstring_key - nslocalizedstring_key
- nslocalizedstring_require_bundle - nslocalizedstring_require_bundle
- number_separator - number_separator
@ -76,9 +74,7 @@ opt_in_rules:
- sorted_first_last - sorted_first_last
- sorted_imports - sorted_imports
- static_operator - static_operator
- strict_fileprivate
- strong_iboutlet - strong_iboutlet
- switch_case_on_newline
- test_case_accessibility - test_case_accessibility
- toggle_bool - toggle_bool
- trailing_closure - trailing_closure
@ -97,3 +93,5 @@ disabled_rules:
- force_try - force_try
- nesting - nesting
- todo - todo
- trailing_comma
- switch_case_on_newline

View file

@ -1,5 +1,6 @@
{ {
"recommendations": [ "recommendations": [
"rust-lang.rust-analyzer", "rust-lang.rust-analyzer",
"vadimcn.vscode-lldb",
] ]
} }

38
.vscode/settings.json vendored
View file

@ -1,16 +1,26 @@
{ {
"files.autoSave": "onFocusChange", "files.autoSave": "onFocusChange",
"files.defaultLanguage": "rust", "files.defaultLanguage": "rust",
"explorer.excludeGitIgnore": true, "editor.formatOnPaste": true,
"editor.formatOnPaste": true, "editor.formatOnSave": true,
"editor.formatOnSave": true, "files.trimTrailingWhitespace": true,
"files.trimTrailingWhitespace": true, "editor.suggest.preview": true,
"editor.suggest.preview": true, "editor.acceptSuggestionOnEnter": "on",
"editor.acceptSuggestionOnEnter": "on", "rust-analyzer.restartServerOnConfigChange": true,
"rust-analyzer.checkOnSave.command": "clippy", "rust-analyzer.cargo.features": "all",
"rust-analyzer.restartServerOnConfigChange": true, "rust-analyzer.rustfmt.extraArgs": ["+nightly"],
"rust-analyzer.cargo.features": "all", "[rust]": {
"[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer"
"editor.defaultFormatter": "rust-lang.rust-analyzer", },
}, "rust-analyzer.inlayHints.typeHints.enable": false,
"rust-analyzer.linkedProjects": [
"./burrow/Cargo.toml"
],
"[yaml]": {
"editor.insertSpaces": true,
"editor.tabSize": 2,
"editor.autoIndent": "advanced",
"diffEditor.ignoreTrimWhitespace": false,
"editor.formatOnSave": false
}
} }

12
.vscode/tasks.json vendored
View file

@ -3,7 +3,7 @@
"tasks": [ "tasks": [
{ {
"type": "cargo", "type": "cargo",
"command": "check", "command": "clippy",
"problemMatcher": [ "problemMatcher": [
"$rustc" "$rustc"
], ],
@ -11,7 +11,13 @@
"kind": "build", "kind": "build",
"isDefault": true "isDefault": true
}, },
"label": "Check" "label": "rust: cargo clippy",
} "args": [
"--workspace",
"--all-targets",
"--all-features",
"--all"
]
},
] ]
} }

View file

@ -2,6 +2,15 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:burrow.rs?mode=developer</string>
<string>webcredentials:burrow.rs?mode=developer</string>
</array>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>$(APP_GROUP_IDENTIFIER)</string> <string>$(APP_GROUP_IDENTIFIER)</string>

View file

@ -2,6 +2,15 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:burrow.rs?mode=developer</string>
<string>webcredentials:burrow.rs?mode=developer</string>
</array>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>$(APP_GROUP_IDENTIFIER)</string> <string>$(APP_GROUP_IDENTIFIER)</string>

View file

@ -2,6 +2,7 @@
PRODUCT_NAME = Burrow PRODUCT_NAME = Burrow
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER) PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER)
PRODUCT_MODULE_NAME = BurrowApp
INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphone*] = YES INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphone*] = YES
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphone*] = YES INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphone*] = YES
@ -10,8 +11,13 @@ INFOPLIST_KEY_UIStatusBarStyle[sdk=iphone*] = UIStatusBarStyleDefault
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone[sdk=iphone*] = UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight
TARGETED_DEVICE_FAMILY[sdk=iphone*] = 1,2 TARGETED_DEVICE_FAMILY[sdk=iphone*] = 1,2
EXCLUDED_SOURCE_FILE_NAMES = MainMenu.xib
INFOPLIST_KEY_LSApplicationCategoryType[sdk=macos*] = public.app-category.utilities EXCLUDED_SOURCE_FILE_NAMES[sdk=macosx*] =
INFOPLIST_KEY_LSUIElement[sdk=macosx*] = YES
INFOPLIST_KEY_NSMainNibFile[sdk=macosx*] = MainMenu
INFOPLIST_KEY_NSPrincipalClass[sdk=macosx*] = NSApplication
INFOPLIST_KEY_LSApplicationCategoryType[sdk=macosx*] = public.app-category.utilities
CODE_SIGN_ENTITLEMENTS = App/App-iOS.entitlements CODE_SIGN_ENTITLEMENTS = App/App-iOS.entitlements
CODE_SIGN_ENTITLEMENTS[sdk=macos*] = App/App-macOS.entitlements CODE_SIGN_ENTITLEMENTS[sdk=macosx*] = App/App-macOS.entitlements

View file

@ -0,0 +1,53 @@
#if os(macOS)
import AppKit
import BurrowUI
import SwiftUI
@main
@MainActor
class AppDelegate: NSObject, NSApplicationDelegate {
private let quitItem: NSMenuItem = {
let quitItem = NSMenuItem(
title: "Quit Burrow",
action: #selector(NSApplication.terminate(_:)),
keyEquivalent: "q"
)
quitItem.target = NSApplication.shared
quitItem.keyEquivalentModifierMask = .command
return quitItem
}()
private let toggleItem: NSMenuItem = {
let toggleView = NSHostingView(rootView: MenuItemToggleView())
toggleView.frame.size = CGSize(width: 300, height: 32)
toggleView.autoresizingMask = [.width]
let toggleItem = NSMenuItem()
toggleItem.view = toggleView
return toggleItem
}()
private lazy var menu: NSMenu = {
let menu = NSMenu()
menu.items = [
toggleItem,
.separator(),
quitItem
]
return menu
}()
private lazy var statusItem: NSStatusItem = {
let statusBar = NSStatusBar.system
let statusItem = statusBar.statusItem(withLength: NSStatusItem.squareLength)
if let button = statusItem.button {
button.image = NSImage(systemSymbolName: "network.badge.shield.half.filled", accessibilityDescription: nil)
}
return statusItem
}()
func applicationDidFinishLaunching(_ notification: Notification) {
statusItem.menu = menu
}
}
#endif

View file

@ -1,63 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -1,10 +1,14 @@
#if !os(macOS)
import BurrowUI
import SwiftUI import SwiftUI
@MainActor
@main @main
struct BurrowApp: App { struct BurrowApp: App {
var body: some Scene { var body: some Scene {
WindowGroup { WindowGroup {
ContentView() BurrowView()
} }
} }
} }
#endif

View file

@ -1,19 +0,0 @@
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

679
Apple/App/MainMenu.xib Normal file
View file

@ -0,0 +1,679 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23091" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23091"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="BurrowApp" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="Burrow" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Burrow" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About Burrow" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide Burrow" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit Burrow" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleSidebar:" target="-1" id="iwa-gc-5KM"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="Burrow Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
<point key="canvasLocation" x="200" y="121"/>
</menu>
</objects>
</document>

View file

@ -7,11 +7,47 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00AA8962A4669BC005C8102 /* AppDelegate.swift */; };
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; }; D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
D03383AD2C8E67E300F7C44E /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = D078F7E22C8DA375008A8CEC /* SwiftProtobuf */; };
D03383AE2C8E67E300F7C44E /* NIO in Frameworks */ = {isa = PBXBuildFile; productRef = D044EE902C8DAB2000778185 /* NIO */; };
D03383AF2C8E67E300F7C44E /* NIOConcurrencyHelpers in Frameworks */ = {isa = PBXBuildFile; productRef = D044EE922C8DAB2000778185 /* NIOConcurrencyHelpers */; };
D03383B02C8E67E300F7C44E /* NIOTransportServices in Frameworks */ = {isa = PBXBuildFile; productRef = D044EE952C8DAB2800778185 /* NIOTransportServices */; };
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; }; D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; };
D05B9F7829E39EEC008CB1F9 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7729E39EEC008CB1F9 /* ContentView.swift */; }; D09150422B9D2AF700BE3CB0 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D09150412B9D2AF700BE3CB0 /* MainMenu.xib */; platformFilters = (macos, ); };
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D05B9F7929E39EED008CB1F9 /* Assets.xcassets */; }; D0B1D1102C436152004B7823 /* AsyncAlgorithms in Frameworks */ = {isa = PBXBuildFile; productRef = D0B1D10F2C436152004B7823 /* AsyncAlgorithms */; };
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCC6032A09535900AD070D /* libburrow.a */; };
D0BF09522C8E66F6000D8DEC /* BurrowConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */; };
D0BF09552C8E66FD000D8DEC /* BurrowConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */; };
D0D4E53A2C8D996F007F820A /* BurrowCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D0D4E56B2C8D9C2F007F820A /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49A2C8D921A007F820A /* Logging.swift */; };
D0D4E5702C8D9C62007F820A /* BurrowCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; };
D0D4E5712C8D9C6F007F820A /* HackClub.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49D2C8D921A007F820A /* HackClub.swift */; };
D0D4E5722C8D9C6F007F820A /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49E2C8D921A007F820A /* Network.swift */; };
D0D4E5732C8D9C6F007F820A /* WireGuard.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E49F2C8D921A007F820A /* WireGuard.swift */; };
D0D4E5742C8D9C6F007F820A /* BurrowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A22C8D921A007F820A /* BurrowView.swift */; };
D0D4E5752C8D9C6F007F820A /* FloatingButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A32C8D921A007F820A /* FloatingButtonStyle.swift */; };
D0D4E5762C8D9C6F007F820A /* MenuItemToggleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A42C8D921A007F820A /* MenuItemToggleView.swift */; };
D0D4E5772C8D9C6F007F820A /* NetworkCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A52C8D921A007F820A /* NetworkCarouselView.swift */; };
D0D4E5782C8D9C6F007F820A /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A62C8D921A007F820A /* NetworkExtension+Async.swift */; };
D0D4E5792C8D9C6F007F820A /* NetworkExtensionTunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A72C8D921A007F820A /* NetworkExtensionTunnel.swift */; };
D0D4E57A2C8D9C6F007F820A /* NetworkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A82C8D921A007F820A /* NetworkView.swift */; };
D0D4E57B2C8D9C6F007F820A /* OAuth2.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4A92C8D921A007F820A /* OAuth2.swift */; };
D0D4E57C2C8D9C6F007F820A /* Tunnel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4AA2C8D921A007F820A /* Tunnel.swift */; };
D0D4E57D2C8D9C6F007F820A /* TunnelButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4AB2C8D921A007F820A /* TunnelButton.swift */; };
D0D4E57E2C8D9C6F007F820A /* TunnelStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4AC2C8D921A007F820A /* TunnelStatusView.swift */; };
D0D4E5892C8D9C94007F820A /* BurrowUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */; };
D0D4E58A2C8D9C9E007F820A /* BurrowUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D0D4E58B2C8D9CA4007F820A /* BurrowConfiguration.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D0D4E5922C8D9D15007F820A /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E58F2C8D9D0A007F820A /* Constants.swift */; };
D0D4E5A62C8D9E65007F820A /* BurrowCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; };
D0F4FAD32C8DC79C0068730A /* BurrowCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0D4E5312C8D996F007F820A /* BurrowCore.framework */; };
D0F7594E2C8DAB6B00126CF3 /* GRPC in Frameworks */ = {isa = PBXBuildFile; productRef = D078F7E02C8DA375008A8CEC /* GRPC */; };
D0F759612C8DB24B00126CF3 /* grpc-swift-config.json in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4962C8D921A007F820A /* grpc-swift-config.json */; };
D0F759622C8DB24B00126CF3 /* swift-protobuf-config.json in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4972C8D921A007F820A /* swift-protobuf-config.json */; };
D0F7597E2C8DB30500126CF3 /* CGRPCZlib in Frameworks */ = {isa = PBXBuildFile; productRef = D0F7597D2C8DB30500126CF3 /* CGRPCZlib */; };
D0F7598D2C8DB3DA00126CF3 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D4E4992C8D921A007F820A /* Client.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -22,6 +58,48 @@
remoteGlobalIDString = D020F65229E4A697002790F6; remoteGlobalIDString = D020F65229E4A697002790F6;
remoteInfo = BurrowNetworkExtension; remoteInfo = BurrowNetworkExtension;
}; };
D0BF09502C8E66F1000D8DEC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0D4E55A2C8D9BF4007F820A;
remoteInfo = Configuration;
};
D0BF09532C8E66FA000D8DEC /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0D4E55A2C8D9BF4007F820A;
remoteInfo = Configuration;
};
D0D4E56E2C8D9C5D007F820A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0D4E5302C8D996F007F820A;
remoteInfo = Core;
};
D0D4E57F2C8D9C78007F820A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0D4E5302C8D996F007F820A;
remoteInfo = Core;
};
D0D4E5872C8D9C88007F820A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0D4E5502C8D9BF2007F820A;
remoteInfo = UI;
};
D0F4FAD12C8DC7960068730A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D05B9F6A29E39EEC008CB1F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0D4E5302C8D996F007F820A;
remoteInfo = Core;
};
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
@ -36,13 +114,28 @@
name = "Embed Foundation Extensions"; name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
D0D4E53F2C8D996F007F820A /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
D0D4E58B2C8D9CA4007F820A /* BurrowConfiguration.framework in Embed Frameworks */,
D0D4E58A2C8D9C9E007F820A /* BurrowUI.framework in Embed Frameworks */,
D0D4E53A2C8D996F007F820A /* BurrowCore.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
D00117422B30348D00D87C25 /* Configuration.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Configuration.xcconfig; sourceTree = "<group>"; };
D00AA8962A4669BC005C8102 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; }; D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; }; D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; };
D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
D020F64929E4A34B002790F6 /* Burrow.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Burrow.xcconfig; sourceTree = "<group>"; }; D020F64929E4A34B002790F6 /* App.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = App.xcconfig; sourceTree = "<group>"; };
D020F64A29E4A452002790F6 /* App.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = App.xcconfig; sourceTree = "<group>"; }; D020F64A29E4A452002790F6 /* App.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = App.xcconfig; sourceTree = "<group>"; };
D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = BurrowNetworkExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = BurrowNetworkExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = "<group>"; }; D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = "<group>"; };
@ -53,10 +146,43 @@
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "NetworkExtension-iOS.entitlements"; sourceTree = "<group>"; }; D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "NetworkExtension-iOS.entitlements"; sourceTree = "<group>"; };
D020F66829E4AA74002790F6 /* App-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-iOS.entitlements"; sourceTree = "<group>"; }; D020F66829E4AA74002790F6 /* App-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-iOS.entitlements"; sourceTree = "<group>"; };
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; }; D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
D04A3E1D2BAF465F0043EC85 /* Version.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; };
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; }; D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; }; D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
D05B9F7729E39EEC008CB1F9 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; }; D09150412B9D2AF700BE3CB0 /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = "<group>"; };
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
D0B98FD829FDDB6F004E7149 /* libburrow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libburrow.h; sourceTree = "<group>"; };
D0B98FDC29FDDDCF004E7149 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
D0BCC6032A09535900AD070D /* libburrow.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libburrow.a; sourceTree = BUILT_PRODUCTS_DIR; };
D0BF09582C8E6789000D8DEC /* UI.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = UI.xcconfig; sourceTree = "<group>"; };
D0D4E4952C8D921A007F820A /* burrow.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = burrow.proto; sourceTree = "<group>"; };
D0D4E4962C8D921A007F820A /* grpc-swift-config.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "grpc-swift-config.json"; sourceTree = "<group>"; };
D0D4E4972C8D921A007F820A /* swift-protobuf-config.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "swift-protobuf-config.json"; sourceTree = "<group>"; };
D0D4E4992C8D921A007F820A /* Client.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Client.swift; sourceTree = "<group>"; };
D0D4E49A2C8D921A007F820A /* Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = "<group>"; };
D0D4E49D2C8D921A007F820A /* HackClub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HackClub.swift; sourceTree = "<group>"; };
D0D4E49E2C8D921A007F820A /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = "<group>"; };
D0D4E49F2C8D921A007F820A /* WireGuard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuard.swift; sourceTree = "<group>"; };
D0D4E4A12C8D921A007F820A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
D0D4E4A22C8D921A007F820A /* BurrowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowView.swift; sourceTree = "<group>"; };
D0D4E4A32C8D921A007F820A /* FloatingButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingButtonStyle.swift; sourceTree = "<group>"; };
D0D4E4A42C8D921A007F820A /* MenuItemToggleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItemToggleView.swift; sourceTree = "<group>"; };
D0D4E4A52C8D921A007F820A /* NetworkCarouselView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkCarouselView.swift; sourceTree = "<group>"; };
D0D4E4A62C8D921A007F820A /* NetworkExtension+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NetworkExtension+Async.swift"; sourceTree = "<group>"; };
D0D4E4A72C8D921A007F820A /* NetworkExtensionTunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkExtensionTunnel.swift; sourceTree = "<group>"; };
D0D4E4A82C8D921A007F820A /* NetworkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkView.swift; sourceTree = "<group>"; };
D0D4E4A92C8D921A007F820A /* OAuth2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OAuth2.swift; sourceTree = "<group>"; };
D0D4E4AA2C8D921A007F820A /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
D0D4E4AB2C8D921A007F820A /* TunnelButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelButton.swift; sourceTree = "<group>"; };
D0D4E4AC2C8D921A007F820A /* TunnelStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelStatusView.swift; sourceTree = "<group>"; };
D0D4E4F62C8D932D007F820A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
D0D4E4F72C8D941D007F820A /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = "<group>"; };
D0D4E5312C8D996F007F820A /* BurrowCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BurrowCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BurrowUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BurrowConfiguration.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D0D4E58E2C8D9D0A007F820A /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = "<group>"; };
D0D4E58F2C8D9D0A007F820A /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
D0D4E5902C8D9D0A007F820A /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -64,6 +190,10 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D0BF09522C8E66F6000D8DEC /* BurrowConfiguration.framework in Frameworks */,
D0D4E5A62C8D9E65007F820A /* BurrowCore.framework in Frameworks */,
D0BCC6092A09A03E00AD070D /* libburrow.a in Frameworks */,
D0B1D1102C436152004B7823 /* AsyncAlgorithms in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -71,20 +201,56 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D0BF09552C8E66FD000D8DEC /* BurrowConfiguration.framework in Frameworks */,
D0F4FAD32C8DC79C0068730A /* BurrowCore.framework in Frameworks */,
D0D4E5892C8D9C94007F820A /* BurrowUI.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D078F7CF2C8DA213008A8CEC /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D03383B02C8E67E300F7C44E /* NIOTransportServices in Frameworks */,
D03383AF2C8E67E300F7C44E /* NIOConcurrencyHelpers in Frameworks */,
D03383AE2C8E67E300F7C44E /* NIO in Frameworks */,
D03383AD2C8E67E300F7C44E /* SwiftProtobuf in Frameworks */,
D0F7594E2C8DAB6B00126CF3 /* GRPC in Frameworks */,
D0F7597E2C8DB30500126CF3 /* CGRPCZlib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D0D4E5532C8D9BF2007F820A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D0D4E5702C8D9C62007F820A /* BurrowCore.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
D00117432B30372900D87C25 /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
D020F63C29E4A1FF002790F6 /* Configuration */ = { D020F63C29E4A1FF002790F6 /* Configuration */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */, D020F63D29E4A1FF002790F6 /* Identity.xcconfig */,
D020F64A29E4A452002790F6 /* App.xcconfig */, D020F64A29E4A452002790F6 /* App.xcconfig */,
D020F66329E4A703002790F6 /* Extension.xcconfig */, D020F66329E4A703002790F6 /* Extension.xcconfig */,
D0D4E4F72C8D941D007F820A /* Framework.xcconfig */,
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */, D020F64029E4A1FF002790F6 /* Compiler.xcconfig */,
D0D4E4F62C8D932D007F820A /* Debug.xcconfig */,
D04A3E1D2BAF465F0043EC85 /* Version.xcconfig */,
D020F64229E4A1FF002790F6 /* Info.plist */, D020F64229E4A1FF002790F6 /* Info.plist */,
D0D4E5912C8D9D0A007F820A /* Constants */,
D00117422B30348D00D87C25 /* Configuration.xcconfig */,
); );
path = Configuration; path = Configuration;
sourceTree = "<group>"; sourceTree = "<group>";
@ -97,6 +263,7 @@
D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */, D020F66729E4A95D002790F6 /* NetworkExtension-iOS.entitlements */,
D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */, D020F66629E4A95D002790F6 /* NetworkExtension-macOS.entitlements */,
D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */, D020F66229E4A6E5002790F6 /* NetworkExtension.xcconfig */,
D0B98FD729FDDB57004E7149 /* libburrow */,
); );
path = NetworkExtension; path = NetworkExtension;
sourceTree = "<group>"; sourceTree = "<group>";
@ -106,8 +273,11 @@
children = ( children = (
D05B9F7429E39EEC008CB1F9 /* App */, D05B9F7429E39EEC008CB1F9 /* App */,
D020F65629E4A697002790F6 /* NetworkExtension */, D020F65629E4A697002790F6 /* NetworkExtension */,
D0D4E49C2C8D921A007F820A /* Core */,
D0D4E4AD2C8D921A007F820A /* UI */,
D020F63C29E4A1FF002790F6 /* Configuration */, D020F63C29E4A1FF002790F6 /* Configuration */,
D05B9F7329E39EEC008CB1F9 /* Products */, D05B9F7329E39EEC008CB1F9 /* Products */,
D00117432B30372900D87C25 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -116,6 +286,10 @@
children = ( children = (
D05B9F7229E39EEC008CB1F9 /* Burrow.app */, D05B9F7229E39EEC008CB1F9 /* Burrow.app */,
D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */, D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */,
D0BCC6032A09535900AD070D /* libburrow.a */,
D0D4E5312C8D996F007F820A /* BurrowCore.framework */,
D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */,
D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -124,15 +298,86 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */, D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */,
D05B9F7729E39EEC008CB1F9 /* ContentView.swift */, D00AA8962A4669BC005C8102 /* AppDelegate.swift */,
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */, D09150412B9D2AF700BE3CB0 /* MainMenu.xib */,
D020F66829E4AA74002790F6 /* App-iOS.entitlements */, D020F66829E4AA74002790F6 /* App-iOS.entitlements */,
D020F66929E4AA74002790F6 /* App-macOS.entitlements */, D020F66929E4AA74002790F6 /* App-macOS.entitlements */,
D020F64929E4A34B002790F6 /* Burrow.xcconfig */, D020F64929E4A34B002790F6 /* App.xcconfig */,
); );
path = App; path = App;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D0B98FD729FDDB57004E7149 /* libburrow */ = {
isa = PBXGroup;
children = (
D0B98FBF29FD8072004E7149 /* build-rust.sh */,
D0B98FDC29FDDDCF004E7149 /* module.modulemap */,
D0B98FD829FDDB6F004E7149 /* libburrow.h */,
);
path = libburrow;
sourceTree = "<group>";
};
D0D4E4982C8D921A007F820A /* Client */ = {
isa = PBXGroup;
children = (
D0D4E4952C8D921A007F820A /* burrow.proto */,
D0D4E4962C8D921A007F820A /* grpc-swift-config.json */,
D0D4E4972C8D921A007F820A /* swift-protobuf-config.json */,
);
path = Client;
sourceTree = "<group>";
};
D0D4E49C2C8D921A007F820A /* Core */ = {
isa = PBXGroup;
children = (
D0D4E49A2C8D921A007F820A /* Logging.swift */,
D0D4E4992C8D921A007F820A /* Client.swift */,
D0D4E4982C8D921A007F820A /* Client */,
);
path = Core;
sourceTree = "<group>";
};
D0D4E4A02C8D921A007F820A /* Networks */ = {
isa = PBXGroup;
children = (
D0D4E49D2C8D921A007F820A /* HackClub.swift */,
D0D4E49E2C8D921A007F820A /* Network.swift */,
D0D4E49F2C8D921A007F820A /* WireGuard.swift */,
);
path = Networks;
sourceTree = "<group>";
};
D0D4E4AD2C8D921A007F820A /* UI */ = {
isa = PBXGroup;
children = (
D0D4E4A22C8D921A007F820A /* BurrowView.swift */,
D0D4E4A02C8D921A007F820A /* Networks */,
D0D4E4A32C8D921A007F820A /* FloatingButtonStyle.swift */,
D0D4E4A42C8D921A007F820A /* MenuItemToggleView.swift */,
D0D4E4A52C8D921A007F820A /* NetworkCarouselView.swift */,
D0D4E4A62C8D921A007F820A /* NetworkExtension+Async.swift */,
D0D4E4A72C8D921A007F820A /* NetworkExtensionTunnel.swift */,
D0D4E4A82C8D921A007F820A /* NetworkView.swift */,
D0D4E4A92C8D921A007F820A /* OAuth2.swift */,
D0D4E4AA2C8D921A007F820A /* Tunnel.swift */,
D0D4E4AB2C8D921A007F820A /* TunnelButton.swift */,
D0D4E4AC2C8D921A007F820A /* TunnelStatusView.swift */,
D0D4E4A12C8D921A007F820A /* Assets.xcassets */,
D0BF09582C8E6789000D8DEC /* UI.xcconfig */,
);
path = UI;
sourceTree = "<group>";
};
D0D4E5912C8D9D0A007F820A /* Constants */ = {
isa = PBXGroup;
children = (
D0D4E58E2C8D9D0A007F820A /* Constants.h */,
D0D4E58F2C8D9D0A007F820A /* Constants.swift */,
D0D4E5902C8D9D0A007F820A /* module.modulemap */,
);
path = Constants;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -140,38 +385,109 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = D020F65E29E4A697002790F6 /* Build configuration list for PBXNativeTarget "NetworkExtension" */; buildConfigurationList = D020F65E29E4A697002790F6 /* Build configuration list for PBXNativeTarget "NetworkExtension" */;
buildPhases = ( buildPhases = (
D0BCC60B2A09A0C100AD070D /* Compile Rust */,
D020F64F29E4A697002790F6 /* Sources */, D020F64F29E4A697002790F6 /* Sources */,
D020F65029E4A697002790F6 /* Frameworks */, D020F65029E4A697002790F6 /* Frameworks */,
D020F65129E4A697002790F6 /* Resources */,
); );
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
D0BF09512C8E66F1000D8DEC /* PBXTargetDependency */,
D0D4E5802C8D9C78007F820A /* PBXTargetDependency */,
); );
name = NetworkExtension; name = NetworkExtension;
productName = BurrowNetworkExtension; productName = BurrowNetworkExtension;
productReference = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; productReference = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */;
productType = "com.apple.product-type.app-extension"; productType = "com.apple.product-type.app-extension";
}; };
D05B9F7129E39EEC008CB1F9 /* Burrow */ = { D05B9F7129E39EEC008CB1F9 /* App */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = D05B9F8129E39EED008CB1F9 /* Build configuration list for PBXNativeTarget "Burrow" */; buildConfigurationList = D05B9F8129E39EED008CB1F9 /* Build configuration list for PBXNativeTarget "App" */;
buildPhases = ( buildPhases = (
D05B9F6E29E39EEC008CB1F9 /* Sources */, D05B9F6E29E39EEC008CB1F9 /* Sources */,
D05B9F6F29E39EEC008CB1F9 /* Frameworks */, D05B9F6F29E39EEC008CB1F9 /* Frameworks */,
D05B9F7029E39EEC008CB1F9 /* Resources */, D05B9F7029E39EEC008CB1F9 /* Resources */,
D0D4E53F2C8D996F007F820A /* Embed Frameworks */,
D020F66129E4A697002790F6 /* Embed Foundation Extensions */, D020F66129E4A697002790F6 /* Embed Foundation Extensions */,
); );
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
D0BF09542C8E66FA000D8DEC /* PBXTargetDependency */,
D0F4FAD22C8DC7960068730A /* PBXTargetDependency */,
D0D4E5882C8D9C88007F820A /* PBXTargetDependency */,
D020F65C29E4A697002790F6 /* PBXTargetDependency */, D020F65C29E4A697002790F6 /* PBXTargetDependency */,
); );
name = Burrow; name = App;
productName = Burrow; productName = Burrow;
productReference = D05B9F7229E39EEC008CB1F9 /* Burrow.app */; productReference = D05B9F7229E39EEC008CB1F9 /* Burrow.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
}; };
D0D4E5302C8D996F007F820A /* Core */ = {
isa = PBXNativeTarget;
buildConfigurationList = D0D4E53C2C8D996F007F820A /* Build configuration list for PBXNativeTarget "Core" */;
buildPhases = (
D0D4E52D2C8D996F007F820A /* Sources */,
D078F7CF2C8DA213008A8CEC /* Frameworks */,
);
buildRules = (
);
dependencies = (
D0F7598A2C8DB34200126CF3 /* PBXTargetDependency */,
D0F7595E2C8DB24400126CF3 /* PBXTargetDependency */,
D0F759602C8DB24400126CF3 /* PBXTargetDependency */,
);
name = Core;
packageProductDependencies = (
D078F7E02C8DA375008A8CEC /* GRPC */,
D078F7E22C8DA375008A8CEC /* SwiftProtobuf */,
D044EE902C8DAB2000778185 /* NIO */,
D044EE922C8DAB2000778185 /* NIOConcurrencyHelpers */,
D044EE952C8DAB2800778185 /* NIOTransportServices */,
D0F7597D2C8DB30500126CF3 /* CGRPCZlib */,
);
productName = Core;
productReference = D0D4E5312C8D996F007F820A /* BurrowCore.framework */;
productType = "com.apple.product-type.framework";
};
D0D4E5502C8D9BF2007F820A /* UI */ = {
isa = PBXNativeTarget;
buildConfigurationList = D0D4E5552C8D9BF2007F820A /* Build configuration list for PBXNativeTarget "UI" */;
buildPhases = (
D0D4E5522C8D9BF2007F820A /* Sources */,
D0D4E5532C8D9BF2007F820A /* Frameworks */,
D0D4E5542C8D9BF2007F820A /* Resources */,
);
buildRules = (
);
dependencies = (
D0D4E56F2C8D9C5D007F820A /* PBXTargetDependency */,
);
name = UI;
packageProductDependencies = (
);
productName = Core;
productReference = D0D4E5582C8D9BF2007F820A /* BurrowUI.framework */;
productType = "com.apple.product-type.framework";
};
D0D4E55A2C8D9BF4007F820A /* Configuration */ = {
isa = PBXNativeTarget;
buildConfigurationList = D0D4E55F2C8D9BF4007F820A /* Build configuration list for PBXNativeTarget "Configuration" */;
buildPhases = (
D0F759912C8DB49E00126CF3 /* Configure Version */,
D0D4E55C2C8D9BF4007F820A /* Sources */,
);
buildRules = (
);
dependencies = (
);
name = Configuration;
packageProductDependencies = (
);
productName = Core;
productReference = D0D4E5622C8D9BF4007F820A /* BurrowConfiguration.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
/* Begin PBXProject section */ /* Begin PBXProject section */
@ -179,8 +495,8 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
BuildIndependentTargetsInParallel = 1; BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1430; LastSwiftUpdateCheck = 1600;
LastUpgradeCheck = 1430; LastUpgradeCheck = 1520;
TargetAttributes = { TargetAttributes = {
D020F65229E4A697002790F6 = { D020F65229E4A697002790F6 = {
CreatedOnToolsVersion = 14.3; CreatedOnToolsVersion = 14.3;
@ -188,6 +504,9 @@
D05B9F7129E39EEC008CB1F9 = { D05B9F7129E39EEC008CB1F9 = {
CreatedOnToolsVersion = 14.3; CreatedOnToolsVersion = 14.3;
}; };
D0D4E5302C8D996F007F820A = {
CreatedOnToolsVersion = 16.0;
};
}; };
}; };
buildConfigurationList = D05B9F6D29E39EEC008CB1F9 /* Build configuration list for PBXProject "Burrow" */; buildConfigurationList = D05B9F6D29E39EEC008CB1F9 /* Build configuration list for PBXProject "Burrow" */;
@ -199,34 +518,89 @@
Base, Base,
); );
mainGroup = D05B9F6929E39EEC008CB1F9; mainGroup = D05B9F6929E39EEC008CB1F9;
packageReferences = (
D0B1D10E2C436152004B7823 /* XCRemoteSwiftPackageReference "swift-async-algorithms" */,
D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */,
D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */,
D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */,
D044EE942C8DAB2800778185 /* XCRemoteSwiftPackageReference "swift-nio-transport-services" */,
);
productRefGroup = D05B9F7329E39EEC008CB1F9 /* Products */; productRefGroup = D05B9F7329E39EEC008CB1F9 /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
targets = ( targets = (
D05B9F7129E39EEC008CB1F9 /* Burrow */, D05B9F7129E39EEC008CB1F9 /* App */,
D020F65229E4A697002790F6 /* NetworkExtension */, D020F65229E4A697002790F6 /* NetworkExtension */,
D0D4E5502C8D9BF2007F820A /* UI */,
D0D4E5302C8D996F007F820A /* Core */,
D0D4E55A2C8D9BF4007F820A /* Configuration */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */ /* Begin PBXResourcesBuildPhase section */
D020F65129E4A697002790F6 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
D05B9F7029E39EEC008CB1F9 /* Resources */ = { D05B9F7029E39EEC008CB1F9 /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */, D09150422B9D2AF700BE3CB0 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D0D4E5542C8D9BF2007F820A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
D0BCC60B2A09A0C100AD070D /* Compile Rust */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Compile Rust";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PROJECT_DIR}/NetworkExtension/libburrow/build-rust.sh\"\n";
showEnvVarsInLog = 0;
};
D0F759912C8DB49E00126CF3 /* Configure Version */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(PROJECT_DIR)/../Tools/version.sh",
"$(PROJECT_DIR)/../.git",
);
name = "Configure Version";
outputFileListPaths = (
);
outputPaths = (
"$(PROJECT_DIR)/Configuration/Version.xcconfig",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"$PROJECT_DIR/../Tools/version.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
D020F64F29E4A697002790F6 /* Sources */ = { D020F64F29E4A697002790F6 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
@ -240,11 +614,51 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
D05B9F7829E39EEC008CB1F9 /* ContentView.swift in Sources */, D00AA8972A4669BC005C8102 /* AppDelegate.swift in Sources */,
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */, D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
D0D4E52D2C8D996F007F820A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D0F759612C8DB24B00126CF3 /* grpc-swift-config.json in Sources */,
D0F759622C8DB24B00126CF3 /* swift-protobuf-config.json in Sources */,
D0F7598D2C8DB3DA00126CF3 /* Client.swift in Sources */,
D0D4E56B2C8D9C2F007F820A /* Logging.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D0D4E5522C8D9BF2007F820A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D0D4E5712C8D9C6F007F820A /* HackClub.swift in Sources */,
D0D4E5722C8D9C6F007F820A /* Network.swift in Sources */,
D0D4E5732C8D9C6F007F820A /* WireGuard.swift in Sources */,
D0D4E5742C8D9C6F007F820A /* BurrowView.swift in Sources */,
D0D4E5752C8D9C6F007F820A /* FloatingButtonStyle.swift in Sources */,
D0D4E5762C8D9C6F007F820A /* MenuItemToggleView.swift in Sources */,
D0D4E5772C8D9C6F007F820A /* NetworkCarouselView.swift in Sources */,
D0D4E5782C8D9C6F007F820A /* NetworkExtension+Async.swift in Sources */,
D0D4E5792C8D9C6F007F820A /* NetworkExtensionTunnel.swift in Sources */,
D0D4E57A2C8D9C6F007F820A /* NetworkView.swift in Sources */,
D0D4E57B2C8D9C6F007F820A /* OAuth2.swift in Sources */,
D0D4E57C2C8D9C6F007F820A /* Tunnel.swift in Sources */,
D0D4E57D2C8D9C6F007F820A /* TunnelButton.swift in Sources */,
D0D4E57E2C8D9C6F007F820A /* TunnelStatusView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D0D4E55C2C8D9BF4007F820A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D0D4E5922C8D9D15007F820A /* Constants.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */ /* Begin PBXTargetDependency section */
@ -253,6 +667,48 @@
target = D020F65229E4A697002790F6 /* NetworkExtension */; target = D020F65229E4A697002790F6 /* NetworkExtension */;
targetProxy = D020F65B29E4A697002790F6 /* PBXContainerItemProxy */; targetProxy = D020F65B29E4A697002790F6 /* PBXContainerItemProxy */;
}; };
D0BF09512C8E66F1000D8DEC /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0D4E55A2C8D9BF4007F820A /* Configuration */;
targetProxy = D0BF09502C8E66F1000D8DEC /* PBXContainerItemProxy */;
};
D0BF09542C8E66FA000D8DEC /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0D4E55A2C8D9BF4007F820A /* Configuration */;
targetProxy = D0BF09532C8E66FA000D8DEC /* PBXContainerItemProxy */;
};
D0D4E56F2C8D9C5D007F820A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0D4E5302C8D996F007F820A /* Core */;
targetProxy = D0D4E56E2C8D9C5D007F820A /* PBXContainerItemProxy */;
};
D0D4E5802C8D9C78007F820A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0D4E5302C8D996F007F820A /* Core */;
targetProxy = D0D4E57F2C8D9C78007F820A /* PBXContainerItemProxy */;
};
D0D4E5882C8D9C88007F820A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0D4E5502C8D9BF2007F820A /* UI */;
targetProxy = D0D4E5872C8D9C88007F820A /* PBXContainerItemProxy */;
};
D0F4FAD22C8DC7960068730A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0D4E5302C8D996F007F820A /* Core */;
targetProxy = D0F4FAD12C8DC7960068730A /* PBXContainerItemProxy */;
};
D0F7595E2C8DB24400126CF3 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
productRef = D0F7595D2C8DB24400126CF3 /* GRPCSwiftPlugin */;
};
D0F759602C8DB24400126CF3 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
productRef = D0F7595F2C8DB24400126CF3 /* SwiftProtobufPlugin */;
};
D0F7598A2C8DB34200126CF3 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
productRef = D0F759892C8DB34200126CF3 /* GRPC */;
};
/* End PBXTargetDependency section */ /* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
@ -286,14 +742,56 @@
}; };
D05B9F8229E39EED008CB1F9 /* Debug */ = { D05B9F8229E39EED008CB1F9 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = D020F64929E4A34B002790F6 /* Burrow.xcconfig */; baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
buildSettings = { buildSettings = {
}; };
name = Debug; name = Debug;
}; };
D05B9F8329E39EED008CB1F9 /* Release */ = { D05B9F8329E39EED008CB1F9 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = D020F64929E4A34B002790F6 /* Burrow.xcconfig */; baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
buildSettings = {
};
name = Release;
};
D0D4E53D2C8D996F007F820A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D0D4E4F72C8D941D007F820A /* Framework.xcconfig */;
buildSettings = {
};
name = Debug;
};
D0D4E53E2C8D996F007F820A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D0D4E4F72C8D941D007F820A /* Framework.xcconfig */;
buildSettings = {
};
name = Release;
};
D0D4E5562C8D9BF2007F820A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D0BF09582C8E6789000D8DEC /* UI.xcconfig */;
buildSettings = {
};
name = Debug;
};
D0D4E5572C8D9BF2007F820A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D0BF09582C8E6789000D8DEC /* UI.xcconfig */;
buildSettings = {
};
name = Release;
};
D0D4E5602C8D9BF4007F820A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D00117422B30348D00D87C25 /* Configuration.xcconfig */;
buildSettings = {
};
name = Debug;
};
D0D4E5612C8D9BF4007F820A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D00117422B30348D00D87C25 /* Configuration.xcconfig */;
buildSettings = { buildSettings = {
}; };
name = Release; name = Release;
@ -319,7 +817,7 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
D05B9F8129E39EED008CB1F9 /* Build configuration list for PBXNativeTarget "Burrow" */ = { D05B9F8129E39EED008CB1F9 /* Build configuration list for PBXNativeTarget "App" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
D05B9F8229E39EED008CB1F9 /* Debug */, D05B9F8229E39EED008CB1F9 /* Debug */,
@ -328,7 +826,130 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
D0D4E53C2C8D996F007F820A /* Build configuration list for PBXNativeTarget "Core" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D0D4E53D2C8D996F007F820A /* Debug */,
D0D4E53E2C8D996F007F820A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
D0D4E5552C8D9BF2007F820A /* Build configuration list for PBXNativeTarget "UI" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D0D4E5562C8D9BF2007F820A /* Debug */,
D0D4E5572C8D9BF2007F820A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
D0D4E55F2C8D9BF4007F820A /* Build configuration list for PBXNativeTarget "Configuration" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D0D4E5602C8D9BF4007F820A /* Debug */,
D0D4E5612C8D9BF4007F820A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */ /* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/apple/swift-nio.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.72.0;
};
};
D044EE942C8DAB2800778185 /* XCRemoteSwiftPackageReference "swift-nio-transport-services" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/apple/swift-nio-transport-services.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.21.0;
};
};
D0B1D10E2C436152004B7823 /* XCRemoteSwiftPackageReference "swift-async-algorithms" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/apple/swift-async-algorithms.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.0.1;
};
};
D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/grpc/grpc-swift.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.23.0;
};
};
D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/apple/swift-protobuf.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.28.1;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
D044EE902C8DAB2000778185 /* NIO */ = {
isa = XCSwiftPackageProductDependency;
package = D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */;
productName = NIO;
};
D044EE922C8DAB2000778185 /* NIOConcurrencyHelpers */ = {
isa = XCSwiftPackageProductDependency;
package = D044EE8F2C8DAB2000778185 /* XCRemoteSwiftPackageReference "swift-nio" */;
productName = NIOConcurrencyHelpers;
};
D044EE952C8DAB2800778185 /* NIOTransportServices */ = {
isa = XCSwiftPackageProductDependency;
package = D044EE942C8DAB2800778185 /* XCRemoteSwiftPackageReference "swift-nio-transport-services" */;
productName = NIOTransportServices;
};
D078F7E02C8DA375008A8CEC /* GRPC */ = {
isa = XCSwiftPackageProductDependency;
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
productName = GRPC;
};
D078F7E22C8DA375008A8CEC /* SwiftProtobuf */ = {
isa = XCSwiftPackageProductDependency;
package = D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */;
productName = SwiftProtobuf;
};
D0B1D10F2C436152004B7823 /* AsyncAlgorithms */ = {
isa = XCSwiftPackageProductDependency;
package = D0B1D10E2C436152004B7823 /* XCRemoteSwiftPackageReference "swift-async-algorithms" */;
productName = AsyncAlgorithms;
};
D0F7595D2C8DB24400126CF3 /* GRPCSwiftPlugin */ = {
isa = XCSwiftPackageProductDependency;
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
productName = "plugin:GRPCSwiftPlugin";
};
D0F7595F2C8DB24400126CF3 /* SwiftProtobufPlugin */ = {
isa = XCSwiftPackageProductDependency;
package = D0D4E4852C8D8F29007F820A /* XCRemoteSwiftPackageReference "swift-protobuf" */;
productName = "plugin:SwiftProtobufPlugin";
};
D0F7597D2C8DB30500126CF3 /* CGRPCZlib */ = {
isa = XCSwiftPackageProductDependency;
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
productName = CGRPCZlib;
};
D0F759892C8DB34200126CF3 /* GRPC */ = {
isa = XCSwiftPackageProductDependency;
package = D0D4E4822C8D8EF6007F820A /* XCRemoteSwiftPackageReference "grpc-swift" */;
productName = GRPC;
};
/* End XCSwiftPackageProductDependency section */
}; };
rootObject = D05B9F6A29E39EEC008CB1F9 /* Project object */; rootObject = D05B9F6A29E39EEC008CB1F9 /* Project object */;
} }

View file

@ -0,0 +1,8 @@
<?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>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,123 @@
{
"originHash" : "fa512b990383b7e309c5854a5279817052294a8191a6d3c55c49cfb38e88c0c3",
"pins" : [
{
"identity" : "grpc-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/grpc/grpc-swift.git",
"state" : {
"revision" : "6a90b7e77e29f9bda6c2b3a4165a40d6c02cfda1",
"version" : "1.23.0"
}
},
{
"identity" : "swift-async-algorithms",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-async-algorithms.git",
"state" : {
"revision" : "6ae9a051f76b81cc668305ceed5b0e0a7fd93d20",
"version" : "1.0.1"
}
},
{
"identity" : "swift-atomics",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-atomics.git",
"state" : {
"revision" : "cd142fd2f64be2100422d658e7411e39489da985",
"version" : "1.2.0"
}
},
{
"identity" : "swift-collections",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-collections.git",
"state" : {
"revision" : "9bf03ff58ce34478e66aaee630e491823326fd06",
"version" : "1.1.3"
}
},
{
"identity" : "swift-http-types",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-http-types",
"state" : {
"revision" : "ae67c8178eb46944fd85e4dc6dd970e1f3ed6ccd",
"version" : "1.3.0"
}
},
{
"identity" : "swift-log",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-log.git",
"state" : {
"revision" : "9cb486020ebf03bfa5b5df985387a14a98744537",
"version" : "1.6.1"
}
},
{
"identity" : "swift-nio",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio.git",
"state" : {
"revision" : "9746cf80e29edfef2a39924a66731249223f42a3",
"version" : "2.72.0"
}
},
{
"identity" : "swift-nio-extras",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-extras.git",
"state" : {
"revision" : "d1ead62745cc3269e482f1c51f27608057174379",
"version" : "1.24.0"
}
},
{
"identity" : "swift-nio-http2",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-http2.git",
"state" : {
"revision" : "b5f7062b60e4add1e8c343ba4eb8da2e324b3a94",
"version" : "1.34.0"
}
},
{
"identity" : "swift-nio-ssl",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-ssl.git",
"state" : {
"revision" : "7b84abbdcef69cc3be6573ac12440220789dcd69",
"version" : "2.27.2"
}
},
{
"identity" : "swift-nio-transport-services",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-transport-services.git",
"state" : {
"revision" : "38ac8221dd20674682148d6451367f89c2652980",
"version" : "1.21.0"
}
},
{
"identity" : "swift-protobuf",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-protobuf.git",
"state" : {
"revision" : "edb6ed4919f7756157fe02f2552b7e3850a538e5",
"version" : "1.28.1"
}
},
{
"identity" : "swift-system",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-system.git",
"state" : {
"revision" : "d2ba781702a1d8285419c15ee62fd734a9437ff5",
"version" : "1.3.2"
}
}
],
"version" : 3
}

View file

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D05B9F7129E39EEC008CB1F9"
BuildableName = "Burrow.app"
BlueprintName = "App"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</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">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D05B9F7129E39EEC008CB1F9"
BuildableName = "Burrow.app"
BlueprintName = "App"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D05B9F7129E39EEC008CB1F9"
BuildableName = "Burrow.app"
BlueprintName = "App"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
wasCreatedForAppExtension = "YES"
version = "2.0">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D020F65229E4A697002790F6"
BuildableName = "BurrowNetworkExtension.appex"
BlueprintName = "NetworkExtension"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D05B9F7129E39EEC008CB1F9"
BuildableName = "Burrow.app"
BlueprintName = "App"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
askForAppToLaunch = "Yes"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D05B9F7129E39EEC008CB1F9"
BuildableName = "Burrow.app"
BlueprintName = "App"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
askForAppToLaunch = "Yes"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D05B9F7129E39EEC008CB1F9"
BuildableName = "Burrow.app"
BlueprintName = "App"
ReferencedContainer = "container:Burrow.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -1,10 +1,8 @@
LD_EXPORT_SYMBOLS = NO
SKIP_INSTALL = NO SKIP_INSTALL = NO
LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor
ENABLE_PREVIEWS = YES

View file

@ -1,61 +1,44 @@
#include "Identity.xcconfig" #include "Identity.xcconfig"
#include "Debug.xcconfig"
#include "Version.xcconfig"
SDKROOT = auto SDKROOT = auto
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES
SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx
IPHONEOS_DEPLOYMENT_TARGET = 15.0 SWIFT_VERSION = 6.0
MACOSX_DEPLOYMENT_TARGET = 12.0 IPHONEOS_DEPLOYMENT_TARGET = 17.0
MACOSX_DEPLOYMENT_TARGET = 14.0
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO
SUPPORTS_MACCATALYST = NO SUPPORTS_MACCATALYST = NO
ALWAYS_SEARCH_USER_PATHS = NO
PRODUCT_NAME = $(TARGET_NAME:c99extidentifier) PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME) PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME)
CURRENT_PROJECT_VERSION = 1
MARKETING_VERSION = 0.1 MARKETING_VERSION = 0.1
SKIP_INSTALL = YES SKIP_INSTALL = YES
CODE_SIGN_IDENTITY = Apple Development CODE_SIGN_IDENTITY = Apple Development
INFOPLIST_FILE = Configuration/Info.plist
GENERATE_INFOPLIST_FILE = YES GENERATE_INFOPLIST_FILE = YES
INFOPLIST_KEY_NSHumanReadableCopyright = Copyright © 2023 Hack Club INFOPLIST_FILE = Configuration/Info.plist
INFOPLIST_KEY_NSHumanReadableCopyright = Copyright © 2023-2024 Hack Club
INFOPLIST_KEY_CFBundleDisplayName = Burrow INFOPLIST_KEY_CFBundleDisplayName = Burrow
ENABLE_BITCODE = NO
ENABLE_APP_SANDBOX[sdk=macosx*] = YES ENABLE_APP_SANDBOX[sdk=macosx*] = YES
ENABLE_HARDENED_RUNTIME[sdk=macosx*] = YES
COMBINE_HIDPI_IMAGES = YES
COPY_PHASE_STRIP = NO
ENABLE_BITCODE = NO
ALWAYS_SEARCH_USER_PATHS = NO
COMBINE_HIDPI_IMAGES = YES
EAGER_LINKING = YES
FUSE_BUILD_SCRIPT_PHASES = YES FUSE_BUILD_SCRIPT_PHASES = YES
SWIFT_EMIT_LOC_STRINGS = YES
LOCALIZATION_PREFERS_STRING_CATALOGS = YES
ENABLE_DEBUG_DYLIB = NO
APP_GROUP_IDENTIFIER = group.$(APP_BUNDLE_IDENTIFIER) APP_GROUP_IDENTIFIER = group.$(APP_BUNDLE_IDENTIFIER)
APP_GROUP_IDENTIFIER[sdk=macosx*] = $(DEVELOPMENT_TEAM).$(APP_BUNDLE_IDENTIFIER) APP_GROUP_IDENTIFIER[sdk=macosx*] = $(DEVELOPMENT_TEAM).$(APP_BUNDLE_IDENTIFIER)
NETWORK_EXTENSION_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).network
// Swift // https://github.com/grpc/grpc-swift/issues/683#issuecomment-1130118953
SWIFT_VERSION = 5.0 OTHER_SWIFT_FLAGS = $(inherited) -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/CNIOAtomics.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/CNIODarwin.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/CGRPCZlib.modulemap
SWIFT_EMIT_LOC_STRINGS = YES
// Release
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
SWIFT_REFLECTION_METADATA_LEVEL = none
SWIFT_COMPILATION_MODE = wholemodule
SWIFT_OPTIMIZATION_LEVEL = -Osize
LLVM_LTO = YES
DEAD_CODE_STRIPPING = YES
VALIDATE_PRODUCT = YES
// Debug
ONLY_ACTIVE_ARCH[config=Debug] = YES
DEBUG_INFORMATION_FORMAT[config=Debug] = dwarf
ENABLE_TESTABILITY[config=Debug] = YES
SWIFT_OPTIMIZATION_LEVEL[config=Debug] = -Onone
SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug] = DEBUG
SWIFT_COMPILATION_MODE[config=Debug] = singlefile
LLVM_LTO[config=Debug] = NO
DEAD_CODE_STRIPPING[config=Debug] = NO
VALIDATE_PRODUCT[config=Debug] = NO

View file

@ -0,0 +1,4 @@
#include "Framework.xcconfig"
SWIFT_INCLUDE_PATHS = $(PROJECT_DIR)/Configuration/Constants
GCC_PREPROCESSOR_DEFINITIONS = APP_BUNDLE_IDENTIFIER=$(APP_BUNDLE_IDENTIFIER) APP_GROUP_IDENTIFIER=$(APP_GROUP_IDENTIFIER) NETWORK_EXTENSION_BUNDLE_IDENTIFIER=$(NETWORK_EXTENSION_BUNDLE_IDENTIFIER)

View file

@ -0,0 +1,12 @@
#import <Foundation/Foundation.h>
#define MACRO_STRING_(m) #m
#define MACRO_STRING(m) @MACRO_STRING_(m)
NS_ASSUME_NONNULL_BEGIN
static NSString * const AppBundleIdentifier = MACRO_STRING(APP_BUNDLE_IDENTIFIER);
static NSString * const AppGroupIdentifier = MACRO_STRING(APP_GROUP_IDENTIFIER);
static NSString * const NetworkExtensionBundleIdentifier = MACRO_STRING(NETWORK_EXTENSION_BUNDLE_IDENTIFIER);
NS_ASSUME_NONNULL_END

View file

@ -0,0 +1,38 @@
@_implementationOnly import CConstants
import OSLog
public enum Constants {
enum Error: Swift.Error {
case invalidAppGroupIdentifier
}
public static let bundleIdentifier = AppBundleIdentifier
public static let appGroupIdentifier = AppGroupIdentifier
public static let networkExtensionBundleIdentifier = NetworkExtensionBundleIdentifier
public static var socketURL: URL {
get throws {
try groupContainerURL.appending(component: "burrow.sock", directoryHint: .notDirectory)
}
}
public static var databaseURL: URL {
get throws {
try groupContainerURL.appending(component: "burrow.db", directoryHint: .notDirectory)
}
}
private static var groupContainerURL: URL {
get throws { try _groupContainerURL.get() }
}
private static let _groupContainerURL: Result<URL, Error> = {
switch FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) {
case .some(let url): .success(url)
case .none: .failure(.invalidAppGroupIdentifier)
}
}()
}
extension Logger {
@_dynamicReplacement(for: subsystem)
public static var subsystem: String { Constants.bundleIdentifier }
}

View file

@ -0,0 +1,4 @@
module CConstants {
header "Constants.h"
export *
}

View file

@ -0,0 +1,26 @@
// Release
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
SWIFT_COMPILATION_MODE = wholemodule
SWIFT_OPTIMIZATION_LEVEL = -Osize
LLVM_LTO = YES
DEAD_CODE_STRIPPING = YES
STRIP_INSTALLED_PRODUCT = YES
STRIP_SWIFT_SYMBOLS = YES
COPY_PHASE_STRIP = NO
VALIDATE_PRODUCT = YES
ENABLE_MODULE_VERIFIER = YES
// Debug
ONLY_ACTIVE_ARCH[config=Debug] = YES
DEBUG_INFORMATION_FORMAT[config=Debug] = dwarf
ENABLE_TESTABILITY[config=Debug] = YES
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG=1 $(inherited)
SWIFT_OPTIMIZATION_LEVEL[config=Debug] = -Onone
SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug] = DEBUG
SWIFT_COMPILATION_MODE[config=Debug] = singlefile
LLVM_LTO[config=Debug] = NO
DEAD_CODE_STRIPPING[config=Debug] = NO
VALIDATE_PRODUCT[config=Debug] = NO
STRIP_INSTALLED_PRODUCT[config=Debug] = NO
STRIP_SWIFT_SYMBOLS[config=Debug] = NO
ENABLE_MODULE_VERIFIER[config=Debug] = NO

View file

@ -1,2 +1,6 @@
LD_EXPORT_SYMBOLS = NO
OTHER_SWIFT_FLAGS = $(inherited) -Xfrontend -disable-autolink-framework -Xfrontend UIKit -Xfrontend -disable-autolink-framework -Xfrontend AppKit -Xfrontend -disable-autolink-framework -Xfrontend SwiftUI
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @executable_path/../../Frameworks LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @executable_path/../../Frameworks
LD_RUNPATH_SEARCH_PATHS[sdk=macos*] = $(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks

View file

@ -0,0 +1,14 @@
PRODUCT_NAME = Burrow$(TARGET_NAME:c99extidentifier)
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).$(TARGET_NAME:c99extidentifier)
APPLICATION_EXTENSION_API_ONLY = YES
SWIFT_INSTALL_OBJC_HEADER = NO
SWIFT_SKIP_AUTOLINKING_FRAMEWORKS = YES
SWIFT_SKIP_AUTOLINKING_LIBRARIES = YES
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks
LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/Frameworks
DYLIB_INSTALL_NAME_BASE = @rpath
DYLIB_COMPATIBILITY_VERSION = 1
DYLIB_CURRENT_VERSION = 1
VERSIONING_SYSTEM =

View file

@ -1,2 +1,2 @@
DEVELOPMENT_TEAM = 87PW93R2ZR DEVELOPMENT_TEAM = P6PV2R9443
APP_BUNDLE_IDENTIFIER = com.hackclub.burrow APP_BUNDLE_IDENTIFIER = com.hackclub.burrow

View file

32
Apple/Core/Client.swift Normal file
View file

@ -0,0 +1,32 @@
import GRPC
import NIOTransportServices
public typealias TunnelClient = Burrow_TunnelAsyncClient
public typealias NetworksClient = Burrow_NetworksAsyncClient
public protocol Client {
init(channel: GRPCChannel)
}
extension Client {
public static func unix(socketURL: URL) -> Self {
let group = NIOTSEventLoopGroup()
let configuration = ClientConnection.Configuration.default(
target: .unixDomainSocket(socketURL.path),
eventLoopGroup: group
)
return Self(channel: ClientConnection(configuration: configuration))
}
}
extension TunnelClient: Client {
public init(channel: any GRPCChannel) {
self.init(channel: channel, defaultCallOptions: .init(), interceptors: .none)
}
}
extension NetworksClient: Client {
public init(channel: any GRPCChannel) {
self.init(channel: channel, defaultCallOptions: .init(), interceptors: .none)
}
}

View file

@ -0,0 +1 @@
../../../proto/burrow.proto

View file

@ -0,0 +1,11 @@
{
"invocations": [
{
"protoFiles": [
"burrow.proto",
],
"server": false,
"visibility": "public"
}
]
}

View file

@ -0,0 +1,10 @@
{
"invocations": [
{
"protoFiles": [
"burrow.proto",
],
"visibility": "public"
}
]
}

19
Apple/Core/Logging.swift Normal file
View file

@ -0,0 +1,19 @@
import os
@_exported import OSLog
extension Logger {
private static let loggers: OSAllocatedUnfairLock<[String: Logger]> = OSAllocatedUnfairLock(initialState: [:])
public dynamic static var subsystem: String { "com.hackclub.burrow" }
public static func logger(for type: Any.Type) -> Logger {
let category = String(describing: type)
let logger = loggers.withLock { loggers in
if let logger = loggers[category] { return logger }
let logger = Logger(subsystem: subsystem, category: category)
loggers[category] = logger
return logger
}
return logger
}
}

View file

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleName</key>
<string>$(INFOPLIST_KEY_CFBundleDisplayName)</string>
<key>NSExtension</key> <key>NSExtension</key>
<dict> <dict>
<key>NSExtensionPointIdentifier</key> <key>NSExtensionPointIdentifier</key>

View file

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>$(APP_GROUP_IDENTIFIER)</string> <string>$(APP_GROUP_IDENTIFIER)</string>

View file

@ -2,9 +2,19 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key> <key>com.apple.security.application-groups</key>
<array> <array>
<string>$(APP_GROUP_IDENTIFIER)</string> <string>$(APP_GROUP_IDENTIFIER)</string>
</array> </array>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
</dict> </dict>
</plist> </plist>

View file

@ -1,8 +1,11 @@
#include "../Configuration/Extension.xcconfig" #include "../Configuration/Extension.xcconfig"
PRODUCT_NAME = BurrowNetworkExtension PRODUCT_NAME = BurrowNetworkExtension
PRODUCT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).network PRODUCT_BUNDLE_IDENTIFIER = $(NETWORK_EXTENSION_BUNDLE_IDENTIFIER)
INFOPLIST_FILE = NetworkExtension/Info.plist INFOPLIST_FILE = NetworkExtension/Info.plist
CODE_SIGN_ENTITLEMENTS = NetworkExtension/NetworkExtension-iOS.entitlements CODE_SIGN_ENTITLEMENTS = NetworkExtension/NetworkExtension-iOS.entitlements
CODE_SIGN_ENTITLEMENTS[sdk=macos*] = NetworkExtension/NetworkExtension-macOS.entitlements CODE_SIGN_ENTITLEMENTS[sdk=macosx*] = NetworkExtension/NetworkExtension-macOS.entitlements
SWIFT_INCLUDE_PATHS = $(inherited) $(PROJECT_DIR)/NetworkExtension

View file

@ -1,29 +1,74 @@
import AsyncAlgorithms
import BurrowConfiguration
import BurrowCore
import libburrow
import NetworkExtension import NetworkExtension
import os
class PacketTunnelProvider: NEPacketTunnelProvider { class PacketTunnelProvider: NEPacketTunnelProvider {
enum Error: Swift.Error {
override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) { case missingTunnelConfiguration
// Add code here to start the process of connecting the tunnel.
} }
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { private let logger = Logger.logger(for: PacketTunnelProvider.self)
// Add code here to start the process of stopping the tunnel.
completionHandler() private var client: TunnelClient {
get throws { try _client.get() }
}
private let _client: Result<TunnelClient, Swift.Error> = Result {
try TunnelClient.unix(socketURL: Constants.socketURL)
} }
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) { override init() {
// Add code here to handle the message. do {
if let handler = completionHandler { libburrow.spawnInProcess(
handler(messageData) socketPath: try Constants.socketURL.path(percentEncoded: false),
databasePath: try Constants.databaseURL.path(percentEncoded: false)
)
} catch {
logger.error("Failed to spawn networking thread: \(error)")
} }
} }
override func sleep(completionHandler: @escaping () -> Void) { override func startTunnel(options: [String: NSObject]? = nil) async throws {
// Add code here to get ready to sleep. do {
completionHandler() let configuration = try await Array(client.tunnelConfiguration(.init()).prefix(1)).first
guard let settings = configuration?.settings else {
throw Error.missingTunnelConfiguration
}
try await setTunnelNetworkSettings(settings)
_ = try await client.tunnelStart(.init())
logger.log("Started tunnel with network settings: \(settings)")
} catch {
logger.error("Failed to start tunnel: \(error)")
throw error
}
} }
override func wake() { override func stopTunnel(with reason: NEProviderStopReason) async {
// Add code here to wake up. do {
_ = try await client.tunnelStop(.init())
logger.log("Stopped client")
} catch {
logger.error("Failed to stop tunnel: \(error)")
}
}
}
extension Burrow_TunnelConfigurationResponse {
fileprivate var settings: NEPacketTunnelNetworkSettings {
let ipv6Addresses = addresses.filter { IPv6Address($0) != nil }
let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "1.1.1.1")
settings.mtu = NSNumber(value: mtu)
settings.ipv4Settings = NEIPv4Settings(
addresses: addresses.filter { IPv4Address($0) != nil },
subnetMasks: ["255.255.255.0"]
)
settings.ipv6Settings = NEIPv6Settings(
addresses: ipv6Addresses,
networkPrefixLengths: ipv6Addresses.map { _ in 64 }
)
return settings
} }
} }

View file

@ -0,0 +1,83 @@
#!/bin/bash
# This is a build script. It is run by Xcode as a build step.
# The type of build is described in various environment variables set by Xcode.
export PATH="${PATH}:${HOME}/.cargo/bin:/opt/homebrew/bin:/usr/local/bin:/etc/profiles/per-user/${USER}/bin"
if ! [[ -x "$(command -v cargo)" ]]; then
echo 'error: Unable to find cargo'
exit 127
fi
set -e
# Change directories relative to the location of this script
cd -- "$(dirname -- "${BASH_SOURCE[0]}")"/../../../burrow
RUST_TARGETS=()
# Match the PLATFORM_NAME (iphoneos) and ARCHS (arm64) to a set of RUST_TARGETS (aarch64-apple-ios)
IFS=' ' read -a BURROW_ARCHS <<< "${ARCHS[@]}"
for ARCH in "${BURROW_ARCHS[@]}"; do
case $PLATFORM_NAME in
iphonesimulator)
case $ARCH in
arm64) RUST_TARGETS+=("aarch64-apple-ios-sim") ;;
x86_64) RUST_TARGETS+=("x86_64-apple-ios") ;;
*) echo "error: Unknown $PLATFORM_NAME arch, $ARCH"; exit 1 ;;
esac
;;
iphoneos)
case $ARCH in
arm64) RUST_TARGETS+=("aarch64-apple-ios") ;;
*) echo "error: Unknown $PLATFORM_NAME arch, $ARCH"; exit 1 ;;
esac
;;
macos*)
case $ARCH in
arm64) RUST_TARGETS+=("aarch64-apple-darwin") ;;
x86_64) RUST_TARGETS+=("x86_64-apple-darwin") ;;
*) echo "error: Unknown $PLATFORM_NAME arch, $ARCH"; exit 1 ;;
esac
;;
*) echo "error: Unsupported platform $PLATFORM_NAME"; exit 1 ;;
esac
done
# Pass all RUST_TARGETS in a single invocation
CARGO_ARGS=()
for TARGET in "${RUST_TARGETS[@]}"; do
CARGO_ARGS+=("--target")
CARGO_ARGS+=("$TARGET")
done
CARGO_ARGS+=("--lib")
# Pass the configuration (Debug or Release) through to cargo
if [[ $SWIFT_ACTIVE_COMPILATION_CONDITIONS == *DEBUG* ]]; then
CARGO_TARGET_SUBDIR="debug"
else
CARGO_ARGS+=("--release")
CARGO_TARGET_SUBDIR="release"
fi
if [[ -x "$(command -v rustup)" ]]; then
CARGO_PATH="$(dirname $(rustup which cargo)):/usr/bin"
else
CARGO_PATH="$(dirname $(readlink -f $(which cargo))):/usr/bin"
fi
PROTOC=$(readlink -f $(which protoc))
CARGO_PATH="$(dirname $PROTOC):$CARGO_PATH"
# Run cargo without the various environment variables set by Xcode.
# Those variables can confuse cargo and the build scripts it runs.
env -i PATH="$CARGO_PATH" PROTOC="$PROTOC" CARGO_TARGET_DIR="${CONFIGURATION_TEMP_DIR}/target" IPHONEOS_DEPLOYMENT_TARGET="$IPHONEOS_DEPLOYMENT_TARGET" MACOSX_DEPLOYMENT_TARGET="$MACOSX_DEPLOYMENT_TARGET" cargo build "${CARGO_ARGS[@]}"
mkdir -p "${BUILT_PRODUCTS_DIR}"
# Use `lipo` to merge the architectures together into BUILT_PRODUCTS_DIR
/usr/bin/xcrun --sdk $PLATFORM_NAME lipo \
-create $(printf "${CONFIGURATION_TEMP_DIR}/target/%q/${CARGO_TARGET_SUBDIR}/libburrow.a " "${RUST_TARGETS[@]}") \
-output "${BUILT_PRODUCTS_DIR}/libburrow.a"

View file

@ -0,0 +1,2 @@
__attribute__((__swift_name__("spawnInProcess(socketPath:databasePath:)")))
extern void spawn_in_process(const char * __nullable socket_path, const char * __nullable db_path);

View file

@ -0,0 +1,4 @@
module libburrow {
header "libburrow.h"
export *
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,344 @@
{
"images" : [
{
"filename" : "40.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "60.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "29.png",
"idiom" : "iphone",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "87.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"filename" : "80.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "120.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"filename" : "57.png",
"idiom" : "iphone",
"scale" : "1x",
"size" : "57x57"
},
{
"filename" : "114.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "57x57"
},
{
"filename" : "120.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "180.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"filename" : "20.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"filename" : "40.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "29.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "40.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"filename" : "80.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "50.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "50x50"
},
{
"filename" : "100.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "50x50"
},
{
"filename" : "72.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "72x72"
},
{
"filename" : "144.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "72x72"
},
{
"filename" : "76.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"filename" : "152.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "167.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"filename" : "1024.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
},
{
"filename" : "16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "32.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "32.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "64.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "256.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "256.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "512.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "512.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "1024.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
},
{
"filename" : "48.png",
"idiom" : "watch",
"role" : "notificationCenter",
"scale" : "2x",
"size" : "24x24",
"subtype" : "38mm"
},
{
"filename" : "55.png",
"idiom" : "watch",
"role" : "notificationCenter",
"scale" : "2x",
"size" : "27.5x27.5",
"subtype" : "42mm"
},
{
"filename" : "58.png",
"idiom" : "watch",
"role" : "companionSettings",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "87.png",
"idiom" : "watch",
"role" : "companionSettings",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "watch",
"role" : "notificationCenter",
"scale" : "2x",
"size" : "33x33",
"subtype" : "45mm"
},
{
"filename" : "80.png",
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "40x40",
"subtype" : "38mm"
},
{
"filename" : "88.png",
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "44x44",
"subtype" : "40mm"
},
{
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "46x46",
"subtype" : "41mm"
},
{
"filename" : "100.png",
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "50x50",
"subtype" : "44mm"
},
{
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "51x51",
"subtype" : "45mm"
},
{
"idiom" : "watch",
"role" : "appLauncher",
"scale" : "2x",
"size" : "54x54",
"subtype" : "49mm"
},
{
"filename" : "172.png",
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "86x86",
"subtype" : "38mm"
},
{
"filename" : "196.png",
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "98x98",
"subtype" : "42mm"
},
{
"filename" : "216.png",
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "108x108",
"subtype" : "44mm"
},
{
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "117x117",
"subtype" : "45mm"
},
{
"idiom" : "watch",
"role" : "quickLook",
"scale" : "2x",
"size" : "129x129",
"subtype" : "49mm"
},
{
"filename" : "1024.png",
"idiom" : "watch-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Some files were not shown because too many files have changed in this diff Show more