From 88ae4bdd776c5e28ddac11899b33ba31cb13f0d4 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Fri, 10 Apr 2020 15:31:15 -0400 Subject: [PATCH] gut ui-* --- ui-ios/CMakeLists.txt | 60 -- ui-ios/ios-toolchain.cmake | 4 - ui-ios/lokinet/AppDelegate.swift | 92 --- .../AppIcon.appiconset/Contents.json | 98 --- ui-ios/lokinet/Assets.xcassets/Contents.json | 6 - .../Base.lproj/LaunchScreen.storyboard | 25 - ui-ios/lokinet/Base.lproj/Main.storyboard | 24 - ui-ios/lokinet/CMakeLists.txt | 1 - ui-ios/lokinet/Info.plist | 45 -- ui-ios/lokinet/ViewController.swift | 19 - ui-ios/lokinet/lokinet.entitlements | 15 - .../lokinet.xcdatamodeld/.xccurrentversion | 8 - .../lokinet.xcdatamodel/contents | 4 - ui-macos/WindowsManager.swift | 29 - ui-macos/lokinet.xcodeproj/project.pbxproj | 641 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/xcschemes/lokinet.xcscheme | 112 --- ui-macos/lokinet/AppDelegate.swift | 155 ----- .../AppIcon.appiconset/Contents.json | 58 -- .../lokinet/Assets.xcassets/Contents.json | 6 - ui-macos/lokinet/Base.lproj/Main.storyboard | 238 ------- ui-macos/lokinet/DNSManager.swift | 79 --- ui-macos/lokinet/Info.plist | 34 - ui-macos/lokinet/LokinetLog.swift | 37 - ui-macos/lokinet/LokinetRunner.swift | 60 -- ui-macos/lokinet/StreamReader.swift | 73 -- ui-macos/lokinet/lokinet.entitlements | 8 - ui-macos/lokinetTests/Info.plist | 22 - ui-macos/lokinetTests/lokinetTests.swift | 33 - ui-macos/lokinetUITests/Info.plist | 22 - ui-macos/lokinetUITests/lokinetUITests.swift | 33 - ui-win32/.gitignore | 338 --------- ui-win32/AboutBox.Designer.cs | 186 ----- ui-win32/AboutBox.cs | 118 ---- ui-win32/AboutBox.resx | 454 ------------- ui-win32/App.config | 20 - ui-win32/LogDumper.cs | 62 -- ui-win32/Program.cs | 41 -- ui-win32/Properties/AssemblyInfo.cs | 46 -- ui-win32/Properties/Resources.Designer.cs | 63 -- ui-win32/Properties/Resources.resx | 117 ---- ui-win32/Properties/Settings.Designer.cs | 38 -- ui-win32/Properties/Settings.settings | 9 - ui-win32/Settings.cs | 28 - ui-win32/UIMain.Designer.cs | 253 ------- ui-win32/UIMain.cs | 178 ----- ui-win32/UIMain.resx | 279 -------- ui-win32/UserSettings.Designer.cs | 137 ---- ui-win32/UserSettings.cs | 111 --- ui-win32/UserSettings.resx | 120 ---- ui-win32/VisualSettings.Designer.cs | 96 --- ui-win32/VisualSettings.cs | 28 - ui-win32/VisualSettings.resx | 120 ---- ui-win32/dlgBootstrap.Designer.cs | 101 --- ui-win32/dlgBootstrap.cs | 98 --- ui-win32/dlgBootstrap.resx | 279 -------- ui-win32/loki-sidebar.png | Bin 19733 -> 0 bytes ui-win32/lokinet.ico | Bin 4286 -> 0 bytes ui-win32/lokivpn.csproj | 131 ---- ui-win32/lokivpn.sln | 25 - ui-win32/versioning/NetRevisionTool.exe | Bin 66048 -> 0 bytes ui-win32/versioning/release.bat | 4 - ui-win32/versioning/unpatch.bat | 4 - 64 files changed, 5540 deletions(-) delete mode 100644 ui-ios/CMakeLists.txt delete mode 100644 ui-ios/ios-toolchain.cmake delete mode 100644 ui-ios/lokinet/AppDelegate.swift delete mode 100644 ui-ios/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ui-ios/lokinet/Assets.xcassets/Contents.json delete mode 100644 ui-ios/lokinet/Base.lproj/LaunchScreen.storyboard delete mode 100644 ui-ios/lokinet/Base.lproj/Main.storyboard delete mode 100644 ui-ios/lokinet/CMakeLists.txt delete mode 100644 ui-ios/lokinet/Info.plist delete mode 100644 ui-ios/lokinet/ViewController.swift delete mode 100644 ui-ios/lokinet/lokinet.entitlements delete mode 100644 ui-ios/lokinet/lokinet.xcdatamodeld/.xccurrentversion delete mode 100644 ui-ios/lokinet/lokinet.xcdatamodeld/lokinet.xcdatamodel/contents delete mode 100644 ui-macos/WindowsManager.swift delete mode 100644 ui-macos/lokinet.xcodeproj/project.pbxproj delete mode 100644 ui-macos/lokinet.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ui-macos/lokinet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ui-macos/lokinet.xcodeproj/xcshareddata/xcschemes/lokinet.xcscheme delete mode 100644 ui-macos/lokinet/AppDelegate.swift delete mode 100644 ui-macos/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ui-macos/lokinet/Assets.xcassets/Contents.json delete mode 100644 ui-macos/lokinet/Base.lproj/Main.storyboard delete mode 100644 ui-macos/lokinet/DNSManager.swift delete mode 100644 ui-macos/lokinet/Info.plist delete mode 100644 ui-macos/lokinet/LokinetLog.swift delete mode 100644 ui-macos/lokinet/LokinetRunner.swift delete mode 100644 ui-macos/lokinet/StreamReader.swift delete mode 100644 ui-macos/lokinet/lokinet.entitlements delete mode 100644 ui-macos/lokinetTests/Info.plist delete mode 100644 ui-macos/lokinetTests/lokinetTests.swift delete mode 100644 ui-macos/lokinetUITests/Info.plist delete mode 100644 ui-macos/lokinetUITests/lokinetUITests.swift delete mode 100644 ui-win32/.gitignore delete mode 100644 ui-win32/AboutBox.Designer.cs delete mode 100644 ui-win32/AboutBox.cs delete mode 100644 ui-win32/AboutBox.resx delete mode 100644 ui-win32/App.config delete mode 100644 ui-win32/LogDumper.cs delete mode 100644 ui-win32/Program.cs delete mode 100644 ui-win32/Properties/AssemblyInfo.cs delete mode 100644 ui-win32/Properties/Resources.Designer.cs delete mode 100644 ui-win32/Properties/Resources.resx delete mode 100644 ui-win32/Properties/Settings.Designer.cs delete mode 100644 ui-win32/Properties/Settings.settings delete mode 100644 ui-win32/Settings.cs delete mode 100644 ui-win32/UIMain.Designer.cs delete mode 100644 ui-win32/UIMain.cs delete mode 100644 ui-win32/UIMain.resx delete mode 100644 ui-win32/UserSettings.Designer.cs delete mode 100644 ui-win32/UserSettings.cs delete mode 100644 ui-win32/UserSettings.resx delete mode 100644 ui-win32/VisualSettings.Designer.cs delete mode 100644 ui-win32/VisualSettings.cs delete mode 100644 ui-win32/VisualSettings.resx delete mode 100644 ui-win32/dlgBootstrap.Designer.cs delete mode 100644 ui-win32/dlgBootstrap.cs delete mode 100644 ui-win32/dlgBootstrap.resx delete mode 100644 ui-win32/loki-sidebar.png delete mode 100644 ui-win32/lokinet.ico delete mode 100644 ui-win32/lokivpn.csproj delete mode 100644 ui-win32/lokivpn.sln delete mode 100644 ui-win32/versioning/NetRevisionTool.exe delete mode 100644 ui-win32/versioning/release.bat delete mode 100644 ui-win32/versioning/unpatch.bat diff --git a/ui-ios/CMakeLists.txt b/ui-ios/CMakeLists.txt deleted file mode 100644 index 3707fb4f7..000000000 --- a/ui-ios/CMakeLists.txt +++ /dev/null @@ -1,60 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -set(PROJECT_NAME lokinet) -project(${PROJECT_NAME} C CXX Swift) - -get_filename_component(LOKINET_ROOT .. ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}") - -include("${LOKINET_ROOT}/cmake/target_link_libraries_system.cmake") -include("${LOKINET_ROOT}/cmake/add_import_library.cmake") -include("${LOKINET_ROOT}/cmake/add_log_tag.cmake") -include("${LOKINET_ROOT}/cmake/libatomic.cmake") - -if (STATIC_LINK AND STATIC_LINK_RUNTIME) - message(FATAL "Cannot set both STATIC_LINK and STATIC_LINK_RUNTIME") -endif() - -set(CMAKE_Swift_LANGUAGE_VERSION 5.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -list(APPEND CMAKE_MODULE_PATH "${LOKINET_ROOT}/cmake") - -include(FetchContent) -FetchContent_Declare( - libuv - GIT_REPOSITORY https://github.com/libuv/libuv.git - GIT_TAG v1.32.0 -) -FetchContent_Populate(libuv) -add_subdirectory(${libuv_SOURCE_DIR} ${libuv_BINARY_DIR}) - -include("${LOKINET_ROOT}/cmake/basic_definitions.cmake") -set(LIBUV_IN_SOURCE ON) -set(LIBUV_LIBRARY uv_a) -include("${LOKINET_ROOT}/cmake/unix.cmake") -unset(LIBTUNTAP_SRC) - -find_package(Threads REQUIRED) - -set(ABSEIL_DIR "${LOKINET_ROOT}/vendor/abseil-cpp") - -macro(add_loki_dir name) - add_subdirectory("${LOKINET_ROOT}/${name}" "${name}") -endmacro() - -include_directories(SYSTEM ${ABSEIL_DIR}) -add_loki_dir(vendor/cxxopts) -add_loki_dir(vendor/nlohmann) -include_directories(SYSTEM "${LOKINET_ROOT}/vendor/cxxopts/include") -include_directories("${LOKINET_ROOT}/include") -include_directories("${libuv_SOURCE_DIR}/include") - -add_loki_dir(vendor/gtest) -add_subdirectory(${ABSEIL_DIR} "vendor/abseil-cpp") - -add_loki_dir(crypto) -add_loki_dir(llarp) -add_loki_dir(libabyss) - -add_subdirectory(lokinet) diff --git a/ui-ios/ios-toolchain.cmake b/ui-ios/ios-toolchain.cmake deleted file mode 100644 index 8d36fe7fc..000000000 --- a/ui-ios/ios-toolchain.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set(CMAKE_MACOSX_BUNDLE YES) -set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO) -set(CMAKE_OSX_SYSROOT iphoneos) -set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") diff --git a/ui-ios/lokinet/AppDelegate.swift b/ui-ios/lokinet/AppDelegate.swift deleted file mode 100644 index dbb3fcde6..000000000 --- a/ui-ios/lokinet/AppDelegate.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// AppDelegate.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import UIKit -import CoreData - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - // Saves changes in the application's managed object context before the application terminates. - self.saveContext() - } - - // MARK: - Core Data stack - - lazy var persistentContainer: NSPersistentContainer = { - /* - The persistent container for the application. This implementation - creates and returns a container, having loaded the store for the - application to it. This property is optional since there are legitimate - error conditions that could cause the creation of the store to fail. - */ - let container = NSPersistentContainer(name: "lokinet") - container.loadPersistentStores(completionHandler: { (storeDescription, error) in - if let error = error as NSError? { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - - /* - Typical reasons for an error here include: - * The parent directory does not exist, cannot be created, or disallows writing. - * The persistent store is not accessible, due to permissions or data protection when the device is locked. - * The device is out of space. - * The store could not be migrated to the current model version. - Check the error message to determine what the actual problem was. - */ - fatalError("Unresolved error \(error), \(error.userInfo)") - } - }) - return container - }() - - // MARK: - Core Data Saving support - - func saveContext () { - let context = persistentContainer.viewContext - if context.hasChanges { - do { - try context.save() - } catch { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - let nserror = error as NSError - fatalError("Unresolved error \(nserror), \(nserror.userInfo)") - } - } - } - -} - diff --git a/ui-ios/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json b/ui-ios/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d8db8d65f..000000000 --- a/ui-ios/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ui-ios/lokinet/Assets.xcassets/Contents.json b/ui-ios/lokinet/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/ui-ios/lokinet/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ui-ios/lokinet/Base.lproj/LaunchScreen.storyboard b/ui-ios/lokinet/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index bfa361294..000000000 --- a/ui-ios/lokinet/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui-ios/lokinet/Base.lproj/Main.storyboard b/ui-ios/lokinet/Base.lproj/Main.storyboard deleted file mode 100644 index f1bcf3840..000000000 --- a/ui-ios/lokinet/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui-ios/lokinet/CMakeLists.txt b/ui-ios/lokinet/CMakeLists.txt deleted file mode 100644 index 35fa08bd5..000000000 --- a/ui-ios/lokinet/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_executable(lokinet AppDelegate.swift ViewController.swift) diff --git a/ui-ios/lokinet/Info.plist b/ui-ios/lokinet/Info.plist deleted file mode 100644 index 16be3b681..000000000 --- a/ui-ios/lokinet/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ui-ios/lokinet/ViewController.swift b/ui-ios/lokinet/ViewController.swift deleted file mode 100644 index 26e307e09..000000000 --- a/ui-ios/lokinet/ViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ViewController.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - - -} - diff --git a/ui-ios/lokinet/lokinet.entitlements b/ui-ios/lokinet/lokinet.entitlements deleted file mode 100644 index 8f2ff3f1e..000000000 --- a/ui-ios/lokinet/lokinet.entitlements +++ /dev/null @@ -1,15 +0,0 @@ - - - - - com.apple.developer.networking.networkextension - - dns-proxy - packet-tunnel-provider - - com.apple.developer.networking.vpn.api - - allow-vpn - - - diff --git a/ui-ios/lokinet/lokinet.xcdatamodeld/.xccurrentversion b/ui-ios/lokinet/lokinet.xcdatamodeld/.xccurrentversion deleted file mode 100644 index bf2d08f0a..000000000 --- a/ui-ios/lokinet/lokinet.xcdatamodeld/.xccurrentversion +++ /dev/null @@ -1,8 +0,0 @@ - - - - - _XCCurrentVersionName - lokinet.xcdatamodel - - diff --git a/ui-ios/lokinet/lokinet.xcdatamodeld/lokinet.xcdatamodel/contents b/ui-ios/lokinet/lokinet.xcdatamodeld/lokinet.xcdatamodel/contents deleted file mode 100644 index 476e5b6cf..000000000 --- a/ui-ios/lokinet/lokinet.xcdatamodeld/lokinet.xcdatamodel/contents +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui-macos/WindowsManager.swift b/ui-macos/WindowsManager.swift deleted file mode 100644 index 35d206882..000000000 --- a/ui-macos/WindowsManager.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// WindowsManager.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import AppKit -import Foundation - -struct WindowsManager { - static func getVC(withIdentifier identifier: String, - ofType: T.Type?, - storyboard: String = "Main", - bundle: Bundle? = nil) -> T? { - let storyboard = NSStoryboard(name: storyboard, bundle: bundle) - - guard let vc: T = storyboard.instantiateController(withIdentifier: identifier) as? T else { - let alert = NSAlert() - alert.alertStyle = .critical - alert.messageText = "Error initiating the viewcontroller" - alert.runModal() - - return nil - } - - return vc - } -} diff --git a/ui-macos/lokinet.xcodeproj/project.pbxproj b/ui-macos/lokinet.xcodeproj/project.pbxproj deleted file mode 100644 index 7dd8c6cf5..000000000 --- a/ui-macos/lokinet.xcodeproj/project.pbxproj +++ /dev/null @@ -1,641 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 7B28BD1A232EA8B40073B955 /* DNSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B28BD19232EA8B40073B955 /* DNSManager.swift */; }; - 7B28BD1C232EB6EF0073B955 /* LokinetRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B28BD1B232EB6EF0073B955 /* LokinetRunner.swift */; }; - 7BA4FB642340D5940098E20A /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA4FB632340D5940098E20A /* Preferences.swift */; }; - 7BA4FB662340DA820098E20A /* StatusMenuExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA4FB652340DA820098E20A /* StatusMenuExt.swift */; }; - 7BA4FB6C2340F2270098E20A /* WindowsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA4FB6B2340F2270098E20A /* WindowsManager.swift */; }; - 7BA4FB7023411FF60098E20A /* PrefsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA4FB6E23411FF60098E20A /* PrefsViewController.swift */; }; - 7BA4FB7323412D700098E20A /* Interfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA4FB7223412D700098E20A /* Interfaces.swift */; }; - 7BED5B7A232D78D900DF603F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BED5B79232D78D900DF603F /* AppDelegate.swift */; }; - 7BED5B7E232D78DB00DF603F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7BED5B7D232D78DB00DF603F /* Assets.xcassets */; }; - 7BED5B81232D78DB00DF603F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7BED5B7F232D78DB00DF603F /* Main.storyboard */; }; - 7BED5B8D232D78DB00DF603F /* lokinetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BED5B8C232D78DB00DF603F /* lokinetTests.swift */; }; - 7BED5B98232D78DB00DF603F /* lokinetUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BED5B97232D78DB00DF603F /* lokinetUITests.swift */; }; - 7BED5BA6232E7E6600DF603F /* LokinetLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BED5BA5232E7E6600DF603F /* LokinetLog.swift */; }; - 7BED5BA8232E831B00DF603F /* StreamReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BED5BA7232E831B00DF603F /* StreamReader.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 7BED5B89232D78DB00DF603F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7BED5B6E232D78D900DF603F /* Project object */; - proxyType = 1; - remoteGlobalIDString = 7BED5B75232D78D900DF603F; - remoteInfo = lokinet; - }; - 7BED5B94232D78DB00DF603F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 7BED5B6E232D78D900DF603F /* Project object */; - proxyType = 1; - remoteGlobalIDString = 7BED5B75232D78D900DF603F; - remoteInfo = lokinet; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 7B28BD19232EA8B40073B955 /* DNSManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSManager.swift; sourceTree = ""; }; - 7B28BD1B232EB6EF0073B955 /* LokinetRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LokinetRunner.swift; sourceTree = ""; }; - 7BA4FB632340D5940098E20A /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; }; - 7BA4FB652340DA820098E20A /* StatusMenuExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenuExt.swift; sourceTree = ""; }; - 7BA4FB6B2340F2270098E20A /* WindowsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowsManager.swift; sourceTree = ""; }; - 7BA4FB6E23411FF60098E20A /* PrefsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefsViewController.swift; sourceTree = ""; }; - 7BA4FB7223412D700098E20A /* Interfaces.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Interfaces.swift; sourceTree = ""; }; - 7BED5B76232D78D900DF603F /* lokinet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = lokinet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7BED5B79232D78D900DF603F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7BED5B7D232D78DB00DF603F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 7BED5B80232D78DB00DF603F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 7BED5B82232D78DB00DF603F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7BED5B83232D78DB00DF603F /* lokinet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = lokinet.entitlements; sourceTree = ""; }; - 7BED5B88232D78DB00DF603F /* lokinetTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = lokinetTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 7BED5B8C232D78DB00DF603F /* lokinetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lokinetTests.swift; sourceTree = ""; }; - 7BED5B8E232D78DB00DF603F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7BED5B93232D78DB00DF603F /* lokinetUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = lokinetUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 7BED5B97232D78DB00DF603F /* lokinetUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lokinetUITests.swift; sourceTree = ""; }; - 7BED5B99232D78DB00DF603F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7BED5BA5232E7E6600DF603F /* LokinetLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LokinetLog.swift; sourceTree = ""; }; - 7BED5BA7232E831B00DF603F /* StreamReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StreamReader.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7BED5B73232D78D900DF603F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7BED5B85232D78DB00DF603F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7BED5B90232D78DB00DF603F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 7BED5B6D232D78D900DF603F = { - isa = PBXGroup; - children = ( - 7BA4FB6B2340F2270098E20A /* WindowsManager.swift */, - 7BED5B78232D78D900DF603F /* lokinet */, - 7BED5B8B232D78DB00DF603F /* lokinetTests */, - 7BED5B96232D78DB00DF603F /* lokinetUITests */, - 7BED5B77232D78D900DF603F /* Products */, - 7BED5BA9232E993E00DF603F /* Frameworks */, - ); - sourceTree = ""; - }; - 7BED5B77232D78D900DF603F /* Products */ = { - isa = PBXGroup; - children = ( - 7BED5B76232D78D900DF603F /* lokinet.app */, - 7BED5B88232D78DB00DF603F /* lokinetTests.xctest */, - 7BED5B93232D78DB00DF603F /* lokinetUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 7BED5B78232D78D900DF603F /* lokinet */ = { - isa = PBXGroup; - children = ( - 7BED5B79232D78D900DF603F /* AppDelegate.swift */, - 7BA4FB652340DA820098E20A /* StatusMenuExt.swift */, - 7BA4FB632340D5940098E20A /* Preferences.swift */, - 7BA4FB6E23411FF60098E20A /* PrefsViewController.swift */, - 7BED5B7D232D78DB00DF603F /* Assets.xcassets */, - 7BED5B7F232D78DB00DF603F /* Main.storyboard */, - 7BED5B82232D78DB00DF603F /* Info.plist */, - 7BED5B83232D78DB00DF603F /* lokinet.entitlements */, - 7BED5BA5232E7E6600DF603F /* LokinetLog.swift */, - 7B28BD19232EA8B40073B955 /* DNSManager.swift */, - 7BED5BA7232E831B00DF603F /* StreamReader.swift */, - 7B28BD1B232EB6EF0073B955 /* LokinetRunner.swift */, - 7BA4FB7223412D700098E20A /* Interfaces.swift */, - ); - path = lokinet; - sourceTree = ""; - }; - 7BED5B8B232D78DB00DF603F /* lokinetTests */ = { - isa = PBXGroup; - children = ( - 7BED5B8C232D78DB00DF603F /* lokinetTests.swift */, - 7BED5B8E232D78DB00DF603F /* Info.plist */, - ); - path = lokinetTests; - sourceTree = ""; - }; - 7BED5B96232D78DB00DF603F /* lokinetUITests */ = { - isa = PBXGroup; - children = ( - 7BED5B97232D78DB00DF603F /* lokinetUITests.swift */, - 7BED5B99232D78DB00DF603F /* Info.plist */, - ); - path = lokinetUITests; - sourceTree = ""; - }; - 7BED5BA9232E993E00DF603F /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 7BED5B75232D78D900DF603F /* lokinet */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7BED5B9C232D78DB00DF603F /* Build configuration list for PBXNativeTarget "lokinet" */; - buildPhases = ( - 7BED5B72232D78D900DF603F /* Sources */, - 7BED5B73232D78D900DF603F /* Frameworks */, - 7BED5B74232D78D900DF603F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = lokinet; - productName = lokinet; - productReference = 7BED5B76232D78D900DF603F /* lokinet.app */; - productType = "com.apple.product-type.application"; - }; - 7BED5B87232D78DB00DF603F /* lokinetTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7BED5B9F232D78DB00DF603F /* Build configuration list for PBXNativeTarget "lokinetTests" */; - buildPhases = ( - 7BED5B84232D78DB00DF603F /* Sources */, - 7BED5B85232D78DB00DF603F /* Frameworks */, - 7BED5B86232D78DB00DF603F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 7BED5B8A232D78DB00DF603F /* PBXTargetDependency */, - ); - name = lokinetTests; - productName = lokinetTests; - productReference = 7BED5B88232D78DB00DF603F /* lokinetTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 7BED5B92232D78DB00DF603F /* lokinetUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7BED5BA2232D78DB00DF603F /* Build configuration list for PBXNativeTarget "lokinetUITests" */; - buildPhases = ( - 7BED5B8F232D78DB00DF603F /* Sources */, - 7BED5B90232D78DB00DF603F /* Frameworks */, - 7BED5B91232D78DB00DF603F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 7BED5B95232D78DB00DF603F /* PBXTargetDependency */, - ); - name = lokinetUITests; - productName = lokinetUITests; - productReference = 7BED5B93232D78DB00DF603F /* lokinetUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 7BED5B6E232D78D900DF603F /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = Loki; - TargetAttributes = { - 7BED5B75232D78D900DF603F = { - CreatedOnToolsVersion = 10.2.1; - SystemCapabilities = { - com.apple.ApplicationGroups.Mac = { - enabled = 0; - }; - com.apple.NetworkExtensions = { - enabled = 0; - }; - com.apple.Sandbox = { - enabled = 0; - }; - }; - }; - 7BED5B87232D78DB00DF603F = { - CreatedOnToolsVersion = 10.2.1; - TestTargetID = 7BED5B75232D78D900DF603F; - }; - 7BED5B92232D78DB00DF603F = { - CreatedOnToolsVersion = 10.2.1; - TestTargetID = 7BED5B75232D78D900DF603F; - }; - }; - }; - buildConfigurationList = 7BED5B71232D78D900DF603F /* Build configuration list for PBXProject "lokinet" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 7BED5B6D232D78D900DF603F; - productRefGroup = 7BED5B77232D78D900DF603F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 7BED5B75232D78D900DF603F /* lokinet */, - 7BED5B87232D78DB00DF603F /* lokinetTests */, - 7BED5B92232D78DB00DF603F /* lokinetUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 7BED5B74232D78D900DF603F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BED5B7E232D78DB00DF603F /* Assets.xcassets in Resources */, - 7BED5B81232D78DB00DF603F /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7BED5B86232D78DB00DF603F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7BED5B91232D78DB00DF603F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 7BED5B72232D78D900DF603F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BED5BA8232E831B00DF603F /* StreamReader.swift in Sources */, - 7BA4FB7023411FF60098E20A /* PrefsViewController.swift in Sources */, - 7BED5BA6232E7E6600DF603F /* LokinetLog.swift in Sources */, - 7BA4FB662340DA820098E20A /* StatusMenuExt.swift in Sources */, - 7B28BD1A232EA8B40073B955 /* DNSManager.swift in Sources */, - 7B28BD1C232EB6EF0073B955 /* LokinetRunner.swift in Sources */, - 7BA4FB6C2340F2270098E20A /* WindowsManager.swift in Sources */, - 7BA4FB7323412D700098E20A /* Interfaces.swift in Sources */, - 7BA4FB642340D5940098E20A /* Preferences.swift in Sources */, - 7BED5B7A232D78D900DF603F /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7BED5B84232D78DB00DF603F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BED5B8D232D78DB00DF603F /* lokinetTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7BED5B8F232D78DB00DF603F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7BED5B98232D78DB00DF603F /* lokinetUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 7BED5B8A232D78DB00DF603F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 7BED5B75232D78D900DF603F /* lokinet */; - targetProxy = 7BED5B89232D78DB00DF603F /* PBXContainerItemProxy */; - }; - 7BED5B95232D78DB00DF603F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 7BED5B75232D78D900DF603F /* lokinet */; - targetProxy = 7BED5B94232D78DB00DF603F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 7BED5B7F232D78DB00DF603F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 7BED5B80232D78DB00DF603F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 7BED5B9A232D78DB00DF603F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 23TKR8Q2XE; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 7BED5B9B232D78DB00DF603F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 23TKR8Q2XE; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 7BED5B9D232D78DB00DF603F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = lokinet/lokinet.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 23TKR8Q2XE; - ENABLE_HARDENED_RUNTIME = YES; - INFOPLIST_FILE = lokinet/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.14; - PRODUCT_BUNDLE_IDENTIFIER = loki.lokinet; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 7BED5B9E232D78DB00DF603F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = lokinet/lokinet.entitlements; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 23TKR8Q2XE; - ENABLE_HARDENED_RUNTIME = YES; - INFOPLIST_FILE = lokinet/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.14; - PRODUCT_BUNDLE_IDENTIFIER = loki.lokinet; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 7BED5BA0232D78DB00DF603F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = lokinetTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = loki.lokinetTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/lokinet.app/Contents/MacOS/lokinet"; - }; - name = Debug; - }; - 7BED5BA1232D78DB00DF603F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = lokinetTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = loki.lokinetTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/lokinet.app/Contents/MacOS/lokinet"; - }; - name = Release; - }; - 7BED5BA3232D78DB00DF603F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = lokinetUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = loki.lokinetUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = lokinet; - }; - name = Debug; - }; - 7BED5BA4232D78DB00DF603F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = lokinetUITests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = loki.lokinetUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = lokinet; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 7BED5B71232D78D900DF603F /* Build configuration list for PBXProject "lokinet" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7BED5B9A232D78DB00DF603F /* Debug */, - 7BED5B9B232D78DB00DF603F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7BED5B9C232D78DB00DF603F /* Build configuration list for PBXNativeTarget "lokinet" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7BED5B9D232D78DB00DF603F /* Debug */, - 7BED5B9E232D78DB00DF603F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7BED5B9F232D78DB00DF603F /* Build configuration list for PBXNativeTarget "lokinetTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7BED5BA0232D78DB00DF603F /* Debug */, - 7BED5BA1232D78DB00DF603F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7BED5BA2232D78DB00DF603F /* Build configuration list for PBXNativeTarget "lokinetUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7BED5BA3232D78DB00DF603F /* Debug */, - 7BED5BA4232D78DB00DF603F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 7BED5B6E232D78D900DF603F /* Project object */; -} diff --git a/ui-macos/lokinet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ui-macos/lokinet.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ui-macos/lokinet.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ui-macos/lokinet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ui-macos/lokinet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ui-macos/lokinet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ui-macos/lokinet.xcodeproj/xcshareddata/xcschemes/lokinet.xcscheme b/ui-macos/lokinet.xcodeproj/xcshareddata/xcschemes/lokinet.xcscheme deleted file mode 100644 index bf40928c4..000000000 --- a/ui-macos/lokinet.xcodeproj/xcshareddata/xcschemes/lokinet.xcscheme +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui-macos/lokinet/AppDelegate.swift b/ui-macos/lokinet/AppDelegate.swift deleted file mode 100644 index 4f066d70d..000000000 --- a/ui-macos/lokinet/AppDelegate.swift +++ /dev/null @@ -1,155 +0,0 @@ -// -// AppDelegate.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import Cocoa - -let LOG_WINDOW_CONTROLLER: NSWindowController = NSWindowController(window: nil) - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { - - var lokinet: LokinetRunner? = nil - var appender: Appendable? = nil - - var statusBarItem: NSStatusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) - - func applicationWillFinishLaunching(_ notification: Notification) { - if (!Preferences.firstRunDone) { - Preferences.firstRunDone = true - Preferences.restore() - } - } - - func applicationDidFinishLaunching(_ aNotification: Notification) { - guard let statusButton = statusBarItem.button else { return } - statusButton.title = "LokiNet" - let statusMenu: NSMenu = NSMenu() - statusMenu.autoenablesItems = false - statusMenu.addItem(withTitle: "LokiNet", action: nil, keyEquivalent: "") - - let runItem: NSMenuItem = { - let item = NSMenuItem( - title: "Run", - action: #selector(runLokinet), - keyEquivalent: "r" - ) - item.target = self - - return item - }() - - let stopItem: NSMenuItem = { - let item = NSMenuItem( - title: "Stop", - action: #selector(stopLokinet), - keyEquivalent: "s" - - ) - item.isEnabled = false - item.target = self - - return item - }() - - let showWindowItem: NSMenuItem = { - let item = NSMenuItem( - title: "Show Window", - action: #selector(showWindow), - keyEquivalent: "w" - ) - item.target = self - - return item - }() - - let quitApplicationItem: NSMenuItem = { - let item = NSMenuItem( - title: "Quit", - action: #selector(terminate), - keyEquivalent: "q") - item.target = self - - return item - }() - - statusMenu.addItems( - .separator(), - runItem, - stopItem, - .separator(), - showWindowItem, - .separator(), - quitApplicationItem - ) - - statusBarItem.menu = statusMenu - } - - func applicationWillTerminate(_ aNotification: Notification) { - lokinet?.stop() - } -} - -extension AppDelegate { - @objc - func showWindow(sender: NSMenuItem) { - if let vc = WindowsManager.getVC(withIdentifier: "LokinetLogController", ofType: LokinetLogController.self) { - appender = vc.log - let window: NSWindow = { - let w = NSWindow(contentViewController: vc) - - w.styleMask.remove(.fullScreen) - w.styleMask.remove(.resizable) - w.styleMask.remove(.miniaturizable) - - w.level = .floating - - return w - }() - - lokinet?.logAppender = vc.log - - if LOG_WINDOW_CONTROLLER.window == nil { - LOG_WINDOW_CONTROLLER.window = window - } - - LOG_WINDOW_CONTROLLER.showWindow(window) - } - } - - @objc - func runLokinet(sender: NSMenuItem) { - if lokinet == nil { - lokinet = LokinetRunner(interface: Preferences.interfaceName, path: Preferences.lokinetPath) - lokinet?.logAppender = appender - lokinet?.start() - } - - sender.isEnabled = false; - - if let menu = statusBarItem.menu, let stop = menu.item(withTitle: "Stop") { - stop.isEnabled = true - } - } - - @objc - func stopLokinet(_ sender: NSMenuItem) { - lokinet?.stop() - lokinet = nil - - sender.isEnabled = false; - - if let menu = statusBarItem.menu, let start = menu.item(withTitle: "Run") { - start.isEnabled = true - } - } - - @objc - func terminate(_ sender: NSMenuItem) { - NSApp.terminate(sender) - } -} diff --git a/ui-macos/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json b/ui-macos/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2db2b1c7c..000000000 --- a/ui-macos/lokinet/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ui-macos/lokinet/Assets.xcassets/Contents.json b/ui-macos/lokinet/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/ui-macos/lokinet/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ui-macos/lokinet/Base.lproj/Main.storyboard b/ui-macos/lokinet/Base.lproj/Main.storyboard deleted file mode 100644 index ae53972c5..000000000 --- a/ui-macos/lokinet/Base.lproj/Main.storyboard +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui-macos/lokinet/DNSManager.swift b/ui-macos/lokinet/DNSManager.swift deleted file mode 100644 index 7185a91fa..000000000 --- a/ui-macos/lokinet/DNSManager.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// DNSManager.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import Foundation - -func split(str: String?) -> [String] { - let res = str?.components(separatedBy: NSCharacterSet.whitespacesAndNewlines) ?? [] - return res.filter({!$0.isEmpty}) -} - -class DNSManager { - static let netSetup = URL(fileURLWithPath: "/usr/sbin/networksetup") - - let interface: String - var oldDNSSettings: [String] = [] - - func getOldSettings() -> [String] { - let netprocess = Process() - netprocess.executableURL = DNSManager.netSetup - netprocess.arguments = ["-getdnsservers", interface] - - do { - let pipe = Pipe() - netprocess.standardOutput = pipe - try netprocess.run() - let data = pipe.fileHandleForReading.readDataToEndOfFile() - let asStr = String(data: data, encoding: .ascii) - - if asStr?.contains("There aren't any DNS Servers") ?? true { - return [] - } else { - return split(str: asStr).filter({$0 != "127.0.0.1"}) - } - } catch { - return [] - } - } - - func setNewSettings() throws { - self.oldDNSSettings = getOldSettings() - print("Overriding DNS Settings of \(self.oldDNSSettings)") - - let netprocess = Process() - netprocess.executableURL = DNSManager.netSetup - - netprocess.arguments = ["-setdnsservers", self.interface, "127.0.0.1"] - - try netprocess.run() - } - - func restoreOldSettings() { - let netprocess = Process() - netprocess.executableURL = DNSManager.netSetup - - netprocess.arguments = ["-setdnsservers", self.interface] - - if oldDNSSettings.isEmpty { - // networkmsetup uses "networksetup -setdnsservers Empty" to reset - netprocess.arguments?.append("Empty") - } else { - netprocess.arguments?.append(contentsOf: oldDNSSettings) - } - - do { - try netprocess.run() - print("Resetting DNS Settings to \(self.oldDNSSettings)") - } catch { - // do nothing - } - } - - init(interface: String) { - self.interface = interface - } -} diff --git a/ui-macos/lokinet/Info.plist b/ui-macos/lokinet/Info.plist deleted file mode 100644 index 06d8a48d9..000000000 --- a/ui-macos/lokinet/Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSApplicationCategoryType - public.app-category.productivity - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - Copyright © 2019 Loki. All rights reserved. - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication - - diff --git a/ui-macos/lokinet/LokinetLog.swift b/ui-macos/lokinet/LokinetLog.swift deleted file mode 100644 index 40849e5a1..000000000 --- a/ui-macos/lokinet/LokinetLog.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// LokinetLog.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import AppKit - -class LokinetLogController : NSViewController { - override func viewDidLoad() { - super.viewDidLoad() - } - - var log: LokinetLog { - get { - // this is walking down the UI stack. - // TODO: work out a better way of doing this - let scroll = self.view.subviews[0] as! NSScrollView - let clip = scroll.subviews[0] as! NSClipView - let log = clip.subviews[0] as! LokinetLog - return log - } - } - -} - -protocol Appendable { - func append(string: String) -} - -final class LokinetLog : NSTextView, Appendable { - func append(string: String) { - self.textStorage?.append(NSAttributedString(string: string + "\n")) - self.scrollToEndOfDocument(nil) - } -} diff --git a/ui-macos/lokinet/LokinetRunner.swift b/ui-macos/lokinet/LokinetRunner.swift deleted file mode 100644 index 9ba633155..000000000 --- a/ui-macos/lokinet/LokinetRunner.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// LokinetRunner.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import Foundation -import Cocoa - -class LokinetRunner { - let dnsManager: DNSManager - let lokinetPath: URL - var process = Process() - - var logAppender: Appendable? = nil - - init(interface: String, path: String) { - self.lokinetPath = URL(fileURLWithPath: path) - self.dnsManager = DNSManager(interface: interface) - } - - func start() { - process.executableURL = self.lokinetPath - process.arguments = ["--colour=false"] - let outputPipe = Pipe() - process.standardOutput = outputPipe - process.standardError = outputPipe - - do { - try self.dnsManager.setNewSettings() - try process.run() - } catch { - NSApp.presentError(error) - } - - guard let reader = StreamReader(fh: outputPipe.fileHandleForReading) else { - let err = NSError(domain: "lokinet", code: 0, userInfo: ["msg": "Failed to read from filehandle"]) - NSApp.presentError(err) - return - } - - DispatchQueue.global(qos: .background).async { - for line in reader { - print(line) - DispatchQueue.main.async { - self.logAppender?.append(string: line) - } - } - } - } - - func stop() { - if process.isRunning { - process.terminate() - process.waitUntilExit() - } - dnsManager.restoreOldSettings() - } -} diff --git a/ui-macos/lokinet/StreamReader.swift b/ui-macos/lokinet/StreamReader.swift deleted file mode 100644 index 39e0c4eae..000000000 --- a/ui-macos/lokinet/StreamReader.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// StreamReader.swift -// lokinet -// -// Copyright © 2019 Loki. All rights reserved. -// - -import Foundation - -final class StreamReader { - let encoding : String.Encoding - let chunkSize : Int - - var fileHandle : FileHandle! - var buffer : Data - let delimData : Data - var atEof : Bool = false - - init?(fh: FileHandle, delimiter: String = "\n", encoding : String.Encoding = .utf8, chunkSize : Int = 4096) { - self.chunkSize = chunkSize - self.encoding = encoding - self.fileHandle = fh - - guard let delimData = delimiter.data(using: encoding) else { - return nil - } - self.delimData = delimData - self.buffer = Data(capacity: chunkSize) - } - - /// Return next line, or nil on EOF. - func nextLine() -> String? { - precondition(fileHandle != nil, "Attempt to read from closed file") - - if atEof { - return nil - } - - // Read data chunks from file until a line delimiter is found: - while !atEof { - if let range = buffer.range(of: delimData) { - // Convert complete line (excluding the delimiter) to a string: - let line = String(data: buffer.subdata(in: 0.. 0 { - buffer.append(tmpData) - } else { - // EOF or read error. - atEof = true - if buffer.count > 0 { - // Buffer contains last line in file (not terminated by delimiter). - let line = String(data: buffer as Data, encoding: encoding) - buffer.count = 0 - return line - } - } - } - - return nil - } -} - -extension StreamReader : Sequence { - func makeIterator() -> AnyIterator { - return AnyIterator { - return self.nextLine() - } - } -} diff --git a/ui-macos/lokinet/lokinet.entitlements b/ui-macos/lokinet/lokinet.entitlements deleted file mode 100644 index 2eb7e333a..000000000 --- a/ui-macos/lokinet/lokinet.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.security.application-groups - - - diff --git a/ui-macos/lokinetTests/Info.plist b/ui-macos/lokinetTests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/ui-macos/lokinetTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/ui-macos/lokinetTests/lokinetTests.swift b/ui-macos/lokinetTests/lokinetTests.swift deleted file mode 100644 index e95c64178..000000000 --- a/ui-macos/lokinetTests/lokinetTests.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// lokinetTests.swift -// lokinetTests -// -// Copyright © 2019 Loki. All rights reserved. -// - -import XCTest -@testable import lokinet - -class lokinetTests: XCTestCase { - - override func setUp() { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/ui-macos/lokinetUITests/Info.plist b/ui-macos/lokinetUITests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/ui-macos/lokinetUITests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/ui-macos/lokinetUITests/lokinetUITests.swift b/ui-macos/lokinetUITests/lokinetUITests.swift deleted file mode 100644 index 79e381db0..000000000 --- a/ui-macos/lokinetUITests/lokinetUITests.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// lokinetUITests.swift -// lokinetUITests -// -// Copyright © 2019 Loki. All rights reserved. -// - -import XCTest - -class lokinetUITests: XCTestCase { - - override func setUp() { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. - XCUIApplication().launch() - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() { - // Use recording to get started writing UI tests. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - -} diff --git a/ui-win32/.gitignore b/ui-win32/.gitignore deleted file mode 100644 index a7f453652..000000000 --- a/ui-win32/.gitignore +++ /dev/null @@ -1,338 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ -# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true -**/wwwroot/lib/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ diff --git a/ui-win32/AboutBox.Designer.cs b/ui-win32/AboutBox.Designer.cs deleted file mode 100644 index 88db3d6fe..000000000 --- a/ui-win32/AboutBox.Designer.cs +++ /dev/null @@ -1,186 +0,0 @@ -namespace network.loki.lokinet.win32.ui -{ - partial class AboutBox - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); - this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); - this.logoPictureBox = new System.Windows.Forms.PictureBox(); - this.labelProductName = new System.Windows.Forms.Label(); - this.labelVersion = new System.Windows.Forms.Label(); - this.labelCopyright = new System.Windows.Forms.Label(); - this.labelCompanyName = new System.Windows.Forms.Label(); - this.textBoxDescription = new System.Windows.Forms.TextBox(); - this.okButton = new System.Windows.Forms.Button(); - this.tableLayoutPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); - this.SuspendLayout(); - // - // tableLayoutPanel - // - this.tableLayoutPanel.ColumnCount = 2; - this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); - this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); - this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); - this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); - this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); - this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); - this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); - this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); - this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); - this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9); - this.tableLayoutPanel.Name = "tableLayoutPanel"; - this.tableLayoutPanel.RowCount = 6; - this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); - this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); - this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); - this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); - this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); - this.tableLayoutPanel.Size = new System.Drawing.Size(417, 265); - this.tableLayoutPanel.TabIndex = 0; - // - // logoPictureBox - // - this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; - this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image"))); - this.logoPictureBox.Location = new System.Drawing.Point(3, 3); - this.logoPictureBox.Name = "logoPictureBox"; - this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); - this.logoPictureBox.Size = new System.Drawing.Size(131, 259); - this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.logoPictureBox.TabIndex = 12; - this.logoPictureBox.TabStop = false; - // - // labelProductName - // - this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelProductName.Location = new System.Drawing.Point(143, 0); - this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); - this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17); - this.labelProductName.Name = "labelProductName"; - this.labelProductName.Size = new System.Drawing.Size(271, 17); - this.labelProductName.TabIndex = 19; - this.labelProductName.Text = "Product Name"; - this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // labelVersion - // - this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelVersion.Location = new System.Drawing.Point(143, 26); - this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); - this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17); - this.labelVersion.Name = "labelVersion"; - this.labelVersion.Size = new System.Drawing.Size(271, 17); - this.labelVersion.TabIndex = 0; - this.labelVersion.Text = "Version"; - this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // labelCopyright - // - this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelCopyright.Location = new System.Drawing.Point(143, 52); - this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); - this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17); - this.labelCopyright.Name = "labelCopyright"; - this.labelCopyright.Size = new System.Drawing.Size(271, 17); - this.labelCopyright.TabIndex = 21; - this.labelCopyright.Text = "Copyright"; - this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // labelCompanyName - // - this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelCompanyName.Location = new System.Drawing.Point(143, 78); - this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); - this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17); - this.labelCompanyName.Name = "labelCompanyName"; - this.labelCompanyName.Size = new System.Drawing.Size(271, 17); - this.labelCompanyName.TabIndex = 22; - this.labelCompanyName.Text = "Company Name"; - this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // textBoxDescription - // - this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxDescription.Location = new System.Drawing.Point(143, 107); - this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); - this.textBoxDescription.Multiline = true; - this.textBoxDescription.Name = "textBoxDescription"; - this.textBoxDescription.ReadOnly = true; - this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.textBoxDescription.Size = new System.Drawing.Size(271, 126); - this.textBoxDescription.TabIndex = 23; - this.textBoxDescription.TabStop = false; - this.textBoxDescription.Text = "Description"; - // - // okButton - // - this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.okButton.Location = new System.Drawing.Point(339, 239); - this.okButton.Name = "okButton"; - this.okButton.Size = new System.Drawing.Size(75, 23); - this.okButton.TabIndex = 24; - this.okButton.Text = "&OK"; - // - // AboutBox - // - this.AcceptButton = this.okButton; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(435, 283); - this.Controls.Add(this.tableLayoutPanel); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "AboutBox"; - this.Padding = new System.Windows.Forms.Padding(9); - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "AboutBox1"; - this.tableLayoutPanel.ResumeLayout(false); - this.tableLayoutPanel.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; - private System.Windows.Forms.PictureBox logoPictureBox; - private System.Windows.Forms.Label labelProductName; - private System.Windows.Forms.Label labelVersion; - private System.Windows.Forms.Label labelCopyright; - private System.Windows.Forms.Label labelCompanyName; - private System.Windows.Forms.TextBox textBoxDescription; - private System.Windows.Forms.Button okButton; - } -} diff --git a/ui-win32/AboutBox.cs b/ui-win32/AboutBox.cs deleted file mode 100644 index 0de2b9664..000000000 --- a/ui-win32/AboutBox.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.IO; -using System.Reflection; -using System.Windows.Forms; - -namespace network.loki.lokinet.win32.ui -{ - partial class AboutBox : Form - { - public AboutBox() - { - InitializeComponent(); - var lic = File.ReadAllText(String.Format("{0}/LICENSE", Directory.GetCurrentDirectory())); - this.Text = String.Format("About {0}", AssemblyTitle); - this.labelProductName.Text = AssemblyProduct; - this.labelVersion.Text = String.Format("Version {0}", AssemblyInformationalVersion); - this.labelCopyright.Text = AssemblyCopyright; - this.labelCompanyName.Text = AssemblyCompany; - this.textBoxDescription.Text = lic; - } - - #region Assembly Attribute Accessors - - public string AssemblyTitle - { - get - { - object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); - if (attributes.Length > 0) - { - AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; - if (titleAttribute.Title != "") - { - return titleAttribute.Title; - } - } - return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); - } - } - - public string AssemblyVersion - { - get - { - return Assembly.GetExecutingAssembly().GetName().Version.ToString(); - } - } - - public string AssemblyInformationalVersion - { - get - { - object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false); - if (attributes.Length == 0) - { - return ""; - } - return ((AssemblyInformationalVersionAttribute)attributes[0]).InformationalVersion; - } - } - - public string AssemblyDescription - { - get - { - object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); - if (attributes.Length == 0) - { - return ""; - } - return ((AssemblyDescriptionAttribute)attributes[0]).Description; - } - } - - public string AssemblyProduct - { - get - { - object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); - if (attributes.Length == 0) - { - return ""; - } - return ((AssemblyProductAttribute)attributes[0]).Product; - } - } - - public string AssemblyCopyright - { - get - { - object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); - if (attributes.Length == 0) - { - return ""; - } - return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; - } - } - - public string AssemblyCompany - { - get - { - object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); - if (attributes.Length == 0) - { - return ""; - } - return ((AssemblyCompanyAttribute)attributes[0]).Company; - } - } - #endregion - } -} diff --git a/ui-win32/AboutBox.resx b/ui-win32/AboutBox.resx deleted file mode 100644 index 1951451a5..000000000 --- a/ui-win32/AboutBox.resx +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - - - \ No newline at end of file diff --git a/ui-win32/App.config b/ui-win32/App.config deleted file mode 100644 index c5410d1db..000000000 --- a/ui-win32/App.config +++ /dev/null @@ -1,20 +0,0 @@ - - - - -
- - - - - - - - - - - True - - - - \ No newline at end of file diff --git a/ui-win32/LogDumper.cs b/ui-win32/LogDumper.cs deleted file mode 100644 index 57335b2c4..000000000 --- a/ui-win32/LogDumper.cs +++ /dev/null @@ -1,62 +0,0 @@ -using network.loki.lokinet.win32.ui.Properties; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; - -namespace network.loki.lokinet.win32.ui -{ - - class LogDumper - { - private const string LogFolderName = "logs"; - private const string LogFileName = "lokinet.log"; - private string tmp; - private string LogPath; - - public LogDumper(string text_dump) - { - tmp = text_dump; - } - - public void setText(string text) - { - tmp = text; - } - public string getLogPath() - { - return LogPath; - } - - public void CreateLog(string path) - { - var logFolderPath = Path.Combine(path, LogFolderName); - if (!Directory.Exists(logFolderPath)) - Directory.CreateDirectory(logFolderPath); - - var logFilePath = Path.Combine(logFolderPath, LogFileName); - LogPath = logFilePath; - - Rotate(logFilePath); - - using (var sw = File.AppendText(logFilePath)) - { - sw.WriteLine(tmp); - } - } - - private void Rotate(string filePath) - { - if (!File.Exists(filePath)) - return; - - var fileInfo = new FileInfo(filePath); - - var fileTime = DateTime.Now.ToString("dd-MM-yy__h-m-s"); - var rotatedPath = filePath.Replace(".log", $".{fileTime}.log"); - File.Move(filePath, rotatedPath); - } - } - -} diff --git a/ui-win32/Program.cs b/ui-win32/Program.cs deleted file mode 100644 index a04bab098..000000000 --- a/ui-win32/Program.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Diagnostics; -using System.Threading; -using System.Windows.Forms; - -namespace network.loki.lokinet.win32.ui -{ - static class Program - { - public static OperatingSystem os_id = Environment.OSVersion; - public static PlatformID platform = os_id.Platform; - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // Scrub any old lokinet process left behind - Mutex m = new Mutex(true, "lokinet_dotnet_ui"); - Process[] old_pids = Process.GetProcessesByName("lokinet"); - foreach (Process pid in old_pids) - { - try - { - pid.Kill(); - } - catch { } // don't yell - } - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new main_frame()); - try - { - main_frame.lokiNetDaemon.Kill(); - } - catch - { } - m.ReleaseMutex(); - } - } -} diff --git a/ui-win32/Properties/AssemblyInfo.cs b/ui-win32/Properties/AssemblyInfo.cs deleted file mode 100644 index 94dc96ef3..000000000 --- a/ui-win32/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,46 +0,0 @@ -// WARNING: for the love of all that is good and holy -// please DO NOT convert this file to UTF-8, much less -// UTF-16 - the UNIX port of Roslyn does not understand UTF-16, -// and UTF-8 chews up the copyright symbols. -// -rick -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Lokinet for Windows")] -[assembly: AssemblyDescription("Lokinet end-user UI")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Loki Project")] -[assembly: AssemblyProduct("Lokinet Launcher")] -[assembly: AssemblyCopyright("Copyright ©2018-2020 Loki Project. All rights reserved. See LICENSE for more details.")] -[assembly: AssemblyTrademark("Loki, Loki Project, LokiNET are ™ & ©2018-2020 Loki Foundation")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("1cdee73c-29c5-4781-bd74-1eeac6f75a14")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.7.0")] -[assembly: AssemblyFileVersion("0.7.0")] -#if DEBUG -[assembly: AssemblyInformationalVersion("0.7.0-dev-{chash:8}")] -#else -[assembly: AssemblyInformationalVersion("0.7.0 (RELEASE_CODENAME)")] -#endif \ No newline at end of file diff --git a/ui-win32/Properties/Resources.Designer.cs b/ui-win32/Properties/Resources.Designer.cs deleted file mode 100644 index 77cdf66d6..000000000 --- a/ui-win32/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace network.loki.lokinet.win32.ui.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("network.loki.lokinet.win32.ui.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/ui-win32/Properties/Resources.resx b/ui-win32/Properties/Resources.resx deleted file mode 100644 index ffecec851..000000000 --- a/ui-win32/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ui-win32/Properties/Settings.Designer.cs b/ui-win32/Properties/Settings.Designer.cs deleted file mode 100644 index 1ea593d8e..000000000 --- a/ui-win32/Properties/Settings.Designer.cs +++ /dev/null @@ -1,38 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace network.loki.lokinet.win32.ui.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool autoScroll { - get { - return ((bool)(this["autoScroll"])); - } - set { - this["autoScroll"] = value; - } - } - } -} diff --git a/ui-win32/Properties/Settings.settings b/ui-win32/Properties/Settings.settings deleted file mode 100644 index f83d61ca6..000000000 --- a/ui-win32/Properties/Settings.settings +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - True - - - \ No newline at end of file diff --git a/ui-win32/Settings.cs b/ui-win32/Settings.cs deleted file mode 100644 index 5f12eca59..000000000 --- a/ui-win32/Settings.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace network.loki.lokinet.win32.ui.Properties { - - - // This class allows you to handle specific events on the settings class: - // The SettingChanging event is raised before a setting's value is changed. - // The PropertyChanged event is raised after a setting's value is changed. - // The SettingsLoaded event is raised after the setting values are loaded. - // The SettingsSaving event is raised before the setting values are saved. - internal sealed partial class Settings { - - public Settings() { - // // To add event handlers for saving and changing settings, uncomment the lines below: - // - // this.SettingChanging += this.SettingChangingEventHandler; - // - // this.SettingsSaving += this.SettingsSavingEventHandler; - // - } - - private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { - // Add code to handle the SettingChangingEvent event here. - } - - private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { - // Add code to handle the SettingsSaving event here. - } - } -} diff --git a/ui-win32/UIMain.Designer.cs b/ui-win32/UIMain.Designer.cs deleted file mode 100644 index 08aee13e5..000000000 --- a/ui-win32/UIMain.Designer.cs +++ /dev/null @@ -1,253 +0,0 @@ -namespace network.loki.lokinet.win32.ui -{ - partial class main_frame - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(main_frame)); - this.StatusLabel = new System.Windows.Forms.Label(); - this.lokinetd_fd1 = new System.Windows.Forms.TextBox(); - this.NotificationTrayIcon = new System.Windows.Forms.NotifyIcon(this.components); - this.TrayMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.showToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TrayConnect = new System.Windows.Forms.ToolStripMenuItem(); - this.TrayDisconnect = new System.Windows.Forms.ToolStripMenuItem(); - this.saveLogToFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.btnHide = new System.Windows.Forms.Button(); - this.UIVersionLabel = new System.Windows.Forms.Label(); - this.btnConnect = new System.Windows.Forms.Button(); - this.btnDrop = new System.Windows.Forms.Button(); - this.btnConfigProfile = new System.Windows.Forms.Button(); - this.btnAbout = new System.Windows.Forms.Button(); - this.TrayMenu.SuspendLayout(); - this.SuspendLayout(); - // - // StatusLabel - // - this.StatusLabel.AutoSize = true; - this.StatusLabel.Location = new System.Drawing.Point(13, 13); - this.StatusLabel.Name = "StatusLabel"; - this.StatusLabel.Size = new System.Drawing.Size(97, 13); - this.StatusLabel.TabIndex = 0; - this.StatusLabel.Text = "[connection status]"; - // - // lokinetd_fd1 - // - this.lokinetd_fd1.AcceptsReturn = true; - this.lokinetd_fd1.AcceptsTab = true; - this.lokinetd_fd1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lokinetd_fd1.BackColor = System.Drawing.SystemColors.InfoText; - this.lokinetd_fd1.Font = new System.Drawing.Font("Iosevka Term Light", 9.749999F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lokinetd_fd1.ForeColor = System.Drawing.Color.Lime; - this.lokinetd_fd1.Location = new System.Drawing.Point(12, 39); - this.lokinetd_fd1.MaxLength = 0; - this.lokinetd_fd1.Multiline = true; - this.lokinetd_fd1.Name = "lokinetd_fd1"; - this.lokinetd_fd1.ReadOnly = true; - this.lokinetd_fd1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.lokinetd_fd1.Size = new System.Drawing.Size(776, 330); - this.lokinetd_fd1.TabIndex = 1; - this.lokinetd_fd1.TextChanged += new System.EventHandler(this.lokinetd_fd1_TextChanged); - // - // NotificationTrayIcon - // - this.NotificationTrayIcon.ContextMenuStrip = this.TrayMenu; - this.NotificationTrayIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("NotificationTrayIcon.Icon"))); - this.NotificationTrayIcon.Text = "LokiNET - disconnected"; - this.NotificationTrayIcon.Visible = true; - this.NotificationTrayIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.NotificationTrayIcon_MouseDoubleClick); - // - // TrayMenu - // - this.TrayMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.showToolStripMenuItem, - this.TrayConnect, - this.TrayDisconnect, - this.saveLogToFileToolStripMenuItem, - this.aboutToolStripMenuItem, - this.exitToolStripMenuItem}); - this.TrayMenu.Name = "TrayMenu"; - this.TrayMenu.Size = new System.Drawing.Size(166, 136); - // - // showToolStripMenuItem - // - this.showToolStripMenuItem.Name = "showToolStripMenuItem"; - this.showToolStripMenuItem.Size = new System.Drawing.Size(165, 22); - this.showToolStripMenuItem.Text = "Show"; - this.showToolStripMenuItem.Click += new System.EventHandler(this.showToolStripMenuItem_Click); - // - // TrayConnect - // - this.TrayConnect.Name = "TrayConnect"; - this.TrayConnect.Size = new System.Drawing.Size(165, 22); - this.TrayConnect.Text = "Connect"; - this.TrayConnect.Click += new System.EventHandler(this.TrayConnect_Click); - // - // TrayDisconnect - // - this.TrayDisconnect.Name = "TrayDisconnect"; - this.TrayDisconnect.Size = new System.Drawing.Size(165, 22); - this.TrayDisconnect.Text = "Disconnect"; - this.TrayDisconnect.Click += new System.EventHandler(this.TrayDisconnect_Click); - // - // saveLogToFileToolStripMenuItem - // - this.saveLogToFileToolStripMenuItem.Name = "saveLogToFileToolStripMenuItem"; - this.saveLogToFileToolStripMenuItem.Size = new System.Drawing.Size(165, 22); - this.saveLogToFileToolStripMenuItem.Text = "Save Log to File..."; - this.saveLogToFileToolStripMenuItem.Click += new System.EventHandler(this.saveLogToFileToolStripMenuItem_Click); - // - // aboutToolStripMenuItem - // - this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(165, 22); - this.aboutToolStripMenuItem.Text = "About..."; - this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); - // - // exitToolStripMenuItem - // - this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; - this.exitToolStripMenuItem.Size = new System.Drawing.Size(165, 22); - this.exitToolStripMenuItem.Text = "Exit"; - this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); - // - // btnHide - // - this.btnHide.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnHide.Location = new System.Drawing.Point(713, 415); - this.btnHide.Name = "btnHide"; - this.btnHide.Size = new System.Drawing.Size(75, 23); - this.btnHide.TabIndex = 2; - this.btnHide.Text = "Hide"; - this.btnHide.UseVisualStyleBackColor = true; - this.btnHide.Click += new System.EventHandler(this.btnHide_Click); - // - // UIVersionLabel - // - this.UIVersionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.UIVersionLabel.Location = new System.Drawing.Point(455, 388); - this.UIVersionLabel.Name = "UIVersionLabel"; - this.UIVersionLabel.Size = new System.Drawing.Size(333, 13); - this.UIVersionLabel.TabIndex = 3; - this.UIVersionLabel.Text = "version label"; - this.UIVersionLabel.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // btnConnect - // - this.btnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnConnect.Location = new System.Drawing.Point(13, 415); - this.btnConnect.Name = "btnConnect"; - this.btnConnect.Size = new System.Drawing.Size(75, 23); - this.btnConnect.TabIndex = 4; - this.btnConnect.Text = "Connect"; - this.btnConnect.UseVisualStyleBackColor = true; - this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); - // - // btnDrop - // - this.btnDrop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnDrop.Enabled = false; - this.btnDrop.Location = new System.Drawing.Point(95, 415); - this.btnDrop.Name = "btnDrop"; - this.btnDrop.Size = new System.Drawing.Size(75, 23); - this.btnDrop.TabIndex = 5; - this.btnDrop.Text = "Disconnect"; - this.btnDrop.UseVisualStyleBackColor = true; - this.btnDrop.Click += new System.EventHandler(this.btnDrop_Click); - // - // btnConfigProfile - // - this.btnConfigProfile.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnConfigProfile.Location = new System.Drawing.Point(177, 415); - this.btnConfigProfile.Name = "btnConfigProfile"; - this.btnConfigProfile.Size = new System.Drawing.Size(75, 23); - this.btnConfigProfile.TabIndex = 6; - this.btnConfigProfile.Text = "Settings..."; - this.btnConfigProfile.UseVisualStyleBackColor = true; - this.btnConfigProfile.Click += new System.EventHandler(this.btnConfigProfile_Click); - // - // btnAbout - // - this.btnAbout.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnAbout.Location = new System.Drawing.Point(259, 415); - this.btnAbout.Name = "btnAbout"; - this.btnAbout.Size = new System.Drawing.Size(75, 23); - this.btnAbout.TabIndex = 7; - this.btnAbout.Text = "About..."; - this.btnAbout.UseVisualStyleBackColor = true; - this.btnAbout.Click += new System.EventHandler(this.btnAbout_Click); - // - // main_frame - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Controls.Add(this.btnAbout); - this.Controls.Add(this.btnConfigProfile); - this.Controls.Add(this.btnDrop); - this.Controls.Add(this.btnConnect); - this.Controls.Add(this.UIVersionLabel); - this.Controls.Add(this.btnHide); - this.Controls.Add(this.lokinetd_fd1); - this.Controls.Add(this.StatusLabel); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "main_frame"; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Lokinet Launcher"; - this.TrayMenu.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label StatusLabel; - private System.Windows.Forms.NotifyIcon NotificationTrayIcon; - private System.Windows.Forms.Button btnHide; - private System.Windows.Forms.Label UIVersionLabel; - private System.Windows.Forms.Button btnConnect; - private System.Windows.Forms.Button btnDrop; - private System.Windows.Forms.Button btnConfigProfile; - public System.Windows.Forms.TextBox lokinetd_fd1; - private System.Windows.Forms.Button btnAbout; - private System.Windows.Forms.ContextMenuStrip TrayMenu; - private System.Windows.Forms.ToolStripMenuItem TrayConnect; - private System.Windows.Forms.ToolStripMenuItem TrayDisconnect; - private System.Windows.Forms.ToolStripMenuItem saveLogToFileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem showToolStripMenuItem; - } -} - diff --git a/ui-win32/UIMain.cs b/ui-win32/UIMain.cs deleted file mode 100644 index b35947888..000000000 --- a/ui-win32/UIMain.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Windows.Forms; - -namespace network.loki.lokinet.win32.ui -{ - public partial class main_frame : Form - { - public static Process lokiNetDaemon = new Process(); - public static bool isConnected; - public static string logText; - private string config_path; - private LogDumper ld; - - void UpdateUI(string text) - { - this.Invoke(new MethodInvoker(delegate () { lokinetd_fd1.AppendText(text); })); - } - - public main_frame() - { - InitializeComponent(); - if (Program.platform == PlatformID.Win32NT) - config_path = Environment.ExpandEnvironmentVariables("%APPDATA%\\.lokinet"); - else - config_path = Environment.ExpandEnvironmentVariables("%HOME%/.lokinet"); - StatusLabel.Text = "Disconnected"; - var build = ((AssemblyInformationalVersionAttribute)Assembly - .GetAssembly(typeof(main_frame)) - .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false)[0]) - .InformationalVersion; - UIVersionLabel.Text = String.Format("Lokinet version {0}", build); - lokinetd_fd1.Text = string.Empty; - logText = string.Empty; - lokiNetDaemon.OutputDataReceived += new DataReceivedEventHandler((s, ev) => - { - if (!string.IsNullOrEmpty(ev.Data)) - { - UpdateUI(ev.Data + Environment.NewLine); - } - }); - } - - private void btnConfigProfile_Click(object sender, EventArgs e) - { - //MessageBox.Show("not implemented yet", "error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); - UserSettingsForm f = new UserSettingsForm(); - f.ShowDialog(); - f.Dispose(); - } - - private void btnConnect_Click(object sender, EventArgs e) - { - string lokinetExeString; - - if (Program.platform == PlatformID.Win32NT) - lokinetExeString = String.Format("{0}\\lokinet.exe", Directory.GetCurrentDirectory()); - else - lokinetExeString = String.Format("{0}/lokinet", Directory.GetCurrentDirectory()); - - lokiNetDaemon.StartInfo.UseShellExecute = false; - lokiNetDaemon.StartInfo.RedirectStandardOutput = true; - //lokiNetDaemon.EnableRaisingEvents = true; - lokiNetDaemon.StartInfo.CreateNoWindow = true; - lokiNetDaemon.StartInfo.FileName = lokinetExeString; - lokiNetDaemon.Start(); - lokiNetDaemon.BeginOutputReadLine(); - btnConnect.Enabled = false; - TrayConnect.Enabled = false; - StatusLabel.Text = "Connected"; - isConnected = true; - NotificationTrayIcon.Text = "Lokinet - connected"; - btnDrop.Enabled = true; - TrayDisconnect.Enabled = true; - NotificationTrayIcon.ShowBalloonTip(5, "Lokinet", "Connected to network.", ToolTipIcon.Info); - } - - private void btnDrop_Click(object sender, EventArgs e) - { - lokiNetDaemon.CancelOutputRead(); - lokiNetDaemon.Kill(); - btnConnect.Enabled = true; - TrayConnect.Enabled = true; - btnDrop.Enabled = false; - TrayDisconnect.Enabled = false; - StatusLabel.Text = "Disconnected"; - NotificationTrayIcon.Text = "Lokinet - disconnected"; - isConnected = false; - logText = lokinetd_fd1.Text; - lokinetd_fd1.Text = string.Empty; - NotificationTrayIcon.ShowBalloonTip(5, "Lokinet", "Disconnected from network.", ToolTipIcon.Info); - - } - - private void lokinetd_fd1_TextChanged(object sender, EventArgs e) - { - if (Properties.Settings.Default.autoScroll) - lokinetd_fd1.ScrollToCaret(); - else - return; - } - - private void btnHide_Click(object sender, EventArgs e) - { - Hide(); - if (isConnected) - NotificationTrayIcon.ShowBalloonTip(5, "Lokinet", "Currently connected.", ToolTipIcon.Info); - else - NotificationTrayIcon.ShowBalloonTip(5, "Lokinet", "Currently disconnected.", ToolTipIcon.Info); - } - - private void NotificationTrayIcon_MouseDoubleClick(object sender, MouseEventArgs e) - { - if (!Visible) - { - Show(); - } - } - - private void btnAbout_Click(object sender, EventArgs e) - { - AboutBox a = new AboutBox(); - a.ShowDialog(this); - a.Dispose(); - } - - private void saveLogToFileToolStripMenuItem_Click(object sender, EventArgs e) - { - if (isConnected) - MessageBox.Show("Cannot dump log when client is running.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - else - { - if (logText == string.Empty) - { - MessageBox.Show("Log is empty", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - if (ld == null) - ld = new LogDumper(logText); - else - ld.setText(logText); - - ld.CreateLog(config_path); - MessageBox.Show(string.Format("Wrote log to {0}, previous log rotated", ld.getLogPath()), "Lokinet", MessageBoxButtons.OK, MessageBoxIcon.Information); - logText = string.Empty; - } - } - - private void aboutToolStripMenuItem_Click(object sender, EventArgs e) - { - AboutBox a = new AboutBox(); - a.ShowDialog(); - a.Dispose(); - } - - private void exitToolStripMenuItem_Click(object sender, EventArgs e) - { - Application.Exit(); - } - - private void TrayDisconnect_Click(object sender, EventArgs e) - { - btnDrop_Click(sender, e); - } - - private void TrayConnect_Click(object sender, EventArgs e) - { - btnConnect_Click(sender, e); - } - - private void showToolStripMenuItem_Click(object sender, EventArgs e) - { - Show(); - } - } -} diff --git a/ui-win32/UIMain.resx b/ui-win32/UIMain.resx deleted file mode 100644 index 4717dd0a4..000000000 --- a/ui-win32/UIMain.resx +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 179, 17 - - - - - AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEgccHBygHBwcmRISEgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvgEkMIjYpvBwcHP8cHBz/HBwcuBQUFAwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANpdVGEW+bM00fUv/HB0c/xwcHP8cHBz/HBwcyRYW - FhUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADujXCZFvmzdRb5s/0W9a/82hE/4HBwc+Rwc - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTBxwcHKAcHBypFRYWCgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA//////////////////w////4H///8A///+AH///AA///gYH//wPA//4E - IH/8CBA//BAIP/wAAD/8AAA//AGAP/wBgD/8AAA//AAAP/wQCD/8CBA//gQgf/8DwP//gYH//8AD///g - B///8A////gf///8P/////////////////8= - - - - - AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEgccHBygHBwcmRISEgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvgEkMIjYpvBwcHP8cHBz/HBwcuBQUFAwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANpdVGEW+bM00fUv/HB0c/xwcHP8cHBz/HBwcyRYW - FhUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADujXCZFvmzdRb5s/0W9a/82hE/4HBwc+Rwc - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTBxwcHKAcHBypFRYWCgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA//////////////////w////4H///8A///+AH///AA///gYH//wPA//4E - IH/8CBA//BAIP/wAAD/8AAA//AGAP/wBgD/8AAA//AAAP/wQCD/8CBA//gQgf/8DwP//gYH//8AD///g - B///8A////gf///8P/////////////////8= - - - \ No newline at end of file diff --git a/ui-win32/UserSettings.Designer.cs b/ui-win32/UserSettings.Designer.cs deleted file mode 100644 index 3fff3c706..000000000 --- a/ui-win32/UserSettings.Designer.cs +++ /dev/null @@ -1,137 +0,0 @@ -namespace network.loki.lokinet.win32.ui -{ - partial class UserSettingsForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.btnOK = new System.Windows.Forms.Button(); - this.btnBoot = new System.Windows.Forms.Button(); - this.btnDumpLog = new System.Windows.Forms.Button(); - this.btnVSettings = new System.Windows.Forms.Button(); - this.btnEditCfg = new System.Windows.Forms.Button(); - this.btnNewCfg = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // btnOK - // - this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btnOK.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnOK.Location = new System.Drawing.Point(109, 167); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 0; - this.btnOK.Text = "Close"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // btnBoot - // - this.btnBoot.Location = new System.Drawing.Point(13, 13); - this.btnBoot.Name = "btnBoot"; - this.btnBoot.Size = new System.Drawing.Size(270, 23); - this.btnBoot.TabIndex = 1; - this.btnBoot.Text = "Bootstrap Client from Web..."; - this.btnBoot.UseVisualStyleBackColor = true; - this.btnBoot.Click += new System.EventHandler(this.btnBoot_Click); - // - // btnDumpLog - // - this.btnDumpLog.Location = new System.Drawing.Point(13, 43); - this.btnDumpLog.Name = "btnDumpLog"; - this.btnDumpLog.Size = new System.Drawing.Size(270, 23); - this.btnDumpLog.TabIndex = 2; - this.btnDumpLog.Text = "Save Log..."; - this.btnDumpLog.UseVisualStyleBackColor = true; - this.btnDumpLog.Click += new System.EventHandler(this.btnDumpLog_Click); - // - // btnVSettings - // - this.btnVSettings.Location = new System.Drawing.Point(13, 73); - this.btnVSettings.Name = "btnVSettings"; - this.btnVSettings.Size = new System.Drawing.Size(270, 23); - this.btnVSettings.TabIndex = 3; - this.btnVSettings.Text = "Display Settings..."; - this.btnVSettings.UseVisualStyleBackColor = true; - this.btnVSettings.Click += new System.EventHandler(this.btnVSettings_Click); - // - // btnEditCfg - // - this.btnEditCfg.Location = new System.Drawing.Point(13, 102); - this.btnEditCfg.Name = "btnEditCfg"; - this.btnEditCfg.Size = new System.Drawing.Size(270, 23); - this.btnEditCfg.TabIndex = 4; - this.btnEditCfg.Text = "Edit Configuration File..."; - this.btnEditCfg.UseVisualStyleBackColor = true; - this.btnEditCfg.Click += new System.EventHandler(this.BtnEditCfg_Click); - // - // btnNewCfg - // - this.btnNewCfg.Location = new System.Drawing.Point(12, 131); - this.btnNewCfg.Name = "btnNewCfg"; - this.btnNewCfg.Size = new System.Drawing.Size(270, 23); - this.btnNewCfg.TabIndex = 5; - this.btnNewCfg.Text = "New Configuration File..."; - this.btnNewCfg.UseVisualStyleBackColor = true; - this.btnNewCfg.Click += new System.EventHandler(this.BtnNewCfg_Click); - // - // UserSettingsForm - // - this.AcceptButton = this.btnOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnOK; - this.ClientSize = new System.Drawing.Size(295, 202); - this.ControlBox = false; - this.Controls.Add(this.btnNewCfg); - this.Controls.Add(this.btnEditCfg); - this.Controls.Add(this.btnVSettings); - this.Controls.Add(this.btnDumpLog); - this.Controls.Add(this.btnBoot); - this.Controls.Add(this.btnOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "UserSettingsForm"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Settings"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Button btnBoot; - private System.Windows.Forms.Button btnDumpLog; - private System.Windows.Forms.Button btnVSettings; - private System.Windows.Forms.Button btnEditCfg; - private System.Windows.Forms.Button btnNewCfg; - } -} \ No newline at end of file diff --git a/ui-win32/UserSettings.cs b/ui-win32/UserSettings.cs deleted file mode 100644 index 53df671e3..000000000 --- a/ui-win32/UserSettings.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Windows.Forms; - -namespace network.loki.lokinet.win32.ui -{ - public partial class UserSettingsForm : Form - { - public UserSettingsForm() - { - InitializeComponent(); - if (Program.platform == PlatformID.Win32NT) - config_path = Environment.ExpandEnvironmentVariables("%APPDATA%\\.lokinet"); - else - config_path = Environment.ExpandEnvironmentVariables("%HOME%/.lokinet"); - } - - private string config_path; - private LogDumper ld; - - private void btnOK_Click(object sender, EventArgs e) - { - this.Close(); - } - - private void btnBoot_Click(object sender, EventArgs e) - { - dlgBootstrap b = new dlgBootstrap(); - b.ShowDialog(); - b.Dispose(); - } - - private void btnDumpLog_Click(object sender, EventArgs e) - { - if (main_frame.isConnected) - MessageBox.Show("Cannot dump log when client is running.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - else - { - if (main_frame.logText == string.Empty) - { - MessageBox.Show("Log is empty", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - if (ld == null) - ld = new LogDumper(main_frame.logText); - else - ld.setText(main_frame.logText); - - ld.CreateLog(config_path); - MessageBox.Show(string.Format("Wrote log to {0}, previous log rotated", ld.getLogPath()), "LokiNET", MessageBoxButtons.OK, MessageBoxIcon.Information); - main_frame.logText = string.Empty; - } - } - - private void btnVSettings_Click(object sender, EventArgs e) - { - VisualSettings v = new VisualSettings(); - v.ShowDialog(); - v.Dispose(); - } - - private void BtnEditCfg_Click(object sender, EventArgs e) - { - try { - Process.Start(string.Format("{0}/lokinet.ini", config_path)); } - catch - { - MessageBox.Show("No existing config found"); - BtnNewCfg_Click(sender, e); - } - - } - - private void BtnNewCfg_Click(object sender, EventArgs e) - { - if (File.Exists(string.Format("{0}/lokinet.ini", config_path))) - { - DialogResult resp = MessageBox.Show("WARNING: This will overwrite your existing config file, Continue?", "Lokinet", MessageBoxButtons.YesNo, MessageBoxIcon.Question); - switch(resp) - { - case DialogResult.Yes: - File.Delete(string.Format("{0}/lokinet.ini", config_path)); - break; - case DialogResult.No: - return; - } - } - - string lokinetExeString; - - if (Program.platform == PlatformID.Win32NT) - lokinetExeString = String.Format("{0}\\lokinet.exe", Directory.GetCurrentDirectory()); - else - lokinetExeString = String.Format("{0}/lokinet", Directory.GetCurrentDirectory()); - Process p = new Process(); - p.StartInfo.FileName = lokinetExeString; - p.StartInfo.Arguments = "-g"; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.UseShellExecute = false; - p.EnableRaisingEvents = true; - p.Exited += new EventHandler(msg); - p.Start(); - } - - private void msg(object sender, EventArgs e) - { - MessageBox.Show(string.Format("Created new config file at {0}/lokinet.ini", config_path), "Success", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); - } - } -} diff --git a/ui-win32/UserSettings.resx b/ui-win32/UserSettings.resx deleted file mode 100644 index 5ea0895e3..000000000 --- a/ui-win32/UserSettings.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ui-win32/VisualSettings.Designer.cs b/ui-win32/VisualSettings.Designer.cs deleted file mode 100644 index 8d3563e62..000000000 --- a/ui-win32/VisualSettings.Designer.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace network.loki.lokinet.win32.ui -{ - partial class VisualSettings - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.btnOK = new System.Windows.Forms.Button(); - this.btnCancel = new System.Windows.Forms.Button(); - this.ToggleAutoScroll = new System.Windows.Forms.CheckBox(); - this.SuspendLayout(); - // - // btnOK - // - this.btnOK.Location = new System.Drawing.Point(104, 135); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 0; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // btnCancel - // - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(186, 135); - this.btnCancel.Name = "btnCancel"; - this.btnCancel.Size = new System.Drawing.Size(75, 23); - this.btnCancel.TabIndex = 1; - this.btnCancel.Text = "Cancel"; - this.btnCancel.UseVisualStyleBackColor = true; - // - // ToggleAutoScroll - // - this.ToggleAutoScroll.AutoSize = true; - this.ToggleAutoScroll.Location = new System.Drawing.Point(13, 13); - this.ToggleAutoScroll.Name = "ToggleAutoScroll"; - this.ToggleAutoScroll.Size = new System.Drawing.Size(172, 17); - this.ToggleAutoScroll.TabIndex = 2; - this.ToggleAutoScroll.Text = "Scroll log window automatically"; - this.ToggleAutoScroll.UseVisualStyleBackColor = true; - // - // VisualSettings - // - this.AcceptButton = this.btnOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnCancel; - this.ClientSize = new System.Drawing.Size(365, 170); - this.ControlBox = false; - this.Controls.Add(this.ToggleAutoScroll); - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnOK); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "VisualSettings"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Display Settings"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.Button btnCancel; - private System.Windows.Forms.CheckBox ToggleAutoScroll; - } -} \ No newline at end of file diff --git a/ui-win32/VisualSettings.cs b/ui-win32/VisualSettings.cs deleted file mode 100644 index 1151e5094..000000000 --- a/ui-win32/VisualSettings.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace network.loki.lokinet.win32.ui -{ - public partial class VisualSettings : Form - { - public VisualSettings() - { - InitializeComponent(); - ToggleAutoScroll.Checked = Properties.Settings.Default.autoScroll; - } - - private void btnOK_Click(object sender, EventArgs e) - { - if (ToggleAutoScroll.Checked) - Properties.Settings.Default.autoScroll = true; - else - Properties.Settings.Default.autoScroll = false; - Close(); - } - } -} diff --git a/ui-win32/VisualSettings.resx b/ui-win32/VisualSettings.resx deleted file mode 100644 index 7080a7d11..000000000 --- a/ui-win32/VisualSettings.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ui-win32/dlgBootstrap.Designer.cs b/ui-win32/dlgBootstrap.Designer.cs deleted file mode 100644 index af6f80780..000000000 --- a/ui-win32/dlgBootstrap.Designer.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace network.loki.lokinet.win32.ui -{ - partial class dlgBootstrap - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(dlgBootstrap)); - this.label1 = new System.Windows.Forms.Label(); - this.uriBox = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.btnDownload = new System.Windows.Forms.Button(); - this.btnCancel = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // uriBox - // - resources.ApplyResources(this.uriBox, "uriBox"); - this.uriBox.Name = "uriBox"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // btnDownload - // - resources.ApplyResources(this.btnDownload, "btnDownload"); - this.btnDownload.DialogResult = System.Windows.Forms.DialogResult.OK; - this.btnDownload.Name = "btnDownload"; - this.btnDownload.UseVisualStyleBackColor = true; - this.btnDownload.Click += new System.EventHandler(this.button1_Click); - // - // btnCancel - // - resources.ApplyResources(this.btnCancel, "btnCancel"); - this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Name = "btnCancel"; - this.btnCancel.UseVisualStyleBackColor = true; - this.btnCancel.Click += new System.EventHandler(this.button1_Click_1); - // - // dlgBootstrap - // - this.AcceptButton = this.btnDownload; - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnCancel; - this.ControlBox = false; - this.Controls.Add(this.btnCancel); - this.Controls.Add(this.btnDownload); - this.Controls.Add(this.label2); - this.Controls.Add(this.uriBox); - this.Controls.Add(this.label1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "dlgBootstrap"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox uriBox; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Button btnDownload; - private System.Windows.Forms.Button btnCancel; - } -} \ No newline at end of file diff --git a/ui-win32/dlgBootstrap.cs b/ui-win32/dlgBootstrap.cs deleted file mode 100644 index 5ae172a4c..000000000 --- a/ui-win32/dlgBootstrap.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Net; -using System.Net.Security; -using System.Reflection; -using System.Security.Cryptography.X509Certificates; -using System.Windows.Forms; - -namespace network.loki.lokinet.win32.ui -{ - public partial class dlgBootstrap : Form - { - public dlgBootstrap() - { - InitializeComponent(); - if (Program.platform == PlatformID.Win32NT) - default_path = Environment.ExpandEnvironmentVariables("%APPDATA%\\.lokinet"); - else - default_path = Environment.ExpandEnvironmentVariables("%HOME%/.lokinet"); - label2.Text = String.Format("This file is automatically saved as {0}{1}{2}.", default_path, Path.DirectorySeparatorChar, rcName); - } - - private WebClient wc; - private string default_path; - private const string rcName = "bootstrap.signed"; - - private void button1_Click(object sender, EventArgs e) - { - Directory.CreateDirectory(default_path); - var build = ((AssemblyInformationalVersionAttribute)Assembly - .GetAssembly(typeof(main_frame)) - .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false)[0]) - .InformationalVersion; - // add something more unique, this is the IE 5.0 default string - try - { - ServicePointManager.ServerCertificateValidationCallback += cert_check; - ServicePointManager.SecurityProtocol = (SecurityProtocolType)48 | 0 | (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072; - wc = new WebClient(); - wc.Headers.Add("User-Agent", string.Format("Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0); lokinet-win32-managed-ui/{0}", build)); - wc.DownloadFile(uriBox.Text, string.Format("{0}{1}{2}", default_path, Path.DirectorySeparatorChar, rcName)); - MessageBox.Show("LokiNET node bootstrapped", "LokiNET", MessageBoxButtons.OK, MessageBoxIcon.Information); - DialogResult = DialogResult.OK; - } - catch (Exception ex) - { - string lokinetExeString; - Process lokinet_bootstrap = new Process(); - - if (Program.platform == PlatformID.Win32NT) - lokinetExeString = String.Format("{0}\\lokinet-bootstrap.exe", Directory.GetCurrentDirectory()); - else - lokinetExeString = String.Format("{0}/lokinet-bootstrap", Directory.GetCurrentDirectory()); - - lokinet_bootstrap.StartInfo.UseShellExecute = false; - lokinet_bootstrap.StartInfo.CreateNoWindow = true; - lokinet_bootstrap.StartInfo.WorkingDirectory = Directory.GetCurrentDirectory(); - lokinet_bootstrap.StartInfo.FileName = lokinetExeString; - lokinet_bootstrap.StartInfo.Arguments = string.Format("--cacert rootcerts.pem -L {0} --output \"{1}{2}{3}\"", uriBox.Text, default_path, Path.DirectorySeparatorChar, rcName); - lokinet_bootstrap.Start(); - lokinet_bootstrap.WaitForExit(); - if (lokinet_bootstrap.ExitCode == 0) - { - DialogResult = DialogResult.OK; - MessageBox.Show("LokiNET node bootstrapped", "LokiNET", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - else - { - MessageBox.Show(string.Format("An error occured while downloading data. {0}", ex.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); - DialogResult = DialogResult.Abort; - } - } - Close(); - } - - private bool cert_check(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) - { - // If the certificate is a valid, signed certificate, return true. - if (error == System.Net.Security.SslPolicyErrors.None) - { - return true; - } - - MessageBox.Show(string.Format("X509Certificate [{0}] Policy Error: '{1}'", - cert.Subject, - error.ToString()), "SSL Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); - - return false; - } - - private void button1_Click_1(object sender, EventArgs e) - { - DialogResult = DialogResult.Cancel; - Close(); - } - } -} diff --git a/ui-win32/dlgBootstrap.resx b/ui-win32/dlgBootstrap.resx deleted file mode 100644 index d1152d86d..000000000 --- a/ui-win32/dlgBootstrap.resx +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - True - - - - 13, 13 - - - 196, 13 - - - 0 - - - Enter a URI to a node to bootstrap from: - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - - Left, Right - - - 12, 29 - - - 520, 20 - - - 1 - - - https://seed.lokinet.org/lokinet.signed - - - uriBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - 12, 52 - - - 347, 13 - - - 2 - - - This file is automatically saved as $APPDATA\.lokinet\bootstrap.signed. - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - Bottom - - - 196, 75 - - - 75, 23 - - - 3 - - - OK - - - btnDownload - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Bottom - - - 278, 75 - - - 75, 23 - - - 4 - - - Cancel - - - btnCancel - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - True - - - 6, 13 - - - 548, 111 - - - CenterParent - - - bootstrap from web... - - - dlgBootstrap - - - System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ui-win32/loki-sidebar.png b/ui-win32/loki-sidebar.png deleted file mode 100644 index 6e77dc2f6c02ee6974bf6836fb5ab622322d08ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19733 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 diff --git a/ui-win32/lokivpn.csproj b/ui-win32/lokivpn.csproj deleted file mode 100644 index ed2e1ea9c..000000000 --- a/ui-win32/lokivpn.csproj +++ /dev/null @@ -1,131 +0,0 @@ - - - - - Debug - AnyCPU - {1CDEE73C-29C5-4781-BD74-1EEAC6F75A14} - WinExe - network.loki.lokinet.win32.ui - lokinetui - v2.0 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - - - lokinet.ico - - - - - - - - - - - - Form - - - AboutBox.cs - - - - Form - - - dlgBootstrap.cs - - - - Form - - - UserSettings.cs - - - Form - - - UIMain.cs - - - - - Form - - - VisualSettings.cs - - - AboutBox.cs - - - dlgBootstrap.cs - - - UserSettings.cs - - - UIMain.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - VisualSettings.cs - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - $(SolutionDir)versioning\NetRevisionTool /info /patch "$(ProjectDir)" -$(SolutionDir)versioning\release.bat - - - $(SolutionDir)versioning\NetRevisionTool /restore "$(ProjectDir)" -$(SolutionDir)versioning\unpatch.bat - - diff --git a/ui-win32/lokivpn.sln b/ui-win32/lokivpn.sln deleted file mode 100644 index 172bf9bf4..000000000 --- a/ui-win32/lokivpn.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.102 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lokivpn", "lokivpn.csproj", "{1CDEE73C-29C5-4781-BD74-1EEAC6F75A14}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1CDEE73C-29C5-4781-BD74-1EEAC6F75A14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1CDEE73C-29C5-4781-BD74-1EEAC6F75A14}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1CDEE73C-29C5-4781-BD74-1EEAC6F75A14}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1CDEE73C-29C5-4781-BD74-1EEAC6F75A14}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {43867E52-9394-4EFC-A8FA-4382447D4B24} - EndGlobalSection -EndGlobal diff --git a/ui-win32/versioning/NetRevisionTool.exe b/ui-win32/versioning/NetRevisionTool.exe deleted file mode 100644 index a8c03a675976987847c5a692a4a07822ebb674b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66048 zcmdpfd0^aCwg3HoXXZO=mdPYD*)v_zPBTepn=VOPTGA#hf$r(vLOV^S>Cj2O>31ew zC@n3Uf`Akdp$M;lD54?=`osl`A`e7;prWEs!N)^EeIg>lQ_Jsj&i#I8$x@d0-ao&< zobNs7-h1x3=bn4+x%azt*{17+O$cGf@7;HW_!_SCcNW9bgTu%!towSQc*y<3abHuG z{&3uyorzR<(9rvgSbw-DHZY*4!`tIwV`w0p7zlT)=nnVmz47LP0?$N~^~z2mmMS(8 ze(>lPtF;$}s(6*DLc9fvM^euTC_;ph4&zGFQCgL9BgOL5Rcu2(==5h3XI(BtG5?>v zny4%y-Y!wZ3QB|TVa+7wUd~d45BLecBC2!g@0AV<;mRrF0)BQ5-kgr_O9MaqO#tL^ zUro7z@n0CdX*N~C&VGhd4M$#+( zNH$eCMDLIg-@J-+Cq$bNT39IJxSvYAzrVm#o7jw^;ObW+B^bXZj~WTkRaG0*R4Gy( zO)tZxu~}aAAdm$bAUac}PXgh2O^pE2nru~3 zrSc#Kz-&J?8M)q&a{2sm1|Q^y?o6kzE&7^Z;c*9=HD7(vH8jn1I2bpeXF+G?nv zWaVhfU7j%_PffOBW5YTE3|>Df{YfpX3+1_n=NiqX@2J^?emZ# zbq44WXfzt|_&rU7+1xK?a-pDT1j8K-6sQqQb*-`5U!b?3VrW{4QG~Afwa5&hshI#5 znq}N(nWhpWKD>y(AgIqmS!z?ikvLW%aWf@KjE{^c?a{A8)-|klZ!l08-Q;&S`utvh zq2GNc`XBXD+NsY5%R4D~tZ91XHJE(Rmhls?yR$yzFAQzCdOk>Z)|VT9V_Jn@yED?7 zk(){c3c*u0H~m(>$L~$ug_Z+8zbC{-<@eO<$B0toFM^)Qz);G^HimjP0dFie6ClG8 zc%o7D09hmS|~+`%@o;5Znmo!oudF(46c4`R=@RL~`irH- z$`Lvg1IzlR(4<4#kT|71fR=eI>km^7k7$9rvD$!}8g%Q|B0H$h1M8fDYG}ux!CJ*C z{9xu{KYoSy(I3&jgx?Sn6Cpnw5C4&$+HR(0Pns}?Jm4>}L&(e(?8_t=4A)bCm~zN| zqKA6&%RESBFg7SdIploggvZn(zjC43UgRw5Ks$iGkia5BJ1Er&5PtQaLNu?*61cd& znDUnpfUEX2&lo$ui}FjkmeB>ZrOu&R)JOx#VH3L`2PT7`+_Toy!<;;kb5Xz>Sqd0g z24Jj3)yQ%}DaRSw(5z{kBk_&F2-Z!Hk1^NA$Vwn}VOI)+;K^1qGa9)6YtSy{pZ{Vg z&mLKgf=x|zZ$&Wkvu2zYs1rxc`! z&sO%^8U9dwhW}sl`Ac*Z{#54>fwB3+lL<&*>TM$TT;1T&f@i2fj}}=AL8iO-650ry zG}7=@spN3bRFIjSRg=tUh^(X1(oPnm9Z2GjtOv~#*#PKOeZhigt;?-%1QxK{{C0g4 zQkYNn2;9BL9okUfcIj}ip6SnNk@IkMM$QLho(_R=rO-jj-e|8|8FfUqBHN>eEPw2| zP2UEJH|UGjI$g(tOxH0DJ(?|o)mYIR6k{WqB}#Z2wFqXSry=OEH`c1gX3!}BLUd6EOD*5vi3Wn6 zXpt7$;88VJTV1&M&s^WD1*f^|!Wxf)mq}2sEwnLU_uEye#A12Hf*khSWlnIKPleuT z1nR;qulnsx4zA;pLiLhRE|-&Clh36FQMMU07Bhmy!{Y;|4U+E}alF$#t=7%i8w$!OSk#PvvG_=wyW3bciU>`1r)~NJ%r&p5rus0RpQZYg2{Wb~2!Gl^H!MxTkKs8ESGRR-@_g`kxD`dKJXf2LSAnkHDz z&`o>kDaF3EF=V_132ep$6?2FTvL-bhMJ|+O8ZqFA3$=y@s}A}cnCcW)f@cBbFs7iM z%rm+y7QqNsdem$J#6*jnL6{nWezk*;4RI*JCO3LaiD=MR!CVO8nPM`K#gv8=dZu}u zb{+C*s?$+uFLV@Yh0e${!Xr}wDf-96qEMXIm5I1w{lI>s5mb2I5_GM}DJ9Lw#3J!J zanLHys)?jgS|0-NXvQtnE%5a;6=}vD8KffGtQwyKdJyAbSB)=H5-PDbsKx_X@>eos z<6$JF09pRr-8#3_Im>PrSK&&3s?8{{i9urmKx7XDI7q{0a^U_1QDhMn**InqKZ-B| zOxKYND3|Mwn(I_cxk+@M{5q^uV2EIQ(5&4P^hVFqoX4unV9(eO84!)C2S^_jihhI% z73u-f%ANI5BrQvPt?P;*W(vz>oOrN9~&#vreitQC}7sSh4!}Vpc-e> ztXu(tk*iS|0pvBfG*%fdO$<7DYh}zrGIA}*(t4b5-ARz7xj4ggPByK*%G#Oz23eR3 zvM$X9yORhNT<+@CPzKEh>;^C&Xq#5&mGTF%9siO8CTDMRsn8_PG{56ClkB);{GOAn z?ICp6;#Y0TDd$}%JMSQK-dv>ViD=+Fml%YJ44Qd3KL$d9_DN1p>Zb4 zSM;|Ed)*VbV&mhN`;{u*o7e4&VBPXWjuKcw;CcdQ0puL)+(0yhVOj*Cmll~r01LAg z^qd^@I_X#v(L@VTYXCeaH~WnLhEiPmC#d2K0J*YfX88C58Y|3js!HqGawb%`=v>gF zf0C({#u}n>fQOhsvPMWwF#-K8UoOh92g16BbdT6f;X>6^m)MB~uN3`EVPl9;-Piyw zItps#R%p3hHgD{ptNt&@@@mEfRx#_i(YP>^?bD1)tn32KxYkMs?3!^bgE%zf-VCB? z#@8~4Q!~DkL0p>g%M9YyjF*9gbeuwH0Z98sCJQpDg_$gfPy&oQl96x{D6#_qh}AJ7 ze?vCEP%{RBnGIp#JdXvTfnN&(IIW+tmt(>)N`&1cbv>tJt( z2sEB&`~YS6CdDBg1U`8kK;o44Rg_O*_Tli7a_DYI^w3~_nSZ4+w{RKCq2tmhTaa|| zCw*)(AsOB{kUvDBtOg=9t2MR*Uqp#2GofEBbE!%d*}A8x#!!plWhEOUjI`XUNTuRt z1am3_gJs0YXUs>DDl@lG<_3`qf1x!N7+*#%jyI+QyRbA+Zrz?}MuO#J^@mL?P;Qj? z(Rg{zptd4B7Dg+`a(GGuRhHH^u+{?A{^}rW4mnkNJ+<3}1a<)$8Z2*&`h(XdLer)j z_Y&{w;X9^ig>e!YGPusu`*Bn*F>uO}FOk2zDUJ?OXdj$bYMhOHDVp&(l7aH*66AIw zH*%a5I@!dGUm!Pf2a!sR-()Lo2ymqmBZ-8`hz=PcdqAqQ$WKXD*KV+F@Rv%u3yLzB zV3&k_evK1NKEJenKEMtJYD~JnW?P`v%%XIirO8=2_J_to{#t*X-^;uZiPMOKlV46} z+6?B~=Xd0xNj*9mr@V3w8F+=}eWDOsmAyYxeB^`aTs4gmErSo1J|QWOnQ@ZYX-5Wm zY|LxgxCtEbiD)aV;AXZ!_hYG@lu#z!nR+ zKXNCU!g(7`I<#vW7t2KOSmp*{m~Ie`zfHf3ifNHg)6hA!$lZ))N}WNawwQaysMmNb zJB-z(bRa-WoE%s4oa{f*eh}@KdW^GBLgqylKnk3Fw_bu=98(tXZDZ?Y$>DCW}P2-uye}O3D4!2rj*N+f&vT;tCMYS~+88-rxjr;9516Fl3 zt$Csa)=Bt+A)NhcO*4(3qM)1~sU8%mHzo$L*es@G3pXI&y#&N2#2RtJ8pmsfGXS2_^1bDS{6v1P3{+w~K`sYvz?sP#YQ^LHp z?=!9e%{oP75A5O74X^P6GE}3e-1J|vpDNul_V}XfTzuMLoI%;22dTgIr$*P zJVUu$Z2zr1zo2_`8!`Ij&{OJ*sO5>=2dIAufbNRSCbMws_Y=R#PvfLTjXZ#~TmLd( zW0^bhAg*bmBlLhs4*|8ta{6~Q{VTvR2NCbt_+DTI%>in`2vuM_u>!-)gP|0bS&ujM zH9#NY+J|v<1uqEdUq@n+EAg>)!_;nhw?+>KBn_dG`jnKPv9 zp*93jFf&v!TU4%+{Z~bun77$VSBRx?D_tzM>Xwdd;!X4cuEEb|Hy(!OO%zTSL>_@W zPdm^6>nEsx8#vusX)N{QiHIV1&cw}+U>5Egg{wRujWpU@}i&M7#9TfM; z;)pO$Ck$ol-$ii*YINtp$!jiqP**SlU!l3>rQupN+ym`4`_=FcTwDBgMeP294K?O9 zM9-UyM|i}~n{Wbz2^N79ARyF`B{%^>y+z;z2w*QuZ~}zM7J(BWL@WX)K$v0?H~|7i zS@Pfn2vLi`2@o1B0w+LdvIv|2q1hsE0)#Ux0w+M2Y7scWXYz;=`A>~>LVHbK^WMy2 zAZlb)E@?HBx^qcun6x&Rw2n#Zb4eSRgbABvzllkkb4gp6bY3p$d?3&VY> ziONIM2$oF$OJ}fK3RS&E9N0|ZVJuG8Fb%rAi z2+mxOWa(sN89JV= zv${zpnW0~rrPF-K&~M1nY4&93cYz*xDytwdr_drLNv83d6 zIXY2RVKwCyW=iBr9zwGrGDL4=Heh3!)A$QXa|iMpUCt0cW9GFPwi}Ci2lOtc-cxvKi~C;wddLEW_kQ{=(;qkkT4U zOiwg3Py$BL5CjgUfkfE-20e^N79+?GUMrN!bkN0eDLknnQ*9 z%|cYec>qn?BRY|2QKI|!ZiFMX#wB&bMmMHa zjNVhLlR2ZCZGWVyWgeNE7A`In;vku4>&pm$RO83P8g2V{R>Q``uo$%3%2B8h0bN=W z>9ejl;0WOqvJupbYDN_;Ps976gSM>@Vl07KHS<}@snp=-QNc9)wr{)-DX-3xQnqc1 zMQu0P>#Cz_-Nb-7@cCJ#$b#ACcPhtxv-*~dP4nPRT}8s>k@LqpnpBPJhV`g%sX3*j z(q(N^=ccqpc&K`~M5C%X>N6e#`wF?|bs7I@m7|f#_n^@C9qjHo5;_f^@j=iOAg57*(^tTs-e2TIun45I%Lq6Z7VtD>Fa#^n^uoF=>fTEa!d+ z>DG5;<`@6_%R@6KA;XZ!v*_ix1Ui&VsAgvXgSJ%_2El+;Lu`e!P8L{g_`sJ|!bE=ir2q5daP@fa=f z?Z{A{C+Y%8U7n%-gs4*_bwh^weWKDE8sM-!Lw%H}{{#SaXNHPEShW6DQU^0s))uSJ zW$epP5oe25nmoi8_cVC$=iElry8$%gFp3_em9F&;#;?!dM;X5-gCAl15etu|HRA^v zq)#(WW{^#q@p=YXhWjVu%{HQEX@)O@v}i_o2AQN86EjGKW=zc>K4TWrrg2MS3^luD zqP%54-b7&k=64#Gp`5ht9$@62B!-jNZ0DQC0sCmC=_OM))HqkOvNchpUs<}zMP2&K< z?}+>u(<-x9y%nmi!Oc$db9U%P4ahVW1~?`w($p4*#ZQ_au^MWQ}eS&OMkC*<0M2XHfm%}0)> z{zzEeL=W*!ku$0~<91VR1t;B7YXv8T+tS(jqV^&z1FSPUKU<4&vh37mm*&YjqjQMg zK<)(2EMye@AHc|NY+?cWHj(T`X1t6HoQF<#Y5XKrW?(ITV5KD^aIzk+C6o80a9T3e ziLx14nP76Fo_SvY|K{Ow_sY5Ib7i&wh`I&lpIDAxbgNCv3HDz>J2c?%uy|Z=5%T8p zM4bmnkHl%-Xfud3qw}%`I4giGDyhkEe~^ey79#RHFvM-Vufj!C%B8wQG5$cF=vCwx zr4x{%)s;^pp}p6Th9L5+iHgV@J&-tn_tHX&5Rd2W-OZ)9aAKOV8NT z$#Y%lf)3nFX?TV2mmHpkUe{I27ayKp0fZl%KTJNkZlXy>KTI-t291X@MdS@7yKPmd!Nzw)aI_UUPNn|UcpRl+^}pg0c?$qrS27#8FyYb>PYV*@88~i$h{toaaWd1j<@<@`$YYx4CW!ya} zV+La={#BItK-!K5a`kL#I7ha|7e^D!%|hW8Gv7fpiYC98Tyd26Kyu}X&{Q{yh?Xk1 zWL5c1sBF?`((0R0$hZw6$T+S{la$Yb!Yd#@NN0S73fu}N#*F<~SmtF#&$y8>q?Y?6eI)K2Xi~R!={P=Qd;tjy7~5{qN|`*z-7d z1ocryP);H|)%_8)BPTN6+m+{23pAuI1pA!R13Bl;N58Gi5mWhP)X=w~gxTC!7GZoB zO`g8<(dhrcU}uln-4YjvtBoEFk7=Au_Te>#(3Etc>$EyY6G;E7=-kQ4SpB=8(5vG^a}YE(8h$6gjcy!8o_Zi7 zp%jyj6-rRP@m#;lQ*#Z~zzfl1iYZx>X=Kr&oGGUSYA zG~qAEHJ&|WULS_>*M~FCGw(Cmys_ml4d+*sx(FsTR#)+UeQsCr2E5hP;`hNgu*}p9l=w?zU*`Br-bY{j)EA03 zbB9f9+9}odHnqaL9BwM$59Bsg>MymLDt#YK1y0-4tTXbOD)X1+HWl;-t)_zSqp7k{ zn`+p@ex=cCY@)^}2x%}5Ws-X$c!9uE+Z-@%wrExWhP}cuHR3?Ft^rgwJB`Ot2KRw! z+i{SzFW>IOM&xJ6z(t#i3*R^Dg*DQjQ3#S;5Ah}@oUV2d;V$+j1hF?c2iex%1n-{` zm3I^BfpaNY0dWs5;|c^>9jJ9lPOT8XN118wiA;N=>}Tdpg9?ZzKb8Bw_cM!8EpI=g ziKnoWoHBerW8*K!c%3%72kF5}3fH2ddhoY3~LElvJDCK?|t z3NU^{z02FSG|sbj9y#as`bvy~MISxT!Pshe_D^n;Xdlsd?Ry0f{0wZ9isz|4(@)bu z8en4{+!jAI`i_|VmP33G@h^@@IR1T%{MUQN zzgMBuhmL=7I3S&z`KEYd+sM$D%6!1kH%YO9be1Yb^8Z3TX`3-3sH78Im(ha^83aR< zGF;p3*K)(PjF{{^O<9}lrJm^7BV*v<@=8v$IOWE`d(mj#@;m1k33<&(AunMen`c@= zW+L^Z8L68KMn=dFDBtKY`f{|FFCR@jV-V#0$h`4j?luDZ1F6A2zl$}f9{8|w$@;_f zHgfOqX~-413bUh)HF(CX;S#nD*I;Jvko3!d|9_~#(RU3aHTbEFq^!%|jgT~7m)N^l zx|AOX`|!Gy_1{~UxjTk$&xS+G>=?cT*?F2{OEXfA_cL$3)ckW`nrl|kUcc9jpxI7n zv+x0Y0rRYB9mX>+cwREh7x0dO&4qUiSJK)rMpv;d`*2;HkfPiCVS%MQFthWf900F1W zvIHkKsdP4|HL0ZyGNs=`;>}U%BL$jG_aMMf8z$jWbjx6>0I9DgWmBh9*LnIz+oQVC=5#d5Tajz=yDx_y(NDvV z!mWnp)cvS&cpHl1c|sk&PiyqptXHWTf(;Ee9Zp=shjAKeZBn1jsjpC-0jjf@Klfte zFTL;`l7?9}el@@@vB&wlJ$CuvBMcg&a3Rbm=YTVN6O(Q(X$`*|UW0G?zGpSIZ=0Bj zt48)sp9?aZU2^(nH_|QE??WgI7tgy7!DB;)$Gy2NW6Pv9X?#8nJr3(Q#!`N-1fbnP8u;C(JTJ$ z5-XlQlEDvWSB)rStb%u98O`E!q|vaj`<#XFKP)R|f!H&nd1`aZ)Rt*&L~@8E;5`$B zm~aU1Mo$z1&*_K>-Dx8+(3heTSEHjFPoNT5@H6mx6hAly`W_#@8-`{DMvBW}o6Y`|WTiQI zj!7pT0sJVReuP_BDoZ$Bh4@x6r7;x3D4JEN39XpmwT0iTC=%N$iGF?2xn-L8Y9Yb3 zoc=t+KQjC$(`Rw|&cYDt{;=>$zb2Z>zEGu!$|8d4!g=E~ae2*}QcYYOTw>EiQh5<@ zW8tjI6=HJ*wKBfq36$LKp)v~zaey^*B1G*@<6e9Tl6!)ctHgOpkVf;$Fu{A6^Wh5OmUL6!Z{xmS%01m( zL43aNqTJO%YQ1>erOKbgT_GB^PokD4&Sg!`v#lv5OZpCsnk4&$>(Pco*#5~<|O0?KpYd1}JWRS0v7FnASMO<%f4Pn#x?tZb@&v`S&5Ob+@6PE=75hf-? zcL8CG2tzxc44qxwiSI7&5yydV0!B0KV$NH_dFO~rx!zOgdncYrxf+jA6pN3Q5w=QP z!`P2%3EL>{!q*au1;Phlo5klC`zd2v#J$2cu2_5vQ?*lU!_!$fVio5U2yr=Neu%M; zdkDLLuuRDT&MOvJI#F*oz6?$eBAyRfo)sza9mZ|}C5r(uF+2=c^_E!Oa1E`2Em%k2JAN~r${v8#M03P(d3CgxQg5Plwe5;bU_0~}O zXO6$&WMsGP@6L6H|5pAtz}Falx`NVCAHjER1UK6WK3_)g=PrUzR1 zE&xxzc(9IS`-Ao-;JFTx_D9ZBfSQxqz0dh~z?i1ukf)R3Aqy>kNKpo?^J2W#MUhKHODpfA8E zE8;rNUFVt(%1zE$fU4`qkoGgdIp|A)kNTBT<|F-8Wg+0ZfV0FS>N&2Um@k$C_KWp^ zuZeBkiv(o;M=%Lk86X%bAb3t8!4lA|p6;(31m&9yZ54yeGYvjp!Y*bveb(dctlJ z2XW)YDPA|RYu$v=-(hhyyrkebN?O>}p3k^k8SFgw7hGdF;}s;*~IqRpLPYr zXK_SNQa=#Fhg-!76I&JjIduP`iM7WD4?*Mb znyXr@W$YDYJhW6JwrBEw4eVmZUQ(JXBJlDOdqvq$@fxt3Wl8aax~G9Xk*W8(t5%dY zatp3g)z6Bs2un=(y>Gd~;wvWhibul}R3}Vqbxk|4*BLt^-rzjk;>6z(QROX0UTL$$ z7NBHATxViiy@Y+*#J(9M%yot=c^}s9h}dajPgWKKd&0zij&*v9*f3R=e5F!#PZ0}e z6GnO|aGxPoOUyOZUFx1DHZgX@b*8%lSPx@2xt{l*uTB>iFm}}Ss{gmjbYYlz-L@gM zMeH~8w%h95E#fknCvGmC=$;{xt<>I8;Vbv6GsWv?5_Xe#&fVa~q1=3#*H$vsJzKnP zVy}f~xm(4{3uNA_W%J#0g|A&=@#+ruJdrlB+k$>|o|w8&=Dk?T7%i%3@5MU1W1d*U z*cGn6&^hii#TFCW8(IM@Zeqcbc6f_^6RR&N2DZn<+@WpC0&&R1s_}5-0`UMa(3HL+gQTP#kQ z*q=~uiO@PoXIHpRq23ZvWMX?!?`#n=v5%nM*&=LWkNew2m!J=SQ@v;W#lWVS*k6j< z5r?#y*x!qbfh{yKn}3^ft~kfULViV@E7nL%{IXcX?&%*U_8CN}OY^+xQgO>-+1_Qg zE$*e_4io!?Ee7mf6FU!@UnU-sn7F_AKKn9pBW*xn6JPN6xtEJCFm^<=`TE@}#dYV( zymNeM_bPD@&S1zs7X>bKuNEuUNNi@{QukU>y;fqj!mHgI#1~BL?Sfm}=Zlr=WZo^+ z7rM8LkDAyu)t9>C;$;)N)LmfPDSohCmfTSMTjheh{_PTf!eI^MEWfV8ukIR_HwC9F zLOd?+g64OLsf@kiZpHZR60;?ye4+MPU^`9hSK&{)cZpw^*lXd>yZgmqY;Vcid@bBA z2E@8JVMoOQ^?Y?eq$TE>Tss8pddB2Bh64@$d%S?!%U}*_FN;xoS&Z5n6b~~ODfMn~ zf-x!eZt;Y~SnA!Pbq6)^ib7m=i+fCrxTM743n=f1xEE5V#i~KVq}1s=sncSR^Q6>i z@fc$_2z$u`?zH#^W0%77ebqfAYG|_x+x=4IH{E+hJ!3~)4_7`0tl7+ayLOwhPs}p& zymgA$Cl;7_mtz+17fZ~%8!?ObiHszrBn3*>RvK$mQnt9))}`{m%LOI zDM8QWLN~E*DeoZq`KXDVMBYclw@pk_-w_`bzhF$xoGbHMxKg}qmONVoJy(i%Ol+^H z_FRSg_SA<<@kNsHo{tG1W0K3&d0eg*IQRE}s+dPxEQB5ueqt#Zq&7jzhY-f6ykXf^Etts>%&AR zX;p!5cOpHthSFcM5jRH_4l2bfg>=SrJxXfgahyjv#Wg{zmLl4@7q6qI__v2p-p1wa zT;9RuHM4wf>$#ed=}o9>^|S>MHPWmxDcdsi(I)P%Ao_A{Q5m7(kv#wB6#Dmw6fuSM z_6oOn%1@MaEZYk_ntz8>Ht|Q+3ALz-T#7974EWfXZb!-DVuyIXq!_DhIdm)SL>2jE zh%W0AXPfW_vL$mVB#CNTnv`m&gls9v(n>pgKa^_jX|8>KQ0;ver-F*;z}bc(o&{9J zSv;n>e6C|Hg&B@ae;HPX(*%Z69!jg?8%#M;O1U2dI>dRfS^DoNPF*_iL9`B>99>nR z;8ciqhZTSx#OGI46yx-VU>n1BhFuI-G2F;723RH%oZb&ui4~Ff+`;fkhCZ?bn_xn!)9t+zPO1tq9sjDhN%1g?D+8V&Yf?0qU)U8lT#eZS_eMYIR zSteE~)QeKFu(Vfcy>vDpZ&{9s%XSg2xoMI?w-<@~SxD-UiC;pet%m@M*=b-Vcgj{TDz*rPkf*pKD$~$3W~&nWY&C#t>Z#Z*u_3TK1zZzbDMGEqJcl%ouuJftd0G<>`Ij&gnQ4W&(O#{S){ zK3;y0+777@zjGgxe2$jnbF?&%?32npr7xkC#pUg6EqzGW*8E9brM~U|s~S@u!tQs9 z(o!vK33XwqX4|dOD*u3Tceudzq_W%llKOyhCbaZ`^0nduTL*NaiC4vWwNEM2psPCD ze)Tul+;#8>PE$%spGCSRJlWQU+*aEv^-UMGcv;muqDyHgTwznxCoqD4MtXydB#GNd ztG|WD?uC{r)Ei4_ERL1Dfzf;cr>w?Cj3xzD%X$eOv4b#jOLb|7s}fZGB4Za_`M@F4pY_Lx!@xW-Pc zTw&j@e$Ca6b6J{Gcc@30f3WIy`xJ2l&JAU(Jp!4p0{t1-Lr5Y0KW6_k%Cw``S9s4?k0`$iZc~mZL%v_wk0`CRCjsyB{}yGM z3g5NAs@Tizjw$NhVYlN-B~djV@T!VQj-yIhO%otdjw-3D8Gyg6n2X$n#mgKtnyZm6 zsM!ek?-c~+m0jR?mD_zrd9`MbgS6c)rl`Lwz8rP$uAYlpclnP2HWl83@|RUptqW_u z1$Y#)T?wD_1k%*IE0xQc@^;^|8TV9ndzx{t@It^U#HY>pw`}eNj52HyUq^bb_y^!3QR8jKDMANe zw^#wVS!@C95!=0o#Q|_T!tgl5I~bl|_##6^r7}GXzsvAH7}{)1XLuLT@@C3sb843@VXE=`GSq$45Zeti@c$nc4hQ}G+ z!SDpbM;X4z@Fj-AOPm#kVTR)vp2e`8;Wmbc86IbNg5iq{g^zp6@HoSli!KGv6Mmw< z$WWB9{0z@xxQ*dqhQ}G6VE7_K5#aI+&tkZZ;bDfyWxABg9A|if;foAii0P)|{sbLu z)*vc88&|qNxDVGl-2aPVCjCtLr&6GnsSDM0>L=8@)PGZduD+nYq6TbDwzF(W+X36} zZLiy0_R03R{S)@j+8?z4(EcZTsbhg-o8uzK4URh;_d9;2Kes`)f%F= zyJrIa(LV=phmCR%gysWIDOm&<4lM!vvF}{KhZwHpuXfLNP~F!8ROTfw!JV8|eU$zf zr=RsxdNRW*Kk>Q6whA!De8zFfXf3rU)47yyRjvcQsE%sg%q_m)p%!PBoe%g$mV7?v z{;0MOl%2)gZdnrPwkql=QB-J)wB`U*p*086PCylUa{~GikE_s`7qA}xLY0bl_lr(C*#a{GD#Til?;KgDt;AL1- zRQ!8V3jnW0bfAcj1FGUW^jN`uVG+{TqsNN40Zg`1ysd7=qsMLfHuAy2qSls zcoJ(+kus?4RSqgwDNc2YdY}3O^{48;+P-U>V}B60F>Az<0tNqYahMHHM@0dcRH3%^t2mBY=754BE4q+V7xnVVf@T#)2E7g z^V_y=oi=qVQp;kAf%Qgga4>Gn-)<2(dj@5%j2WpoXD~XyXY1CEL~1Y@+rKCoOQohs zDsh`d#rxvvt&5F#yxr&<>W>ekQ(Tp^hF5K)@~h)1J-LS)0A@-xZ8WJs9L@oa6IC{j z)L4xpE8C5{Hm8Z@L&;=pdosRln&|2rfXs%8wfCeG`T)pT>iSr6SKP=cnbrwgnnvIgIkLnPM$un>I@8&%T&T5%8YcVd1 zXDpu8GJR%SXWR7lw$Ap}j#<-Zou(5rXNi^a-)CQ(NXAneT4&`ooR7^GG-7MlEN;y! z1Z;jAOhE4)O2+4-6GmcBEFJIaA56x{reN0kKu0_sOC<5n;dabwow2ZEYTKgDnTr>; z%%0u3XzI+x(_7kRw{=WynbkRMTF0!Z=)^)XyLCoKYfI;}*0#2mwrPuIwRg6)&79u4 zaMsj?3#ZRsG`)4kqRvH&r*?>y$yj=aZuH{;xbFR_biBX0YXuxG$+|k;ukVSkiS?}$ zseE)#EIAb4x>a=d?1YdVv2@I=uqTlsafu+SiC|nUY29gkYPY| zYjzs(Sg&aB?G+1Ssd(o=kKP-XCAw1W>2wUzTPXCO*pUEAVt1u7=<4_dXflJYHxlW% zbRfNAG1L}ITNr7qE44bldnjRK_+(I-+chvalwKY0MTwp?3MEp*DYD#(q4e;ABS>AT zm9g~B)w)iMa^;d@WvE$H@?MtMml02<%|0?66UQ3#`Mb7mT^Q@xg(oK$C*sLoGTZEM zj?B$!ZL~Z~6Qkv^7$Y+}_a)McFk~Zhx>DVc3iD-zh>P_8{zN(*HV zIg;hsvD7HFGJ5I65||vxRVrqT%+>Kh9i7vS{cDZU>hhc%$#caZ`L2<4%Z!!}^>4>I zJVIaVdQxz!dlJ2)Wzx8&MyW#{X%ss8rK9g~rs=qpXOu!Pr+9iKPit8pnS&(@VqoMJ z=|cmf)C9ZHa~2LIFp<_6iT=)kUa=bPX^l>)SUPRc75*_!R(5Uz2rVkh_4H!2VYw+R zU2$VatS64T2upD7O3|Xe!dSl(o~e6~NQ>b1u!0Pv(y*YoAb#EYkbz`MUdRzxlZzc* z28o+fPNXR?fZL0UCDfMz1TGRKWg77m`D)Hi4)UdYr@pr%P7W5m+uu1r)z=Orm_W_7 zFYoT6xx6yg7iS;6qH|duo`)<$15{9Q-9FT35is_gv34LeG&ram@N!FI1ARkO7=C^= z(xjR_Fs(JZzBFb4#qyxtaTN$t2~u@%`<4Fh7`(6CsH% z3Ip{N(^q52p;GpVXU7J5!E&HG-D@VnJ&Wu#HD~6TH7PjFmL_bmq4%2<62o$D=3*p$ z9XgQ06hymduzetw+@F%^^iD(HyJBEj0)s-X8rfJGdUkSZF$}3am5TRoPa-hhp)=8x zipPQGlc05yau~r-57ETU5YQ!B2Zjc7DVg*Rs~$6cet@R_nG8IKv9qE?p2_e!eXzn#jnOy;PtLm_ipnHYqZkdqogm2PzR z=%6f#r)gBFgc;d!avix=PN4u_*YAuQC?dnfMX*V#YVungOD4C&TGnzkVj&f z5m}ZOS?N-k_B9ZnUd3&eG?C{ zXz%MY;(c(Fq9aaggN&du8lor&L=3|qG-7bHiNd{z8jZyEA!Mzkh!r6txdifE*_@6z z99AFEvotVThtN2WW=+dAiF9t!HRQC?i)n$`s~fwrJQA3`6mVi{#*$gG#fFA%oeZM0 znceZ8A%v{^SH_Kg@(=nzHqWYvf!mSj8#0*l$n1`Is>ew1Ql8C}is2fo^bf`c_GdFp?@FRUob8Du`kl=s zGg^zey)&Ln(x!sOknD}E8{5|bnIIA(D2c2@AfM>L5`hUoCN2|u7^Q;XXYh&~Lj<%( z@*5Tnnl3yqLL^U4=Kx|EwpU_#96JITS7XUaHpll#Ms$23meYtQDYZ0~N_P$P#`mq* zA&ea?IwC=4PgfELJxA=D2`M>mIL(~2a%+U;f-B0s1y3O&k*Y=^;fQ6RH)iw>%UYb+ zm#JxTH%Fq`G)LmOMwjnkiSF2rc=you6f6bg^|3^{YX{F5mP7`gk;k+!=|3%u z#FUnUaFaI$ImVPBQ7O5MWsBtEYX^Gh)QtDl&1=(%B*i5=If0XGFS4J39TFrq0%Auh&09_#1YP}GVYCcb1-V$e)3gKIbTn}~UQ z!{xhh_#swc#enx1=#!?*p*k!L{w&eQK`n)9T--W1;UhD#5K}iE8xXXDBMKj&5fpUV zC}DI*e!3Cq9*(2;07|n#4jKzC)>Y_Utj}MCOT?qgT-r4cwph%^$UF;vU;&>TSo0~Ng zVO?8efH-b9YkMOCJU+qV1kG?xaNw8e>7tz|L{eIdiQHYAvqr8jCP~^pg_LnaP^Zi! z>|l=!Akcl@ev7W0y*P8v#mTwl;$8BnDN}h#f<{X+>K=sKi6s}aR~0Ne)F)jhToFY~ z5XMw2sf)4xek?f@&zck~tRO|3B!t=&Yt9Kj#+uIoX_4>SGpGHOHm5k69)6nIoU`Sf zw`M*LS+P^*y987(o=x(?+ev{Cb0=4VLu-_2?vao$2#r>zq0eL@mV(vGgHad^wwu|s zDNRQr);FN1a1SR%8+kY>9qSzHWR0GVB`pGnTWHwA6LcVwgR@&OD_g!y?$?{Ssy^6_ z@(E0COAl7CLUWU1{Y<`fD3UVm6CQ?+I#T3?tSO%W+PM$@zIT)(1ujXRD1{p@vA0_Ufl#HZVKB?>&7DMA@5eBNYRO#o|f{HmB3z8KrwqdV*BL?aRMXL z6H9YsA|15YVeZjQl+K8(Rl_8~6oygAVNu*-vEZ$!JTKwkSghDik|W$9ufp=8Gqm~R zG#|0@sL2$qVlA`UlY={B+v8~tTc@{X(3nNAeM+|WT%@Ce4 zD-4UWIANsHS=3yOGKUz}qLL*n+8OWJmE$a!zctR%tj$5^oRu-Ulf_AMHIr#NceV<^ zb-)Sofip8eom>)3DHkQ}bereXTs(vHFw;~|Y=G`6ap=nd5T8!V6b`vyWP;A5^r19P z({P(gBp5Q^ye%SgAHI&s-J`T#TJ}wxR<7l68Kh#qn$DZth;>Xy$ut3KYPr6buQ-CE zBm zdKZ3>PaYp&Ik3VJCJvxbhJe|!Vju}da>w32K+IT58{cic!nNEehPU5$V=logj51wNEkwyIl#rZwV>?c{JntrT)D)#D{|VQ zR$?e;@!JkQVYEOkhSB;ES|^#L6k$&HBR3^mo3M=KNdaPuh8i(^;iV6?s0`i<1VvPZ z@!XIO`Y5u@99|!B6Za;8^6?Q`A^D*_FY#`|^FDY6$hK`fzW3}1Q%h|txfT{{VAQMq zxb6ZUx~3t6)G5hD@{-P)`9EQ6#+ZP^wD;yfx=w(DS<_2BHqhFBJP_B8mPvR0_=g;m zpwI|Y-$?@r9>?s+5uHYlMxLYz)4#3b7!SUpZYB7oF)}+jhxD4QFH21dD_v`lPotI1 z>jh5O0IpI8Vb;hV&}fXvvaHeQ=Qh|Pob=3V3NJ`C!ydOo6Pxin55IZ%;nnJHvZ)lL z9mIb$l4I3nkI|K?G)rESYlB(7DrRUvSmD$vhD?_(}TLF ztHu2(I3I7eZ$bMFfa35`nZz>}_%AzHk~+sMIF=v=2A2j$c7-0-T*qCoI%hRwH8>s* z-9<2{4R|v zD6_{SpCqFx6vIG~`O`3v5v1`W=aK>^n%0AWG<9KiO{-CgO3)CG)@Ihw&`MQ)yLovm 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 hg6WvP8UmB{|Ni|yKml