From b52761c37ee715648fb1427f56563e4129b91eea Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Fri, 11 Feb 2022 14:49:31 +0100 Subject: [PATCH 01/68] Updates InAppMessage constructor signature to accept a completion block --- PIALibrary/Sources/Core/WebServices/InAppMessage.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PIALibrary/Sources/Core/WebServices/InAppMessage.swift b/PIALibrary/Sources/Core/WebServices/InAppMessage.swift index e49c9bd9..060d89a3 100644 --- a/PIALibrary/Sources/Core/WebServices/InAppMessage.swift +++ b/PIALibrary/Sources/Core/WebServices/InAppMessage.swift @@ -45,8 +45,9 @@ public struct InAppMessage { public let settingAction: [String: Bool]? public let settingView: String? public let settingLink: String? + public let callbackDidFinishExecution: (() -> ())? - public init(withMessage message: [String: String], id: String, link: [String: String], type: InAppMessageType, level: InAppMessageLevel, actions: [String:Bool]?, view: String?, uri: String?) { + public init(withMessage message: [String: String], id: String, link: [String: String], type: InAppMessageType, level: InAppMessageLevel, actions: [String:Bool]?, view: String?, uri: String?, didFinishExecution: (() -> ())? = nil) { self.id = id self.message = message self.linkMessage = link @@ -55,13 +56,14 @@ public struct InAppMessage { self.settingAction = actions self.settingView = view self.settingLink = uri + self.callbackDidFinishExecution = didFinishExecution } } extension InAppMessage { - init(withMessage messageInformation: MessageInformation, andLevel level: InAppMessageLevel) { + init(withMessage messageInformation: MessageInformation, andLevel level: InAppMessageLevel, didFinishExecution: (() -> ())? = nil) { self.id = "\(messageInformation.id)" self.message = messageInformation.message @@ -98,7 +100,7 @@ extension InAppMessage { } self.level = level - + self.callbackDidFinishExecution = didFinishExecution } } From 4c13f1e67d2df8faba62a5a4d57fe2769fc0d9d2 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Fri, 11 Feb 2022 16:09:21 +0100 Subject: [PATCH 02/68] Renames completion handler --- PIALibrary/Sources/Core/WebServices/InAppMessage.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PIALibrary/Sources/Core/WebServices/InAppMessage.swift b/PIALibrary/Sources/Core/WebServices/InAppMessage.swift index 060d89a3..2c44190c 100644 --- a/PIALibrary/Sources/Core/WebServices/InAppMessage.swift +++ b/PIALibrary/Sources/Core/WebServices/InAppMessage.swift @@ -45,9 +45,9 @@ public struct InAppMessage { public let settingAction: [String: Bool]? public let settingView: String? public let settingLink: String? - public let callbackDidFinishExecution: (() -> ())? + public let executionCompletionHandler: (() -> ())? - public init(withMessage message: [String: String], id: String, link: [String: String], type: InAppMessageType, level: InAppMessageLevel, actions: [String:Bool]?, view: String?, uri: String?, didFinishExecution: (() -> ())? = nil) { + public init(withMessage message: [String: String], id: String, link: [String: String], type: InAppMessageType, level: InAppMessageLevel, actions: [String:Bool]?, view: String?, uri: String?, executionCompletionHandler: (() -> ())? = nil) { self.id = id self.message = message self.linkMessage = link @@ -56,14 +56,14 @@ public struct InAppMessage { self.settingAction = actions self.settingView = view self.settingLink = uri - self.callbackDidFinishExecution = didFinishExecution + self.executionCompletionHandler = executionCompletionHandler } } extension InAppMessage { - init(withMessage messageInformation: MessageInformation, andLevel level: InAppMessageLevel, didFinishExecution: (() -> ())? = nil) { + init(withMessage messageInformation: MessageInformation, andLevel level: InAppMessageLevel, executionCompletionHandler: (() -> ())? = nil) { self.id = "\(messageInformation.id)" self.message = messageInformation.message @@ -100,7 +100,7 @@ extension InAppMessage { } self.level = level - self.callbackDidFinishExecution = didFinishExecution + self.executionCompletionHandler = executionCompletionHandler } } From 10d8347073f3e29b18c502619da97991cfbc1882 Mon Sep 17 00:00:00 2001 From: Juan Docal Date: Mon, 14 Feb 2022 14:02:56 +0100 Subject: [PATCH 03/68] update kpi integration for v1.1.0 --- .../ServiceQualityManager.swift | 132 ++++++++++++++---- .../Providers/PIAKPIClientStateProvider.swift | 18 ++- .../PIAKPIStagingClientStateProvider.swift | 17 ++- PIALibrary/Sources/Util/DateUtil.swift | 3 + Podfile | 2 +- Podfile.lock | 42 +++--- 6 files changed, 163 insertions(+), 51 deletions(-) diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 4c5e1a1d..1f2c062f 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -27,28 +27,71 @@ import SwiftyBeaver private let log = SwiftyBeaver.self public class ServiceQualityManager: NSObject { - - private var kpiToken = "" + public static let shared = ServiceQualityManager() + private let kpiPreferenceName = "PIA_KPI_PREFERENCE_NAME" private var kpiManager: KPIAPI? private var isAppActive = true + + /** + * Enum defining the different connection sources. + * e.g. Manual for user-related actions, Automatic for reconnections, etc. + */ + private enum KPIConnectionSource: String { + case Automatic + case Manual + } + + /** + * Enum defining the supported connection related events. + */ + private enum KPIConnectionEvent: String { + case VPN_CONNECTION_ATTEMPT + case VPN_CONNECTION_CANCELLED + case VPN_CONNECTION_ESTABLISHED + } + + /** + * Enum defining the supported vpn protocols to report. + */ + private enum KPIVpnProtocol: String { + case OpenVPN + case WireGuard + case IPSec + } + + /** + * Enum defining the supported vpn protocols to report. + */ + private enum KPIEventPropertyKey: String { + case connection_source + case user_agent + case vpn_protocol + } + public override init() { super.init() if Client.environment == .staging { - kpiToken = LibraryConstants.Elastic.stagingToken kpiManager = KPIBuilder() - .setAppVersion(appVersion: Macros.localizedVersionNumber()) .setKPIFlushEventMode(kpiSendEventMode: .perBatch) .setKPIClientStateProvider(kpiClientStateProvider: PIAKPIStagingClientStateProvider()) + .setEventTimeRoundGranularity(eventTimeRoundGranularity: KTimeUnit.hours) + .setEventTimeSendGranularity(eventSendTimeGranularity: KTimeUnit.milliseconds) + .setRequestFormat(requestFormat: KPIRequestFormat.kape) + .setPreferenceName(preferenceName: kpiPreferenceName) + .setUserAgent(userAgent: PIAWebServices.userAgent) .build() } else { - kpiToken = LibraryConstants.Elastic.liveToken kpiManager = KPIBuilder() - .setAppVersion(appVersion: Macros.localizedVersionNumber()) .setKPIFlushEventMode(kpiSendEventMode: .perBatch) .setKPIClientStateProvider(kpiClientStateProvider: PIAKPIClientStateProvider()) + .setEventTimeRoundGranularity(eventTimeRoundGranularity: KTimeUnit.hours) + .setEventTimeSendGranularity(eventSendTimeGranularity: KTimeUnit.milliseconds) + .setRequestFormat(requestFormat: KPIRequestFormat.kape) + .setPreferenceName(preferenceName: kpiPreferenceName) + .setUserAgent(userAgent: PIAWebServices.userAgent) .build() } @@ -73,8 +116,13 @@ public class ServiceQualityManager: NSObject { } public func stop() { - kpiManager?.stop() - log.debug("KPI manager stopped") + kpiManager?.stop(callback: { error in + guard error == nil else { + log.error("\(error)") + return + } + log.debug("KPI manager stopped") + }) } @objc private func appChangedState(with notification: Notification) { @@ -89,29 +137,48 @@ public class ServiceQualityManager: NSObject { @objc private func flushEvents() { kpiManager?.flush(callback: { error in - guard error != nil else { + guard error == nil else { + log.error("\(error)") return } - log.error("\(error)") + log.debug("KPI events flushed") }) } public func connectionAttemptEvent() { let connectionSource = connectionSource() - if connectionSource == .manual && isAppActive { - let event = KPIClientEvent(eventCountry: nil, eventName: KPIConnectionEvent.vpnConnectionAttempt, eventProperties: KPIClientEvent.EventProperties(connectionSource: connectionSource, data: nil, preRelease: isPreRelease(), reason: nil, serverIdentifier: nil, userAgent: PIAWebServices.userAgent, vpnProtocol: currentProtocol()), eventToken: kpiToken) + if connectionSource == .Manual && isAppActive { + let event = KPIClientEvent( + eventCountry: nil, + eventName: KPIConnectionEvent.VPN_CONNECTION_ATTEMPT.rawValue, + eventProperties: [ + KPIEventPropertyKey.connection_source.rawValue: connectionSource.rawValue, + KPIEventPropertyKey.user_agent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpn_protocol.rawValue: currentProtocol().rawValue + ], + eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) + ) kpiManager?.submit(event: event) { (error) in - log.debug("Event sent \(event)") + log.debug("KPI event submitted \(event)") } } } public func connectionEstablishedEvent() { let connectionSource = connectionSource() - if connectionSource == .manual && isAppActive { - let event = KPIClientEvent(eventCountry: nil, eventName: KPIConnectionEvent.vpnConnectionEstablished, eventProperties: KPIClientEvent.EventProperties(connectionSource: connectionSource, data: nil, preRelease: isPreRelease(), reason: nil, serverIdentifier: nil, userAgent: PIAWebServices.userAgent, vpnProtocol: currentProtocol()), eventToken: kpiToken) + if connectionSource == .Manual && isAppActive { + let event = KPIClientEvent( + eventCountry: nil, + eventName: KPIConnectionEvent.VPN_CONNECTION_ESTABLISHED.rawValue, + eventProperties: [ + KPIEventPropertyKey.connection_source.rawValue: connectionSource.rawValue, + KPIEventPropertyKey.user_agent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpn_protocol.rawValue: currentProtocol().rawValue + ], + eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) + ) kpiManager?.submit(event: event) { (error) in - log.debug("Event sent \(event)") + log.debug("KPI event submitted \(event)") } } } @@ -119,10 +186,19 @@ public class ServiceQualityManager: NSObject { public func connectionCancelledEvent() { let disconnectionSource = disconnectionSource() - if disconnectionSource == .manual && isAppActive { - let event = KPIClientEvent(eventCountry: nil, eventName: KPIConnectionEvent.vpnConnectionCancelled, eventProperties: KPIClientEvent.EventProperties(connectionSource: disconnectionSource, data: nil, preRelease: isPreRelease(), reason: nil, serverIdentifier: nil, userAgent: PIAWebServices.userAgent, vpnProtocol: currentProtocol()), eventToken: kpiToken) + if disconnectionSource == .Manual && isAppActive { + let event = KPIClientEvent( + eventCountry: nil, + eventName: KPIConnectionEvent.VPN_CONNECTION_CANCELLED.rawValue, + eventProperties: [ + KPIEventPropertyKey.connection_source.rawValue: disconnectionSource.rawValue, + KPIEventPropertyKey.user_agent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpn_protocol.rawValue: currentProtocol().rawValue + ], + eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) + ) kpiManager?.submit(event: event) { (error) in - log.debug("Event sent \(event)") + log.debug("KPI event submitted \(event)") } } } @@ -138,26 +214,28 @@ public class ServiceQualityManager: NSObject { } private func connectionSource() -> KPIConnectionSource { - return Client.configuration.connectedManually ? .manual : .automatic + return Client.configuration.connectedManually ? + KPIConnectionSource.Manual : + KPIConnectionSource.Automatic } private func disconnectionSource() -> KPIConnectionSource { - return Client.configuration.disconnectedManually ? .manual : .automatic + return Client.configuration.disconnectedManually ? + KPIConnectionSource.Manual : + KPIConnectionSource.Automatic } private func currentProtocol() -> KPIVpnProtocol { switch Client.providers.vpnProvider.currentVPNType { case IKEv2Profile.vpnType: - return KPIVpnProtocol.ipsec + return KPIVpnProtocol.IPSec case PIATunnelProfile.vpnType: - return KPIVpnProtocol.openvpn + return KPIVpnProtocol.OpenVPN case PIAWGTunnelProfile.vpnType: - return KPIVpnProtocol.wireguard + return KPIVpnProtocol.WireGuard default: - return KPIVpnProtocol.ipsec + return KPIVpnProtocol.IPSec } - } - } diff --git a/PIALibrary/Sources/Library/Providers/PIAKPIClientStateProvider.swift b/PIALibrary/Sources/Library/Providers/PIAKPIClientStateProvider.swift index 7b5d10f8..89f06132 100644 --- a/PIALibrary/Sources/Library/Providers/PIAKPIClientStateProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIAKPIClientStateProvider.swift @@ -23,6 +23,16 @@ import Foundation import PIAKPI class PIAKPIClientStateProvider : KPIClientStateProvider { + + private let kpiPath = "/api/client/v2/service-quality" + + func projectToken() -> String { + if Client.environment == .staging { + return LibraryConstants.Elastic.stagingToken + } else { + return LibraryConstants.Elastic.liveToken + } + } func kpiAuthToken() -> String { return Client.providers.accountProvider.apiToken ?? "" @@ -32,7 +42,13 @@ class PIAKPIClientStateProvider : KPIClientStateProvider { let validEndpoints = EndpointManager.shared.availableEndpoints() var clientEndpoints = [KPIEndpoint]() for endpoint in validEndpoints { - clientEndpoints.append(KPIEndpoint(endpoint: endpoint.host, isProxy: endpoint.isProxy, usePinnedCertificate: endpoint.useCertificatePinning, certificateCommonName: endpoint.commonName)) + clientEndpoints.append( + KPIEndpoint( + endpoint: endpoint.host + kpiPath, + usePinnedCertificate: endpoint.useCertificatePinning, + certificateCommonName: endpoint.commonName + ) + ) } return clientEndpoints } diff --git a/PIALibrary/Sources/Library/Providers/PIAKPIStagingClientStateProvider.swift b/PIALibrary/Sources/Library/Providers/PIAKPIStagingClientStateProvider.swift index 916554f3..a78e36a4 100644 --- a/PIALibrary/Sources/Library/Providers/PIAKPIStagingClientStateProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIAKPIStagingClientStateProvider.swift @@ -23,13 +23,28 @@ import Foundation import PIAKPI class PIAKPIStagingClientStateProvider : KPIClientStateProvider { + + private let kpiPath = "/api/client/v2/service-quality" + + func projectToken() -> String { + if Client.environment == .staging { + return LibraryConstants.Elastic.stagingToken + } else { + return LibraryConstants.Elastic.liveToken + } + } + func kpiAuthToken() -> String { return Client.providers.accountProvider.apiToken ?? "" } func kpiEndpoints() -> [KPIEndpoint] { return [ - KPIEndpoint(endpoint: Client.configuration.baseUrl, isProxy: false, usePinnedCertificate: false, certificateCommonName: nil), + KPIEndpoint( + endpoint: Client.configuration.baseUrl + kpiPath, + usePinnedCertificate: false, + certificateCommonName: nil + ) ] } } diff --git a/PIALibrary/Sources/Util/DateUtil.swift b/PIALibrary/Sources/Util/DateUtil.swift index c57bb451..36b85310 100644 --- a/PIALibrary/Sources/Util/DateUtil.swift +++ b/PIALibrary/Sources/Util/DateUtil.swift @@ -38,4 +38,7 @@ public extension Date { return result } + public var epochMilliseconds: Int64 { + Int64((self.timeIntervalSince1970 * 1000.0).rounded()) + } } diff --git a/Podfile b/Podfile index e0d53445..ba50de34 100644 --- a/Podfile +++ b/Podfile @@ -35,7 +35,7 @@ abstract_target 'PIALibrary' do pod "PIAAccountModule", :git => "#{$gitlab_kn_root}/#{$accounts_gitlab_repo}", :branch => 'release/1.2.0' pod "PIARegionsModule", :git => "#{$gitlab_kn_root}/#{$regions_gitlab_repo}", :branch => 'release/1.3.1' pod "PIACSIModule", :git => "#{$gitlab_kn_root}/#{$csi_gitlab_repo}", :commit => 'b62d1bab' - pod "PIAKPIModule", :git => "#{$gitlab_kn_root}/#{$kpi_gitlab_repo}", :commit => '31186b1d' + pod "PIAKPIModule", :git => "#{$gitlab_kn_root}/#{$kpi_gitlab_repo}", :branch => 'release/1.1.0' target 'PIALibrary-iOS' do platform :ios, '12.0' diff --git a/Podfile.lock b/Podfile.lock index 5487d085..8f8ab57b 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -15,11 +15,11 @@ PODS: - PIACSIModule/gradle (= 1.0.1) - PIACSIModule/csi (1.0.1) - PIACSIModule/gradle (1.0.1) - - PIAKPIModule (1.0.1): - - PIAKPIModule/gradle (= 1.0.1) - - PIAKPIModule/kpi (= 1.0.1) - - PIAKPIModule/gradle (1.0.1) - - PIAKPIModule/kpi (1.0.1) + - PIAKPIModule (1.1.0): + - PIAKPIModule/gradle (= 1.1.0) + - PIAKPIModule/kpi (= 1.1.0) + - PIAKPIModule/gradle (1.1.0) + - PIAKPIModule/kpi (1.1.0) - PIARegionsModule (1.3.1): - PIARegionsModule/gradle (= 1.3.1) - PIARegionsModule/regions (= 1.3.1) @@ -64,7 +64,7 @@ DEPENDENCIES: - OpenSSL-Apple (from `https://github.com/keeshux/openssl-apple`) - "PIAAccountModule (from `git@gitlab.kape.com:pia-mobile/shared/account.git`, branch `release/1.2.0`)" - "PIACSIModule (from `git@gitlab.kape.com:pia-mobile/shared/csi.git`, commit `b62d1bab`)" - - "PIAKPIModule (from `git@gitlab.kape.com:pia-mobile/shared/kpi.git`, commit `31186b1d`)" + - "PIAKPIModule (from `git@gitlab.kape.com:pia-mobile/shared/kpi.git`, branch `release/1.1.0`)" - "PIARegionsModule (from `git@gitlab.kape.com:pia-mobile/shared/regions.git`, branch `release/1.3.1`)" - "PIAWireguard (from `git@gitlab.kape.com:pia-mobile/ios/pia-wireguard.git`, branch `develop`)" - PopupDialog @@ -97,7 +97,7 @@ EXTERNAL SOURCES: :commit: b62d1bab :git: "git@gitlab.kape.com:pia-mobile/shared/csi.git" PIAKPIModule: - :commit: 31186b1d + :branch: release/1.1.0 :git: "git@gitlab.kape.com:pia-mobile/shared/kpi.git" PIARegionsModule: :branch: release/1.3.1 @@ -120,7 +120,7 @@ CHECKOUT OPTIONS: :commit: b62d1bab :git: "git@gitlab.kape.com:pia-mobile/shared/csi.git" PIAKPIModule: - :commit: 31186b1d + :commit: 4ffb43cc4bb9d66da9b0b966d98934507b2cb04f :git: "git@gitlab.kape.com:pia-mobile/shared/kpi.git" PIARegionsModule: :commit: 6b3b763b3b1d066cb73d2d8833563669ff8e87bb @@ -133,25 +133,25 @@ CHECKOUT OPTIONS: :git: https://github.com/pia-foss/tunnelkit SPEC CHECKSUMS: - Alamofire: 16ce2c353fb72865124ddae8a57c5942388f4f11 - DynamicBlurView: b1df5415f9bd31897549e5d7077e5ec120a4d636 - FXPageControl: 97620412515365d10a3282ec0660f49f6401a8f0 - Gloss: 13ab6b4b0ff4cb2448466edc957479b1bccea8ba - lottie-ios: 06e0b54aab85ba128e332687d7f4ac4861a7a7ae + Alamofire: 2ad20d0a5a6e593fb8fa4556060a68918a58fe5b + DynamicBlurView: 8ecc633fc8e66d445fa1267d2b405e7cbf7c894f + FXPageControl: e3b89828c27a6ec2f01952d09c5737a680f81ced + Gloss: 51fbd000cbba87e032dced8925b2bb55c960337f + lottie-ios: 92aecc6f5aee59f2d5bfbe19b0f2b57050b4b8c0 OpenSSL-Apple: bb7c9715a259404de040f5359ed3b3170cedf8d6 PIAAccountModule: e81a47491b646121a8db272016db00a1980d2955 PIACSIModule: 32df98c20a0fc4cad5fadbb1b72f7b74315aa8ea - PIAKPIModule: ec04bedfc7e6eccc7dfe4bc630a99c104ffbb7ea + PIAKPIModule: 37c56c0153d693db4d4adb43fd12b9c96ec7ad6d PIARegionsModule: eff00bd28dea554d7b766ec5d7e9a74ab448f5fe PIAWireguard: e6fc3a37758af8d83704dd61e327c2ff6da88b13 - PopupDialog: f4bb461bf70ff422be0b56656566424ee9273080 - QuickLayout: a730730b646b231fd4ef7cffaeb1e81fe0e1ca92 - ReachabilitySwift: 408477d1b6ed9779dba301953171e017c31241f3 - SwiftEntryKit: 83d312243af7397e38a222b17b7a744b9a7d2145 - SwiftyBeaver: 4cc0080d2e23f980652e28978db11a5c9da39165 + PopupDialog: 70009b0bdff82db3796eb06fe16a2af6e265f662 + QuickLayout: 10384f7db74f2303a776e5edc0409270d8bb0a6a + ReachabilitySwift: 8610aeb4af1844f38c44f05482de0ab537f852eb + SwiftEntryKit: 6da87bb561409684bd330619857533116e98d132 + SwiftyBeaver: faff13c9b69e467c2d21425a0f8e5efaed8e6a35 TunnelKit: 2a6aadea2d772a2760b153aee27d1c334c9ca6db - TweetNacl: 3abf4d1d2082b0114e7a67410e300892448951e6 + TweetNacl: 3f1d3a198ace99c4a17d7a6e165f051da9e8ceda -PODFILE CHECKSUM: 9a4fe235c0b55800d3e349444a2fff9dbd22f61f +PODFILE CHECKSUM: 54c9b2ea184a1f940d19519b8965a7b509bc10c2 COCOAPODS: 1.11.2 From 9e764d6b667f9573fca8d7b7919a5eb54fab5fee Mon Sep 17 00:00:00 2001 From: Juan Docal Date: Mon, 14 Feb 2022 14:39:30 +0100 Subject: [PATCH 04/68] update enums --- .../ServiceQualityManager.swift | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 1f2c062f..4c9d01a1 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -38,35 +38,35 @@ public class ServiceQualityManager: NSObject { * e.g. Manual for user-related actions, Automatic for reconnections, etc. */ private enum KPIConnectionSource: String { - case Automatic - case Manual + case automatic = "Automatic" + case manual = "Manual" } /** * Enum defining the supported connection related events. */ private enum KPIConnectionEvent: String { - case VPN_CONNECTION_ATTEMPT - case VPN_CONNECTION_CANCELLED - case VPN_CONNECTION_ESTABLISHED + case vpnConnectionAttempt = "VPN_CONNECTION_ATTEMPT" + case vpnConnectionCancelled = "VPN_CONNECTION_CANCELLED" + case vpnConnectionEstablished = "VPN_CONNECTION_ESTABLISHED" } /** * Enum defining the supported vpn protocols to report. */ private enum KPIVpnProtocol: String { - case OpenVPN - case WireGuard - case IPSec + case ovpn = "OpenVPN" + case wireguard = "WireGuard" + case ipsec = "IPSec" } /** * Enum defining the supported vpn protocols to report. */ private enum KPIEventPropertyKey: String { - case connection_source - case user_agent - case vpn_protocol + case connectionSource = "connection_source" + case userAgent = "user_agent" + case vpnProtocol = "vpn_protocol" } @@ -147,14 +147,14 @@ public class ServiceQualityManager: NSObject { public func connectionAttemptEvent() { let connectionSource = connectionSource() - if connectionSource == .Manual && isAppActive { + if connectionSource == .manual && isAppActive { let event = KPIClientEvent( eventCountry: nil, - eventName: KPIConnectionEvent.VPN_CONNECTION_ATTEMPT.rawValue, + eventName: KPIConnectionEvent.vpnConnectionAttempt.rawValue, eventProperties: [ - KPIEventPropertyKey.connection_source.rawValue: connectionSource.rawValue, - KPIEventPropertyKey.user_agent.rawValue: PIAWebServices.userAgent, - KPIEventPropertyKey.vpn_protocol.rawValue: currentProtocol().rawValue + KPIEventPropertyKey.connectionSource.rawValue: connectionSource.rawValue, + KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue ], eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) @@ -166,14 +166,14 @@ public class ServiceQualityManager: NSObject { public func connectionEstablishedEvent() { let connectionSource = connectionSource() - if connectionSource == .Manual && isAppActive { + if connectionSource == .manual && isAppActive { let event = KPIClientEvent( eventCountry: nil, - eventName: KPIConnectionEvent.VPN_CONNECTION_ESTABLISHED.rawValue, + eventName: KPIConnectionEvent.vpnConnectionEstablished.rawValue, eventProperties: [ - KPIEventPropertyKey.connection_source.rawValue: connectionSource.rawValue, - KPIEventPropertyKey.user_agent.rawValue: PIAWebServices.userAgent, - KPIEventPropertyKey.vpn_protocol.rawValue: currentProtocol().rawValue + KPIEventPropertyKey.connectionSource.rawValue: connectionSource.rawValue, + KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue ], eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) @@ -186,14 +186,14 @@ public class ServiceQualityManager: NSObject { public func connectionCancelledEvent() { let disconnectionSource = disconnectionSource() - if disconnectionSource == .Manual && isAppActive { + if disconnectionSource == .manual && isAppActive { let event = KPIClientEvent( eventCountry: nil, - eventName: KPIConnectionEvent.VPN_CONNECTION_CANCELLED.rawValue, + eventName: KPIConnectionEvent.vpnConnectionCancelled.rawValue, eventProperties: [ - KPIEventPropertyKey.connection_source.rawValue: disconnectionSource.rawValue, - KPIEventPropertyKey.user_agent.rawValue: PIAWebServices.userAgent, - KPIEventPropertyKey.vpn_protocol.rawValue: currentProtocol().rawValue + KPIEventPropertyKey.connectionSource.rawValue: disconnectionSource.rawValue, + KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue ], eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) @@ -215,27 +215,27 @@ public class ServiceQualityManager: NSObject { private func connectionSource() -> KPIConnectionSource { return Client.configuration.connectedManually ? - KPIConnectionSource.Manual : - KPIConnectionSource.Automatic + KPIConnectionSource.manual : + KPIConnectionSource.automatic } private func disconnectionSource() -> KPIConnectionSource { return Client.configuration.disconnectedManually ? - KPIConnectionSource.Manual : - KPIConnectionSource.Automatic + KPIConnectionSource.manual : + KPIConnectionSource.automatic } private func currentProtocol() -> KPIVpnProtocol { switch Client.providers.vpnProvider.currentVPNType { case IKEv2Profile.vpnType: - return KPIVpnProtocol.IPSec + return KPIVpnProtocol.ipsec case PIATunnelProfile.vpnType: - return KPIVpnProtocol.OpenVPN + return KPIVpnProtocol.ovpn case PIAWGTunnelProfile.vpnType: - return KPIVpnProtocol.WireGuard + return KPIVpnProtocol.wireguard default: - return KPIVpnProtocol.IPSec + return KPIVpnProtocol.ipsec } } } From aef8ef8b1e758a37c4a916a481c443c30b46a14c Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 16 Feb 2022 12:14:18 +0100 Subject: [PATCH 05/68] Adds 'time_to_connect' property to connection established event. --- .../ServiceQualityManager.swift | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 4c9d01a1..51c47d39 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -32,7 +32,8 @@ public class ServiceQualityManager: NSObject { private let kpiPreferenceName = "PIA_KPI_PREFERENCE_NAME" private var kpiManager: KPIAPI? private var isAppActive = true - + private var lastConnectionAttempt: TimeInterval = Date().timeIntervalSince1970 + /** * Enum defining the different connection sources. * e.g. Manual for user-related actions, Automatic for reconnections, etc. @@ -67,6 +68,7 @@ public class ServiceQualityManager: NSObject { case connectionSource = "connection_source" case userAgent = "user_agent" case vpnProtocol = "vpn_protocol" + case timeToConnect = "time_to_connect" } @@ -103,6 +105,11 @@ public class ServiceQualityManager: NSObject { selector: #selector(appChangedState(with:)), name: UIApplication.didBecomeActiveNotification, object: nil) + + NotificationCenter.default.addObserver(self, + selector: #selector(vpnStatusChanged(with:)), + name: .PIADaemonsDidUpdateVPNStatus, + object: nil) } @@ -125,6 +132,15 @@ public class ServiceQualityManager: NSObject { }) } + @objc private func vpnStatusChanged(with notification: Notification) { + switch Client.providers.vpnProvider.vpnStatus { + case .connecting: + lastConnectionAttempt = Date().timeIntervalSince1970 + default: + log.debug("KPI manager detected VPN status change") + } + } + @objc private func appChangedState(with notification: Notification) { switch notification.name { case UIApplication.didEnterBackgroundNotification: @@ -173,7 +189,8 @@ public class ServiceQualityManager: NSObject { eventProperties: [ KPIEventPropertyKey.connectionSource.rawValue: connectionSource.rawValue, KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, - KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue + KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue, + KPIEventPropertyKey.timeToConnect.rawValue: "\(Date().timeIntervalSince1970 - lastConnectionAttempt)" ], eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) From a7dbb4fa840ab8ced27d314b44a948b6da8020a5 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 16 Feb 2022 12:26:28 +0100 Subject: [PATCH 06/68] Adds time to connect property in user consent text --- PIALibrary/Resources/UI/iOS/en.lproj/Signup.strings | 1 + PIALibrary/Sources/UI/iOS/SwiftGen+Strings.swift | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/PIALibrary/Resources/UI/iOS/en.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/en.lproj/Signup.strings index 76989010..dacff3d5 100644 --- a/PIALibrary/Resources/UI/iOS/en.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/en.lproj/Signup.strings @@ -85,6 +85,7 @@ For all of these events, we will collect the following information: - App type (pre-release or not) - Protocol used - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. diff --git a/PIALibrary/Sources/UI/iOS/SwiftGen+Strings.swift b/PIALibrary/Sources/UI/iOS/SwiftGen+Strings.swift index 92a5eeaf..68f2d848 100644 --- a/PIALibrary/Sources/UI/iOS/SwiftGen+Strings.swift +++ b/PIALibrary/Sources/UI/iOS/SwiftGen+Strings.swift @@ -117,7 +117,7 @@ internal enum L10n { } internal enum ReadMore { internal enum Text { - /// This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default.\n\nWe will collect information about the following events:\n\n - Connection Attempt\n - Connection Canceled\n - Connection Established\n\nFor all of these events, we will collect the following information:\n - Platform\n - App version\n - App type (pre-release or not)\n - Protocol used\n - Connection source (manual or using automation)\n\nAll events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes.\n\nYou will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time. + /// This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default.\n\nWe will collect information about the following events:\n\n - Connection Attempt\n - Connection Canceled\n - Connection Established\n\nFor all of these events, we will collect the following information:\n - Platform\n - App version\n - App type (pre-release or not)\n - Protocol used\n - Connection source (manual or using automation)\n - Time To Connect (time between connecting and connected state)\n\nAll events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes.\n\nYou will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time. internal static let description = L10n.tr("Signup", "share.data.readMore.text.description") } } From 913ef511e2e67d7fa0bc7ad64ae9cf8198a8d7ea Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 16 Feb 2022 18:19:40 +0100 Subject: [PATCH 07/68] Moves the responsibility of timeToConnect property to VPNDaemon --- .../Sources/Core/Persistence/PlainStore.swift | 2 ++ .../ServiceQualityManager.swift | 21 +++++-------------- .../Sources/Library/Client+Preferences.swift | 10 ++++++++- .../Sources/Library/Daemons/VPNDaemon.swift | 8 +++++-- .../Persistence/UserDefaultsStore.swift | 13 ++++++++++-- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index 6cb1ddf7..66876235 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -68,6 +68,8 @@ protocol PlainStore: class { var vpnCustomConfigurationMaps: [String: [String: Any]]? { get set } var lastKnownVpnStatus: VPNStatus { get set } + + var lastVPNConnectionAttempt: Double { get set } // MARK: Preferences diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 51c47d39..609ec1a2 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -32,7 +32,6 @@ public class ServiceQualityManager: NSObject { private let kpiPreferenceName = "PIA_KPI_PREFERENCE_NAME" private var kpiManager: KPIAPI? private var isAppActive = true - private var lastConnectionAttempt: TimeInterval = Date().timeIntervalSince1970 /** * Enum defining the different connection sources. @@ -105,11 +104,6 @@ public class ServiceQualityManager: NSObject { selector: #selector(appChangedState(with:)), name: UIApplication.didBecomeActiveNotification, object: nil) - - NotificationCenter.default.addObserver(self, - selector: #selector(vpnStatusChanged(with:)), - name: .PIADaemonsDidUpdateVPNStatus, - object: nil) } @@ -132,15 +126,6 @@ public class ServiceQualityManager: NSObject { }) } - @objc private func vpnStatusChanged(with notification: Notification) { - switch Client.providers.vpnProvider.vpnStatus { - case .connecting: - lastConnectionAttempt = Date().timeIntervalSince1970 - default: - log.debug("KPI manager detected VPN status change") - } - } - @objc private func appChangedState(with notification: Notification) { switch notification.name { case UIApplication.didEnterBackgroundNotification: @@ -190,7 +175,7 @@ public class ServiceQualityManager: NSObject { KPIEventPropertyKey.connectionSource.rawValue: connectionSource.rawValue, KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue, - KPIEventPropertyKey.timeToConnect.rawValue: "\(Date().timeIntervalSince1970 - lastConnectionAttempt)" + KPIEventPropertyKey.timeToConnect.rawValue: timeToConnect() ], eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) @@ -255,4 +240,8 @@ public class ServiceQualityManager: NSObject { return KPIVpnProtocol.ipsec } } + + private func timeToConnect() -> String { + return "\(VPNDaemon.shared.timeToConnect)" + } } diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index 8b99e14a..aff2b84f 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -379,7 +379,15 @@ extension Client { accessedDatabase.plain.shareServiceQualityData = newValue } } - + /// Store a date as a number when last VPN Connection was attempted. + public var lastVPNConnectionAttempt: Double { + get { + return accessedDatabase.plain.lastVPNConnectionAttempt + } + set { + accessedDatabase.plain.lastVPNConnectionAttempt = newValue + } + } } } diff --git a/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift b/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift index a39e1c64..07b80270 100644 --- a/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift +++ b/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift @@ -35,11 +35,13 @@ class VPNDaemon: Daemon, DatabaseAccess, ProvidersAccess { private var isReconnecting: Bool private var lastKnownVpnStatus: VPNStatus = .disconnected - + private(set) var timeToConnect: Double + private init() { hasEnabledUpdates = false isReconnecting = false numberOfAttempts = 0 + timeToConnect = Date().timeIntervalSince1970 - Client.preferences.lastVPNConnectionAttempt } func start() { @@ -71,6 +73,7 @@ class VPNDaemon: Daemon, DatabaseAccess, ProvidersAccess { switch connection.status { case .connected: nextStatus = .connected + timeToConnect = Date().timeIntervalSince1970 - Client.preferences.lastVPNConnectionAttempt let previousStatus = accessedDatabase.transient.vpnStatus @@ -92,7 +95,8 @@ class VPNDaemon: Daemon, DatabaseAccess, ProvidersAccess { case .connecting, .reasserting: nextStatus = .connecting - + Client.preferences.lastVPNConnectionAttempt = Date().timeIntervalSince1970 + let previousStatus = accessedDatabase.transient.vpnStatus if accessedDatabase.transient.vpnStatus == .disconnected, diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index 0bf5e718..02cb45d6 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -97,7 +97,8 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let nmtGenericRules = "NMTGenericRules" static let shareServiceQualityData = "ShareServiceQualityData" - + + static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" } private let backend: UserDefaults @@ -409,7 +410,15 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } - + + var lastVPNConnectionAttempt: Double { + get { + return backend.double(forKey: Entries.lastVPNConnectionAttempt) + } + set { + backend.set(newValue, forKey: Entries.lastVPNConnectionAttempt) + } + } // MARK: Preferences From 90f24b0ba0cf9c074e27855183bca67966bd374e Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Thu, 17 Feb 2022 11:22:45 +0100 Subject: [PATCH 08/68] Stores timeToConnect in User.preferences instead of VPNDaemon --- PIALibrary/Sources/Core/Persistence/PlainStore.swift | 2 ++ .../Core/ServiceQuality/ServiceQualityManager.swift | 2 +- PIALibrary/Sources/Library/Client+Preferences.swift | 12 ++++++++++++ PIALibrary/Sources/Library/Daemons/VPNDaemon.swift | 4 +--- .../Library/Persistence/UserDefaultsStore.swift | 11 +++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index 66876235..5f63bdca 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -70,6 +70,8 @@ protocol PlainStore: class { var lastKnownVpnStatus: VPNStatus { get set } var lastVPNConnectionAttempt: Double { get set } + + var timeToConnectVPN: Double { get set } // MARK: Preferences diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 609ec1a2..2da1c957 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -242,6 +242,6 @@ public class ServiceQualityManager: NSObject { } private func timeToConnect() -> String { - return "\(VPNDaemon.shared.timeToConnect)" + return "\(Client.preferences.timeToConnectVPN)" } } diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index aff2b84f..6d07250b 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -379,6 +379,7 @@ extension Client { accessedDatabase.plain.shareServiceQualityData = newValue } } + /// Store a date as a number when last VPN Connection was attempted. public var lastVPNConnectionAttempt: Double { get { @@ -388,6 +389,17 @@ extension Client { accessedDatabase.plain.lastVPNConnectionAttempt = newValue } } + + /// Store a decimal number which represents time (in seconds) between + /// connecting and connect state of VPNDaemon + public var timeToConnectVPN: Double { + get { + return accessedDatabase.plain.timeToConnectVPN + } + set { + accessedDatabase.plain.timeToConnectVPN = newValue + } + } } } diff --git a/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift b/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift index 07b80270..126ffd58 100644 --- a/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift +++ b/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift @@ -35,13 +35,11 @@ class VPNDaemon: Daemon, DatabaseAccess, ProvidersAccess { private var isReconnecting: Bool private var lastKnownVpnStatus: VPNStatus = .disconnected - private(set) var timeToConnect: Double private init() { hasEnabledUpdates = false isReconnecting = false numberOfAttempts = 0 - timeToConnect = Date().timeIntervalSince1970 - Client.preferences.lastVPNConnectionAttempt } func start() { @@ -73,7 +71,7 @@ class VPNDaemon: Daemon, DatabaseAccess, ProvidersAccess { switch connection.status { case .connected: nextStatus = .connected - timeToConnect = Date().timeIntervalSince1970 - Client.preferences.lastVPNConnectionAttempt + Client.preferences.timeToConnectVPN = Date().timeIntervalSince1970 - Client.preferences.lastVPNConnectionAttempt let previousStatus = accessedDatabase.transient.vpnStatus diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index 02cb45d6..da9a6cd5 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -99,6 +99,8 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let shareServiceQualityData = "ShareServiceQualityData" static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" + + static let timeToConnectVPN = "timeToConnectVPN" } private let backend: UserDefaults @@ -420,6 +422,15 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } + var timeToConnectVPN: Double { + get { + return backend.double(forKey: Entries.timeToConnectVPN) + } + set { + backend.set(newValue, forKey: Entries.timeToConnectVPN) + } + } + // MARK: Preferences var isPersistentConnection: Bool? { From a578a59bc912daaca460a45d2890d3d8bc225c0c Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 21 Feb 2022 15:44:34 +0100 Subject: [PATCH 09/68] Updates collection of time to connect property based on app version when opted in --- .../Sources/Core/Persistence/PlainStore.swift | 4 ++ .../ServiceQualityManager.swift | 53 ++++++++++++++++--- .../Sources/Library/Client+Preferences.swift | 41 ++++++++++---- .../Persistence/UserDefaultsStore.swift | 16 +++++- .../SignupSuccessViewController.swift | 1 + 5 files changed, 97 insertions(+), 18 deletions(-) diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index 5f63bdca..e551d34a 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -73,6 +73,10 @@ protocol PlainStore: class { var timeToConnectVPN: Double { get set } + // MARK: Service Quality + + var versionServiceQualityOpted: String? { get set } + // MARK: Preferences var isPersistentConnection: Bool? { get set } diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 2da1c957..1e3665c5 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -171,12 +171,7 @@ public class ServiceQualityManager: NSObject { let event = KPIClientEvent( eventCountry: nil, eventName: KPIConnectionEvent.vpnConnectionEstablished.rawValue, - eventProperties: [ - KPIEventPropertyKey.connectionSource.rawValue: connectionSource.rawValue, - KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, - KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue, - KPIEventPropertyKey.timeToConnect.rawValue: timeToConnect() - ], + eventProperties: connectionEstablisedEventProperties(), eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) kpiManager?.submit(event: event) { (error) in @@ -241,7 +236,53 @@ public class ServiceQualityManager: NSObject { } } + private func connectionEstablisedEventProperties() -> [String: String] { + var eventProperties: [String: String] = [ + KPIEventPropertyKey.connectionSource.rawValue: connectionSource().rawValue, + KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, + KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue + ] + if let appVersion = Macros.versionString(), let optedVersion = Client.preferences.versionServiceQualityOpted { + switch optedVersion.versionCompare(appVersion) { + case .orderedSame, .orderedDescending: + eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = timeToConnect() + default: + break + } + } + return eventProperties + } + private func timeToConnect() -> String { return "\(Client.preferences.timeToConnectVPN)" } } + +private extension String { + func versionCompare(_ otherVersion: String, versionDelimiter: String = ".") -> ComparisonResult { + // split the versions by period a default delimiter (.) + var versionComponents = self.components(separatedBy: versionDelimiter) + var otherVersionComponents = otherVersion.components(separatedBy: versionDelimiter) + + // then, find the difference of digit that we will zero pad + let zeroDiff = versionComponents.count - otherVersionComponents.count + + // if there are no differences, we don't need to do anything and use simple .compare + if zeroDiff == 0 { + // Same format, compare normally + return self.compare(otherVersion, options: .numeric) + } else { + // we populate an array of missing zero + let zeros = Array(repeating: "0", count: abs(zeroDiff)) + // we add zero pad array to a version with a fewer period and zero. + if zeroDiff > 0 { + otherVersionComponents.append(contentsOf: zeros) + } else { + versionComponents.append(contentsOf: zeros) + } + // we use array components to build back our versions from components and compare them. This time it will have the same period and number of digit. + return versionComponents.joined(separator: versionDelimiter) + .compare(otherVersionComponents.joined(separator: versionDelimiter), options: .numeric) + } + } +} diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index 6d07250b..8942e285 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -67,6 +67,8 @@ private protocol PreferencesStore: class { var signInWithAppleFakeEmail: String? { get set } var shareServiceQualityData: Bool { get set } + + var versionServiceQualityOpted: String? { get set } func vpnCustomConfiguration(for vpnType: String) -> VPNCustomConfiguration? @@ -100,6 +102,7 @@ private extension PreferencesStore { ikeV2PacketSize = source.ikeV2PacketSize signInWithAppleFakeEmail = source.signInWithAppleFakeEmail shareServiceQualityData = source.shareServiceQualityData + versionServiceQualityOpted = source.versionServiceQualityOpted lastConnectedRegion = source.lastConnectedRegion } } @@ -369,16 +372,6 @@ extension Client { accessedDatabase.plain.signInWithAppleFakeEmail = newValue } } - - /// Shares anonymous data to the service quality library. - public fileprivate(set) var shareServiceQualityData: Bool { - get { - return accessedDatabase.plain.shareServiceQualityData ?? false - } - set { - accessedDatabase.plain.shareServiceQualityData = newValue - } - } /// Store a date as a number when last VPN Connection was attempted. public var lastVPNConnectionAttempt: Double { @@ -400,6 +393,28 @@ extension Client { accessedDatabase.plain.timeToConnectVPN = newValue } } + + // MARK: Service Quality + + /// Shares anonymous data to the service quality library. + public fileprivate(set) var shareServiceQualityData: Bool { + get { + return accessedDatabase.plain.shareServiceQualityData ?? false + } + set { + accessedDatabase.plain.shareServiceQualityData = newValue + } + } + + /// Store app version when user opted-in for service quality stats + public var versionServiceQualityOpted: String? { + get { + return accessedDatabase.plain.versionServiceQualityOpted + } + set { + accessedDatabase.plain.versionServiceQualityOpted = newValue + } + } } } @@ -436,6 +451,7 @@ extension Client.Preferences { ikeV2PacketSize = 0 signInWithAppleFakeEmail = nil shareServiceQualityData = false + versionServiceQualityOpted = nil } /** @@ -523,7 +539,10 @@ extension Client.Preferences { /// :nodoc: public var shareServiceQualityData: Bool - + + /// :nodoc: + public var versionServiceQualityOpted: String? + /// :nodoc: public func vpnCustomConfiguration(for vpnType: String) -> VPNCustomConfiguration? { return vpnCustomConfigurations[vpnType] diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index da9a6cd5..be576682 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -98,6 +98,8 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let shareServiceQualityData = "ShareServiceQualityData" + static let versionServiceQualityOpted = "versionServiceQualityOpted" + static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" static let timeToConnectVPN = "timeToConnectVPN" @@ -514,6 +516,8 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } + // MARK: Service Quality + var shareServiceQualityData: Bool? { get { return backend.bool(forKey: Entries.shareServiceQualityData) @@ -522,7 +526,16 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { backend.set(newValue, forKey: Entries.shareServiceQualityData) } } - + + var versionServiceQualityOpted: String? { + get { + return backend.string(forKey: Entries.versionServiceQualityOpted) + } + set { + backend.set(newValue, forKey: Entries.versionServiceQualityOpted) + } + } + //MARK: Networks var cachedNetworks: [String] { get { @@ -648,6 +661,7 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { backend.removeObject(forKey: Entries.serverNetwork) backend.removeObject(forKey: Entries.signInWithAppleFakeEmail) backend.removeObject(forKey: Entries.shareServiceQualityData) + backend.removeObject(forKey: Entries.versionServiceQualityOpted) backend.synchronize() } diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift index 6e44bcf8..392f234d 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift @@ -96,6 +96,7 @@ public class SignupSuccessViewController: AutolayoutViewController, BrandableNav @IBAction private func acceptShareData() { let preferences = Client.preferences.editable() preferences.shareServiceQualityData = true + preferences.versionServiceQualityOpted = Macros.versionString() preferences.commit() DispatchQueue.main.async { UIView.animate(withDuration: 0.3) { From d789b25ca23333e8342aecea15a73f50cf92e6f2 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 21 Feb 2022 16:39:36 +0100 Subject: [PATCH 10/68] Code refactor --- .../Core/ServiceQuality/ServiceQualityManager.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 1e3665c5..702b02b1 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -171,7 +171,7 @@ public class ServiceQualityManager: NSObject { let event = KPIClientEvent( eventCountry: nil, eventName: KPIConnectionEvent.vpnConnectionEstablished.rawValue, - eventProperties: connectionEstablisedEventProperties(), + eventProperties: createEstablishedEventProperties(), eventInstant: Kotlinx_datetimeInstant.companion.fromEpochMilliseconds(epochMilliseconds: Date().epochMilliseconds) ) kpiManager?.submit(event: event) { (error) in @@ -236,7 +236,7 @@ public class ServiceQualityManager: NSObject { } } - private func connectionEstablisedEventProperties() -> [String: String] { + private func createEstablishedEventProperties() -> [String: String] { var eventProperties: [String: String] = [ KPIEventPropertyKey.connectionSource.rawValue: connectionSource().rawValue, KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, @@ -245,7 +245,7 @@ public class ServiceQualityManager: NSObject { if let appVersion = Macros.versionString(), let optedVersion = Client.preferences.versionServiceQualityOpted { switch optedVersion.versionCompare(appVersion) { case .orderedSame, .orderedDescending: - eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = timeToConnect() + eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = getTimeToConnect() default: break } @@ -253,7 +253,7 @@ public class ServiceQualityManager: NSObject { return eventProperties } - private func timeToConnect() -> String { + private func getTimeToConnect() -> String { return "\(Client.preferences.timeToConnectVPN)" } } From 79086e91a174287ccde64234c6ccd5d81fc7e137 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 21 Feb 2022 17:21:39 +0100 Subject: [PATCH 11/68] Code refactor --- .../ServiceQualityManager.swift | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 702b02b1..764cadc5 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -242,13 +242,10 @@ public class ServiceQualityManager: NSObject { KPIEventPropertyKey.userAgent.rawValue: PIAWebServices.userAgent, KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue ] - if let appVersion = Macros.versionString(), let optedVersion = Client.preferences.versionServiceQualityOpted { - switch optedVersion.versionCompare(appVersion) { - case .orderedSame, .orderedDescending: - eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = getTimeToConnect() - default: - break - } + if let appVersion = Macros.versionString(), + let optedVersion = Client.preferences.versionServiceQualityOpted, + appVersion.isGreaterThanEqual(to: optedVersion) { + eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = getTimeToConnect() } return eventProperties } @@ -259,6 +256,16 @@ public class ServiceQualityManager: NSObject { } private extension String { + + func isGreaterThanEqual(to version: String) -> Bool { + switch self.versionCompare(version) { + case .orderedSame, .orderedDescending: + return true + default: + return false + } + } + func versionCompare(_ otherVersion: String, versionDelimiter: String = ".") -> ComparisonResult { // split the versions by period a default delimiter (.) var versionComponents = self.components(separatedBy: versionDelimiter) From 5549b5fbd9aef0f176267e434b5865f995466fb9 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 21 Feb 2022 17:39:29 +0100 Subject: [PATCH 12/68] Rename property --- .../Sources/Core/Persistence/PlainStore.swift | 2 +- .../ServiceQuality/ServiceQualityManager.swift | 2 +- .../Sources/Library/Client+Preferences.swift | 14 +++++++------- .../Library/Persistence/UserDefaultsStore.swift | 10 +++++----- .../SignupSuccessViewController.swift | 3 ++- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index e551d34a..16572954 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -75,7 +75,7 @@ protocol PlainStore: class { // MARK: Service Quality - var versionServiceQualityOpted: String? { get set } + var versionWhenServiceQualityOpted: String? { get set } // MARK: Preferences diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 764cadc5..1a172798 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -243,7 +243,7 @@ public class ServiceQualityManager: NSObject { KPIEventPropertyKey.vpnProtocol.rawValue: currentProtocol().rawValue ] if let appVersion = Macros.versionString(), - let optedVersion = Client.preferences.versionServiceQualityOpted, + let optedVersion = Client.preferences.versionWhenServiceQualityOpted, appVersion.isGreaterThanEqual(to: optedVersion) { eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = getTimeToConnect() } diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index 8942e285..f6f6fe7d 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -68,7 +68,7 @@ private protocol PreferencesStore: class { var shareServiceQualityData: Bool { get set } - var versionServiceQualityOpted: String? { get set } + var versionWhenServiceQualityOpted: String? { get set } func vpnCustomConfiguration(for vpnType: String) -> VPNCustomConfiguration? @@ -102,7 +102,7 @@ private extension PreferencesStore { ikeV2PacketSize = source.ikeV2PacketSize signInWithAppleFakeEmail = source.signInWithAppleFakeEmail shareServiceQualityData = source.shareServiceQualityData - versionServiceQualityOpted = source.versionServiceQualityOpted + versionWhenServiceQualityOpted = source.versionWhenServiceQualityOpted lastConnectedRegion = source.lastConnectedRegion } } @@ -407,12 +407,12 @@ extension Client { } /// Store app version when user opted-in for service quality stats - public var versionServiceQualityOpted: String? { + public var versionWhenServiceQualityOpted: String? { get { - return accessedDatabase.plain.versionServiceQualityOpted + return accessedDatabase.plain.versionWhenServiceQualityOpted } set { - accessedDatabase.plain.versionServiceQualityOpted = newValue + accessedDatabase.plain.versionWhenServiceQualityOpted = newValue } } } @@ -451,7 +451,7 @@ extension Client.Preferences { ikeV2PacketSize = 0 signInWithAppleFakeEmail = nil shareServiceQualityData = false - versionServiceQualityOpted = nil + versionWhenServiceQualityOpted = nil } /** @@ -541,7 +541,7 @@ extension Client.Preferences { public var shareServiceQualityData: Bool /// :nodoc: - public var versionServiceQualityOpted: String? + public var versionWhenServiceQualityOpted: String? /// :nodoc: public func vpnCustomConfiguration(for vpnType: String) -> VPNCustomConfiguration? { diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index be576682..d7024ca7 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -98,7 +98,7 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let shareServiceQualityData = "ShareServiceQualityData" - static let versionServiceQualityOpted = "versionServiceQualityOpted" + static let versionWhenServiceQualityOpted = "versionWhenServiceQualityOpted" static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" @@ -527,12 +527,12 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } - var versionServiceQualityOpted: String? { + var versionWhenServiceQualityOpted: String? { get { - return backend.string(forKey: Entries.versionServiceQualityOpted) + return backend.string(forKey: Entries.versionWhenServiceQualityOpted) } set { - backend.set(newValue, forKey: Entries.versionServiceQualityOpted) + backend.set(newValue, forKey: Entries.versionWhenServiceQualityOpted) } } @@ -661,7 +661,7 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { backend.removeObject(forKey: Entries.serverNetwork) backend.removeObject(forKey: Entries.signInWithAppleFakeEmail) backend.removeObject(forKey: Entries.shareServiceQualityData) - backend.removeObject(forKey: Entries.versionServiceQualityOpted) + backend.removeObject(forKey: Entries.versionWhenServiceQualityOpted) backend.synchronize() } diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift index 392f234d..a6e1a6fd 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/SignupSuccessViewController.swift @@ -96,7 +96,7 @@ public class SignupSuccessViewController: AutolayoutViewController, BrandableNav @IBAction private func acceptShareData() { let preferences = Client.preferences.editable() preferences.shareServiceQualityData = true - preferences.versionServiceQualityOpted = Macros.versionString() + preferences.versionWhenServiceQualityOpted = Macros.versionString() preferences.commit() DispatchQueue.main.async { UIView.animate(withDuration: 0.3) { @@ -108,6 +108,7 @@ public class SignupSuccessViewController: AutolayoutViewController, BrandableNav @IBAction private func rejectShareData() { let preferences = Client.preferences.editable() preferences.shareServiceQualityData = false + preferences.versionWhenServiceQualityOpted = nil preferences.commit() DispatchQueue.main.async { UIView.animate(withDuration: 0.3) { From e1dd40bb51d0a85f7f1cc9ffc9d81bda32411f0b Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 21 Feb 2022 17:50:09 +0100 Subject: [PATCH 13/68] Renames a function --- .../Sources/Core/ServiceQuality/ServiceQualityManager.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift index 1a172798..ddc1c5cc 100644 --- a/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift +++ b/PIALibrary/Sources/Core/ServiceQuality/ServiceQualityManager.swift @@ -244,7 +244,7 @@ public class ServiceQualityManager: NSObject { ] if let appVersion = Macros.versionString(), let optedVersion = Client.preferences.versionWhenServiceQualityOpted, - appVersion.isGreaterThanEqual(to: optedVersion) { + appVersion.isVersionGreaterThanEqual(to: optedVersion) { eventProperties[KPIEventPropertyKey.timeToConnect.rawValue] = getTimeToConnect() } return eventProperties @@ -257,7 +257,7 @@ public class ServiceQualityManager: NSObject { private extension String { - func isGreaterThanEqual(to version: String) -> Bool { + func isVersionGreaterThanEqual(to version: String) -> Bool { switch self.versionCompare(version) { case .orderedSame, .orderedDescending: return true From aca720b48379733fbd5b0c936ec81c2c0026f4b3 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Thu, 24 Feb 2022 16:34:12 +0100 Subject: [PATCH 14/68] Fixes an issue where wrong ip was shown --- .../Sources/Library/WebServices/EndpointManager.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PIALibrary/Sources/Library/WebServices/EndpointManager.swift b/PIALibrary/Sources/Library/WebServices/EndpointManager.swift index 74afc946..47927117 100644 --- a/PIALibrary/Sources/Library/WebServices/EndpointManager.swift +++ b/PIALibrary/Sources/Library/WebServices/EndpointManager.swift @@ -52,6 +52,7 @@ public class EndpointManager { if let historicalServer = Client.providers.serverProvider.historicalServers.first, let meta = historicalServer.meta { availableEndpoints.append(PinningEndpoint(host: meta.ip, + isProxy: true, useCertificatePinning: true, commonName: meta.cn)) } @@ -65,16 +66,16 @@ public class EndpointManager { if filtered.count < 2 { while availableEndpoints.count < 2 { if let random = currentServers.randomElement(), let meta = random.meta { - availableEndpoints.append(PinningEndpoint(host: meta.ip, useCertificatePinning: true, commonName: meta.cn)) + availableEndpoints.append(PinningEndpoint(host: meta.ip, isProxy: true, useCertificatePinning: true, commonName: meta.cn)) } } } else { if let meta = filtered.first?.meta { - availableEndpoints.append(PinningEndpoint(host: meta.ip, useCertificatePinning: true, commonName: meta.cn)) + availableEndpoints.append(PinningEndpoint(host: meta.ip ,isProxy: true, useCertificatePinning: true, commonName: meta.cn)) } if availableEndpoints.count < 2 { if let meta = filtered[1].meta { - availableEndpoints.append(PinningEndpoint(host: meta.ip, useCertificatePinning: true, commonName: meta.cn)) + availableEndpoints.append(PinningEndpoint(host: meta.ip, isProxy: true, useCertificatePinning: true, commonName: meta.cn)) } } } From d34a4b7af5be66bb1fc4ccbb0f59b0495ee7d6d6 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 7 Mar 2022 09:12:05 +0100 Subject: [PATCH 15/68] Adds accessibility identifiers for UI testing --- .../UI/iOS/ViewControllers/GetStartedViewController.swift | 4 ++++ .../Sources/UI/iOS/ViewControllers/LoginViewController.swift | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift index fca9325f..2246412e 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift @@ -421,6 +421,10 @@ public class GetStartedViewController: PIAWelcomeViewController { for: []) newLoginButton.setTitle(L10n.Welcome.Login.submit.uppercased(), for: []) + + loginButton.accessibilityIdentifier = "uitests.login.submit" + newLoginButton.accessibilityIdentifier = "uitests.login.newSubmit" + buyButton.setTitle(L10n.Signup.Purchase.Trials.All.plans, for: []) subscribeNowButton.setTitle(L10n.Signup.Purchase.Subscribe.now.uppercased(), diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift index 01d92fe8..dcc45fad 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift @@ -80,7 +80,10 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie labelTitle.text = L10n.Welcome.Login.title textUsername.placeholder = L10n.Welcome.Login.Username.placeholder textPassword.placeholder = L10n.Welcome.Login.Password.placeholder - + + textUsername.accessibilityIdentifier = "uitests.login.username" + textPassword.accessibilityIdentifier = "uitests.login.password" + textUsername.text = preset.loginUsername textPassword.text = preset.loginPassword From d45c4b3bc7c444ec984abf52b191272d0db5096e Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Tue, 8 Mar 2022 12:35:01 +0100 Subject: [PATCH 16/68] Adds accessibility identifiers for ui elements --- .../UI/iOS/AccessibilityIdentifiers.swift | 22 +++++++++++++++++++ .../GetStartedViewController.swift | 4 ++-- .../ViewControllers/LoginViewController.swift | 6 ++--- .../PIAWelcomeViewController.swift | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift diff --git a/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift b/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift new file mode 100644 index 00000000..1b92d77d --- /dev/null +++ b/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift @@ -0,0 +1,22 @@ +// +// AccessibilityIdentifiers.swift +// PIALibrary +// +// Created by Waleed Mahmood on 07.03.22. +// + +import Foundation + +public struct Accessibility { + public struct UITests { + public struct Welcome { + public static let environment = "uitest.welcome.environment" + } + public struct Login { + public static let submit = "uitest.login.submit" + public static let submitNew = "uitest.login.submit.new" + public static let username = "uitest.login.username" + public static let password = "uitest.login.submit" + } + } +} diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift index 2246412e..4074055a 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift @@ -422,8 +422,8 @@ public class GetStartedViewController: PIAWelcomeViewController { newLoginButton.setTitle(L10n.Welcome.Login.submit.uppercased(), for: []) - loginButton.accessibilityIdentifier = "uitests.login.submit" - newLoginButton.accessibilityIdentifier = "uitests.login.newSubmit" + loginButton.accessibilityIdentifier = Accessibility.UITests.Login.submit + newLoginButton.accessibilityIdentifier = Accessibility.UITests.Login.submitNew buyButton.setTitle(L10n.Signup.Purchase.Trials.All.plans, for: []) diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift index dcc45fad..dea3a534 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift @@ -81,8 +81,8 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie textUsername.placeholder = L10n.Welcome.Login.Username.placeholder textPassword.placeholder = L10n.Welcome.Login.Password.placeholder - textUsername.accessibilityIdentifier = "uitests.login.username" - textPassword.accessibilityIdentifier = "uitests.login.password" + textUsername.accessibilityIdentifier = Accessibility.UITests.Login.username + textPassword.accessibilityIdentifier = Accessibility.UITests.Login.password textUsername.text = preset.loginUsername textPassword.text = preset.loginPassword @@ -368,7 +368,7 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie buttonLogin.style(style: TextStyle.Buttons.piaGreenButton) buttonLogin.setTitle(L10n.Welcome.Login.submit.uppercased(), for: []) - buttonLogin.accessibilityIdentifier = "uitests.login.submit" + buttonLogin.accessibilityIdentifier = Accessibility.UITests.Login.submit couldNotGetPlanButton.setTitle(L10n.Welcome.Login.Restore.button, for: []) diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift index bf7f73bc..3e660e21 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift @@ -76,6 +76,7 @@ public class PIAWelcomeViewController: AutolayoutViewController, WelcomeCompleti buttonCancel.isHidden = true buttonEnvironment.isHidden = !accessedConfiguration.isDevelopment + buttonEnvironment.accessibilityIdentifier = Accessibility.UITests.Welcome.environment #if os(iOS) let nc = NotificationCenter.default From 2b430fce0e99fcb73ab990588e6f8c63b087d660 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Tue, 8 Mar 2022 17:06:17 +0100 Subject: [PATCH 17/68] Bump version to 2.15.0 --- PIALibrary.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary.podspec b/PIALibrary.podspec index 90dcf51b..d34868d2 100644 --- a/PIALibrary.podspec +++ b/PIALibrary.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "PIALibrary" - s.version = "2.14.0" + s.version = "2.15.0" s.summary = "PIA client library in Swift." s.homepage = "https://www.privateinternetaccess.com/" From 87072ac6ffe51113a713f562f0a248741a41d387 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 9 Mar 2022 18:34:37 +0100 Subject: [PATCH 18/68] Update accessibility identifiers --- .../Sources/UI/iOS/AccessibilityIdentifiers.swift | 15 +++++++++++++++ PIALibrary/Sources/UI/iOS/Macros+UI.swift | 5 ++++- .../iOS/ViewControllers/LoginViewController.swift | 3 ++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift b/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift index 1b92d77d..02478e18 100644 --- a/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift +++ b/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift @@ -17,6 +17,21 @@ public struct Accessibility { public static let submitNew = "uitest.login.submit.new" public static let username = "uitest.login.username" public static let password = "uitest.login.submit" + public struct Error { + public static let banner = "uitest.login.error.banner" + } + } + public struct Permissions { + public static let submit = "uitest.permissions.ok.button" + } + public struct Dashboard { + public static let menu = "uitest.dashboard.menu" + } + public struct Menu { + public static let logout = "uitest.menu.logout" + } + public struct Dialog { + public static let destructive = "uitest.dialog.destructive.button" } } } diff --git a/PIALibrary/Sources/UI/iOS/Macros+UI.swift b/PIALibrary/Sources/UI/iOS/Macros+UI.swift index f0531379..f87e7025 100644 --- a/PIALibrary/Sources/UI/iOS/Macros+UI.swift +++ b/PIALibrary/Sources/UI/iOS/Macros+UI.swift @@ -251,7 +251,8 @@ extension Macros { */ public static func displayImageNote(withImage image: UIImage, message: String, - andDuration duration: Double? = nil) { + andDuration duration: Double? = nil, + accessbilityIdentifier: String = "") { var attributes = EKAttributes() @@ -271,6 +272,7 @@ extension Macros { let imageContent = EKProperty.ImageContent(image: image) let contentView = EKImageNoteMessageView(with: labelContent, imageContent: imageContent) + contentView.accessibilityIdentifier = accessbilityIdentifier SwiftEntryKit.display(entry: contentView, using: attributes) @@ -418,6 +420,7 @@ public extension PopupDialog { let button = DestructiveButton(title: title.uppercased(), dismissOnTap: true) { handler() } + button.accessibilityIdentifier = Accessibility.UITests.Dialog.destructive self.addButton(button) } diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift index dea3a534..dc1cda4b 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift @@ -338,7 +338,8 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie private func displayErrorMessage(errorMessage: String?, displayDuration: Double? = nil) { Macros.displayImageNote(withImage: Asset.iconWarning.image, - message: errorMessage ?? L10n.Welcome.Login.Error.title, andDuration: displayDuration) + message: errorMessage ?? L10n.Welcome.Login.Error.title, andDuration: displayDuration, + accessbilityIdentifier: Accessibility.UITests.Login.Error.banner) } private func handleExpiredAccount() { From c786f8a841432f9f939c12c76b8238bc4a3bf5a9 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Fri, 11 Mar 2022 18:21:55 +0100 Subject: [PATCH 19/68] Refactor accessibility strings --- .../UI/iOS/AccessibilityIdentifiers.swift | 22 +++++++++---------- PIALibrary/Sources/UI/iOS/Macros+UI.swift | 2 +- .../GetStartedViewController.swift | 4 ++-- .../ViewControllers/LoginViewController.swift | 8 +++---- .../PIAWelcomeViewController.swift | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift b/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift index 02478e18..bba0e643 100644 --- a/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift +++ b/PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift @@ -8,30 +8,30 @@ import Foundation public struct Accessibility { - public struct UITests { + public struct Id { public struct Welcome { - public static let environment = "uitest.welcome.environment" + public static let environment = "id.welcome.environment" } public struct Login { - public static let submit = "uitest.login.submit" - public static let submitNew = "uitest.login.submit.new" - public static let username = "uitest.login.username" - public static let password = "uitest.login.submit" + public static let submit = "id.login.submit" + public static let submitNew = "id.login.submit.new" + public static let username = "id.login.username" + public static let password = "id.login.submit" public struct Error { - public static let banner = "uitest.login.error.banner" + public static let banner = "id.login.error.banner" } } public struct Permissions { - public static let submit = "uitest.permissions.ok.button" + public static let submit = "id.permissions.ok.button" } public struct Dashboard { - public static let menu = "uitest.dashboard.menu" + public static let menu = "id.dashboard.menu" } public struct Menu { - public static let logout = "uitest.menu.logout" + public static let logout = "id.menu.logout" } public struct Dialog { - public static let destructive = "uitest.dialog.destructive.button" + public static let destructive = "id.dialog.destructive.button" } } } diff --git a/PIALibrary/Sources/UI/iOS/Macros+UI.swift b/PIALibrary/Sources/UI/iOS/Macros+UI.swift index f87e7025..32e174e8 100644 --- a/PIALibrary/Sources/UI/iOS/Macros+UI.swift +++ b/PIALibrary/Sources/UI/iOS/Macros+UI.swift @@ -420,7 +420,7 @@ public extension PopupDialog { let button = DestructiveButton(title: title.uppercased(), dismissOnTap: true) { handler() } - button.accessibilityIdentifier = Accessibility.UITests.Dialog.destructive + button.accessibilityIdentifier = Accessibility.Id.Dialog.destructive self.addButton(button) } diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift index 4074055a..79a80a76 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/GetStartedViewController.swift @@ -422,8 +422,8 @@ public class GetStartedViewController: PIAWelcomeViewController { newLoginButton.setTitle(L10n.Welcome.Login.submit.uppercased(), for: []) - loginButton.accessibilityIdentifier = Accessibility.UITests.Login.submit - newLoginButton.accessibilityIdentifier = Accessibility.UITests.Login.submitNew + loginButton.accessibilityIdentifier = Accessibility.Id.Login.submit + newLoginButton.accessibilityIdentifier = Accessibility.Id.Login.submitNew buyButton.setTitle(L10n.Signup.Purchase.Trials.All.plans, for: []) diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift index dc1cda4b..5caede15 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/LoginViewController.swift @@ -81,8 +81,8 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie textUsername.placeholder = L10n.Welcome.Login.Username.placeholder textPassword.placeholder = L10n.Welcome.Login.Password.placeholder - textUsername.accessibilityIdentifier = Accessibility.UITests.Login.username - textPassword.accessibilityIdentifier = Accessibility.UITests.Login.password + textUsername.accessibilityIdentifier = Accessibility.Id.Login.username + textPassword.accessibilityIdentifier = Accessibility.Id.Login.password textUsername.text = preset.loginUsername textPassword.text = preset.loginPassword @@ -339,7 +339,7 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie Macros.displayImageNote(withImage: Asset.iconWarning.image, message: errorMessage ?? L10n.Welcome.Login.Error.title, andDuration: displayDuration, - accessbilityIdentifier: Accessibility.UITests.Login.Error.banner) + accessbilityIdentifier: Accessibility.Id.Login.Error.banner) } private func handleExpiredAccount() { @@ -369,7 +369,7 @@ class LoginViewController: AutolayoutViewController, WelcomeChild, PIAWelcomeVie buttonLogin.style(style: TextStyle.Buttons.piaGreenButton) buttonLogin.setTitle(L10n.Welcome.Login.submit.uppercased(), for: []) - buttonLogin.accessibilityIdentifier = Accessibility.UITests.Login.submit + buttonLogin.accessibilityIdentifier = Accessibility.Id.Login.submit couldNotGetPlanButton.setTitle(L10n.Welcome.Login.Restore.button, for: []) diff --git a/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift b/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift index 3e660e21..5f8dffad 100644 --- a/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift +++ b/PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift @@ -76,7 +76,7 @@ public class PIAWelcomeViewController: AutolayoutViewController, WelcomeCompleti buttonCancel.isHidden = true buttonEnvironment.isHidden = !accessedConfiguration.isDevelopment - buttonEnvironment.accessibilityIdentifier = Accessibility.UITests.Welcome.environment + buttonEnvironment.accessibilityIdentifier = Accessibility.Id.Welcome.environment #if os(iOS) let nc = NotificationCenter.default From 0af1741263a9a0b7cfc3bf650491a9d6b58cba00 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Tue, 15 Mar 2022 10:02:59 +0100 Subject: [PATCH 20/68] Add translations and placeholders --- .../Resources/UI/iOS/ar.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/ar.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/da.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/da.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/de.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/de.lproj/Welcome.strings | 2 +- .../UI/iOS/es-MX.lproj/Signup.strings | 20 ++++++++++++++++++- .../UI/iOS/es-MX.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/fr.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/fr.lproj/Welcome.strings | 4 ++-- .../Resources/UI/iOS/it.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/it.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/ja.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/ja.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/ko.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/ko.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/nb.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/nb.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/nl.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/nl.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/pl.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/pl.lproj/Welcome.strings | 6 +++--- .../UI/iOS/pt-BR.lproj/Signup.strings | 20 ++++++++++++++++++- .../UI/iOS/pt-BR.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/ru.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/ru.lproj/Welcome.strings | 2 +- .../Resources/UI/iOS/th.lproj/Signup.strings | 20 ++++++++++++++++++- .../Resources/UI/iOS/th.lproj/Welcome.strings | 2 +- .../UI/iOS/zh-Hans.lproj/Signup.strings | 20 ++++++++++++++++++- .../UI/iOS/zh-Hans.lproj/Welcome.strings | 2 +- .../UI/iOS/zh-Hant.lproj/Signup.strings | 20 ++++++++++++++++++- .../UI/iOS/zh-Hant.lproj/Welcome.strings | 2 +- 32 files changed, 323 insertions(+), 35 deletions(-) diff --git a/PIALibrary/Resources/UI/iOS/ar.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/ar.lproj/Signup.strings index 53243af7..ce7d9f39 100644 --- a/PIALibrary/Resources/UI/iOS/ar.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/ar.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "لمساعدتنا في ضمان أداء اتصال خدمتنا، يمكنك مشاركة إحصائيات اتصالك معنا دون الكشف عن هويتك. لا تتضمن هذه التقارير أي معلومات محددة للشخصية."; "share.data.text.footer" = "يمكنك دائمًا التحكم في ذلك من إعداداتك"; -"share.data.readMore.text.description" = "يساعدنا هذا الحد الأدنى من المعلومات في تحديد مشكلات الاتصال المحتملة وإصلاحها. لاحظ أن مشاركة هذه المعلومات تتطلب الموافقة والتفعيل اليدوي حيث أنها متوقفة بشكل افتراضي.\n\nسنجمع معلومات حول الأحداث التالية:\n\n- محاولة الاتصال\n- الاتصال الملغى\n- الاتصال المؤسس\n\nلجميع هذه الأحداث، سنجمع المعلومات التالية:\n- المنصة\n- إصدار التطبيق\n- نوع التطبيق (إصدار تجريبي أم لا)\n- البروتوكول المستخدم\n- مصدر الاتصال (يدوي أو مؤتمت)\n\nستحتوي جميع الأحداث على معرّف فريد يتم إنشاؤه عشوائيًا. هذا المعرف غير مرتبط بحساب المستخدم الخاص بك. يتم إعادة إنشاء هذا المعرف الفريد يوميًا لأغراض الخصوصية.\n\nستكون دائما أنت المتحكم. يمكنك معرفة البيانات التي جمعناها من \"الإعدادات\"، ويمكنك إيقافها في أي وقت."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/ar.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/ar.lproj/Welcome.strings index 2c96a0ec..75d5562b 100644 --- a/PIALibrary/Resources/UI/iOS/ar.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/ar.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "تسجيل الدخول"; "login.error.validation" = "يجب إدخال اسم المستخدم وكلمة المرور"; "login.error.unauthorized" = "اسم المستخدم أو كلمة المرور غير صحيحة."; -"login.error.throttled" = "لقد أجريت الكثير من المحاولات الفاشلة باسم المستخدم هذا. يرجى إعادة المحاولة لاحقًا."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "تسجيل الدخول باستخدام إيصال الشراء"; "login.magic.link.title" = "تسجيل الدخول باستخدام رابط البريد الإلكتروني السحري"; "login.magic.link.response" = "يرجى إلقاء نظرة على بريدك الإلكتروني للحصول على رابط تسجيل الدخول."; diff --git a/PIALibrary/Resources/UI/iOS/da.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/da.lproj/Signup.strings index 6c124fb5..44c00011 100644 --- a/PIALibrary/Resources/UI/iOS/da.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/da.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "For at hjælpe os med at sikre vores tjenestes forbindelsesydelse, kan du anonymt dele dine forbindelsesstatistikker med os. Disse rapporter inkluderer ikke personligt identificerbare oplysninger."; "share.data.text.footer" = "Du kan altid kontrollere dette fra dine indstillinger"; -"share.data.readMore.text.description" = "Denne minimale information hjælper os med at identificere og løse potentielle forbindelsesproblemer. Bemærk, at deling af disse oplysninger kræver samtykke og manuel aktivering, da de er slået fra som standard.\n\nVi indsamler oplysninger om følgende begivenheder:\n\n- Forbindelsesforsøg\n- Afbrudt forbindelse\n- Forbindelse oprettet\n\nFor alle disse begivenheder indsamler vi følgende oplysninger:\n- Platform\n- Appversion\n- Apptype (forudgivelse eller ej)\n- Protokol anvendt\n- Forbindelseskilde (manuel eller ved hjælp af automatisering)\n\nAlle begivenheder vil indeholde et unikt id, der genereres tilfældigt. Dette id er ikke knyttet til din brugerkonto. Dette unikke id genoprettes dagligt for din fortroligheds skyld.\n\nDu vil altid have kontrol. Du kan se, hvilke data vi har indsamlet fra Indstillinger, og du kan til enhver tid slå dem fra."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/da.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/da.lproj/Welcome.strings index 1c0d7548..6e179a03 100644 --- a/PIALibrary/Resources/UI/iOS/da.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/da.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Log ind"; "login.error.validation" = "Du skal indtaste et brugernavn og et kodeord."; "login.error.unauthorized" = "Dit brugernavn eller kodeord er forkert."; -"login.error.throttled" = "Alt for mange mislykkede forsøg på at logge ind med dette brugernavn. Prøv venligst igen senere."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Log på med købskvittering"; "login.magic.link.title" = "Log ind ved hjælp af magisk e-maillink"; "login.magic.link.response" = "Se i din e-mail for et login-link."; diff --git a/PIALibrary/Resources/UI/iOS/de.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/de.lproj/Signup.strings index 44cd8a9b..ba5d2b2b 100644 --- a/PIALibrary/Resources/UI/iOS/de.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/de.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Um uns zu helfen, die Verbindungsleistung unseres Dienstes sicherzustellen, können Sie Ihre Verbindungsstatistiken anonym mit uns teilen. Diese Berichte enthalten keine persönlich identifizierbaren Informationen."; "share.data.text.footer" = "Sie können dies jederzeit über Ihre Einstellungen steuern"; -"share.data.readMore.text.description" = "Diese minimalen Informationen helfen uns, mögliche Verbindungsprobleme zu erkennen und zu beheben. Beachten Sie, dass die Weitergabe dieser Informationen eine Zustimmung und manuelle Aktivierung erfordert, da sie standardmäßig deaktiviert ist.\n\nWir erfassen Informationen über die folgenden Ereignisse:\n\n- Verbindungsversuch\n- Verbindung abgebrochen\n- Verbindung hergestellt\n\nFür alle diese Ereignisse werden wir die folgenden Informationen erfassen:\n- Plattform\n- App-Version\n- App-Typ (Vorabversion oder nicht)\n- Verwendetes Protokoll\n- Verbindungsquelle (manuell oder über Automatisierung)\n\nAlle Ereignisse enthalten eine eindeutige ID, die zufällig generiert wird. Diese ID ist nicht mit Ihrem Benutzerkonto verknüpft. Diese eindeutige ID wird aus Datenschutzgründen täglich neu generiert.\n\nSie werden immer die Kontrolle haben. Sie können sehen, welche Daten wir über Einstellungen erfasst haben, und Sie können sie jederzeit deaktivieren."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/de.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/de.lproj/Welcome.strings index 90885fe2..ed13eb4a 100644 --- a/PIALibrary/Resources/UI/iOS/de.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/de.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Anmelden"; "login.error.validation" = "Du musst einen Benutzernamen und ein Passwort angeben."; "login.error.unauthorized" = "Dein Benutzername oder Passwort ist falsch."; -"login.error.throttled" = "Zu viele fehlgeschlagene Anmeldeversuche mit diesem Benutzernamen. Bitte später erneut versuchen."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Anmeldung mit Kaufbeleg"; "login.magic.link.title" = "Anmeldung mit magischem E-Mail-Link"; "login.magic.link.response" = "Bitte überprüfen Sie Ihre E-Mail auf einen Login-Link."; diff --git a/PIALibrary/Resources/UI/iOS/es-MX.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/es-MX.lproj/Signup.strings index 3ed6d381..3ebdb9fd 100644 --- a/PIALibrary/Resources/UI/iOS/es-MX.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/es-MX.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Para ayudarnos a garantizar el rendimiento de la conexión de nuestro servicio, puedes compartir con nosotros tus estadísticas de conexión de forma anónima. Estos informes no contienen ninguna información personal identificable."; "share.data.text.footer" = "Siempre puedes controlarlo desde tus ajustes."; -"share.data.readMore.text.description" = "Esta información mínima nos ayuda a identificar y solucionar posibles problemas de conexión. Ten en cuenta que compartir esta información requiere el consentimiento y la activación manual, ya que está desactivada por defecto.\n\nRecopilaremos información sobre los siguientes eventos:\n\n - Intento de conexión\n - Conexión cancelada\n - Conexión establecida\n\nEn todos estos eventos, recopilaremos la siguiente información:\n - Plataforma\n - Versión de la aplicación\n - Tipo de aplicación (previa al lanzamiento o no)\n - Protocolo utilizado\n - Origen de la conexión (manual o mediante automatización)\n\nTodos los eventos contendrán una ID única, generada aleatoriamente. Esta ID no está asociado a tu cuenta de usuario. Esta ID única se genera de nuevo a diario por motivos de privacidad.\n\nSiempre tendrás el control. Podrás ver qué datos hemos recopilado en Ajustes y podrás desactivarlos en cualquier momento."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/es-MX.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/es-MX.lproj/Welcome.strings index d512479c..3c47f73e 100644 --- a/PIALibrary/Resources/UI/iOS/es-MX.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/es-MX.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Iniciar sesión"; "login.error.validation" = "Debe ingresar un nombre de usuario y una contraseña."; "login.error.unauthorized" = "Tu nombre de usuario o contraseña son incorrectos."; -"login.error.throttled" = "Demasiados intentos fallidos de inicio de sesión con este nombre de usuario. Por favor, inténtelo de nuevo más tarde."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Inicia sesión con el recibo de compra"; "login.magic.link.title" = "Inicia sesión con el vínculo mágico del correo electrónico."; "login.magic.link.response" = "Busca en tu correo electrónico un enlace de inicio de sesión."; diff --git a/PIALibrary/Resources/UI/iOS/fr.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/fr.lproj/Signup.strings index c762810e..a99c3019 100644 --- a/PIALibrary/Resources/UI/iOS/fr.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/fr.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Pour nous aider à garantir les performances de connexion de notre service, vous pouvez partager vos statistiques de connexion de manière anonyme avec nous. Ces rapports ne contiennent aucune information personnellement identifiable."; "share.data.text.footer" = "Vous pouvez toujours contrôler cela à partir de vos paramètres."; -"share.data.readMore.text.description" = "Ces informations minimales nous aident à identifier et à résoudre les problèmes de connexion potentiels. Notez que le partage de ces informations nécessite un consentement et une activation manuelle car ils sont désactivés par défaut.\n\nNous collecterons des informations sur les événements suivants :\n\n - Tentative de connexion\n - Connexion annulée\n - Connexion établie\n\nPour tous ces événements, nous collecterons les informations suivantes :\n - Plateforme\n - Version de l'application\n - Type d'application (pré-version ou non)\n - Protocole utilisé\n - Source de connexion (manuelle ou utilisant l'automatisation)\n\nTous les événements contiendront un ID unique généré aléatoirement. Cet ID n'est pas associé à votre compte utilisateur. Cet ID unique est régénéré quotidiennement à des fins de confidentialité.\n\nVous aurez toujours le contrôle. Vous pouvez voir quelles données nous avons collectées à partir de Paramètres, et vous pouvez les désactiver à tout moment."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/fr.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/fr.lproj/Welcome.strings index 7ccfc5fc..623c17c3 100644 --- a/PIALibrary/Resources/UI/iOS/fr.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/fr.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Connexion"; "login.error.validation" = "Vous devez saisir un nom d'utilisateur et un mot de passe."; "login.error.unauthorized" = "Votre nom d'utilisateur ou mot de passe est incorrect."; -"login.error.throttled" = "Trop de tentatives de connexion échouées avec ce nom d'utilisateur. Veuillez réessayer plus tard."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Connectez-vous à l'aide du reçu d'achat"; "login.magic.link.title" = "Connectez-vous à l'aide du lien e-mail magique"; "login.magic.link.response" = "Veuillez vérifier vos e-mails pour trouver un lien de connexion."; @@ -56,7 +56,7 @@ "plan.monthly.title" = "Mensuellement"; "plan.yearly.title" = "Annuellement"; "plan.yearly.detail_format" = "%@%@ par an"; -"plan.price_format" = "%@/mo"; +"plan.price_format" = "%@/mois"; "plan.best_value" = "Économique"; "plan.accessibility.per_month" = "par mois"; diff --git a/PIALibrary/Resources/UI/iOS/it.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/it.lproj/Signup.strings index 83b35b6b..b60ca1b4 100644 --- a/PIALibrary/Resources/UI/iOS/it.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/it.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Per aiutarci a garantire le prestazioni di connessione del nostro servizio, puoi condividere in modo anonimo le tue statistiche di connessione con noi. Questi rapporti non contengono informazioni d'identificazione personale."; "share.data.text.footer" = "Puoi sempre controllare questa funzione dalle tue impostazioni"; -"share.data.readMore.text.description" = "Queste informazioni minime ci aiutano a identificare e risolvere potenziali problemi di connessione. Tieni presente che la condivisione di queste informazioni richiede il consenso e l'attivazione manuale poiché è disattivata per impostazione predefinita.\n\nRaccoglieremo informazioni sui seguenti eventi:\n\n- Tentativo di connessione\n- Connessione annullata\n- Connessione stabilita\n\nPer tutti questi eventi, raccoglieremo le seguenti informazioni:\n- Piattaforma\n- Versione dell'app\n- Tipo di app (pre-lancio o no)\n- Protocollo utilizzato\n- Sorgente di connessione (manuale o tramite automazione)\n\nTutti gli eventi conterranno un ID univoco, generato casualmente. Questo ID non è associato al tuo account utente. Questo ID univoco viene rigenerato quotidianamente per motivi di privacy.\n\nAvrai sempre il controllo. Puoi vedere quali dati abbiamo raccolto da Impostazioni e puoi disattivarlo in qualsiasi momento."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/it.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/it.lproj/Welcome.strings index 9fb74a28..19726568 100644 --- a/PIALibrary/Resources/UI/iOS/it.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/it.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Accedi"; "login.error.validation" = "Devi inserire un nome utente e una password."; "login.error.unauthorized" = "Nome utente o password non valida"; -"login.error.throttled" = "Troppi tentativi d'accesso non riusciti con questo nome utente. Riprova più tardi."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Accedi mediante ricevuta d'acquisto"; "login.magic.link.title" = "Accedi tramite il link magico della mail"; "login.magic.link.response" = "Controlla la tua mail per ottenere il link d'accesso."; diff --git a/PIALibrary/Resources/UI/iOS/ja.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/ja.lproj/Signup.strings index 449520b9..88650893 100644 --- a/PIALibrary/Resources/UI/iOS/ja.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/ja.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "弊社のサービスの接続パフォーマンス確保にご協力いただくには、接続データを匿名で弊社と共有してください。これらのレポートには、個人を特定できる情報は含まれません。"; "share.data.text.footer" = "これは、設定からいつでもコントロール可能です"; -"share.data.readMore.text.description" = "この最小限の情報は、潜在的な接続の問題を特定して修正するのに役立ちます。この情報を共有するには、同意と手動による有効化が必要であることに注意してください(この設定はデフォルトでオフになっています)。\n\n弊社は次のイベントに関する情報を収集します:\n\n- 接続の試み\n- キャンセルされた接続\n- 確立された接続\n- これらすべてのイベントについて、弊社は次の情報を収集します:\n- プラットフォーム\n- アプリのバージョン\n- アプリの種類(プレリリースか否か)\n- 使用されたプロトコル\n- 接続ソース(手動または自動を使用)\n\nすべてのイベントには、ランダムに生成される一意のIDが含まれます。このIDはユーザーアカウントに関連付けられているものではありません。この一意のIDは、プライバシー保護のために毎日再生成されます。\n\n主導権は常にお客様にあります。収集したデータは、設定から確認することができ、いつでもオフにすることができます。"; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/ja.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/ja.lproj/Welcome.strings index 421646c4..98aa77a8 100644 --- a/PIALibrary/Resources/UI/iOS/ja.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/ja.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "ログイン"; "login.error.validation" = "ユーザー名とパスワードを入力してください。"; "login.error.unauthorized" = "ユーザー名またはパスワードが間違っています。"; -"login.error.throttled" = "このユーザー名で最大ログイン試行回数を超えました。後でもう一度お試しください。"; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "購入領収書を使用してログイン"; "login.magic.link.title" = "魔法のメールリンクを使用してログイン"; "login.magic.link.response" = "ログインリンクについては、メールを確認してください。"; diff --git a/PIALibrary/Resources/UI/iOS/ko.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/ko.lproj/Signup.strings index ee86dd5d..cfd62453 100644 --- a/PIALibrary/Resources/UI/iOS/ko.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/ko.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "연결 상태를 저희와 익명으로 공유해 주시면 저희 서비스의 연결 성능을 개선하는 데 도움이 됩니다. 이 보고서에는 개인 식별 정보가 포함되지 않습니다."; "share.data.text.footer" = "언제든지 설정에서 이 옵션을 관리할 수 있습니다."; -"share.data.readMore.text.description" = "이 최소한의 정보는 잠재적인 연결 문제를 식별하고 해결하는 데 도움이 됩니다. 이 정보를 공유하려면 기본적으로 해제되어 있는 승인과 수동 활성화가 필요합니다.\n\n저희가 수집하는 이벤트에 관한 정보는 다음과 같습니다.\n\n - 연결 시도\n - 취소된 연결\n - 수립된 연결\n\n이러한 이벤트에 관하여 저희가 수집하는 정보는 다음과 같습니다.\n - 플랫폼\n - 앱 버전\n - 앱 유형 (사전 출시 여부)\n - 사용된 프로토콜\n - 연결 소스 (수동 또는 자동 사용)\n\n모든 이벤트에는 무작위로 생성된 고유 ID가 포함됩니다. 이 ID는 사용자 계정과 연결되지 않습니다. 이 고유 ID는 개인 정보 보호 목적을 위하여 매일 다시 생성됩니다.\n\n회원님은 언제나 이를 통제할 수 있습니다. 설정에서 저희가 수집하는 데이터를 확인하고, 언제든지 해제하실 수 있습니다."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/ko.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/ko.lproj/Welcome.strings index 6f0afb0c..2d29b5f8 100644 --- a/PIALibrary/Resources/UI/iOS/ko.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/ko.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "로그인"; "login.error.validation" = "사용자 이름과 비밀번호를 입력하셔야 합니다."; "login.error.unauthorized" = "사용자명 또는 비밀번호가 틀립니다."; -"login.error.throttled" = "이 사용자 이름으로 너무 많은 로그인 시도가 실패했습니다. 나중에 다시 시도해주십시오."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "구매 영수증을 사용해 로그인"; "login.magic.link.title" = "이메일 링크를 사용해 간편하게 로그인"; "login.magic.link.response" = "로그인 링크가 담긴 이메일을 확인하세요."; diff --git a/PIALibrary/Resources/UI/iOS/nb.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/nb.lproj/Signup.strings index 58259561..300d513e 100644 --- a/PIALibrary/Resources/UI/iOS/nb.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/nb.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "For å hjelpe oss med å sikre tjenestens tilkoblingsytelse, kan du anonymt dele tilkoblingsstatistikken din med oss. Disse rapportene inkluderer informasjon som ikke er personlig identifiserbar."; "share.data.text.footer" = "Du kan kontrollere dette fra innstillingene dine"; -"share.data.readMore.text.description" = "Denne minimale informasjonen hjelper oss med å identifisere og rette opp potensielle tilkoblingsproblemer. Merk at deling av denne informasjonen krever samtykke og manuell aktivering fordi den er slått av som standard.\n\nVi henter inn informasjon om følgende hendelser:\n\n- Tilkoblingsforsøk\n- Tilkoblinger som blir avbrutt\n- Forbindelser som etableres\n\nFor alle disse hendelsene henter vi inn følgende informasjon:\n- Plattform\n- App-versjon\n- App-type (forhåndsutgivelse eller ikke)\n- Protokoll brukt\n- Tilkoblingskilde (manuell eller ved bruk av automatisering)\n\nAlle hendelsene inneholder en unik ID, som genereres tilfeldig. Denne ID-en er ikke tilknyttet brukerkontoen din. Den unike ID-en genereres på nytt hver dag for å sikre personvernet.\n\nDu beholder alltid kontrollen. Du kan se hvilke data vi har hentet inn fra Innstillinger, og du kan slå den av når som helst."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/nb.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/nb.lproj/Welcome.strings index 6ed2a50e..80faed97 100644 --- a/PIALibrary/Resources/UI/iOS/nb.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/nb.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Logg på"; "login.error.validation" = "Du må oppgi et brukernavn og passord."; "login.error.unauthorized" = "Brukernavnet eller passordet ditt er feil."; -"login.error.throttled" = "For mange mislykkede påloggingsforsøk med dette brukernavnet. Prøv igjen senere."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Logg på med kjøpsbevis"; "login.magic.link.title" = "Pålogging med magisk e-postkobling"; "login.magic.link.response" = "Sjekk e-posten din for å finne påloggingskoblingen."; diff --git a/PIALibrary/Resources/UI/iOS/nl.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/nl.lproj/Signup.strings index 1806f22e..97c63fd9 100644 --- a/PIALibrary/Resources/UI/iOS/nl.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/nl.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Om ons te helpen de verbindingsprestaties van onze dienst te verbeteren, kunt u uw verbindingsstatistieken anoniem met ons delen. Deze rapporten bevatten geen persoonsgegevens."; "share.data.text.footer" = "U kunt dit via de Instellingen beheren"; -"share.data.readMore.text.description" = "Deze minimuminformatie helpt ons bij het identificeren en oplossen van potentiële verbindingsproblemen. Let op: voor het delen van deze informatie is toestemming vereist en de handmatige activatie is standaard uitgeschakeld.\n\nWe verzamelen gegevens over de volgende zaken:\n\n- Verbindingspoging\n- Verbinding geannuleerd\n- Verbinding gemaakt\n\nVoor al deze zaken verzamelen we de volgende informatie:\n- Platform\n- App-versie\n- App-type (pre-release of niet)\n- Gebruikt protocol\n- Verbindingsbron (handmatig of automatisch)\n\nAlle zaken krijgen een unieke ID die willekeurig wordt aangemaakt. Deze ID is niet gekoppeld aan uw gebruikersaccount. Dit unieke ID wordt vanwege de privacy dagelijks opnieuw aangemaakt.\n\nU houdt altijd de touwtjes in handen. Via Instellingen kunt u altijd zien welke gegevens we hebben verzameld en u kunt de verzameling te allen tijde uitschakelen."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/nl.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/nl.lproj/Welcome.strings index beec2652..3c4007de 100644 --- a/PIALibrary/Resources/UI/iOS/nl.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/nl.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Inloggen"; "login.error.validation" = "U moet een gebruikersnaam en wachtwoord invoeren."; "login.error.unauthorized" = "Uw gebruikersnaam of wachtwoord is onjuist."; -"login.error.throttled" = "Te veel mislukte inlogpogingen met deze gebruikersnaam. Probeer het later opnieuw."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Inloggen met aankoopbewijs"; "login.magic.link.title" = "Log in met de magische link in uw e-mail"; "login.magic.link.response" = "Controleer uw e-mail voor een inloglink."; diff --git a/PIALibrary/Resources/UI/iOS/pl.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/pl.lproj/Signup.strings index e597af16..9922f65c 100644 --- a/PIALibrary/Resources/UI/iOS/pl.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/pl.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Aby pomóc nam zapewnić najlepszą wydajność naszych usług, możesz anonimowo udostępniać nam swoje statystyki połączeń. Raporty te nie zawierają żadnych informacji umożliwiających identyfikację osób."; "share.data.text.footer" = "Zawsze możesz to kontrolować w swoich ustawieniach"; -"share.data.readMore.text.description" = "Te minimalne informacje pomagają nam zidentyfikować i naprawić potencjalne problemy z połączeniem. Pamiętaj, że udostępnianie tych informacji wymaga zgody i ręcznej aktywacji, ponieważ jest domyślnie wyłączone.\n\nBędziemy zbierać informacje o następujących zdarzeniach:\n\n - Próba połączenia\n - Połączenie anulowane\n - Połączenie ustanowione\n\nW przypadku wszystkich tych wydarzeń zbieramy następujące informacje:\n - Platforma\n - Wersja aplikacji\n - Typ aplikacji (w wersji wstępnej lub nie)\n - Używany protokół\n - Źródło połączenia (ręcznie lub za pomocą automatyzacji)\n\nWszystkie zdarzenia będą zawierały unikalny identyfikator, który jest generowany losowo. Ten identyfikator nie jest powiązany z Twoim kontem użytkownika. Ten unikalny identyfikator jest codziennie ponownie generowany w celu zachowania prywatności.\n\nZawsze będziesz mieć kontrolę. Możesz zobaczyć, jakie dane zebraliśmy w Ustawieniach, i możesz wyłączyć zbieranie danych w dowolnym momencie."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/pl.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/pl.lproj/Welcome.strings index 07dc0693..1af0054e 100644 --- a/PIALibrary/Resources/UI/iOS/pl.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/pl.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Zaloguj"; "login.error.validation" = "Musisz podać nazwę użytkownika i hasło."; "login.error.unauthorized" = "Twoja nazwa użytkownika i hasło są nieprawidłowe."; -"login.error.throttled" = "Zbyt wiele nieudanych prób logowania z tą nazwą użytkownika. Spróbuj ponownie później."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Zaloguj się, używając pokwitowania zakupu"; "login.magic.link.title" = "Zaloguj się, używając sekretnego linku z e-maila"; "login.magic.link.response" = "Link do logowania wysłaliśmy e-mailem,"; @@ -79,10 +79,10 @@ "getstarted.buttons.buyaccount" = "Zakup konto"; -"gdpr.collect.data.title" = "Zbierane przez dane asobowe"; +"gdpr.collect.data.title" = "Zbierane dane osobowe"; "gdpr.collect.data.description" = "Adres e-mail do zarządzania kontem i ochrony przed nadużyciami."; "gdpr.usage.data.title" = "Sposoby wykorzystania zbieranych przez nas danych osobowych"; "gdpr.usage.data.description" = "Adres e-mail; używany go do wysyłania informacji o subskrypcji, potwierdzeń płatności, korespondencji z klientami i wysyłania ofert promocyjnych wyłącznie Private Internet Access"; "gdpr.accept.button.title" = "Zaakceptuj i kontynuuj"; -"update.account.email.error" = "Nie udało się zmienić -emalia konta"; +"update.account.email.error" = "Nie udało się zmienić adresu e-mail konta"; diff --git a/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Signup.strings index 733483a2..5bcf7cb9 100644 --- a/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Para nos ajudar a garantir o desempenho da conexão de nosso serviço, você pode compartilhar anonimamente as estatísticas da sua conexão conosco. Esses relatórios não incluem nenhuma informação de identificação pessoal."; "share.data.text.footer" = "Você sempre poderá controlar isso em suas configurações"; -"share.data.readMore.text.description" = "Essas informações mínimas nos ajudam a identificar e a corrigir possíveis problemas de conexão. Observe que o compartilhamento dessas informações requer consentimento e ativação manual, pois ele é desativado por padrão.\n\nColetaremos informações sobre os seguintes eventos:\n\n- Tentativa de conexão\n- Conexão cancelada \n- Conexão estabelecida \n\nPara todos esses eventos, coletaremos as seguintes informações:\n- Plataforma\n- Versão do aplicativo \n- Tipo de aplicativo (pré-lançamento ou não) \n- Protocolo usado \n- Origem da conexão (manual ou automática) \n\nTodos os eventos conterão um ID único, gerado aleatoriamente. Esse ID não está associado à sua conta de usuário. O ID único é gerado novamente todos os dias para fins de privacidade.\n\nVocê sempre estará no controle e poderá ver quais dados coletamos nas Configurações, podendo desativar essa opção a qualquer momento."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Welcome.strings index 8d15bd2e..7ed6d1e8 100644 --- a/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/pt-BR.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Entrar"; "login.error.validation" = "Você deve inserir um nome de usuário e senha."; "login.error.unauthorized" = "Seu nome de usuário ou senha está incorreto."; -"login.error.throttled" = "Muitas tentativas de login malsucedidas com este nome de usuário. Tente novamente mais tarde."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Faça login usando o recibo de compra"; "login.magic.link.title" = "Faça login usando o link mágico enviado por e-mail"; "login.magic.link.response" = "Veja se você recebeu por e-mail um link para fazer login."; diff --git a/PIALibrary/Resources/UI/iOS/ru.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/ru.lproj/Signup.strings index c201df2d..9f032f79 100644 --- a/PIALibrary/Resources/UI/iOS/ru.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/ru.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "Вы можете анонимно делиться с нами своей статистикой соединения, чтобы помочь нам обеспечить производительность подключения нашей службы. Эти отчеты не включают какую-либо личную информацию."; "share.data.text.footer" = "Вы всегда можете управлять этим параметром через настройки"; -"share.data.readMore.text.description" = "Эта минимальная информация помогает нам идентифицировать и исправлять потенциальные неполадки соединения. Обращаем ваше внимание, что для передачи этой информации требуется согласие и активация вручную, т.к. по умолчанию этот параметр отключен.\n\nМы будем собирать информацию о следующих событиях:\n\n- Попытки соединения\n- Отмененное соединение\n- Установленное соединение\n\nДля всех указанных событий мы будем собирать следующую информацию:\n- Платформа\n- Версия приложения\n- Тип приложения (предварительный выпуск или нет)\n- Источник соединения (вручную или с использованием автоматизации)\n\nВсе события будут включать уникальный идентификатор, генерируемый случайным образом. Этот идентификатор не сопоставляется с вашей учетной записью. Данный уникальный код в целях обеспечения конфиденциальности ежедневно генерируется повторно.\n\nКонтроль во всех случаях будет в ваших руках. Вы сможете увидеть, какие данные мы собрали, в настройках, а также можете в любое время отключить этот параметр."; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/ru.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/ru.lproj/Welcome.strings index f0511678..cd068497 100644 --- a/PIALibrary/Resources/UI/iOS/ru.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/ru.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "Войти"; "login.error.validation" = "Нужно ввести имя пользователя и пароль."; "login.error.unauthorized" = "Неправильное имя пользователя или пароль."; -"login.error.throttled" = "Слишком много неудачных попыток входа с использованием этого имени пользователя. Повторите попытку позже."; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "Выполните вход по квитанции о покупке"; "login.magic.link.title" = "Войти через волшебную ссылку из письма"; "login.magic.link.response" = "Поищите ссылку для входа в письме."; diff --git a/PIALibrary/Resources/UI/iOS/th.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/th.lproj/Signup.strings index 856a1930..520a4ea3 100644 --- a/PIALibrary/Resources/UI/iOS/th.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/th.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "เพื่อช่วยให้เรามั่นใจในประสิทธิภาพการเชื่อมต่อของบริการของเรา คุณสามารถแชร์สถิติการเชื่อมต่อของคุณกับเราโดยไม่ระบุชื่อ รายงานเหล่านี้ไม่รวมข้อมูลส่วนบุคคลที่สามารถระบุตัวตนได้"; "share.data.text.footer" = "คุณสามารถควบคุมสิ่งนี้ได้จากการตั้งค่าของคุณ"; -"share.data.readMore.text.description" = "ข้อมูลเพียงเล็กน้อยนี้ช่วยเราในการระบุและแก้ไขปัญหาการเชื่อมต่อที่อาจเกิดขึ้น โปรดทราบว่าการแชร์ข้อมูลนี้ต้องได้รับความยินยอมและเปิดใช้งานด้วยตนเอง เนื่องจากข้อมูลดังกล่าวจะปิดอยู่โดยค่าเริ่มต้น\n\nเราจะรวบรวมข้อมูลเกี่ยวกับเหตุการณ์ต่อไปนี้:\n\n- ความพยายามในการเชื่อมต่อ\n- การเชื่อมต่อที่ถูกยกเลิก\n- การเชื่อมต่อที่สร้างแล้ว\n\nสำหรับกิจกรรมเหล่านี้ เราจะรวบรวมข้อมูลต่อไปนี้:\n- แพลตฟอร์ม\n- เวอร์ชันแอป\n- ประเภทแอป (ก่อนเปิดตัวหรือไม่)\n- โปรโตคอลที่ใช้\n- แหล่งการเชื่อมต่อ (ด้วยตนเองหรือโดยใช้ระบบอัตโนมัติ)\n\nเหตุการณ์ทั้งหมดจะมี ID ที่ไม่ซ้ำ ซึ่งสร้างขึ้นแบบสุ่ม ID นี้ไม่เชื่อมโยงกับบัญชีผู้ใช้ของคุณ และ ID ที่ไม่ซ้ำนี้ถูกสร้างขึ้นใหม่ทุกวันเพื่อความเป็นส่วนตัว\n\nคุณจะอยู่ภายใต้การควบคุมเสมอ คุณดูข้อมูลที่เรารวบรวมได้จากการตั้งค่า และปิดใช้งานได้ทุกเมื่อ"; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/th.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/th.lproj/Welcome.strings index 8f0afffa..637de14e 100644 --- a/PIALibrary/Resources/UI/iOS/th.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/th.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "เข้าสู่ระบบ"; "login.error.validation" = "คุณต้องกรอกชื่อผู้ใช้และรหัสผ่าน"; "login.error.unauthorized" = "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง"; -"login.error.throttled" = "มีการลงชื่อเข้าใช้ล้มเหลวด้วยชื่อผู้ใช้นี้เกินจำนวนครั้งที่กำหนด โปรดลองใหม่อีกครั้งภายใน"; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "เข้าสู่ระบบโดยใช้ใบเสร็จรับเงิน"; "login.magic.link.title" = "เข้าสู่ระบบโดยใช้ลิงก์อีเมลวิเศษ"; "login.magic.link.response" = "โปรดตรวจสอบอีเมลของคุณเพื่อดูลิงค์สำหรับเข้าสู่ระบบ"; diff --git a/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Signup.strings index b5dde44d..2f4afbb7 100644 --- a/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "为了帮助我们保持服务的连接性能,您可以匿名与我们共享您的连接统计数据。这些报告不包括任何可识别个人身份的信息。"; "share.data.text.footer" = "您始终可以从设置中进行控制"; -"share.data.readMore.text.description" = "这些有限的信息有助于我们识别并解决潜在的连接问题。请注意,分享这些信息需要您同意并手动激活,因为这是默认关闭的。\n\n我们将收集关于以下事件的信息:\n\n - 连接尝试\n - 连接已取消\n - 连接已建立\n\n对于上述所有事件,我们将收集以下信息:\n - 平台\n - 应用程序版本\n - 应用程序类型(预先发布或不预先发布)\n - 使用的协议\n - 连接来源(手动或使用自动化)\n\n所有事件都将包含一个随机生成的唯一 ID。这个 ID 与您的用户账户没有关联。为了保护隐私,这个唯一 ID 每天都会重新生成。\n\n您将始终处于掌控地位。您可以看到我们从设置中收集了哪些数据,您可以随时将其关闭。"; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Welcome.strings index 95c49f60..8d5c7e11 100644 --- a/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/zh-Hans.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "登录"; "login.error.validation" = "您必须输入用户名和密码。"; "login.error.unauthorized" = "您的用户名或密码不正确。"; -"login.error.throttled" = "此用户名尝试登录的失败次数过多。请稍后再试。"; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "使用购买收据登录"; "login.magic.link.title" = "使用魔法电子邮件链接登录"; "login.magic.link.response" = "请检查您的电子邮件,以查找登录链接。"; diff --git a/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Signup.strings b/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Signup.strings index 9f2ba32a..ed78c07e 100644 --- a/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Signup.strings +++ b/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Signup.strings @@ -71,4 +71,22 @@ "share.data.text.description" = "為了確保服務的連線品質,您可以匿名與我們分享您的連線統計資料。這些報告不會包含任何個人識別資訊。"; "share.data.text.footer" = "您隨時都可以在設定中控制。"; -"share.data.readMore.text.description" = "這些基本資訊可協助我們辨識及修正可能的連線問題。請注意,分享這些資訊需要您的同意,且該功能預設為關閉,因此必須手動開啟。\n\n我們會收集以下事件的資訊:\n\n- 連線嘗試\n- 取消的連線\n- 建立的連線\n\n我們會針對上述事件收集下列資訊:\n- 平台\n- 應用程式版本\n- 應用程式類型 (是否為預先發布版)\n- 使用的通訊協定\n- 連線來源 (手動或自動)\n\n所有事件均有一組隨機產生的不重複識別碼。此識別碼不會和您的使用者帳戶建立關聯。為保護隱私,這個唯一識別碼每天都會重新產生。\n\n控制權始終都在您的掌握中。您可以在「設定」中看到我們收集了哪些資料,且隨時可關閉此功能。"; +"share.data.readMore.text.description" = "This minimal information assists us in identifying and fixing potential connection issues. Note that sharing this information requires consent and manual activation as it is turned off by default. + +We will collect information about the following events: + + - Connection Attempt + - Connection Canceled + - Connection Established + +For all of these events, we will collect the following information: + - Platform + - App version + - App type (pre-release or not) + - Protocol used + - Connection source (manual or using automation) + - Time To Connect (time between connecting and connected state) + +All events will contain a unique ID, which is randomly generated. This ID is not associated with your user account. This unique ID is re-generated daily for privacy purposes. + +You will always be in control. You can see what data we’ve collected from Settings, and you can turn it off at any time."; diff --git a/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Welcome.strings b/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Welcome.strings index 22f38ed1..b4c846e0 100644 --- a/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Welcome.strings +++ b/PIALibrary/Resources/UI/iOS/zh-Hant.lproj/Welcome.strings @@ -14,7 +14,7 @@ "login.error.title" = "登入"; "login.error.validation" = "您必須輸入使用者名稱及密碼。"; "login.error.unauthorized" = "您的使用者名稱或密碼不正確。"; -"login.error.throttled" = "此使用者名稱登入失敗次數太多,\n請稍後再試。"; +"login.error.throttled" = "Too many failed login attempts with this username. Please try again after %@ second(s)."; "login.receipt.button" = "使用購買收據登入"; "login.magic.link.title" = "使用神奇的電子郵件連結登入"; "login.magic.link.response" = "請確認電子信箱是否已收到登入連結。"; From 0c61ec3510ed148bb03ba4ac8e1566553fee1485 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 28 Mar 2022 19:35:10 +0200 Subject: [PATCH 21/68] Update mapping of new devices --- .../Sources/UI/Shared/DeviceModel.swift | 59 ++++++++++++++++--- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/PIALibrary/Sources/UI/Shared/DeviceModel.swift b/PIALibrary/Sources/UI/Shared/DeviceModel.swift index 3adb4e53..7344ae9e 100644 --- a/PIALibrary/Sources/UI/Shared/DeviceModel.swift +++ b/PIALibrary/Sources/UI/Shared/DeviceModel.swift @@ -34,7 +34,9 @@ iPod2 = "iPod 2", iPod3 = "iPod 3", iPod4 = "iPod 4", iPod5 = "iPod 5", - +iPod6 = "6th Gen iPod", +iPod7 = "7th Gen iPod", + //iPad iPad2 = "iPad 2", iPad3 = "iPad 3", @@ -42,10 +44,12 @@ iPad4 = "iPad 4", iPadAir = "iPad Air ", iPadAir2 = "iPad Air 2", iPadAir3 = "iPad Air 3", +iPadAir4 = "iPad Air 4", iPad5 = "iPad 5", //iPad 2017 iPad6 = "iPad 6", //iPad 2018 iPad7 = "iPad 7", //iPad 2019 - +iPad8 = "iPad 8", + //iPad Mini iPadMini = "iPad Mini", iPadMini2 = "iPad Mini 2", @@ -59,8 +63,12 @@ iPadPro10_5 = "iPad Pro 10.5\"", iPadPro11 = "iPad Pro 11\"", iPadPro12_9 = "iPad Pro 12.9\"", iPadPro2_12_9 = "iPad Pro 2 12.9\"", +iPadPro3_11 = "iPad Pro 3 11\"", iPadPro3_12_9 = "iPad Pro 3 12.9\"", - +iPadPro4_11 = "iPad Pro 4 11\"", +iPadPro4_12_9 = "iPad Pro 4 12.9\"", +iPadPro5_12_9 = "iPad Pro 5 12.9\"", + //iPhone iPhone4 = "iPhone 4", iPhone4S = "iPhone 4S", @@ -83,7 +91,16 @@ iPhoneXR = "iPhone XR", iPhone11 = "iPhone 11", iPhone11Pro = "iPhone 11 Pro", iPhone11ProMax = "iPhone 11 Pro Max", - +iPhoneSE2Gen = "iPhone SE 2nd Gen", +iPhone12Mini = "iPhone 12 Mini", +iPhone12 = "iPhone 12", +iPhone12Pro = "iPhone 12 Pro", +iPhone12ProMax = "iPhone 12 Pro Max", +iPhone13Pro = "iPhone 13 Pro", +iPhone13ProMax = "iPhone 13 Pro Max", +iPhone13Mini = "iPhone 13 Mini", +iPhone13 = "iPhone 13", + //Apple TV AppleTV = "Apple TV", AppleTV_4K = "Apple TV 4K", @@ -117,7 +134,9 @@ var type: Model { "iPod3,1" : .iPod3, "iPod4,1" : .iPod4, "iPod5,1" : .iPod5, - + "iPod7,1" : .iPod6, + "iPod9,1" : .iPod7, + //iPad "iPad2,1" : .iPad2, "iPad2,2" : .iPad2, @@ -135,7 +154,9 @@ var type: Model { "iPad7,6" : .iPad6, "iPad7,11" : .iPad7, //iPad 2019 "iPad7,12" : .iPad7, - + "iPad11,6" : .iPad8, + "iPad11,7" : .iPad8, + //iPad Mini "iPad2,5" : .iPadMini, "iPad2,6" : .iPadMini, @@ -168,7 +189,19 @@ var type: Model { "iPad8,6" : .iPadPro3_12_9, "iPad8,7" : .iPadPro3_12_9, "iPad8,8" : .iPadPro3_12_9, - + "iPad8,9" : .iPadPro4_11, + "iPad8,10" : .iPadPro4_11, + "iPad8,11" : .iPadPro4_12_9, + "iPad8,12" : .iPadPro4_12_9, + "iPad13,4" : .iPadPro3_11, + "iPad13,5" : .iPadPro3_11, + "iPad13,6" : .iPadPro3_11, + "iPad13,7" : .iPadPro3_11, + "iPad13,8" : .iPadPro5_12_9, + "iPad13,9" : .iPadPro5_12_9, + "iPad13,10" : .iPadPro5_12_9, + "iPad13,11" : .iPadPro5_12_9, + //iPad Air "iPad4,1" : .iPadAir, "iPad4,2" : .iPadAir, @@ -177,7 +210,8 @@ var type: Model { "iPad5,4" : .iPadAir2, "iPad11,3" : .iPadAir3, "iPad11,4" : .iPadAir3, - + "iPad13,1" : .iPadAir4, + "iPad13,2" : .iPadAir4, //iPhone "iPhone3,1" : .iPhone4, @@ -212,6 +246,15 @@ var type: Model { "iPhone12,1" : .iPhone11, "iPhone12,3" : .iPhone11Pro, "iPhone12,5" : .iPhone11ProMax, + "iPhone12,8": .iPhoneSE2Gen, + "iPhone13,1": .iPhone12Mini, + "iPhone13,2": .iPhone12, + "iPhone13,3": .iPhone12Pro, + "iPhone13,4": .iPhone12ProMax, + "iPhone14,2": .iPhone13Pro, + "iPhone14,3": .iPhone13ProMax, + "iPhone14,4": .iPhone13Mini, + "iPhone14,5": .iPhone13, //Apple TV "AppleTV5,3" : .AppleTV, From 3e7c46295e062214c35713ede84632827e00e8de Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Tue, 5 Apr 2022 14:22:05 +0200 Subject: [PATCH 22/68] Bump version to 2.16.0 --- PIALibrary.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary.podspec b/PIALibrary.podspec index d34868d2..d918537a 100644 --- a/PIALibrary.podspec +++ b/PIALibrary.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "PIALibrary" - s.version = "2.15.0" + s.version = "2.16.0" s.summary = "PIA client library in Swift." s.homepage = "https://www.privateinternetaccess.com/" From 492fb2e88d94800e3b2bad4a4ee31784bbb88403 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Tue, 12 Apr 2022 21:32:36 +0200 Subject: [PATCH 23/68] Add new feature flag for rating popup --- PIALibrary/Sources/Library/Client+Configuration.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/PIALibrary/Sources/Library/Client+Configuration.swift b/PIALibrary/Sources/Library/Client+Configuration.swift index e413459f..6aa0aa9c 100644 --- a/PIALibrary/Sources/Library/Client+Configuration.swift +++ b/PIALibrary/Sources/Library/Client+Configuration.swift @@ -30,6 +30,7 @@ extension Client { public static let disableMultiDipTokens = "disable-multi-dip-tokens" public static let checkDipExpirationRequest = "check-dip-expiration-request" public static let showNewInitialScreen = "show-new-initial-screen" + public static let useCustomRatingPopup = "use-custom-rating-popup" } /// Encapsulates internal and public parameters of the client. When not specified otherwise, time intervals are in milliseconds. From 2a43d303de0b1affb05c4ad492459b24b98d3bb7 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Thu, 21 Apr 2022 02:32:59 +0200 Subject: [PATCH 24/68] Fix the v2 token migration --- PIALibrary/Sources/Library/Client.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/PIALibrary/Sources/Library/Client.swift b/PIALibrary/Sources/Library/Client.swift index 8365cf18..9e5b1589 100644 --- a/PIALibrary/Sources/Library/Client.swift +++ b/PIALibrary/Sources/Library/Client.swift @@ -83,11 +83,14 @@ public final class Client { // migrate from old token providers.accountProvider.migrateOldTokenIfNeeded { (error) in - // If there was an error. It will retry on the next boostrap. - if (error != nil) { - log.debug("Client bootstrap migrateOldTokenIfNeeded error: \(error)") + // If there was an error. It will force the user logout. + guard let error = error as? ClientError else { return } + log.debug("Client bootstrap migrateOldTokenIfNeeded error: \(error)") + if (error == .unauthorized) { + providers.accountProvider.logout(nil) + } } } From b21ab1d2c3c437342149ab08d2c24542dc703c54 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Thu, 21 Apr 2022 02:36:57 +0200 Subject: [PATCH 25/68] Bump to hotfix version 2.16.1 --- PIALibrary.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary.podspec b/PIALibrary.podspec index d918537a..a51632d5 100644 --- a/PIALibrary.podspec +++ b/PIALibrary.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "PIALibrary" - s.version = "2.16.0" + s.version = "2.16.1" s.summary = "PIA client library in Swift." s.homepage = "https://www.privateinternetaccess.com/" From 8b85910458d080097ec965cc469d6bd691b74367 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Thu, 21 Apr 2022 14:11:42 +0200 Subject: [PATCH 26/68] Flag rename --- PIALibrary/Sources/Library/Client+Configuration.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary/Sources/Library/Client+Configuration.swift b/PIALibrary/Sources/Library/Client+Configuration.swift index 6aa0aa9c..0d8c32d1 100644 --- a/PIALibrary/Sources/Library/Client+Configuration.swift +++ b/PIALibrary/Sources/Library/Client+Configuration.swift @@ -30,7 +30,7 @@ extension Client { public static let disableMultiDipTokens = "disable-multi-dip-tokens" public static let checkDipExpirationRequest = "check-dip-expiration-request" public static let showNewInitialScreen = "show-new-initial-screen" - public static let useCustomRatingPopup = "use-custom-rating-popup" + public static let disableSystemRatingDialog = "disable-system-rating-dialogue" } /// Encapsulates internal and public parameters of the client. When not specified otherwise, time intervals are in milliseconds. From 0edc0c1cafc33d59cdd9375978987d43585a4087 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 4 May 2022 13:56:47 +0200 Subject: [PATCH 27/68] Bump to version 2.17.0 --- PIALibrary.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary.podspec b/PIALibrary.podspec index a51632d5..6b5b7f90 100644 --- a/PIALibrary.podspec +++ b/PIALibrary.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "PIALibrary" - s.version = "2.16.1" + s.version = "2.17.0" s.summary = "PIA client library in Swift." s.homepage = "https://www.privateinternetaccess.com/" From bbba636a66d3f7b55ca2b8f31e1d6ea0bbe05b17 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 9 May 2022 11:53:52 +0200 Subject: [PATCH 28/68] Update CSI to v1.1.1 and redact IPs --- .../Library/Client+Configuration.swift | 4 +- .../PIACSIDeviceInformationProvider.swift | 52 +++++++++++++++++ .../PIACSIUserInformationProvider.swift | 56 +++++++++++++++++++ .../PIACrashlabClientStateProvider.swift | 30 +++++----- ...ACrashlabProtocolInformationProvider.swift | 33 ++++++++++- ...PIACrashlabRegionInformationProvider.swift | 33 ++++++++++- .../PIAWebServices+Ephemeral.swift | 4 +- .../Library/WebServices/PIAWebServices.swift | 14 +++-- 8 files changed, 203 insertions(+), 23 deletions(-) create mode 100644 PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift create mode 100644 PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift diff --git a/PIALibrary/Sources/Library/Client+Configuration.swift b/PIALibrary/Sources/Library/Client+Configuration.swift index 0d8c32d1..9ca357ab 100644 --- a/PIALibrary/Sources/Library/Client+Configuration.swift +++ b/PIALibrary/Sources/Library/Client+Configuration.swift @@ -37,7 +37,9 @@ extension Client { public final class Configuration { static let teamId = "5357M5NW9W" - + + static let teamIdentifierCSI = "pia_ios" + static let appGroup = "group.com.privateinternetaccess" static let debugLogKey = "LastVPNLog" diff --git a/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift new file mode 100644 index 00000000..469e58d2 --- /dev/null +++ b/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift @@ -0,0 +1,52 @@ +// +// PIACSIDeviceInformationProvider.swift +// PIALibrary +// +// Created by Waleed Mahmood on 06.05.22. +// + +import Foundation +import PIACSI +import UIKit + +class PIACSIDeviceInformationProvider: ICSIProvider { + + static let csiDeviceInformationFilename = "device_information" + + var filename: String? { + get { + return PIACSIDeviceInformationProvider.csiDeviceInformationFilename + } + } + + var isPersistedData: Bool { + get { + return false + } + } + + var providerType: ProviderType { + get { + return ProviderType.deviceInformation + } + } + + var reportType: ReportType { + get { + return ReportType.diagnostic + } + } + + var value: String? { + get { + return getDeviceInformation() + } + } + + + func getDeviceInformation() -> String { + let version = ProcessInfo.processInfo.operatingSystemVersion + let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" + return "OS Version: \(versionString)\nDevice: \(UIDevice.current.type.rawValue)" + } +} diff --git a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift new file mode 100644 index 00000000..2c7ed62e --- /dev/null +++ b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift @@ -0,0 +1,56 @@ +// +// PIACSIUserInformationProvider.swift +// PIALibrary +// +// Created by Waleed Mahmood on 05.05.22. +// Copyright © 2020 London Trust Media. All rights reserved. +// + +import Foundation +import PIACSI + +class PIACSIUserInformationProvider: ICSIProvider { + + static let csiUserSettingsFilename = "user_settings" + + var filename: String? { + get { + return PIACSIUserInformationProvider.csiUserSettingsFilename + } + } + + var isPersistedData: Bool { + get { + return true + } + } + + var providerType: ProviderType { + get { + return ProviderType.userSettings + } + } + + var reportType: ReportType { + get { + return ReportType.diagnostic + } + } + + var value: String? { + get { + return getUserInformation() + } + } + + func getUserInformation() -> String { + var userSettings = "" + guard let defaults = UserDefaults(suiteName: Client.Configuration.appGroup) else { + return userSettings + } + for (key, value) in defaults.dictionaryRepresentation() { + userSettings += "\(key): \(value)\n" + } + return userSettings.redactIPs() + } +} diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift b/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift index f1a31d6c..0eee52a3 100644 --- a/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift @@ -9,21 +9,23 @@ import Foundation import PIACSI -class PIACSIClientStateProvider : CSIClientStateProvider { - - func csiEndpoints() -> [CSIEndpoint] { - let validEndpoints = EndpointManager.shared.availableCSIEndpoints() - var clientEndpoints = [CSIEndpoint]() - for endpoint in validEndpoints { - clientEndpoints.append( - CSIEndpoint( - endpoint: endpoint.host, - isProxy: endpoint.isProxy, - usePinnedCertificate: endpoint.useCertificatePinning, - certificateCommonName: endpoint.commonName +class PIACSIClientStateProvider : IEndPointProvider { + + var endpoints: [CSIEndpoint] { + get { + let validEndpoints = EndpointManager.shared.availableCSIEndpoints() + var clientEndpoints = [CSIEndpoint]() + for endpoint in validEndpoints { + clientEndpoints.append( + CSIEndpoint( + endpoint: endpoint.host, + isProxy: endpoint.isProxy, + usePinnedCertificate: endpoint.useCertificatePinning, + certificateCommonName: endpoint.commonName + ) ) - ) + } + return clientEndpoints } - return clientEndpoints } } diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift index 3866bf89..8549498d 100644 --- a/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift @@ -9,7 +9,38 @@ import Foundation import PIACSI -class PIACSIProtocolInformationProvider : ProtocolInformationProvider { +class PIACSIProtocolInformationProvider : ICSIProvider { + static let csiProtocolInformationFilename = "protocol_information" + var filename: String? { + get { + return PIACSIProtocolInformationProvider.csiProtocolInformationFilename + } + } + + var isPersistedData: Bool { + get { + return false + } + } + + var providerType: ProviderType { + get { + return ProviderType.protocolInformation + } + } + + var reportType: ReportType { + get { + return ReportType.diagnostic + } + } + + var value: String? { + get { + return protocolInformation() + } + } + private var protocolLogs: String? diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift index 9c50144f..48229d4e 100644 --- a/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift @@ -9,7 +9,38 @@ import Foundation import PIACSI -class PIACSIRegionInformationProvider : RegionInformationProvider { +class PIACSIRegionInformationProvider : ICSIProvider { + static let csiRegionInformationFilename = "regions_information" + var filename: String? { + get { + return PIACSIRegionInformationProvider.csiRegionInformationFilename + } + } + + var isPersistedData: Bool { + get { + return true + } + } + + var providerType: ProviderType { + get { + return ProviderType.regionInformation + } + } + + var reportType: ReportType { + get { + return ReportType.diagnostic + } + } + + var value: String? { + get { + return regionInformation() + } + } + func regionInformation() -> String { var redactedServers: [String] = [] diff --git a/PIALibrary/Sources/Library/WebServices/PIAWebServices+Ephemeral.swift b/PIALibrary/Sources/Library/WebServices/PIAWebServices+Ephemeral.swift index a45cfe1d..5f76b8d1 100644 --- a/PIALibrary/Sources/Library/WebServices/PIAWebServices+Ephemeral.swift +++ b/PIALibrary/Sources/Library/WebServices/PIAWebServices+Ephemeral.swift @@ -46,8 +46,8 @@ extension PIAWebServices { func submitDebugReport(_ shouldSendPersistedData: Bool, _ protocolLogs: String, _ callback: LibraryCallback?) { csiProtocolInformationProvider.setProtocolLogs(protocolLogs: protocolLogs) - self.csiAPI.send(shouldSendPersistedData: shouldSendPersistedData) { (reportIdentifier, error) in - if let _ = error { + self.csiAPI.send(shouldSendPersistedData: shouldSendPersistedData) { (reportIdentifier, errors) in + if !errors.isEmpty { callback?(nil, ClientError.internetUnreachable) return } diff --git a/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift b/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift index 453e78f6..3b46aff7 100644 --- a/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift +++ b/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift @@ -70,11 +70,17 @@ class PIAWebServices: WebServices, ConfigurationAccess { appVersion = info["CFBundleShortVersionString"] as? String ?? "Unknown" } self.csiAPI = CSIBuilder() - .setPlatform(platform: .ios) + .setTeamIdentifier(teamIdentifier: Client.Configuration.teamIdentifierCSI) .setAppVersion(appVersion: appVersion) - .setCSIClientStateProvider(csiClientStateProvider: PIACSIClientStateProvider()) - .setProtocolInformationProvider(protocolInformationProvider: csiProtocolInformationProvider) - .setRegionInformationProvider(regionInformationProvider: PIACSIRegionInformationProvider()) + .setCertificate(certificate: rsa4096Certificate) + .setUserAgent(userAgent: PIAWebServices.userAgent) + .setEndPointProvider(endpointsProvider: PIACSIClientStateProvider()) + .addLogProviders(providers_: [ + PIACSIProtocolInformationProvider(), + PIACSIRegionInformationProvider(), + PIACSIUserInformationProvider(), + PIACSIDeviceInformationProvider() + ]) .build() } From b3285b4cdb872ed098e9bf7ea6a256384d0ff9f5 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Fri, 13 May 2022 17:48:04 +0200 Subject: [PATCH 29/68] Add support for Last Know Exception category --- .../Sources/Core/Persistence/PlainStore.swift | 2 ++ .../Sources/Library/Client+Preferences.swift | 17 ++++++++++++++ .../Persistence/UserDefaultsStore.swift | 11 ++++++++++ .../PIACSILastKnownExceptionProvider.swift | 22 +++++++++++++++++++ .../Library/WebServices/PIAWebServices.swift | 3 ++- 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 PIALibrary/Sources/Library/Providers/PIACSILastKnownExceptionProvider.swift diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index 16572954..b5144658 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -77,6 +77,8 @@ protocol PlainStore: class { var versionWhenServiceQualityOpted: String? { get set } + var lastKnownException: String? { get set } + // MARK: Preferences var isPersistentConnection: Bool? { get set } diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index f6f6fe7d..63e55993 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -68,6 +68,8 @@ private protocol PreferencesStore: class { var shareServiceQualityData: Bool { get set } + var lastKnownException: String? { get set } + var versionWhenServiceQualityOpted: String? { get set } func vpnCustomConfiguration(for vpnType: String) -> VPNCustomConfiguration? @@ -102,6 +104,7 @@ private extension PreferencesStore { ikeV2PacketSize = source.ikeV2PacketSize signInWithAppleFakeEmail = source.signInWithAppleFakeEmail shareServiceQualityData = source.shareServiceQualityData + lastKnownException = source.lastKnownException versionWhenServiceQualityOpted = source.versionWhenServiceQualityOpted lastConnectedRegion = source.lastConnectedRegion } @@ -415,6 +418,16 @@ extension Client { accessedDatabase.plain.versionWhenServiceQualityOpted = newValue } } + + /// Stores last known exception raised by the app at any point + public var lastKnownException: String? { + get { + return accessedDatabase.plain.lastKnownException + } + set { + accessedDatabase.plain.lastKnownException = newValue + } + } } } @@ -451,6 +464,7 @@ extension Client.Preferences { ikeV2PacketSize = 0 signInWithAppleFakeEmail = nil shareServiceQualityData = false + lastKnownException = nil versionWhenServiceQualityOpted = nil } @@ -543,6 +557,9 @@ extension Client.Preferences { /// :nodoc: public var versionWhenServiceQualityOpted: String? + /// :nodoc: + public var lastKnownException: String? + /// :nodoc: public func vpnCustomConfiguration(for vpnType: String) -> VPNCustomConfiguration? { return vpnCustomConfigurations[vpnType] diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index d7024ca7..398e940c 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -98,6 +98,8 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let shareServiceQualityData = "ShareServiceQualityData" + static let lastKnownException = "LastKnownException" + static let versionWhenServiceQualityOpted = "versionWhenServiceQualityOpted" static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" @@ -536,6 +538,15 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } + var lastKnownException: String? { + get { + return backend.string(forKey: Entries.lastKnownException) ?? "" + } + set { + backend.set(newValue, forKey: Entries.lastKnownException) + } + } + //MARK: Networks var cachedNetworks: [String] { get { diff --git a/PIALibrary/Sources/Library/Providers/PIACSILastKnownExceptionProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSILastKnownExceptionProvider.swift new file mode 100644 index 00000000..d1557f5c --- /dev/null +++ b/PIALibrary/Sources/Library/Providers/PIACSILastKnownExceptionProvider.swift @@ -0,0 +1,22 @@ +// +// PIACSILastKnownExceptionProvider.swift +// PIALibrary +// +// Created by Waleed Mahmood on 13.05.22. +// + +import Foundation +import PIACSI + +class PIACSILastKnownExceptionProvider: ICSIProvider { + + var filename: String? { return "last_known_exception" } + + var isPersistedData: Bool { return true } + + var providerType: ProviderType { return ProviderType.lastKnownException } + + var reportType: ReportType { return ReportType.crash } + + var value: String? { return Client.preferences.lastKnownException } +} diff --git a/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift b/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift index 3b46aff7..8dc1ba2d 100644 --- a/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift +++ b/PIALibrary/Sources/Library/WebServices/PIAWebServices.swift @@ -79,7 +79,8 @@ class PIAWebServices: WebServices, ConfigurationAccess { PIACSIProtocolInformationProvider(), PIACSIRegionInformationProvider(), PIACSIUserInformationProvider(), - PIACSIDeviceInformationProvider() + PIACSIDeviceInformationProvider(), + PIACSILastKnownExceptionProvider() ]) .build() } From 1a5856c182f1e927b2b5a91bfa81614a6e4aaa1a Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Fri, 13 May 2022 17:55:57 +0200 Subject: [PATCH 30/68] Code cleanup --- .../PIACSIDeviceInformationProvider.swift | 32 +++---------------- .../PIACSIUserInformationProvider.swift | 32 +++---------------- ...ACrashlabProtocolInformationProvider.swift | 32 ++++--------------- ...PIACrashlabRegionInformationProvider.swift | 32 ++++--------------- 4 files changed, 22 insertions(+), 106 deletions(-) diff --git a/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift index 469e58d2..748d9786 100644 --- a/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift @@ -11,37 +11,15 @@ import UIKit class PIACSIDeviceInformationProvider: ICSIProvider { - static let csiDeviceInformationFilename = "device_information" + var filename: String? { return "device_information" } - var filename: String? { - get { - return PIACSIDeviceInformationProvider.csiDeviceInformationFilename - } - } - - var isPersistedData: Bool { - get { - return false - } - } + var isPersistedData: Bool { return false } - var providerType: ProviderType { - get { - return ProviderType.deviceInformation - } - } + var providerType: ProviderType { return ProviderType.deviceInformation } - var reportType: ReportType { - get { - return ReportType.diagnostic - } - } + var reportType: ReportType { return ReportType.diagnostic } - var value: String? { - get { - return getDeviceInformation() - } - } + var value: String? { return getDeviceInformation() } func getDeviceInformation() -> String { diff --git a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift index 2c7ed62e..0eac1885 100644 --- a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift @@ -11,37 +11,15 @@ import PIACSI class PIACSIUserInformationProvider: ICSIProvider { - static let csiUserSettingsFilename = "user_settings" + var filename: String? { return "user_settings" } - var filename: String? { - get { - return PIACSIUserInformationProvider.csiUserSettingsFilename - } - } + var isPersistedData: Bool { return true } - var isPersistedData: Bool { - get { - return true - } - } + var providerType: ProviderType { return ProviderType.userSettings } - var providerType: ProviderType { - get { - return ProviderType.userSettings - } - } + var reportType: ReportType { return ReportType.diagnostic } - var reportType: ReportType { - get { - return ReportType.diagnostic - } - } - - var value: String? { - get { - return getUserInformation() - } - } + var value: String? { return getUserInformation() } func getUserInformation() -> String { var userSettings = "" diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift index 8549498d..bc0816af 100644 --- a/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift @@ -10,36 +10,16 @@ import Foundation import PIACSI class PIACSIProtocolInformationProvider : ICSIProvider { - static let csiProtocolInformationFilename = "protocol_information" - var filename: String? { - get { - return PIACSIProtocolInformationProvider.csiProtocolInformationFilename - } - } - var isPersistedData: Bool { - get { - return false - } - } + var filename: String? { return "protocol_information" } - var providerType: ProviderType { - get { - return ProviderType.protocolInformation - } - } + var isPersistedData: Bool { return false } - var reportType: ReportType { - get { - return ReportType.diagnostic - } - } + var providerType: ProviderType { return ProviderType.protocolInformation } - var value: String? { - get { - return protocolInformation() - } - } + var reportType: ReportType { return ReportType.diagnostic } + + var value: String? { return protocolInformation() } private var protocolLogs: String? diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift index 48229d4e..ee4c92de 100644 --- a/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift @@ -10,36 +10,16 @@ import Foundation import PIACSI class PIACSIRegionInformationProvider : ICSIProvider { - static let csiRegionInformationFilename = "regions_information" - var filename: String? { - get { - return PIACSIRegionInformationProvider.csiRegionInformationFilename - } - } - var isPersistedData: Bool { - get { - return true - } - } + var filename: String? { return "regions_information" } - var providerType: ProviderType { - get { - return ProviderType.regionInformation - } - } + var isPersistedData: Bool { return true } - var reportType: ReportType { - get { - return ReportType.diagnostic - } - } + var providerType: ProviderType { return ProviderType.regionInformation } - var value: String? { - get { - return regionInformation() - } - } + var reportType: ReportType { return ReportType.diagnostic } + + var value: String? { return regionInformation() } func regionInformation() -> String { From 754b03b2ec3144e828dbb782f8118db83d9b8e10 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 10:32:48 +0200 Subject: [PATCH 31/68] Add Whitelist filter for user_settings category on csi --- .../PIACSIUserInformationProvider.swift | 5 +- .../Util/WhitelistUserInformation.plist | 64 +++++++++++++++++++ .../Util/WhitelistUserInformationUtil.swift | 27 ++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 PIALibrary/Sources/Util/WhitelistUserInformation.plist create mode 100644 PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift index 0eac1885..2390b4e0 100644 --- a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift @@ -26,8 +26,11 @@ class PIACSIUserInformationProvider: ICSIProvider { guard let defaults = UserDefaults(suiteName: Client.Configuration.appGroup) else { return userSettings } + let allowedKeys = WhitelistUtil.keys() for (key, value) in defaults.dictionaryRepresentation() { - userSettings += "\(key): \(value)\n" + if allowedKeys.contains(key) { + userSettings += "\(key): \(value)\n" + } } return userSettings.redactIPs() } diff --git a/PIALibrary/Sources/Util/WhitelistUserInformation.plist b/PIALibrary/Sources/Util/WhitelistUserInformation.plist new file mode 100644 index 00000000..6df3e29f --- /dev/null +++ b/PIALibrary/Sources/Util/WhitelistUserInformation.plist @@ -0,0 +1,64 @@ + + + + + Version + AddingEmojiKeybordHandled + com.apple.content-rating.ExplicitMusicPodcastsAllowed + RegionFilter + AppleLanguagesDidMigrate + vpn.button.description + vpn.widget.port + UseConnectSiriShortcuts + NSLanguages + Theme + ShowGeoServers + AppleLanguages + vpn.widget.socket + usesCustomDNSPKKeychainVersionKey + UseSmallPackets + AppEnvironmentIsProduction + stopInAppMessages + INNextHearbeatDate + DismissedMessages + AKLastEmailListRequestDateKey + checksDipExpirationRequest + AKLastIDMSEnvironment + CarCapabilities + ApplePerAppLanguageSelectionBundleIdentifiers + quickSettingKillswitchVisible + userInteractedWithSurvey + quickSettingPrivateBrowserVisible + successConnections + successDisconnections + DidAskToEnableNotifications + com.apple.Animoji.StickerRecents.SplashVersion + ApplePasscodeKeyboards + vpn.widget.trusted.network + quickSettingNetworkToolVisible + StagingVersion + com.apple.content-rating.TVShowRating + IKEV2UseSmallPackets + com.apple.content-rating.AppRating + canAskAgainForReview + AppleTextDirection + WireGuardUseSmallPackets + NSAllowsDefaultLineBreakStrategy + UseDisconnectSiriShortcuts + AppleLocale + com.apple.content-rating.MovieRating + NSInterfaceStyle + disablesMultiDipTokens + quickSettingThemeVisible + PKLogNotificationServiceResponsesKey + com.apple.content-rating.ExplicitBooksAllowed + AppleITunesStoreItemKinds + AppleLanguagesSchemaVersion + vpn.widget.protocol + failureConnections + Launched + showsDedicatedIPView + INNextFreshmintRefreshDateKey + AppVersion + + diff --git a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift new file mode 100644 index 00000000..f8401804 --- /dev/null +++ b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift @@ -0,0 +1,27 @@ +// +// WhitelistUserInformationUtil.swift +// PIALibrary +// +// Created by Waleed Mahmood on 31.05.22. +// + +import Foundation +import SwiftyBeaver + +private let log = SwiftyBeaver.self + +public class WhitelistUtil { + public static func keys() -> [String] { + let bundle = Bundle(for: WhitelistUtil.self) + guard let filePath = bundle.path(forResource: "WhitelistUserInformation", ofType: "plist") else { + log.debug("Couldn't find file 'WhitelistUserInformation.plist'") + return [] + } + let contents = NSArray(contentsOfFile: filePath) + guard let allValues = contents as? [String] else { + log.debug("Couldn't find whitelist contents in 'WhitelistUserInformation.plist'") + return [] + } + return allValues + } +} From f27010d7426b78443e99d08327727bb81dc08329 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 13:44:26 +0200 Subject: [PATCH 32/68] Fix white list missing issue and rename Device to DeviceType --- .../PIACSIDeviceInformationProvider.swift | 2 +- .../Util/WhitelistUserInformation.plist | 111 +++++++++--------- 2 files changed, 55 insertions(+), 58 deletions(-) diff --git a/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift index 748d9786..45e554d1 100644 --- a/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift @@ -25,6 +25,6 @@ class PIACSIDeviceInformationProvider: ICSIProvider { func getDeviceInformation() -> String { let version = ProcessInfo.processInfo.operatingSystemVersion let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" - return "OS Version: \(versionString)\nDevice: \(UIDevice.current.type.rawValue)" + return "OS Version: \(versionString)\nDeviceType: \(UIDevice.current.type.rawValue)" } } diff --git a/PIALibrary/Sources/Util/WhitelistUserInformation.plist b/PIALibrary/Sources/Util/WhitelistUserInformation.plist index 6df3e29f..682d9d4b 100644 --- a/PIALibrary/Sources/Util/WhitelistUserInformation.plist +++ b/PIALibrary/Sources/Util/WhitelistUserInformation.plist @@ -3,62 +3,59 @@ Version - AddingEmojiKeybordHandled - com.apple.content-rating.ExplicitMusicPodcastsAllowed - RegionFilter - AppleLanguagesDidMigrate - vpn.button.description - vpn.widget.port - UseConnectSiriShortcuts - NSLanguages - Theme - ShowGeoServers - AppleLanguages - vpn.widget.socket - usesCustomDNSPKKeychainVersionKey - UseSmallPackets - AppEnvironmentIsProduction - stopInAppMessages - INNextHearbeatDate - DismissedMessages - AKLastEmailListRequestDateKey - checksDipExpirationRequest - AKLastIDMSEnvironment - CarCapabilities - ApplePerAppLanguageSelectionBundleIdentifiers - quickSettingKillswitchVisible - userInteractedWithSurvey - quickSettingPrivateBrowserVisible - successConnections - successDisconnections - DidAskToEnableNotifications - com.apple.Animoji.StickerRecents.SplashVersion - ApplePasscodeKeyboards - vpn.widget.trusted.network - quickSettingNetworkToolVisible - StagingVersion - com.apple.content-rating.TVShowRating - IKEV2UseSmallPackets - com.apple.content-rating.AppRating - canAskAgainForReview - AppleTextDirection - WireGuardUseSmallPackets - NSAllowsDefaultLineBreakStrategy - UseDisconnectSiriShortcuts - AppleLocale - com.apple.content-rating.MovieRating - NSInterfaceStyle - disablesMultiDipTokens - quickSettingThemeVisible - PKLogNotificationServiceResponsesKey - com.apple.content-rating.ExplicitBooksAllowed - AppleITunesStoreItemKinds - AppleLanguagesSchemaVersion - vpn.widget.protocol - failureConnections - Launched - showsDedicatedIPView - INNextFreshmintRefreshDateKey - AppVersion + AddingEmojiKeybordHandled + com.apple.content-rating.ExplicitMusicPodcastsAllowed + RegionFilter + AppleLanguagesDidMigrate + vpn.button.description + vpn.widget.port + UseConnectSiriShortcuts + NSLanguages + Theme + ShowGeoServers + AppleLanguages + vpn.widget.socket + usesCustomDNS + PKKeychainVersionKey + UseSmallPackets + AppEnvironmentIsProduction + stopInAppMessages + INNextHearbeatDate + DismissedMessages + AKLastEmailListRequestDateKey + checksDipExpirationRequest + AKLastIDMSEnvironment + quickSettingKillswitchVisible + userInteractedWithSurvey + quickSettingPrivateBrowserVisible + successConnections + successDisconnections + DidAskToEnableNotifications + ApplePasscodeKeyboards + vpn.widget.trusted.network + quickSettingNetworkToolVisible + StagingVersion + com.apple.content-rating.TVShowRating + IKEV2UseSmallPackets + com.apple.content-rating.AppRating + canAskAgainForReview + WireGuardUseSmallPackets + NSAllowsDefaultLineBreakStrategy + UseDisconnectSiriShortcuts + AppleLocale + com.apple.content-rating.MovieRating + NSInterfaceStyle + disablesMultiDipTokens + quickSettingThemeVisible + PKLogNotificationServiceResponsesKey + com.apple.content-rating.ExplicitBooksAllowed + AppleITunesStoreItemKinds + AppleLanguagesSchemaVersion + vpn.widget.protocol + failureConnections + Launched + showsDedicatedIPView + INNextFreshmintRefreshDateKey + AppVersion From 2bf1bb0dcafab88b4b5864ff29a3091cb84581cd Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 13:56:07 +0200 Subject: [PATCH 33/68] Add references to the project --- PIALibrary.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index 0a46a2e6..acdfca3e 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -230,6 +230,8 @@ 33A542AFDFD3AF0C27B27F45 /* Pods_PIALibrary_PIALibraryTests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C71CB55833441BB6B5D0B9FD /* Pods_PIALibrary_PIALibraryTests_iOS.framework */; }; 354B015F27732095000A73B4 /* NavigationBar+Appearence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */; }; 3D93D3414A3DA19ECB04B778 /* Pods_PIALibrary_PIALibraryHost_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */; }; + 7E9D036F28478ADD00BE85DC /* WhitelistUserInformationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */; }; + 7E9D037028478ADD00BE85DC /* WhitelistUserInformation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */; }; 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; @@ -571,6 +573,8 @@ 10DD9676BB5539C7984C65D9 /* Pods-PIALibrary-PIALibrary-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibrary-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibrary-iOS/Pods-PIALibrary-PIALibrary-iOS.release.xcconfig"; sourceTree = ""; }; 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NavigationBar+Appearence.swift"; sourceTree = ""; }; 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; sourceTree = ""; }; + 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhitelistUserInformationUtil.swift; sourceTree = ""; }; + 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = WhitelistUserInformation.plist; sourceTree = ""; }; 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; @@ -703,6 +707,8 @@ 0E1108911F77B6B600A92462 /* Util */ = { isa = PBXGroup; children = ( + 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */, + 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */, 0E2ADCFB1FE136D600BB170C /* iOS */, 0E2ADCFC1FE136DA00BB170C /* macOS */, 0E2ADCC91FE06D7A00BB170C /* Array+Math.swift */, @@ -1524,6 +1530,7 @@ 824D981E266A1AC500FCD7DA /* staging.json in Resources */, 0E6B0A791FA4986D00EBB916 /* UI.strings in Resources */, 0E7361B41FD9683B00706BFF /* Signup.strings in Resources */, + 7E9D037028478ADD00BE85DC /* WhitelistUserInformation.plist in Resources */, DD6DC5BC21B6A8FC00F9D538 /* pia-spinner.json in Resources */, 0EB8C0831F9CE11A005857E4 /* UI.xcassets in Resources */, 0E7361E61FD9731F00706BFF /* Signup.storyboard in Resources */, @@ -1998,6 +2005,7 @@ DD76292821ECDFF80092DF50 /* Usage.swift in Sources */, 0E2ADD3A1FE14F8600BB170C /* VPNProfile.swift in Sources */, 0E492C5C1FE5EA06007F23DF /* CMacros.m in Sources */, + 7E9D036F28478ADD00BE85DC /* WhitelistUserInformationUtil.swift in Sources */, DD6768E322FAB19D00B9FDD0 /* AppStoreInformation.swift in Sources */, 0EB8C0671F9CD38B005857E4 /* AutolayoutViewController.swift in Sources */, 0E3D13D31F9E270A00434A48 /* GlossAccountInfo.swift in Sources */, From 852940906d76e14e04db009d4fb5f7fa688a168c Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 15:24:27 +0200 Subject: [PATCH 34/68] Fix file references add in last 3 months and update to latest commit for Account & CSI Modules --- PIALibrary.xcodeproj/project.pbxproj | 24 +++++++++++ Podfile | 4 +- Podfile.lock | 60 ++++++++++++++-------------- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index acdfca3e..88bd87df 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -232,6 +232,12 @@ 3D93D3414A3DA19ECB04B778 /* Pods_PIALibrary_PIALibraryHost_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */; }; 7E9D036F28478ADD00BE85DC /* WhitelistUserInformationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */; }; 7E9D037028478ADD00BE85DC /* WhitelistUserInformation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */; }; + 7E9D038028479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */; }; + 7E9D038128479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */; }; + 7E9D038228479DCC00BE85DC /* PIACSIUserInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */; }; + 7E9D038428479DE100BE85DC /* TimeInterval+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */; }; + 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */; }; + 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */; }; 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; @@ -575,6 +581,12 @@ 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; sourceTree = ""; }; 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhitelistUserInformationUtil.swift; sourceTree = ""; }; 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = WhitelistUserInformation.plist; sourceTree = ""; }; + 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSILastKnownExceptionProvider.swift; sourceTree = ""; }; + 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIDeviceInformationProvider.swift; sourceTree = ""; }; + 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIUserInformationProvider.swift; sourceTree = ""; }; + 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TimeInterval+Date.swift"; sourceTree = ""; }; + 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccessibilityIdentifiers.swift; path = PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift; sourceTree = SOURCE_ROOT; }; + 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = ""; }; 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; @@ -724,6 +736,7 @@ DDD824E4218996CD00151709 /* Pages.swift */, DD76292D21ECEC3F0092DF50 /* DataManipulation.swift */, DD6FB0362224355600A84F05 /* UIDevice+WiFi.swift */, + 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */, 82CDC2E1257A5B440001669D /* DateUtil.swift */, ); path = Util; @@ -936,6 +949,7 @@ children = ( 84577FC6213E7D68006DEC3D /* ViewControllers */, 0EB8C04F1F9CD38A005857E4 /* ActivityButton.swift */, + 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */, 0EB8C0501F9CD38A005857E4 /* BorderedTextField.swift */, 0E0F95951FD560C40046DC64 /* CircleProgressView.swift */, 0EE14D1A1FF16B39008D9AC2 /* InvalidatingFlowLayout.swift */, @@ -1209,6 +1223,9 @@ 82FD5D542521F2B600E390CB /* Providers */ = { isa = PBXGroup; children = ( + 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */, + 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */, + 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */, AA319C4C25833088004BECF6 /* PIACrashlabClientStateProvider.swift */, AA319C4B25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift */, AA319C4A25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift */, @@ -1234,6 +1251,7 @@ 84577FC6213E7D68006DEC3D /* ViewControllers */ = { isa = PBXGroup; children = ( + 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */, 8289AD872685C1FC00DA6A17 /* GDPRViewController.swift */, 8289AD862685C1FC00DA6A17 /* ShareDataInformationViewController.swift */, 0EB8C0521F9CD38A005857E4 /* AutolayoutViewController.swift */, @@ -1959,11 +1977,13 @@ AA319C5125833088004BECF6 /* PIACrashlabClientStateProvider.swift in Sources */, 0EB8C06E1F9CD38B005857E4 /* SignupInternetUnreachableViewController.swift in Sources */, 0E75D8D31F9E3F9F00658D1E /* UserAccount.swift in Sources */, + 7E9D038228479DCC00BE85DC /* PIACSIUserInformationProvider.swift in Sources */, 0EB8C0691F9CD38B005857E4 /* PurchasePlanCell.swift in Sources */, 0EA8072F20A1E7C60033EC1A /* GlossRedeem.swift in Sources */, 0EA4C4311FDDD48F0041C3D8 /* Server.swift in Sources */, DD56E3F4225F5D22002EDFB2 /* GlossProduct.swift in Sources */, 8276E175260B5ED400BB7B40 /* ServiceQualityManager.swift in Sources */, + 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */, DD7411A923EC35B40058CEF3 /* PIAWGTunnelProfile.swift in Sources */, 84577FC5213D9B4D006DEC3D /* UILabel+LineHeight.swift in Sources */, 0EB9667E1FDF36490086ABC2 /* GlossParser.swift in Sources */, @@ -2001,6 +2021,7 @@ 0EE771091F9D21020029A77B /* Payment.swift in Sources */, 0E53A8531FE5D73F000C2A18 /* Client+Mock.swift in Sources */, 0E392D9D1FE31D630002160D /* MockVPNProvider.swift in Sources */, + 7E9D038028479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift in Sources */, 0E9D62DA1FDEE3FE009A90CF /* ServerProvider.swift in Sources */, DD76292821ECDFF80092DF50 /* Usage.swift in Sources */, 0E2ADD3A1FE14F8600BB170C /* VPNProfile.swift in Sources */, @@ -2019,6 +2040,7 @@ 0EB8C0481F9CCE07005857E4 /* Macros.swift in Sources */, 84577FC3213D9AEA006DEC3D /* UITextField+PlaceholderColor.swift in Sources */, 0EFEB4C12007784A00F81029 /* PIATunnelProvider+Profile.swift in Sources */, + 7E9D038128479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift in Sources */, DD8C3E612327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift in Sources */, 0E392DA31FE3247E0002160D /* Endpoint.swift in Sources */, 82CDC2E2257A5B440001669D /* DateUtil.swift in Sources */, @@ -2037,6 +2059,7 @@ 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */, 0EFEB4C22007784A00F81029 /* PIATunnelProfile.swift in Sources */, DD1AB10523FC280000396E74 /* DeviceModel.swift in Sources */, + 7E9D038428479DE100BE85DC /* TimeInterval+Date.swift in Sources */, 0E392DBB1FE34B5A0002160D /* NSString+URL.m in Sources */, AA319C4F25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift in Sources */, 8276E1E6260B961C00BB7B40 /* PIAKPIClientStateProvider.swift in Sources */, @@ -2059,6 +2082,7 @@ DDD824EA2189CD5700151709 /* NavigationLogoView.swift in Sources */, 0EFB512E1F82D7C50033B81F /* PIAWebServices.swift in Sources */, 0EB8C0641F9CD38B005857E4 /* ActivityButton.swift in Sources */, + 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */, 0ED2B5131F82444E00C9DB2B /* Client+Preferences.swift in Sources */, 0EE78AF61F81880E002E4CDD /* Credentials.swift in Sources */, DD8BF3CB219C6BAA0041357C /* ConfirmVPNPlanViewController.swift in Sources */, diff --git a/Podfile b/Podfile index ba50de34..185bd751 100644 --- a/Podfile +++ b/Podfile @@ -32,9 +32,9 @@ abstract_target 'PIALibrary' do pod 'TunnelKit', :git => 'https://github.com/pia-foss/tunnelkit', :branch => 'master' pod 'OpenSSL-Apple', :git => 'https://github.com/keeshux/openssl-apple' pod 'PIAWireguard', :git => "#{$gitlab_vpn_root}/pia-wireguard.git", :branch => 'develop' - pod "PIAAccountModule", :git => "#{$gitlab_kn_root}/#{$accounts_gitlab_repo}", :branch => 'release/1.2.0' + pod "PIAAccountModule", :git => "#{$gitlab_kn_root}/#{$accounts_gitlab_repo}", :commit => '6e3f7be' pod "PIARegionsModule", :git => "#{$gitlab_kn_root}/#{$regions_gitlab_repo}", :branch => 'release/1.3.1' - pod "PIACSIModule", :git => "#{$gitlab_kn_root}/#{$csi_gitlab_repo}", :commit => 'b62d1bab' + pod "PIACSIModule", :git => "#{$gitlab_kn_root}/#{$csi_gitlab_repo}", :branch => 'release/1.1.1' pod "PIAKPIModule", :git => "#{$gitlab_kn_root}/#{$kpi_gitlab_repo}", :branch => 'release/1.1.0' target 'PIALibrary-iOS' do diff --git a/Podfile.lock b/Podfile.lock index 8f8ab57b..dc02f917 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -5,16 +5,16 @@ PODS: - Gloss (2.1.0) - lottie-ios (3.0.3) - OpenSSL-Apple (1.1.1j.11) - - PIAAccountModule (1.2.0): - - PIAAccountModule/account (= 1.2.0) - - PIAAccountModule/gradle (= 1.2.0) - - PIAAccountModule/account (1.2.0) - - PIAAccountModule/gradle (1.2.0) - - PIACSIModule (1.0.1): - - PIACSIModule/csi (= 1.0.1) - - PIACSIModule/gradle (= 1.0.1) - - PIACSIModule/csi (1.0.1) - - PIACSIModule/gradle (1.0.1) + - PIAAccountModule (1.2.1): + - PIAAccountModule/account (= 1.2.1) + - PIAAccountModule/gradle (= 1.2.1) + - PIAAccountModule/account (1.2.1) + - PIAAccountModule/gradle (1.2.1) + - PIACSIModule (1.1.1): + - PIACSIModule/csi (= 1.1.1) + - PIACSIModule/gradle (= 1.1.1) + - PIACSIModule/csi (1.1.1) + - PIACSIModule/gradle (1.1.1) - PIAKPIModule (1.1.0): - PIAKPIModule/gradle (= 1.1.0) - PIAKPIModule/kpi (= 1.1.0) @@ -62,8 +62,8 @@ DEPENDENCIES: - Gloss (~> 2) - lottie-ios - OpenSSL-Apple (from `https://github.com/keeshux/openssl-apple`) - - "PIAAccountModule (from `git@gitlab.kape.com:pia-mobile/shared/account.git`, branch `release/1.2.0`)" - - "PIACSIModule (from `git@gitlab.kape.com:pia-mobile/shared/csi.git`, commit `b62d1bab`)" + - "PIAAccountModule (from `git@gitlab.kape.com:pia-mobile/shared/account.git`, commit `6e3f7be`)" + - "PIACSIModule (from `git@gitlab.kape.com:pia-mobile/shared/csi.git`, branch `release/1.1.1`)" - "PIAKPIModule (from `git@gitlab.kape.com:pia-mobile/shared/kpi.git`, branch `release/1.1.0`)" - "PIARegionsModule (from `git@gitlab.kape.com:pia-mobile/shared/regions.git`, branch `release/1.3.1`)" - "PIAWireguard (from `git@gitlab.kape.com:pia-mobile/ios/pia-wireguard.git`, branch `develop`)" @@ -91,10 +91,10 @@ EXTERNAL SOURCES: OpenSSL-Apple: :git: https://github.com/keeshux/openssl-apple PIAAccountModule: - :branch: release/1.2.0 + :commit: 6e3f7be :git: "git@gitlab.kape.com:pia-mobile/shared/account.git" PIACSIModule: - :commit: b62d1bab + :branch: release/1.1.1 :git: "git@gitlab.kape.com:pia-mobile/shared/csi.git" PIAKPIModule: :branch: release/1.1.0 @@ -114,10 +114,10 @@ CHECKOUT OPTIONS: :commit: ada87845f854a21fea436c76deb97be2acc58c8a :git: https://github.com/keeshux/openssl-apple PIAAccountModule: - :commit: f95bd817228bb7bbe4b719733fea92d6551b51dd + :commit: 6e3f7be :git: "git@gitlab.kape.com:pia-mobile/shared/account.git" PIACSIModule: - :commit: b62d1bab + :commit: 5e93ae8ff84bc04ac4e1cfbb6d3dd0aa7dc92a01 :git: "git@gitlab.kape.com:pia-mobile/shared/csi.git" PIAKPIModule: :commit: 4ffb43cc4bb9d66da9b0b966d98934507b2cb04f @@ -133,25 +133,25 @@ CHECKOUT OPTIONS: :git: https://github.com/pia-foss/tunnelkit SPEC CHECKSUMS: - Alamofire: 2ad20d0a5a6e593fb8fa4556060a68918a58fe5b - DynamicBlurView: 8ecc633fc8e66d445fa1267d2b405e7cbf7c894f - FXPageControl: e3b89828c27a6ec2f01952d09c5737a680f81ced - Gloss: 51fbd000cbba87e032dced8925b2bb55c960337f - lottie-ios: 92aecc6f5aee59f2d5bfbe19b0f2b57050b4b8c0 + Alamofire: 16ce2c353fb72865124ddae8a57c5942388f4f11 + DynamicBlurView: b1df5415f9bd31897549e5d7077e5ec120a4d636 + FXPageControl: 97620412515365d10a3282ec0660f49f6401a8f0 + Gloss: 13ab6b4b0ff4cb2448466edc957479b1bccea8ba + lottie-ios: 06e0b54aab85ba128e332687d7f4ac4861a7a7ae OpenSSL-Apple: bb7c9715a259404de040f5359ed3b3170cedf8d6 - PIAAccountModule: e81a47491b646121a8db272016db00a1980d2955 - PIACSIModule: 32df98c20a0fc4cad5fadbb1b72f7b74315aa8ea + PIAAccountModule: 31264ad54dfa98cd8be6810885f910b8bedc9592 + PIACSIModule: 2db8a7fa393d5bef757e856fff3327b8c37dac5d PIAKPIModule: 37c56c0153d693db4d4adb43fd12b9c96ec7ad6d PIARegionsModule: eff00bd28dea554d7b766ec5d7e9a74ab448f5fe PIAWireguard: e6fc3a37758af8d83704dd61e327c2ff6da88b13 - PopupDialog: 70009b0bdff82db3796eb06fe16a2af6e265f662 - QuickLayout: 10384f7db74f2303a776e5edc0409270d8bb0a6a - ReachabilitySwift: 8610aeb4af1844f38c44f05482de0ab537f852eb - SwiftEntryKit: 6da87bb561409684bd330619857533116e98d132 - SwiftyBeaver: faff13c9b69e467c2d21425a0f8e5efaed8e6a35 + PopupDialog: f4bb461bf70ff422be0b56656566424ee9273080 + QuickLayout: a730730b646b231fd4ef7cffaeb1e81fe0e1ca92 + ReachabilitySwift: 408477d1b6ed9779dba301953171e017c31241f3 + SwiftEntryKit: 83d312243af7397e38a222b17b7a744b9a7d2145 + SwiftyBeaver: 4cc0080d2e23f980652e28978db11a5c9da39165 TunnelKit: 2a6aadea2d772a2760b153aee27d1c334c9ca6db - TweetNacl: 3f1d3a198ace99c4a17d7a6e165f051da9e8ceda + TweetNacl: 3abf4d1d2082b0114e7a67410e300892448951e6 -PODFILE CHECKSUM: 54c9b2ea184a1f940d19519b8965a7b509bc10c2 +PODFILE CHECKSUM: 09fe8617e5b4f6378d0549e274916d181b7ad401 COCOAPODS: 1.11.2 From 9a8a83ad2b857c94f14b062dbbac9d18248da5a4 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 15:43:49 +0200 Subject: [PATCH 35/68] Fix the file reference with a new file --- PIALibrary.xcodeproj/project.pbxproj | 10 +++++----- .../Sources/Util/WhitelistUserInformationUtil.swift | 6 +++--- ...erInformation.plist => WhitelistUserSettings.plist} | 0 3 files changed, 8 insertions(+), 8 deletions(-) rename PIALibrary/Sources/Util/{WhitelistUserInformation.plist => WhitelistUserSettings.plist} (100%) diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index 88bd87df..7cd423d4 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -231,13 +231,13 @@ 354B015F27732095000A73B4 /* NavigationBar+Appearence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */; }; 3D93D3414A3DA19ECB04B778 /* Pods_PIALibrary_PIALibraryHost_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */; }; 7E9D036F28478ADD00BE85DC /* WhitelistUserInformationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */; }; - 7E9D037028478ADD00BE85DC /* WhitelistUserInformation.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */; }; 7E9D038028479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */; }; 7E9D038128479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */; }; 7E9D038228479DCC00BE85DC /* PIACSIUserInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */; }; 7E9D038428479DE100BE85DC /* TimeInterval+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */; }; 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */; }; 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */; }; + 7E9D038A2847A35500BE85DC /* WhitelistUserSettings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */; }; 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; @@ -580,13 +580,13 @@ 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NavigationBar+Appearence.swift"; sourceTree = ""; }; 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; sourceTree = ""; }; 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhitelistUserInformationUtil.swift; sourceTree = ""; }; - 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = WhitelistUserInformation.plist; sourceTree = ""; }; 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSILastKnownExceptionProvider.swift; sourceTree = ""; }; 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIDeviceInformationProvider.swift; sourceTree = ""; }; 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIUserInformationProvider.swift; sourceTree = ""; }; 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TimeInterval+Date.swift"; sourceTree = ""; }; 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccessibilityIdentifiers.swift; path = PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift; sourceTree = SOURCE_ROOT; }; 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = ""; }; + 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = WhitelistUserSettings.plist; sourceTree = ""; }; 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; @@ -719,8 +719,6 @@ 0E1108911F77B6B600A92462 /* Util */ = { isa = PBXGroup; children = ( - 7E9D036E28478ADD00BE85DC /* WhitelistUserInformation.plist */, - 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */, 0E2ADCFB1FE136D600BB170C /* iOS */, 0E2ADCFC1FE136DA00BB170C /* macOS */, 0E2ADCC91FE06D7A00BB170C /* Array+Math.swift */, @@ -738,6 +736,8 @@ DD6FB0362224355600A84F05 /* UIDevice+WiFi.swift */, 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */, 82CDC2E1257A5B440001669D /* DateUtil.swift */, + 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */, + 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */, ); path = Util; sourceTree = ""; @@ -1548,10 +1548,10 @@ 824D981E266A1AC500FCD7DA /* staging.json in Resources */, 0E6B0A791FA4986D00EBB916 /* UI.strings in Resources */, 0E7361B41FD9683B00706BFF /* Signup.strings in Resources */, - 7E9D037028478ADD00BE85DC /* WhitelistUserInformation.plist in Resources */, DD6DC5BC21B6A8FC00F9D538 /* pia-spinner.json in Resources */, 0EB8C0831F9CE11A005857E4 /* UI.xcassets in Resources */, 0E7361E61FD9731F00706BFF /* Signup.storyboard in Resources */, + 7E9D038A2847A35500BE85DC /* WhitelistUserSettings.plist in Resources */, 0E7361CF1FD96AF000706BFF /* Welcome.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift index f8401804..1bdddfe1 100644 --- a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift +++ b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift @@ -13,13 +13,13 @@ private let log = SwiftyBeaver.self public class WhitelistUtil { public static func keys() -> [String] { let bundle = Bundle(for: WhitelistUtil.self) - guard let filePath = bundle.path(forResource: "WhitelistUserInformation", ofType: "plist") else { - log.debug("Couldn't find file 'WhitelistUserInformation.plist'") + guard let filePath = bundle.path(forResource: "WhitelistUserSettings", ofType: "plist") else { + log.debug("Couldn't find file 'WhitelistUserSettings.plist'") return [] } let contents = NSArray(contentsOfFile: filePath) guard let allValues = contents as? [String] else { - log.debug("Couldn't find whitelist contents in 'WhitelistUserInformation.plist'") + log.debug("Couldn't find whitelist contents in 'WhitelistUserSettings.plist'") return [] } return allValues diff --git a/PIALibrary/Sources/Util/WhitelistUserInformation.plist b/PIALibrary/Sources/Util/WhitelistUserSettings.plist similarity index 100% rename from PIALibrary/Sources/Util/WhitelistUserInformation.plist rename to PIALibrary/Sources/Util/WhitelistUserSettings.plist From 7300e48bd7a2064ee6a75e29d418d93d297c1b66 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 16:07:14 +0200 Subject: [PATCH 36/68] Fix Whiltelist files --- PIALibrary.xcodeproj/project.pbxproj | 8 +++ .../Util/WhitelistUserInformationUtil.swift | 18 ------ .../Util/WhitelistUserPreferencesKeys.plist | 61 +++++++++++++++++++ .../Sources/Util/WhitelistUserSettings.plist | 58 +----------------- PIALibrary/Sources/Util/WhitelistUtil.swift | 28 +++++++++ 5 files changed, 98 insertions(+), 75 deletions(-) create mode 100644 PIALibrary/Sources/Util/WhitelistUserPreferencesKeys.plist create mode 100644 PIALibrary/Sources/Util/WhitelistUtil.swift diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index 7cd423d4..a2776b54 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -238,6 +238,8 @@ 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */; }; 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */; }; 7E9D038A2847A35500BE85DC /* WhitelistUserSettings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */; }; + 7E9D038C2847A8FC00BE85DC /* WhitelistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */; }; + 7E9D038E2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D038D2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist */; }; 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; @@ -587,6 +589,8 @@ 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccessibilityIdentifiers.swift; path = PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift; sourceTree = SOURCE_ROOT; }; 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = ""; }; 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = WhitelistUserSettings.plist; sourceTree = ""; }; + 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitelistUtil.swift; sourceTree = ""; }; + 7E9D038D2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = WhitelistUserPreferencesKeys.plist; sourceTree = ""; }; 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; @@ -736,6 +740,8 @@ DD6FB0362224355600A84F05 /* UIDevice+WiFi.swift */, 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */, 82CDC2E1257A5B440001669D /* DateUtil.swift */, + 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */, + 7E9D038D2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist */, 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */, 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */, ); @@ -1550,6 +1556,7 @@ 0E7361B41FD9683B00706BFF /* Signup.strings in Resources */, DD6DC5BC21B6A8FC00F9D538 /* pia-spinner.json in Resources */, 0EB8C0831F9CE11A005857E4 /* UI.xcassets in Resources */, + 7E9D038E2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */, 0E7361E61FD9731F00706BFF /* Signup.storyboard in Resources */, 7E9D038A2847A35500BE85DC /* WhitelistUserSettings.plist in Resources */, 0E7361CF1FD96AF000706BFF /* Welcome.strings in Resources */, @@ -1969,6 +1976,7 @@ 0EE1068C1F8250A1009514E9 /* Plan.swift in Sources */, DD36CB7E21CCFFFB00FC815A /* CAGradientLayer+Image.swift in Sources */, 0EBBC6DC1F9F64E700B8BD21 /* Client+Environment.swift in Sources */, + 7E9D038C2847A8FC00BE85DC /* WhitelistUtil.swift in Sources */, 0EB3D9821FF02FE5005B11F4 /* VPNAction.swift in Sources */, 0E2ADD371FE14F0000BB170C /* DefaultVPNProvider.swift in Sources */, 829EB63F2535C432003E74DD /* DedicatedIP.swift in Sources */, diff --git a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift index 1bdddfe1..7aafba39 100644 --- a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift +++ b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift @@ -6,22 +6,4 @@ // import Foundation -import SwiftyBeaver -private let log = SwiftyBeaver.self - -public class WhitelistUtil { - public static func keys() -> [String] { - let bundle = Bundle(for: WhitelistUtil.self) - guard let filePath = bundle.path(forResource: "WhitelistUserSettings", ofType: "plist") else { - log.debug("Couldn't find file 'WhitelistUserSettings.plist'") - return [] - } - let contents = NSArray(contentsOfFile: filePath) - guard let allValues = contents as? [String] else { - log.debug("Couldn't find whitelist contents in 'WhitelistUserSettings.plist'") - return [] - } - return allValues - } -} diff --git a/PIALibrary/Sources/Util/WhitelistUserPreferencesKeys.plist b/PIALibrary/Sources/Util/WhitelistUserPreferencesKeys.plist new file mode 100644 index 00000000..bc8e04b7 --- /dev/null +++ b/PIALibrary/Sources/Util/WhitelistUserPreferencesKeys.plist @@ -0,0 +1,61 @@ + + + + + Version + AddingEmojiKeybordHandled + com.apple.content-rating.ExplicitMusicPodcastsAllowed + RegionFilter + AppleLanguagesDidMigrate + vpn.button.description + vpn.widget.port + UseConnectSiriShortcuts + NSLanguages + Theme + ShowGeoServers + AppleLanguages + vpn.widget.socket + usesCustomDNS + PKKeychainVersionKey + UseSmallPackets + AppEnvironmentIsProduction + stopInAppMessages + INNextHearbeatDate + DismissedMessages + AKLastEmailListRequestDateKey + checksDipExpirationRequest + AKLastIDMSEnvironment + quickSettingKillswitchVisible + userInteractedWithSurvey + quickSettingPrivateBrowserVisible + successConnections + successDisconnections + DidAskToEnableNotifications + ApplePasscodeKeyboards + vpn.widget.trusted.network + quickSettingNetworkToolVisible + StagingVersion + com.apple.content-rating.TVShowRating + IKEV2UseSmallPackets + com.apple.content-rating.AppRating + canAskAgainForReview + WireGuardUseSmallPackets + NSAllowsDefaultLineBreakStrategy + UseDisconnectSiriShortcuts + AppleLocale + com.apple.content-rating.MovieRating + NSInterfaceStyle + disablesMultiDipTokens + quickSettingThemeVisible + PKLogNotificationServiceResponsesKey + com.apple.content-rating.ExplicitBooksAllowed + AppleITunesStoreItemKinds + AppleLanguagesSchemaVersion + vpn.widget.protocol + failureConnections + Launched + showsDedicatedIPView + INNextFreshmintRefreshDateKey + AppVersion + + diff --git a/PIALibrary/Sources/Util/WhitelistUserSettings.plist b/PIALibrary/Sources/Util/WhitelistUserSettings.plist index 682d9d4b..5dd5da85 100644 --- a/PIALibrary/Sources/Util/WhitelistUserSettings.plist +++ b/PIALibrary/Sources/Util/WhitelistUserSettings.plist @@ -1,61 +1,5 @@ - - Version - AddingEmojiKeybordHandled - com.apple.content-rating.ExplicitMusicPodcastsAllowed - RegionFilter - AppleLanguagesDidMigrate - vpn.button.description - vpn.widget.port - UseConnectSiriShortcuts - NSLanguages - Theme - ShowGeoServers - AppleLanguages - vpn.widget.socket - usesCustomDNS - PKKeychainVersionKey - UseSmallPackets - AppEnvironmentIsProduction - stopInAppMessages - INNextHearbeatDate - DismissedMessages - AKLastEmailListRequestDateKey - checksDipExpirationRequest - AKLastIDMSEnvironment - quickSettingKillswitchVisible - userInteractedWithSurvey - quickSettingPrivateBrowserVisible - successConnections - successDisconnections - DidAskToEnableNotifications - ApplePasscodeKeyboards - vpn.widget.trusted.network - quickSettingNetworkToolVisible - StagingVersion - com.apple.content-rating.TVShowRating - IKEV2UseSmallPackets - com.apple.content-rating.AppRating - canAskAgainForReview - WireGuardUseSmallPackets - NSAllowsDefaultLineBreakStrategy - UseDisconnectSiriShortcuts - AppleLocale - com.apple.content-rating.MovieRating - NSInterfaceStyle - disablesMultiDipTokens - quickSettingThemeVisible - PKLogNotificationServiceResponsesKey - com.apple.content-rating.ExplicitBooksAllowed - AppleITunesStoreItemKinds - AppleLanguagesSchemaVersion - vpn.widget.protocol - failureConnections - Launched - showsDedicatedIPView - INNextFreshmintRefreshDateKey - AppVersion - + diff --git a/PIALibrary/Sources/Util/WhitelistUtil.swift b/PIALibrary/Sources/Util/WhitelistUtil.swift new file mode 100644 index 00000000..7c102fa5 --- /dev/null +++ b/PIALibrary/Sources/Util/WhitelistUtil.swift @@ -0,0 +1,28 @@ +// +// WhitelistUtil.swift +// PIALibrary-iOS +// +// Created by Waleed Mahmood on 01.06.22. +// Copyright © 2022 London Trust Media. All rights reserved. +// + +import Foundation +import SwiftyBeaver + +private let log = SwiftyBeaver.self + +public class WhitelistUtil { + public static func keys() -> [String] { + let bundle = Bundle(for: WhitelistUtil.self) + guard let filePath = bundle.path(forResource: "WhitelistUserPreferencesKeys", ofType: "plist") else { + log.debug("Couldn't find file 'WhitelistUserPreferencesKeys.plist'") + return [] + } + let contents = NSArray(contentsOfFile: filePath) + guard let allValues = contents as? [String] else { + log.debug("Couldn't find whitelist contents in 'WhitelistUserPreferencesKeys.plist'") + return [] + } + return allValues + } +} From 38ad2f7ded099ceb18e262a97ff393a87a21fe2d Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 16:14:58 +0200 Subject: [PATCH 37/68] Move plist to resources group --- PIALibrary.xcodeproj/project.pbxproj | 12 ++++-------- PIALibrary/Sources/Util/WhitelistUserSettings.plist | 5 ----- .../Util => }/WhitelistUserPreferencesKeys.plist | 0 3 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 PIALibrary/Sources/Util/WhitelistUserSettings.plist rename PIALibrary/{Sources/Util => }/WhitelistUserPreferencesKeys.plist (100%) diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index a2776b54..f4198b90 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -237,9 +237,8 @@ 7E9D038428479DE100BE85DC /* TimeInterval+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */; }; 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */; }; 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */; }; - 7E9D038A2847A35500BE85DC /* WhitelistUserSettings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */; }; 7E9D038C2847A8FC00BE85DC /* WhitelistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */; }; - 7E9D038E2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D038D2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist */; }; + 7E9D03902847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D038F2847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist */; }; 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; @@ -588,9 +587,8 @@ 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TimeInterval+Date.swift"; sourceTree = ""; }; 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccessibilityIdentifiers.swift; path = PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift; sourceTree = SOURCE_ROOT; }; 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = ""; }; - 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = WhitelistUserSettings.plist; sourceTree = ""; }; 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitelistUtil.swift; sourceTree = ""; }; - 7E9D038D2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = WhitelistUserPreferencesKeys.plist; sourceTree = ""; }; + 7E9D038F2847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = WhitelistUserPreferencesKeys.plist; sourceTree = ""; }; 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; @@ -741,9 +739,7 @@ 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */, 82CDC2E1257A5B440001669D /* DateUtil.swift */, 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */, - 7E9D038D2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist */, 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */, - 7E9D03892847A35500BE85DC /* WhitelistUserSettings.plist */, ); path = Util; sourceTree = ""; @@ -1043,6 +1039,7 @@ children = ( 0EB8C07E1F9CE11A005857E4 /* Resources */, 0EDD36B31F741C9300A5A7B9 /* Sources */, + 7E9D038F2847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist */, 0EBFFFD91F693F800009D4F4 /* Info.plist */, ); path = PIALibrary; @@ -1550,15 +1547,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 7E9D03902847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */, 0E7361E51FD9731F00706BFF /* Welcome.storyboard in Resources */, 824D981E266A1AC500FCD7DA /* staging.json in Resources */, 0E6B0A791FA4986D00EBB916 /* UI.strings in Resources */, 0E7361B41FD9683B00706BFF /* Signup.strings in Resources */, DD6DC5BC21B6A8FC00F9D538 /* pia-spinner.json in Resources */, 0EB8C0831F9CE11A005857E4 /* UI.xcassets in Resources */, - 7E9D038E2847A94400BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */, 0E7361E61FD9731F00706BFF /* Signup.storyboard in Resources */, - 7E9D038A2847A35500BE85DC /* WhitelistUserSettings.plist in Resources */, 0E7361CF1FD96AF000706BFF /* Welcome.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/PIALibrary/Sources/Util/WhitelistUserSettings.plist b/PIALibrary/Sources/Util/WhitelistUserSettings.plist deleted file mode 100644 index 5dd5da85..00000000 --- a/PIALibrary/Sources/Util/WhitelistUserSettings.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/PIALibrary/Sources/Util/WhitelistUserPreferencesKeys.plist b/PIALibrary/WhitelistUserPreferencesKeys.plist similarity index 100% rename from PIALibrary/Sources/Util/WhitelistUserPreferencesKeys.plist rename to PIALibrary/WhitelistUserPreferencesKeys.plist From 2dae8e5473a52df25fb1c03954681d3988a60ee1 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 16:18:51 +0200 Subject: [PATCH 38/68] Removed redundant util file --- PIALibrary.xcodeproj/project.pbxproj | 4 ---- .../Sources/Util/WhitelistUserInformationUtil.swift | 9 --------- 2 files changed, 13 deletions(-) delete mode 100644 PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index f4198b90..b77e3ee2 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -230,7 +230,6 @@ 33A542AFDFD3AF0C27B27F45 /* Pods_PIALibrary_PIALibraryTests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C71CB55833441BB6B5D0B9FD /* Pods_PIALibrary_PIALibraryTests_iOS.framework */; }; 354B015F27732095000A73B4 /* NavigationBar+Appearence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */; }; 3D93D3414A3DA19ECB04B778 /* Pods_PIALibrary_PIALibraryHost_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */; }; - 7E9D036F28478ADD00BE85DC /* WhitelistUserInformationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */; }; 7E9D038028479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */; }; 7E9D038128479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */; }; 7E9D038228479DCC00BE85DC /* PIACSIUserInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */; }; @@ -580,7 +579,6 @@ 10DD9676BB5539C7984C65D9 /* Pods-PIALibrary-PIALibrary-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibrary-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibrary-iOS/Pods-PIALibrary-PIALibrary-iOS.release.xcconfig"; sourceTree = ""; }; 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NavigationBar+Appearence.swift"; sourceTree = ""; }; 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; sourceTree = ""; }; - 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhitelistUserInformationUtil.swift; sourceTree = ""; }; 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSILastKnownExceptionProvider.swift; sourceTree = ""; }; 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIDeviceInformationProvider.swift; sourceTree = ""; }; 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIUserInformationProvider.swift; sourceTree = ""; }; @@ -739,7 +737,6 @@ 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */, 82CDC2E1257A5B440001669D /* DateUtil.swift */, 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */, - 7E9D036D28478ADD00BE85DC /* WhitelistUserInformationUtil.swift */, ); path = Util; sourceTree = ""; @@ -2030,7 +2027,6 @@ DD76292821ECDFF80092DF50 /* Usage.swift in Sources */, 0E2ADD3A1FE14F8600BB170C /* VPNProfile.swift in Sources */, 0E492C5C1FE5EA06007F23DF /* CMacros.m in Sources */, - 7E9D036F28478ADD00BE85DC /* WhitelistUserInformationUtil.swift in Sources */, DD6768E322FAB19D00B9FDD0 /* AppStoreInformation.swift in Sources */, 0EB8C0671F9CD38B005857E4 /* AutolayoutViewController.swift in Sources */, 0E3D13D31F9E270A00434A48 /* GlossAccountInfo.swift in Sources */, diff --git a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift b/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift deleted file mode 100644 index 7aafba39..00000000 --- a/PIALibrary/Sources/Util/WhitelistUserInformationUtil.swift +++ /dev/null @@ -1,9 +0,0 @@ -// -// WhitelistUserInformationUtil.swift -// PIALibrary -// -// Created by Waleed Mahmood on 31.05.22. -// - -import Foundation - From 9a6d926d0aaf8c452a9d3b08fe00a48bd70a8b4a Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 16:32:44 +0200 Subject: [PATCH 39/68] Refactor from plist approach to array --- PIALibrary.xcodeproj/project.pbxproj | 4 -- PIALibrary/Sources/Util/WhitelistUtil.swift | 66 +++++++++++++++---- PIALibrary/WhitelistUserPreferencesKeys.plist | 61 ----------------- 3 files changed, 55 insertions(+), 76 deletions(-) delete mode 100644 PIALibrary/WhitelistUserPreferencesKeys.plist diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj index b77e3ee2..6d748b14 100644 --- a/PIALibrary.xcodeproj/project.pbxproj +++ b/PIALibrary.xcodeproj/project.pbxproj @@ -237,7 +237,6 @@ 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */; }; 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */; }; 7E9D038C2847A8FC00BE85DC /* WhitelistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */; }; - 7E9D03902847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7E9D038F2847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist */; }; 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; @@ -586,7 +585,6 @@ 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccessibilityIdentifiers.swift; path = PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift; sourceTree = SOURCE_ROOT; }; 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = ""; }; 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitelistUtil.swift; sourceTree = ""; }; - 7E9D038F2847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = WhitelistUserPreferencesKeys.plist; sourceTree = ""; }; 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; @@ -1036,7 +1034,6 @@ children = ( 0EB8C07E1F9CE11A005857E4 /* Resources */, 0EDD36B31F741C9300A5A7B9 /* Sources */, - 7E9D038F2847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist */, 0EBFFFD91F693F800009D4F4 /* Info.plist */, ); path = PIALibrary; @@ -1544,7 +1541,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7E9D03902847AB5800BE85DC /* WhitelistUserPreferencesKeys.plist in Resources */, 0E7361E51FD9731F00706BFF /* Welcome.storyboard in Resources */, 824D981E266A1AC500FCD7DA /* staging.json in Resources */, 0E6B0A791FA4986D00EBB916 /* UI.strings in Resources */, diff --git a/PIALibrary/Sources/Util/WhitelistUtil.swift b/PIALibrary/Sources/Util/WhitelistUtil.swift index 7c102fa5..8b8fd4e4 100644 --- a/PIALibrary/Sources/Util/WhitelistUtil.swift +++ b/PIALibrary/Sources/Util/WhitelistUtil.swift @@ -13,16 +13,60 @@ private let log = SwiftyBeaver.self public class WhitelistUtil { public static func keys() -> [String] { - let bundle = Bundle(for: WhitelistUtil.self) - guard let filePath = bundle.path(forResource: "WhitelistUserPreferencesKeys", ofType: "plist") else { - log.debug("Couldn't find file 'WhitelistUserPreferencesKeys.plist'") - return [] - } - let contents = NSArray(contentsOfFile: filePath) - guard let allValues = contents as? [String] else { - log.debug("Couldn't find whitelist contents in 'WhitelistUserPreferencesKeys.plist'") - return [] - } - return allValues + return ["Version", + "AddingEmojiKeybordHandled", + "com.apple.content-rating.ExplicitMusicPodcastsAllowed", + "RegionFilter", + "AppleLanguagesDidMigrate", + "vpn.button.description", + "vpn.widget.port", + "UseConnectSiriShortcuts", + "NSLanguages", + "Theme", + "ShowGeoServers", + "AppleLanguages", + "vpn.widget.socket", + "usesCustomDNS", + "PKKeychainVersionKey", + "UseSmallPackets", + "AppEnvironmentIsProduction", + "stopInAppMessages", + "INNextHearbeatDate", + "DismissedMessages", + "AKLastEmailListRequestDateKey", + "checksDipExpirationRequest", + "AKLastIDMSEnvironment", + "quickSettingKillswitchVisible", + "userInteractedWithSurvey", + "quickSettingPrivateBrowserVisible", + "successConnections", + "successDisconnections", + "DidAskToEnableNotifications", + "ApplePasscodeKeyboards", + "vpn.widget.trusted.network", + "quickSettingNetworkToolVisible", + "StagingVersion", + "com.apple.content-rating.TVShowRating", + "IKEV2UseSmallPackets", + "com.apple.content-rating.AppRating", + "canAskAgainForReview", + "WireGuardUseSmallPackets", + "NSAllowsDefaultLineBreakStrategy", + "UseDisconnectSiriShortcuts", + "AppleLocale", + "com.apple.content-rating.MovieRating", + "NSInterfaceStyle", + "disablesMultiDipTokens", + "quickSettingThemeVisible", + "PKLogNotificationServiceResponsesKey", + "com.apple.content-rating.ExplicitBooksAllowed", + "AppleITunesStoreItemKinds", + "AppleLanguagesSchemaVersion", + "vpn.widget.protocol", + "failureConnections", + "Launched", + "showsDedicatedIPView", + "INNextFreshmintRefreshDateKey", + "AppVersion"] } } diff --git a/PIALibrary/WhitelistUserPreferencesKeys.plist b/PIALibrary/WhitelistUserPreferencesKeys.plist deleted file mode 100644 index bc8e04b7..00000000 --- a/PIALibrary/WhitelistUserPreferencesKeys.plist +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Version - AddingEmojiKeybordHandled - com.apple.content-rating.ExplicitMusicPodcastsAllowed - RegionFilter - AppleLanguagesDidMigrate - vpn.button.description - vpn.widget.port - UseConnectSiriShortcuts - NSLanguages - Theme - ShowGeoServers - AppleLanguages - vpn.widget.socket - usesCustomDNS - PKKeychainVersionKey - UseSmallPackets - AppEnvironmentIsProduction - stopInAppMessages - INNextHearbeatDate - DismissedMessages - AKLastEmailListRequestDateKey - checksDipExpirationRequest - AKLastIDMSEnvironment - quickSettingKillswitchVisible - userInteractedWithSurvey - quickSettingPrivateBrowserVisible - successConnections - successDisconnections - DidAskToEnableNotifications - ApplePasscodeKeyboards - vpn.widget.trusted.network - quickSettingNetworkToolVisible - StagingVersion - com.apple.content-rating.TVShowRating - IKEV2UseSmallPackets - com.apple.content-rating.AppRating - canAskAgainForReview - WireGuardUseSmallPackets - NSAllowsDefaultLineBreakStrategy - UseDisconnectSiriShortcuts - AppleLocale - com.apple.content-rating.MovieRating - NSInterfaceStyle - disablesMultiDipTokens - quickSettingThemeVisible - PKLogNotificationServiceResponsesKey - com.apple.content-rating.ExplicitBooksAllowed - AppleITunesStoreItemKinds - AppleLanguagesSchemaVersion - vpn.widget.protocol - failureConnections - Launched - showsDedicatedIPView - INNextFreshmintRefreshDateKey - AppVersion - - From cec686116e3eb7d08237767a91f1bf805bb0d051 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 1 Jun 2022 17:46:12 +0200 Subject: [PATCH 40/68] Code refactor for filtering and end point provider --- .../PIACSIUserInformationProvider.swift | 9 ++----- .../PIACrashlabClientStateProvider.swift | 24 +++++++++---------- PIALibrary/Sources/Util/WhitelistUtil.swift | 5 ++++ 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift index 2390b4e0..3198b3a4 100644 --- a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift @@ -26,12 +26,7 @@ class PIACSIUserInformationProvider: ICSIProvider { guard let defaults = UserDefaults(suiteName: Client.Configuration.appGroup) else { return userSettings } - let allowedKeys = WhitelistUtil.keys() - for (key, value) in defaults.dictionaryRepresentation() { - if allowedKeys.contains(key) { - userSettings += "\(key): \(value)\n" - } - } - return userSettings.redactIPs() + let filteredPreferences = WhitelistUtil.filter(preferences: defaults.dictionaryRepresentation()) + return filteredPreferences.map{ "\($0): \($1)" }.joined(separator: "\n").redactIPs() } } diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift b/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift index 0eee52a3..9401519a 100644 --- a/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift +++ b/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift @@ -12,20 +12,18 @@ import PIACSI class PIACSIClientStateProvider : IEndPointProvider { var endpoints: [CSIEndpoint] { - get { - let validEndpoints = EndpointManager.shared.availableCSIEndpoints() - var clientEndpoints = [CSIEndpoint]() - for endpoint in validEndpoints { - clientEndpoints.append( - CSIEndpoint( - endpoint: endpoint.host, - isProxy: endpoint.isProxy, - usePinnedCertificate: endpoint.useCertificatePinning, - certificateCommonName: endpoint.commonName - ) + let validEndpoints = EndpointManager.shared.availableCSIEndpoints() + var clientEndpoints = [CSIEndpoint]() + for endpoint in validEndpoints { + clientEndpoints.append( + CSIEndpoint( + endpoint: endpoint.host, + isProxy: endpoint.isProxy, + usePinnedCertificate: endpoint.useCertificatePinning, + certificateCommonName: endpoint.commonName ) - } - return clientEndpoints + ) } + return clientEndpoints } } diff --git a/PIALibrary/Sources/Util/WhitelistUtil.swift b/PIALibrary/Sources/Util/WhitelistUtil.swift index 8b8fd4e4..6ebfbe1b 100644 --- a/PIALibrary/Sources/Util/WhitelistUtil.swift +++ b/PIALibrary/Sources/Util/WhitelistUtil.swift @@ -12,6 +12,11 @@ import SwiftyBeaver private let log = SwiftyBeaver.self public class WhitelistUtil { + + public static func filter(preferences: [String: Any], from filterKeys: [String] = WhitelistUtil.keys()) -> [String: Any] { + return preferences.filter({ filterKeys.contains($0.key) }) + } + public static func keys() -> [String] { return ["Version", "AddingEmojiKeybordHandled", From 5b99eae450fd0b32cabac51efd2aeb6ed9d1863c Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Mon, 27 Jun 2022 17:45:57 +0200 Subject: [PATCH 41/68] Disables meta proxies with a condition filter --- .../Sources/Core/Persistence/PlainStore.swift | 2 ++ .../Sources/Library/Client+Preferences.swift | 19 ++++++++++++++++++- .../Persistence/UserDefaultsStore.swift | 12 ++++++++++++ .../Library/WebServices/EndpointManager.swift | 12 +++++++++--- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index b5144658..1addd79a 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -87,6 +87,8 @@ protocol PlainStore: class { var mace: Bool? { get set } + var disableMetaProxies: Bool { get set } + // MARK: Lifecycle func reset() diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index 63e55993..864f79ba 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -34,6 +34,8 @@ private protocol PreferencesStore: class { var mace: Bool { get set } + var disableMetaProxies: Bool { get set } + var useWiFiProtection: Bool { get set } var trustCellularData: Bool { get set } @@ -107,6 +109,7 @@ private extension PreferencesStore { lastKnownException = source.lastKnownException versionWhenServiceQualityOpted = source.versionWhenServiceQualityOpted lastConnectedRegion = source.lastConnectedRegion + disableMetaProxies = source.disableMetaProxies } } @@ -171,6 +174,16 @@ extension Client { } } + /// Disables the meta proxies end-points + public var disableMetaProxies: Bool { + get { + return accessedDatabase.plain.disableMetaProxies + } + set { + accessedDatabase.plain.disableMetaProxies = newValue + } + } + /// Use VPN WiFi Protection public fileprivate(set) var useWiFiProtection: Bool { get { @@ -466,6 +479,7 @@ extension Client.Preferences { shareServiceQualityData = false lastKnownException = nil versionWhenServiceQualityOpted = nil + disableMetaProxies = false } /** @@ -502,7 +516,10 @@ extension Client.Preferences { /// :nodoc: public var mace: Bool - + + /// :nodoc: + public var disableMetaProxies: Bool + /// :nodoc: public var useWiFiProtection: Bool diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index 398e940c..13b61bd8 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -105,6 +105,8 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" static let timeToConnectVPN = "timeToConnectVPN" + + static let disableMetaProxies = "disableMetaProxies" } private let backend: UserDefaults @@ -518,6 +520,15 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } + var disableMetaProxies: Bool { + get { + return backend.bool(forKey: Entries.disableMetaProxies) + } + set { + backend.set(newValue, forKey: Entries.disableMetaProxies) + } + } + // MARK: Service Quality var shareServiceQualityData: Bool? { @@ -673,6 +684,7 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { backend.removeObject(forKey: Entries.signInWithAppleFakeEmail) backend.removeObject(forKey: Entries.shareServiceQualityData) backend.removeObject(forKey: Entries.versionWhenServiceQualityOpted) + backend.removeObject(forKey: Entries.disableMetaProxies) backend.synchronize() } diff --git a/PIALibrary/Sources/Library/WebServices/EndpointManager.swift b/PIALibrary/Sources/Library/WebServices/EndpointManager.swift index 47927117..3c5c5346 100644 --- a/PIALibrary/Sources/Library/WebServices/EndpointManager.swift +++ b/PIALibrary/Sources/Library/WebServices/EndpointManager.swift @@ -94,7 +94,10 @@ public class EndpointManager { } var availableEndpoints = [PinningEndpoint]() - availableMetaEndpoints(&availableEndpoints) + if Client.preferences.disableMetaProxies { + availableMetaEndpoints(&availableEndpoints) + } + availableEndpoints.append(PinningEndpoint(host: region)) @@ -109,8 +112,11 @@ public class EndpointManager { } var availableEndpoints = [PinningEndpoint]() - availableMetaEndpoints(&availableEndpoints) - + + if Client.preferences.disableMetaProxies { + availableMetaEndpoints(&availableEndpoints) + } + availableEndpoints.append(PinningEndpoint(host: pia)) availableEndpoints.append(PinningEndpoint(host: proxy, isProxy: true)) From 7747347a0bd7489ee0a4d6bae23f1a3cb9b68968 Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Tue, 28 Jun 2022 15:37:01 +0200 Subject: [PATCH 42/68] Rename flag for better readability --- PIALibrary/Sources/Util/WhitelistUtil.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary/Sources/Util/WhitelistUtil.swift b/PIALibrary/Sources/Util/WhitelistUtil.swift index 6ebfbe1b..957f3488 100644 --- a/PIALibrary/Sources/Util/WhitelistUtil.swift +++ b/PIALibrary/Sources/Util/WhitelistUtil.swift @@ -35,7 +35,7 @@ public class WhitelistUtil { "PKKeychainVersionKey", "UseSmallPackets", "AppEnvironmentIsProduction", - "stopInAppMessages", + "showServiceMessages", "INNextHearbeatDate", "DismissedMessages", "AKLastEmailListRequestDateKey", From d4f2c900ccd4531cc052446ac26e55b40c45c29c Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Wed, 13 Jul 2022 14:50:54 +0200 Subject: [PATCH 43/68] Revert meta proxy flag user preferences --- .../Sources/Core/Persistence/PlainStore.swift | 2 -- .../Sources/Library/Client+Preferences.swift | 17 ----------------- .../Library/Persistence/UserDefaultsStore.swift | 12 ------------ .../Library/WebServices/EndpointManager.swift | 10 ++-------- 4 files changed, 2 insertions(+), 39 deletions(-) diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/PIALibrary/Sources/Core/Persistence/PlainStore.swift index 1addd79a..b5144658 100644 --- a/PIALibrary/Sources/Core/Persistence/PlainStore.swift +++ b/PIALibrary/Sources/Core/Persistence/PlainStore.swift @@ -87,8 +87,6 @@ protocol PlainStore: class { var mace: Bool? { get set } - var disableMetaProxies: Bool { get set } - // MARK: Lifecycle func reset() diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/PIALibrary/Sources/Library/Client+Preferences.swift index 864f79ba..b4fee376 100644 --- a/PIALibrary/Sources/Library/Client+Preferences.swift +++ b/PIALibrary/Sources/Library/Client+Preferences.swift @@ -34,8 +34,6 @@ private protocol PreferencesStore: class { var mace: Bool { get set } - var disableMetaProxies: Bool { get set } - var useWiFiProtection: Bool { get set } var trustCellularData: Bool { get set } @@ -109,7 +107,6 @@ private extension PreferencesStore { lastKnownException = source.lastKnownException versionWhenServiceQualityOpted = source.versionWhenServiceQualityOpted lastConnectedRegion = source.lastConnectedRegion - disableMetaProxies = source.disableMetaProxies } } @@ -174,16 +171,6 @@ extension Client { } } - /// Disables the meta proxies end-points - public var disableMetaProxies: Bool { - get { - return accessedDatabase.plain.disableMetaProxies - } - set { - accessedDatabase.plain.disableMetaProxies = newValue - } - } - /// Use VPN WiFi Protection public fileprivate(set) var useWiFiProtection: Bool { get { @@ -479,7 +466,6 @@ extension Client.Preferences { shareServiceQualityData = false lastKnownException = nil versionWhenServiceQualityOpted = nil - disableMetaProxies = false } /** @@ -517,9 +503,6 @@ extension Client.Preferences { /// :nodoc: public var mace: Bool - /// :nodoc: - public var disableMetaProxies: Bool - /// :nodoc: public var useWiFiProtection: Bool diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift index 13b61bd8..398e940c 100644 --- a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift +++ b/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift @@ -105,8 +105,6 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { static let lastVPNConnectionAttempt = "lastVPNConnectionAttempt" static let timeToConnectVPN = "timeToConnectVPN" - - static let disableMetaProxies = "disableMetaProxies" } private let backend: UserDefaults @@ -520,15 +518,6 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { } } - var disableMetaProxies: Bool { - get { - return backend.bool(forKey: Entries.disableMetaProxies) - } - set { - backend.set(newValue, forKey: Entries.disableMetaProxies) - } - } - // MARK: Service Quality var shareServiceQualityData: Bool? { @@ -684,7 +673,6 @@ class UserDefaultsStore: PlainStore, ConfigurationAccess { backend.removeObject(forKey: Entries.signInWithAppleFakeEmail) backend.removeObject(forKey: Entries.shareServiceQualityData) backend.removeObject(forKey: Entries.versionWhenServiceQualityOpted) - backend.removeObject(forKey: Entries.disableMetaProxies) backend.synchronize() } diff --git a/PIALibrary/Sources/Library/WebServices/EndpointManager.swift b/PIALibrary/Sources/Library/WebServices/EndpointManager.swift index 3c5c5346..c7b0ba7f 100644 --- a/PIALibrary/Sources/Library/WebServices/EndpointManager.swift +++ b/PIALibrary/Sources/Library/WebServices/EndpointManager.swift @@ -94,10 +94,7 @@ public class EndpointManager { } var availableEndpoints = [PinningEndpoint]() - if Client.preferences.disableMetaProxies { - availableMetaEndpoints(&availableEndpoints) - } - + availableMetaEndpoints(&availableEndpoints) availableEndpoints.append(PinningEndpoint(host: region)) @@ -112,10 +109,7 @@ public class EndpointManager { } var availableEndpoints = [PinningEndpoint]() - - if Client.preferences.disableMetaProxies { - availableMetaEndpoints(&availableEndpoints) - } + availableMetaEndpoints(&availableEndpoints) availableEndpoints.append(PinningEndpoint(host: pia)) availableEndpoints.append(PinningEndpoint(host: proxy, isProxy: true)) From cffdca05875c90516e9bc75df6ae27f31913c3fc Mon Sep 17 00:00:00 2001 From: Waleed Mahmood Date: Thu, 14 Jul 2022 10:23:18 +0200 Subject: [PATCH 44/68] Bump version to 2.18.0 --- PIALibrary.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIALibrary.podspec b/PIALibrary.podspec index 6b5b7f90..e6213740 100644 --- a/PIALibrary.podspec +++ b/PIALibrary.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "PIALibrary" - s.version = "2.17.0" + s.version = "2.18.0" s.summary = "PIA client library in Swift." s.homepage = "https://www.privateinternetaccess.com/" From b98b1c6122c9c7bc1ccc90bb30c5195ac49e0cd5 Mon Sep 17 00:00:00 2001 From: kp-juan-docal <109512072+kp-juan-docal@users.noreply.github.com> Date: Fri, 16 Dec 2022 13:48:03 +0100 Subject: [PATCH 45/68] Merge `release/2.19.0` into master (#511) * Migrate to SPM * Update to wireguard-apple `1.0.15-26` * Sync OpenVPN TunnelKit to version 4.0.3 (#509) * update openvpn * update tunnelkit dep * update dep from branch to commit Co-authored-by: Waleed Mahmood Co-authored-by: Juan Docal --- .gitignore | 6 +- PIALibrary.podspec | 95 - PIALibrary.xcodeproj/project.pbxproj | 2617 ----------------- .../xcschemes/PIALibrary-iOS.xcscheme | 106 - .../xcschemes/PIALibrary-macOS.xcscheme | 80 - .../xcschemes/PIALibraryHost-iOS.xcscheme | 91 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - PIALibrary/Info.plist | 24 - PIALibrary/Resources/Lottie/pia-spinner.json | 1 - PIALibrary/Resources/Staging/staging.json | 258 -- PIALibrary/Sources/Util/iOS/module.modulemap | 8 - .../Sources/Util/macOS/module.modulemap | 6 - PIALibraryHost-iOS/AppDelegate.swift | 60 - .../AppIcon.appiconset/Contents.json | 98 - .../Base.lproj/LaunchScreen.storyboard | 25 - PIALibraryHost-iOS/Base.lproj/Main.storyboard | 24 - PIALibraryHost-iOS/Info.plist | 50 - .../PIALibraryHost.entitlements | 14 - PIALibraryHost-iOS/ViewController.swift | 39 - Package.swift | 74 + Podfile | 71 - Podfile.lock | 157 - README.md | 38 +- .../PIALibrary}/Account/AccountProvider.swift | 0 .../Account/DefaultAccountProvider.swift | 0 .../Account/EphemeralAccountProvider.swift | 191 ++ .../Account/InApp/RedeemRequest.swift | 0 .../Account/InApp/RenewRequest.swift | 0 .../Account/InApp/SignupRequest.swift | 0 .../Account/LoginReceiptRequest.swift | 0 .../PIALibrary}/Account/LoginRequest.swift | 0 .../Account/UpdateAccountRequest.swift | 0 .../PIALibrary}/Account/UserAccount.swift | 0 .../PIALibrary}/Client+Configuration.swift | 4 +- .../PIALibrary}/Client+Daemons.swift | 0 .../PIALibrary}/Client+Database.swift | 0 .../PIALibrary}/Client+Environment.swift | 0 .../PIALibrary}/Client+Preferences.swift | 0 .../PIALibrary}/Client+Providers.swift | 0 .../PIALibrary}/Client.swift | 0 .../PIALibrary}/ClientAccess.swift | 0 .../PIALibrary}/ClientError.swift | 12 - .../Daemons/ConnectivityDaemon.swift | 0 .../PIALibrary}/Daemons/Daemon.swift | 0 .../PIALibrary}/Daemons/PingTask.swift | 0 .../PIALibrary}/Daemons/ServersDaemon.swift | 1 + .../PIALibrary}/Daemons/ServersPinger.swift | 0 .../PIALibrary}/Daemons/VPNDaemon.swift | 0 .../PIALibrary}/DeviceModel.swift | 0 .../PIALibrary}/InApp/AppStoreProduct.swift | 0 .../PIALibrary}/InApp/AppStoreProvider.swift | 0 .../InApp/AppStoreTransaction.swift | 0 .../PIALibrary}/InApp/InAppProduct.swift | 0 .../PIALibrary}/InApp/InAppProvider.swift | 0 .../PIALibrary}/InApp/InAppTransaction.swift | 0 .../PIALibrary}/LibraryCallback.swift | 0 .../PIALibrary}/LibraryConstants.swift | 0 .../Core => Sources/PIALibrary}/Macros.swift | 0 .../PIALibrary}/Mock/Client+Mock.swift | 0 .../Mock/MockAccountProvider.swift | 0 .../PIALibrary}/Mock/MockInAppProvider.swift | 0 .../PIALibrary}/Mock/MockServerProvider.swift | 0 .../PIALibrary}/Mock/MockTileProvider.swift | 0 .../PIALibrary}/Mock/MockVPNProvider.swift | 0 .../PIALibrary}/Mock/MockWebServices.swift | 0 .../PIALibrary}/NMT/NMTRules.swift | 0 .../PIALibrary}/NMT/NMTType.swift | 0 .../PIALibrary}/Notification+Core.swift | 0 .../PIALibrary}/Notification+Library.swift | 0 .../PIALibrary}/Notification+UI.swift | 0 .../PIALibrary}/NotificationKey.swift | 0 .../Persistence/KeychainStore.swift | 0 .../PIALibrary}/Persistence/MemoryStore.swift | 0 .../PIALibrary}/Persistence/PlainStore.swift | 0 .../PIALibrary}/Persistence/SecureStore.swift | 0 .../Persistence/TransientStore.swift | 0 .../Persistence/UserDefaultsStore.swift | 0 .../PIAAccountClientStateProvider.swift | 0 ...PIAAccountStagingClientStateProvider.swift | 0 .../PIACSIDeviceInformationProvider.swift | 0 .../PIACSILastKnownExceptionProvider.swift | 0 .../PIACSIUserInformationProvider.swift | 0 .../PIACrashlabClientStateProvider.swift | 0 ...ACrashlabProtocolInformationProvider.swift | 0 ...PIACrashlabRegionInformationProvider.swift | 0 .../Providers/PIAKPIClientStateProvider.swift | 0 .../PIAKPIStagingClientStateProvider.swift | 0 .../PIARegionClientStateProvider.swift | 0 .../Resources}/Shared/ar.lproj/UI.strings | 0 .../Resources}/Shared/da.lproj/UI.strings | 0 .../Resources}/Shared/de.lproj/UI.strings | 0 .../Resources}/Shared/en.lproj/UI.strings | 0 .../Resources}/Shared/es-MX.lproj/UI.strings | 0 .../Resources}/Shared/fr.lproj/UI.strings | 0 .../Resources}/Shared/it.lproj/UI.strings | 0 .../Resources}/Shared/ja.lproj/UI.strings | 0 .../Resources}/Shared/ko.lproj/UI.strings | 0 .../Resources}/Shared/nb.lproj/UI.strings | 0 .../Resources}/Shared/nl.lproj/UI.strings | 0 .../Resources}/Shared/pl.lproj/UI.strings | 0 .../Resources}/Shared/pt-BR.lproj/UI.strings | 0 .../Resources}/Shared/ru.lproj/UI.strings | 0 .../Resources}/Shared/th.lproj/UI.strings | 0 .../Resources}/Shared/tr.lproj/UI.strings | 0 .../Shared/zh-Hans.lproj/UI.strings | 0 .../Shared/zh-Hant.lproj/UI.strings | 0 .../Resources}/iOS/Signup.storyboard | 38 +- .../Resources}/iOS/UI.xcassets/Contents.json | 0 .../iOS/UI.xcassets/PIAX/Contents.json | 0 .../iOS/UI.xcassets/PIAX/Global/Contents.json | 0 .../centered-dark-map.imageset/Contents.json | 0 .../darkDotsCopy2.pdf | Bin .../centered-light-map.imageset/Contents.json | 0 .../centered-light-map.imageset/group.pdf | Bin .../computer-icon.imageset/Contents.json | 0 .../computer-icon.imageset/computer-7.png | Bin .../computer-icon.imageset/computer-7@2x.png | Bin .../computer-icon.imageset/computer-7@3x.png | Bin .../Global/globe-icon.imageset/Contents.json | 0 .../globe-icon.imageset/globe-turn-7.png | Bin .../globe-icon.imageset/globe-turn-7@2x.png | Bin .../globe-icon.imageset/globe-turn-7@3x.png | Bin .../Global/icon-back.imageset/Contents.json | 0 .../icon-back.imageset/backIconCopy-2.pdf | Bin .../Global/icon-camera.imageset/Contents.json | 0 .../Global/icon-camera.imageset/scanIcon.pdf | Bin .../Global/icon-close.imageset/Contents.json | 0 .../icon-close.imageset/group104Copy.pdf | Bin .../icon-warning.imageset/Contents.json | 0 .../warningIconCopy4.pdf | Bin .../Contents.json | 0 .../group4.pdf | Bin .../Contents.json | 0 .../oval2Copy.pdf | Bin .../plan-selected.imageset/Contents.json | 0 .../Global/plan-selected.imageset/group3.pdf | Bin .../plan-unselected.imageset/Contents.json | 0 .../Global/plan-unselected.imageset/oval3.pdf | Bin .../scrollableMap-dark.imageset/Contents.json | 0 .../map-dark-walkthrough.pdf | Bin .../Contents.json | 0 .../map-light-walkthrough.pdf | Bin .../Global/shield-icon.imageset/Contents.json | 0 .../Global/shield-icon.imageset/shield-7.png | Bin .../shield-icon.imageset/shield-7@2x.png | Bin .../shield-icon.imageset/shield-7@3x.png | Bin .../close-icon.imageset/Contents.json | 0 .../close-icon.imageset/close_button@2x.png | Bin .../close-icon.imageset/close_button@3x.png | Bin .../Contents.json | 0 .../signup-error.pdf | Bin .../Contents.json | 0 .../consent-icon.pdf | Bin .../image-no-internet.imageset/Contents.json | 0 .../no-internet-dark.pdf | Bin .../Contents.json | 0 .../image-purchase-success@2x.png | Bin .../image-purchase-success@3x.png | Bin .../Contents.json | 0 .../image-receipt-background@2x.png | Bin .../image-receipt-background@3x.png | Bin .../Contents.json | 0 .../image-redeem-claimed@2x.png | Bin .../image-redeem-claimed@3x.png | Bin .../Contents.json | 0 .../gift-card-error.pdf | Bin .../Contents.json | 0 .../sign-up-email.pdf | Bin .../01IllustrationWalkthroughScreen.pdf | Bin .../Contents.json | 0 .../02IllustrationWalkthroughGlobe.pdf | Bin .../Contents.json | 0 .../03IllustrationWalkthroughShield.pdf | Bin .../Contents.json | 0 .../nav-logo.imageset/Contents.json | 0 .../pia-logo-light-horizontal-128.pdf | Bin .../qr-code.imageset/Contents.json | 0 .../qr-code.imageset/ic_qr_code@2x.png | Bin .../qr-code.imageset/ic_qr_code@3x.png | Bin .../Resources}/iOS/Welcome.storyboard | 54 +- .../Resources}/iOS/ar.lproj/Signup.strings | 0 .../Resources}/iOS/ar.lproj/Welcome.strings | 0 .../Resources}/iOS/da.lproj/Signup.strings | 0 .../Resources}/iOS/da.lproj/Welcome.strings | 0 .../Resources}/iOS/de.lproj/Signup.strings | 0 .../Resources}/iOS/de.lproj/Welcome.strings | 0 .../Resources}/iOS/en.lproj/Signup.strings | 0 .../Resources}/iOS/en.lproj/Welcome.strings | 0 .../Resources}/iOS/es-MX.lproj/Signup.strings | 0 .../iOS/es-MX.lproj/Welcome.strings | 0 .../Resources}/iOS/fr.lproj/Signup.strings | 0 .../Resources}/iOS/fr.lproj/Welcome.strings | 0 .../Resources}/iOS/it.lproj/Signup.strings | 0 .../Resources}/iOS/it.lproj/Welcome.strings | 0 .../Resources}/iOS/ja.lproj/Signup.strings | 0 .../Resources}/iOS/ja.lproj/Welcome.strings | 0 .../Resources}/iOS/ko.lproj/Signup.strings | 0 .../Resources}/iOS/ko.lproj/Welcome.strings | 0 .../Resources}/iOS/nb.lproj/Signup.strings | 0 .../Resources}/iOS/nb.lproj/Welcome.strings | 0 .../Resources}/iOS/nl.lproj/Signup.strings | 0 .../Resources}/iOS/nl.lproj/Welcome.strings | 0 .../Resources}/iOS/pl.lproj/Signup.strings | 0 .../Resources}/iOS/pl.lproj/Welcome.strings | 0 .../Resources}/iOS/pt-BR.lproj/Signup.strings | 0 .../iOS/pt-BR.lproj/Welcome.strings | 0 .../Resources}/iOS/ru.lproj/Signup.strings | 0 .../Resources}/iOS/ru.lproj/Welcome.strings | 0 .../Resources}/iOS/th.lproj/Signup.strings | 0 .../Resources}/iOS/th.lproj/Welcome.strings | 0 .../Resources}/iOS/tr.lproj/Signup.strings | 0 .../Resources}/iOS/tr.lproj/Welcome.strings | 0 .../iOS/zh-Hans.lproj/Signup.strings | 0 .../iOS/zh-Hans.lproj/Welcome.strings | 0 .../iOS/zh-Hant.lproj/Signup.strings | 0 .../iOS/zh-Hant.lproj/Welcome.strings | 0 .../Server/DefaultServerProvider.swift | 0 .../PIALibrary}/Server/ServerProvider.swift | 0 .../ServiceQualityManager.swift | 0 .../PIALibrary}/Tiles/AvailableTiles.swift | 0 .../Tiles/DefaultTileProvider.swift | 0 .../PIALibrary}/Tiles/TileProvider.swift | 0 .../PIALibrary}/Tiles/Tileable.swift | 0 .../PIALibrary}/Tiles/TileableCell.swift | 0 .../UI/Shared/BrandableNavigationBar.swift | 0 .../UI/Shared/CAGradientLayer+Image.swift | 0 .../PIALibrary}/UI/Shared/GiftCardUtil.swift | 0 .../UI/Shared/NavigationBar+Appearence.swift | 0 .../PIALibrary}/UI/Shared/PIAColors.swift | 0 .../PIALibrary}/UI/Shared/PIAFonts.swift | 0 .../UI/Shared/PIAPageControl.swift | 2 +- .../PIALibrary}/UI/Shared/Restylable.swift | 0 .../PIALibrary}/UI/Shared/Validator.swift | 0 .../UI/iOS/AccessibilityIdentifiers.swift | 0 .../PIALibrary}/UI/iOS/ActivityButton.swift | 0 .../UI/iOS/BorderedTextField.swift | 0 .../UI/iOS/CircleProgressView.swift | 0 .../UI/iOS/ClientError+Localization.swift | 20 + .../UI/iOS/InvalidatingFlowLayout.swift | 0 .../PIALibrary}/UI/iOS/Macros+UI.swift | 8 +- .../UI/iOS/NavigationLogoView.swift | 0 .../PIALibrary}/UI/iOS/PIAButton.swift | 0 .../PIALibrary}/UI/iOS/PurchasePlan.swift | 0 .../PIALibrary}/UI/iOS/PurchasePlanCell.swift | 0 .../PIALibrary}/UI/iOS/SignupMetadata.swift | 0 .../UI/iOS/Styles/StyleGuideHelpers.swift | 0 .../UI/iOS/Styles/TextStyles.swift | 0 .../UI/iOS/Styles/ViewStyles.swift | 0 .../PIALibrary}/UI/iOS/SwiftGen+Assets.swift | 0 .../UI/iOS/SwiftGen+ScenesStoryboards.swift | 12 +- .../UI/iOS/SwiftGen+SeguesStoryboards.swift | 0 .../PIALibrary}/UI/iOS/SwiftGen+Strings.swift | 0 .../UI/iOS/Theme+LightPalette.swift | 0 .../PIALibrary}/UI/iOS/Theme.swift | 3 +- .../PIALibrary}/UI/iOS/UIControl+Action.swift | 0 .../PIALibrary}/UI/iOS/UIImage+Color.swift | 0 .../UI/iOS/UILabel+LineHeight.swift | 0 .../UI/iOS/UITextField+PlaceholderColor.swift | 0 .../PIALibrary}/UI/iOS/UIViewLoading.swift | 1 + .../AutolayoutViewController.swift | 0 .../ConfirmVPNPlanViewController.swift | 0 .../ViewControllers/GDPRViewController.swift | 0 .../GetStartedViewController.swift | 0 .../ViewControllers/LoginViewController.swift | 0 .../MagicLinkLoginViewController.swift | 0 .../OptionsViewController.swift | 0 .../PIAWelcomeViewController.swift | 183 -- .../PurchaseViewController.swift | 0 .../RestoreSignupViewController.swift | 0 .../ShareDataInformationViewController.swift | 0 .../SignupFailureViewController.swift | 0 .../SignupInProgressViewController.swift | 0 ...nupInternetUnreachableViewController.swift | 0 .../SignupSuccessViewController.swift | 1 + .../TermsAndConditionsViewController.swift | 0 .../WelcomePageViewController.swift | 0 .../UI/iOS/WalkthroughPageView.swift | 0 .../PIALibrary}/Util/Array+Math.swift | 0 .../PIALibrary}/Util/DataManipulation.swift | 0 .../PIALibrary}/Util/DateUtil.swift | 0 .../PIALibrary}/Util/EnumsBuilder.swift | 0 .../PIALibrary}/Util/Keychain.swift | 0 .../PIALibrary}/Util/Macros+Pinger.swift | 0 .../PIALibrary}/Util/Pages.swift | 0 .../PIALibrary}/Util/Preset.swift | 0 .../PIALibrary}/Util/TimeInterval+Date.swift | 0 .../PIALibrary}/Util/UIDevice+WiFi.swift | 0 .../PIALibrary}/Util/UIViewAutolayout.swift | 0 .../PIALibrary}/Util/WhitelistUtil.swift | 0 .../Util/iOS/String+Components.swift | 0 .../PIALibrary}/Util/iOS/String+Random.swift | 0 .../PIALibrary}/VPN/DefaultVPNProvider.swift | 0 .../VPN/IKEv2EncryptionAlgorithm.swift | 0 .../VPN/IKEv2IntegrityAlgorithm.swift | 0 .../PIALibrary}/VPN/IKEv2Profile.swift | 0 .../PIALibrary}/VPN/IPSecProfile.swift | 0 .../VPN/NetworkExtensionProfile.swift | 0 .../PIALibrary}/VPN/PIATunnelProfile.swift | 20 +- .../VPN/PIATunnelProvider+Profile.swift | 6 +- .../PIALibrary}/VPN/PIAWGTunnelProfile.swift | 0 .../VPN/PIAWGTunnelProvider+Profile.swift | 0 .../PIALibrary}/VPN/VPNAction.swift | 0 .../PIALibrary}/VPN/VPNConfiguration.swift | 0 .../PIALibrary}/VPN/VPNProfile.swift | 0 .../PIALibrary}/VPN/VPNProvider.swift | 0 .../PIALibrary}/VPN/VPNStatus.swift | 0 .../WebServices/AccountInfo+Kotlin.swift | 0 .../PIALibrary}/WebServices/AccountInfo.swift | 0 .../WebServices/AppStoreInformation.swift | 0 .../WebServices/ConnectivityStatus.swift | 0 .../PIALibrary}/WebServices/Credentials.swift | 0 .../PIALibrary}/WebServices/DedicatedIP.swift | 0 .../PIALibrary}/WebServices/Endpoint.swift | 0 .../WebServices/EndpointManager.swift | 0 .../WebServices/GlossAccountInfo.swift | 0 .../WebServices/GlossConnectivityStatus.swift | 0 .../WebServices/GlossCredentials.swift | 0 .../PIALibrary}/WebServices/GlossParser.swift | 0 .../WebServices/GlossPayment.swift | 0 .../WebServices/GlossProduct.swift | 0 .../PIALibrary}/WebServices/GlossRedeem.swift | 0 .../PIALibrary}/WebServices/GlossServer.swift | 0 .../WebServices/GlossServersBundle.swift | 0 .../PIALibrary}/WebServices/GlossSignup.swift | 0 .../PIALibrary}/WebServices/GlossToken.swift | 0 .../WebServices/InAppMessage.swift | 0 .../PIAWebServices+Ephemeral.swift | 0 .../WebServices/PIAWebServices.swift | 0 .../PIALibrary}/WebServices/Payment.swift | 0 .../PIALibrary}/WebServices/Plan.swift | 0 .../PIALibrary}/WebServices/Product.swift | 0 .../PIALibrary}/WebServices/Redeem.swift | 0 .../PIALibrary}/WebServices/Server.swift | 0 .../WebServices/ServersBundle.swift | 0 .../PIALibrary}/WebServices/Signup.swift | 0 .../PIALibrary}/WebServices/Usage.swift | 0 .../PIALibrary}/WebServices/WebServices.swift | 0 .../PIALibraryUtilObjC}/CMacros.m | 0 Sources/PIALibraryUtilObjC/FXPageControl.m | 542 ++++ .../PIALibraryUtilObjC}/NSData+Compression.m | 0 .../PIALibraryUtilObjC}/NSString+URL.m | 0 .../PIALibraryUtilObjC}/Pinger.m | 0 .../PIALibraryUtilObjC/include}/CMacros.h | 0 .../include/FXPageControl.h | 107 + .../include}/NSData+Compression.h | 0 .../include}/NSString+URL.h | 0 .../PIALibraryUtilObjC/include}/Pinger.h | 0 .../include/module.modulemap | 9 + .../PIALibraryTests}/AccountInfoTests.swift | 0 .../PIALibraryTests}/AccountSignupTests.swift | 0 .../PIALibraryTests}/AccountTests.swift | 0 .../DIPTokenKeychainTests.swift | 0 .../EndpointManagerTests.swift | 0 .../PIALibraryTests}/GiftCardUtilTests.swift | 0 .../PIALibraryTests}/MockProviders.swift | 0 .../PIALibraryTests}/ProductTests.swift | 0 .../PIALibraryTests/Resources}/Info-iOS.plist | 0 .../Resources}/Info-macOS.plist | 0 .../PIALibraryTests/Resources}/server.json | 0 .../PIALibraryTests}/ServerTests.swift | 0 .../PIALibraryTests}/VPNTests.swift | 0 .../PIALibraryTests}/ValidatorTests.swift | 0 363 files changed, 1032 insertions(+), 4142 deletions(-) delete mode 100644 PIALibrary.podspec delete mode 100644 PIALibrary.xcodeproj/project.pbxproj delete mode 100644 PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-iOS.xcscheme delete mode 100644 PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-macOS.xcscheme delete mode 100644 PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibraryHost-iOS.xcscheme delete mode 100644 PIALibrary.xcworkspace/contents.xcworkspacedata delete mode 100644 PIALibrary.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 PIALibrary/Info.plist delete mode 100644 PIALibrary/Resources/Lottie/pia-spinner.json delete mode 100644 PIALibrary/Resources/Staging/staging.json delete mode 100644 PIALibrary/Sources/Util/iOS/module.modulemap delete mode 100644 PIALibrary/Sources/Util/macOS/module.modulemap delete mode 100644 PIALibraryHost-iOS/AppDelegate.swift delete mode 100644 PIALibraryHost-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 PIALibraryHost-iOS/Base.lproj/LaunchScreen.storyboard delete mode 100644 PIALibraryHost-iOS/Base.lproj/Main.storyboard delete mode 100644 PIALibraryHost-iOS/Info.plist delete mode 100644 PIALibraryHost-iOS/PIALibraryHost.entitlements delete mode 100644 PIALibraryHost-iOS/ViewController.swift create mode 100644 Package.swift delete mode 100644 Podfile delete mode 100644 Podfile.lock rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/AccountProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Account/DefaultAccountProvider.swift (100%) create mode 100644 Sources/PIALibrary/Account/EphemeralAccountProvider.swift rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/InApp/RedeemRequest.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/InApp/RenewRequest.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/InApp/SignupRequest.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/LoginReceiptRequest.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/LoginRequest.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/UpdateAccountRequest.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Account/UserAccount.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client+Configuration.swift (99%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client+Daemons.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client+Database.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client+Environment.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client+Preferences.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client+Providers.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Client.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/ClientAccess.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/ClientError.swift (87%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Daemons/ConnectivityDaemon.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Daemons/Daemon.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Daemons/PingTask.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Daemons/ServersDaemon.swift (99%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Daemons/ServersPinger.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Daemons/VPNDaemon.swift (100%) rename {PIALibrary/Sources/UI/Shared => Sources/PIALibrary}/DeviceModel.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/InApp/AppStoreProduct.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/InApp/AppStoreProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/InApp/AppStoreTransaction.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/InApp/InAppProduct.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/InApp/InAppProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/InApp/InAppTransaction.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/LibraryCallback.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/LibraryConstants.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Macros.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/Client+Mock.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/MockAccountProvider.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/MockInAppProvider.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/MockServerProvider.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/MockTileProvider.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/MockVPNProvider.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Mock/MockWebServices.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/NMT/NMTRules.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/NMT/NMTType.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Notification+Core.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Notification+Library.swift (100%) rename {PIALibrary/Sources/UI/iOS => Sources/PIALibrary}/Notification+UI.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/NotificationKey.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Persistence/KeychainStore.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Persistence/MemoryStore.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Persistence/PlainStore.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Persistence/SecureStore.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Persistence/TransientStore.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Persistence/UserDefaultsStore.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIAAccountClientStateProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIAAccountStagingClientStateProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIACSIDeviceInformationProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIACSILastKnownExceptionProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIACSIUserInformationProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIACrashlabClientStateProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIACrashlabProtocolInformationProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIACrashlabRegionInformationProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIAKPIClientStateProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIAKPIStagingClientStateProvider.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Providers/PIARegionClientStateProvider.swift (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/ar.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/da.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/de.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/en.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/es-MX.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/fr.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/it.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/ja.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/ko.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/nb.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/nl.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/pl.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/pt-BR.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/ru.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/th.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/tr.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/zh-Hans.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/Shared/zh-Hant.lproj/UI.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/Signup.storyboard (98%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/centered-dark-map.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/centered-dark-map.imageset/darkDotsCopy2.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/centered-light-map.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/centered-light-map.imageset/group.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/computer-icon.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/computer-icon.imageset/computer-7.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/computer-icon.imageset/computer-7@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/computer-icon.imageset/computer-7@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/globe-icon.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/globe-icon.imageset/globe-turn-7.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/globe-icon.imageset/globe-turn-7@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/globe-icon.imageset/globe-turn-7@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-back.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-back.imageset/backIconCopy-2.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-camera.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-camera.imageset/scanIcon.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-close.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-close.imageset/group104Copy.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-warning.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/icon-warning.imageset/warningIconCopy4.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/pagecontrol-selected-dot.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/pagecontrol-selected-dot.imageset/group4.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/pagecontrol-unselected-dot.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/pagecontrol-unselected-dot.imageset/oval2Copy.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/plan-selected.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/plan-selected.imageset/group3.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/plan-unselected.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/plan-unselected.imageset/oval3.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/scrollableMap-dark.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/scrollableMap-dark.imageset/map-dark-walkthrough.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/scrollableMap-light.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/scrollableMap-light.imageset/map-light-walkthrough.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/shield-icon.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/shield-icon.imageset/shield-7.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/shield-icon.imageset/shield-7@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/PIAX/Global/shield-icon.imageset/shield-7@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/close-icon.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/close-icon.imageset/close_button@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/close-icon.imageset/close_button@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-account-failed.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-account-failed.imageset/signup-error.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-document-consent.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-document-consent.imageset/consent-icon.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-no-internet.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-no-internet.imageset/no-internet-dark.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-purchase-success.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-purchase-success.imageset/image-purchase-success@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-purchase-success.imageset/image-purchase-success@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-receipt-background.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-receipt-background.imageset/image-receipt-background@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-receipt-background.imageset/image-receipt-background@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-claimed.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-claimed.imageset/image-redeem-claimed@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-claimed.imageset/image-redeem-claimed@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-invalid.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-invalid.imageset/gift-card-error.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-success.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-redeem-success.imageset/sign-up-email.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-walkthrough-1.imageset/01IllustrationWalkthroughScreen.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-walkthrough-1.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-walkthrough-2.imageset/02IllustrationWalkthroughGlobe.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-walkthrough-2.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-walkthrough-3.imageset/03IllustrationWalkthroughShield.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/image-walkthrough-3.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/nav-logo.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/nav-logo.imageset/pia-logo-light-horizontal-128.pdf (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/qr-code.imageset/Contents.json (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/qr-code.imageset/ic_qr_code@2x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/UI.xcassets/qr-code.imageset/ic_qr_code@3x.png (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/Welcome.storyboard (98%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ar.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ar.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/da.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/da.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/de.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/de.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/en.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/en.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/es-MX.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/es-MX.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/fr.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/fr.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/it.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/it.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ja.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ja.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ko.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ko.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/nb.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/nb.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/nl.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/nl.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/pl.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/pl.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/pt-BR.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/pt-BR.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ru.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/ru.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/th.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/th.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/tr.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/tr.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/zh-Hans.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/zh-Hans.lproj/Welcome.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/zh-Hant.lproj/Signup.strings (100%) rename {PIALibrary/Resources/UI => Sources/PIALibrary/Resources}/iOS/zh-Hant.lproj/Welcome.strings (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Server/DefaultServerProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Server/ServerProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/ServiceQuality/ServiceQualityManager.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Tiles/AvailableTiles.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/Tiles/DefaultTileProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Tiles/TileProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Tiles/Tileable.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Tiles/TileableCell.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/BrandableNavigationBar.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/CAGradientLayer+Image.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/GiftCardUtil.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/NavigationBar+Appearence.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/PIAColors.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/PIAFonts.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/PIAPageControl.swift (98%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/Restylable.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/Shared/Validator.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/AccessibilityIdentifiers.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ActivityButton.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/BorderedTextField.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/CircleProgressView.swift (100%) create mode 100644 Sources/PIALibrary/UI/iOS/ClientError+Localization.swift rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/InvalidatingFlowLayout.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/Macros+UI.swift (98%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/NavigationLogoView.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/PIAButton.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/PurchasePlan.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/PurchasePlanCell.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/SignupMetadata.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/Styles/StyleGuideHelpers.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/Styles/TextStyles.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/Styles/ViewStyles.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/SwiftGen+Assets.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/SwiftGen+ScenesStoryboards.swift (91%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/SwiftGen+SeguesStoryboards.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/SwiftGen+Strings.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/Theme+LightPalette.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/Theme.swift (99%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/UIControl+Action.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/UIImage+Color.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/UILabel+LineHeight.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/UITextField+PlaceholderColor.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/UIViewLoading.swift (99%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/AutolayoutViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/ConfirmVPNPlanViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/GDPRViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/GetStartedViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/LoginViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/MagicLinkLoginViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/OptionsViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/PIAWelcomeViewController.swift (62%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/PurchaseViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/RestoreSignupViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/ShareDataInformationViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/SignupFailureViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/SignupInProgressViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/SignupInternetUnreachableViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/SignupSuccessViewController.swift (99%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/TermsAndConditionsViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/ViewControllers/WelcomePageViewController.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/UI/iOS/WalkthroughPageView.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/Array+Math.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/DataManipulation.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/DateUtil.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Util/EnumsBuilder.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/Keychain.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/Macros+Pinger.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/Pages.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/Preset.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/TimeInterval+Date.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/UIDevice+WiFi.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/Util/UIViewAutolayout.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/WhitelistUtil.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/iOS/String+Components.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/Util/iOS/String+Random.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/VPN/DefaultVPNProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/VPN/IKEv2EncryptionAlgorithm.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/VPN/IKEv2IntegrityAlgorithm.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/VPN/IKEv2Profile.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/VPN/IPSecProfile.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/VPN/NetworkExtensionProfile.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/VPN/PIATunnelProfile.swift (95%) rename {PIALibrary/Sources => Sources/PIALibrary}/VPN/PIATunnelProvider+Profile.swift (91%) rename {PIALibrary/Sources => Sources/PIALibrary}/VPN/PIAWGTunnelProfile.swift (100%) rename {PIALibrary/Sources => Sources/PIALibrary}/VPN/PIAWGTunnelProvider+Profile.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/VPN/VPNAction.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/VPN/VPNConfiguration.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/VPN/VPNProfile.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/VPN/VPNProvider.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/VPN/VPNStatus.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/AccountInfo+Kotlin.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/AccountInfo.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/AppStoreInformation.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/ConnectivityStatus.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Credentials.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/DedicatedIP.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/Endpoint.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/EndpointManager.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossAccountInfo.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossConnectivityStatus.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossCredentials.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossParser.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossPayment.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossProduct.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossRedeem.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossServer.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossServersBundle.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossSignup.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/GlossToken.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/InAppMessage.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/PIAWebServices+Ephemeral.swift (100%) rename {PIALibrary/Sources/Library => Sources/PIALibrary}/WebServices/PIAWebServices.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Payment.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Plan.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Product.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Redeem.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Server.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/ServersBundle.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Signup.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/Usage.swift (100%) rename {PIALibrary/Sources/Core => Sources/PIALibrary}/WebServices/WebServices.swift (100%) rename {PIALibrary/Sources/Util/iOS => Sources/PIALibraryUtilObjC}/CMacros.m (100%) create mode 100755 Sources/PIALibraryUtilObjC/FXPageControl.m rename {PIALibrary/Sources/Util => Sources/PIALibraryUtilObjC}/NSData+Compression.m (100%) rename {PIALibrary/Sources/Util => Sources/PIALibraryUtilObjC}/NSString+URL.m (100%) rename {PIALibrary/Sources/Util => Sources/PIALibraryUtilObjC}/Pinger.m (100%) rename {PIALibrary/Sources/Util/iOS => Sources/PIALibraryUtilObjC/include}/CMacros.h (100%) create mode 100755 Sources/PIALibraryUtilObjC/include/FXPageControl.h rename {PIALibrary/Sources/Util => Sources/PIALibraryUtilObjC/include}/NSData+Compression.h (100%) rename {PIALibrary/Sources/Util => Sources/PIALibraryUtilObjC/include}/NSString+URL.h (100%) rename {PIALibrary/Sources/Util => Sources/PIALibraryUtilObjC/include}/Pinger.h (100%) create mode 100644 Sources/PIALibraryUtilObjC/include/module.modulemap rename {PIALibraryTests => Tests/PIALibraryTests}/AccountInfoTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/AccountSignupTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/AccountTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/DIPTokenKeychainTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/EndpointManagerTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/GiftCardUtilTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/MockProviders.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/ProductTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests/Resources}/Info-iOS.plist (100%) rename {PIALibraryTests => Tests/PIALibraryTests/Resources}/Info-macOS.plist (100%) rename {PIALibraryTests => Tests/PIALibraryTests/Resources}/server.json (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/ServerTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/VPNTests.swift (100%) rename {PIALibraryTests => Tests/PIALibraryTests}/ValidatorTests.swift (100%) diff --git a/.gitignore b/.gitignore index cfdf91a8..6c043cda 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,12 @@ -.DS_Store +*.DS_Store *.swp *.pbxuser +*.swiftpm +*.build **/*.xcworkspace/xcuserdata **/*.xcodeproj/project.xcworkspace **/*.xcodeproj/xcuserdata docs Pods +.swiftpm +Package.resolved diff --git a/PIALibrary.podspec b/PIALibrary.podspec deleted file mode 100644 index e6213740..00000000 --- a/PIALibrary.podspec +++ /dev/null @@ -1,95 +0,0 @@ -Pod::Spec.new do |s| - s.name = "PIALibrary" - s.version = "2.18.0" - s.summary = "PIA client library in Swift." - - s.homepage = "https://www.privateinternetaccess.com/" - s.license = { :type => "MIT", :file => "LICENSE" } - s.author = { "Jose Blaya" => "joseblaya@londontrustmedia.com", "Davide De Rosa" => "" } - s.source = { :git => "https://github.com/pia-foss/client-library-apple.git", :tag => "v#{s.version}" } - - s.ios.deployment_target = "12.0" - #s.osx.deployment_target = "10.11" - - s.default_subspecs = "Core", "Library" - - s.subspec "Core" do |p| - p.source_files = "PIALibrary/Sources/Core/**/*.swift" - #p.osx.exclude_files = "PIALibrary/Sources/Core/InApp", - # "PIALibrary/Sources/Core/Account/InApp" - p.dependency "PIAAccountModule" - - end - - s.subspec "Library" do |p| - p.source_files = "PIALibrary/Sources/Library/**/*.swift" - #p.osx.exclude_files = "PIALibrary/Sources/Library/InApp" - p.resources = "PIALibrary/Resources/Staging/**/*" - p.ios.frameworks = "UIKit" - #p.osx.frameworks = "Cocoa" - p.dependency "PIALibrary/Core" - p.dependency "PIALibrary/Util" - p.dependency "Gloss", "~> 2" - p.dependency "Alamofire", "~> 4" - p.dependency "ReachabilitySwift" - p.dependency "SwiftyBeaver" - p.dependency "PopupDialog" - p.dependency "PIARegionsModule" - p.dependency "PIAAccountModule" - p.dependency "PIACSIModule" - p.dependency "PIAKPIModule" - - end - - s.subspec "VPN" do |p| - p.source_files = "PIALibrary/Sources/VPN/*.swift" - p.frameworks = "NetworkExtension" - p.pod_target_xcconfig = { "APPLICATION_EXTENSION_API_ONLY" => "YES" } - - p.dependency "TunnelKit" - p.dependency "PIAWireguard" - p.dependency "PIALibrary/Library" - end - - s.subspec "Lottie" do |p| - p.dependency "PIALibrary/Core" - p.dependency "PIALibrary/Util" - end - - s.subspec "UI" do |p| - p.source_files = "PIALibrary/Sources/UI/Shared/*.swift" - p.resources = "PIALibrary/Resources/UI/Shared/**/*" - p.dependency "PIALibrary/Library" - p.dependency "SwiftyBeaver" - p.dependency "SwiftEntryKit", "0.7.2" - p.dependency "lottie-ios" - p.dependency "FXPageControl" - - - p.ios.source_files = "PIALibrary/Sources/UI/iOS/**/*.swift" - p.ios.resources = "PIALibrary/Resources/UI/iOS/**/*" - p.ios.dependency "TPKeyboardAvoiding" - - #p.osx.source_files = "PIALibrary/Sources/UI/macOS/*.swift" - #p.osx.resources = "PIALibrary/Resources/UI/macOS/**/*" - end - - s.subspec "Mock" do |p| - p.source_files = "PIALibrary/Sources/Mock/*.swift" - p.dependency "PIALibrary/Library" - end - - s.subspec "Util" do |p| - p.source_files = "PIALibrary/Sources/Util/*.{h,m,swift}" - p.private_header_files = "PIALibrary/Sources/Util/*.h" - p.ios.source_files = "PIALibrary/Sources/Util/iOS/*.{h,m,swift}" - p.ios.private_header_files = "PIALibrary/Sources/Util/iOS/*.h" - p.ios.preserve_paths = "PIALibrary/Sources/Util/iOS/*.modulemap" - p.ios.pod_target_xcconfig = { "SWIFT_INCLUDE_PATHS" => "${PODS_TARGET_SRCROOT}/PIALibrary/Sources/Util/iOS" } - #p.osx.source_files = "PIALibrary/Sources/Util/macOS/*.{h,m,swift}" - #p.osx.private_header_files = "PIALibrary/Sources/Util/macOS/*.h" - #p.osx.preserve_paths = "PIALibrary/Sources/Util/macOS/*.modulemap" - #p.osx.pod_target_xcconfig = { "SWIFT_INCLUDE_PATHS" => "${PODS_TARGET_SRCROOT}/PIALibrary/Sources/Util/macOS" } - p.dependency "PIALibrary/Core" - end -end diff --git a/PIALibrary.xcodeproj/project.pbxproj b/PIALibrary.xcodeproj/project.pbxproj deleted file mode 100644 index 6d748b14..00000000 --- a/PIALibrary.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2617 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 0E0E5B0D1F8297BD00022CD0 /* PlainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B0C1F8297BD00022CD0 /* PlainStore.swift */; }; - 0E0E5B0F1F8297C500022CD0 /* SecureStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B0E1F8297C500022CD0 /* SecureStore.swift */; }; - 0E0E5B111F8297D200022CD0 /* UserDefaultsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B101F8297D200022CD0 /* UserDefaultsStore.swift */; }; - 0E0E5B131F8297DE00022CD0 /* KeychainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B121F8297DE00022CD0 /* KeychainStore.swift */; }; - 0E0E5B151F829EC500022CD0 /* UpdateAccountRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B141F829EC500022CD0 /* UpdateAccountRequest.swift */; }; - 0E0F95961FD560C40046DC64 /* CircleProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0F95951FD560C40046DC64 /* CircleProgressView.swift */; }; - 0E1108951F77B6B600A92462 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1108931F77B6B600A92462 /* Keychain.swift */; }; - 0E1743131F82E1A4001E7DD6 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1743121F82E1A4001E7DD6 /* Client.swift */; }; - 0E2215CF2008DFD900F5FB4D /* SwiftGen+Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2215CE2008DFD900F5FB4D /* SwiftGen+Assets.swift */; }; - 0E245C9D1FECF0C20010DEF2 /* ClientAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E245C9C1FECF0C20010DEF2 /* ClientAccess.swift */; }; - 0E245C9E1FECF0C20010DEF2 /* ClientAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E245C9C1FECF0C20010DEF2 /* ClientAccess.swift */; }; - 0E2ADCCA1FE06D7A00BB170C /* Array+Math.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCC91FE06D7A00BB170C /* Array+Math.swift */; }; - 0E2ADCCB1FE06D7A00BB170C /* Array+Math.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCC91FE06D7A00BB170C /* Array+Math.swift */; }; - 0E2ADCDB1FE072ED00BB170C /* Pinger.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E2ADCD81FE072ED00BB170C /* Pinger.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0E2ADCDC1FE072ED00BB170C /* Pinger.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E2ADCD81FE072ED00BB170C /* Pinger.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0E2ADCDD1FE072ED00BB170C /* Pinger.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCD91FE072ED00BB170C /* Pinger.m */; }; - 0E2ADCDE1FE072ED00BB170C /* Pinger.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCD91FE072ED00BB170C /* Pinger.m */; }; - 0E2ADCE91FE0843000BB170C /* Macros+Pinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCE81FE0843000BB170C /* Macros+Pinger.swift */; }; - 0E2ADCEA1FE0843000BB170C /* Macros+Pinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCE81FE0843000BB170C /* Macros+Pinger.swift */; }; - 0E2ADCF01FE09C6C00BB170C /* ConnectivityDaemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCEE1FE09C6C00BB170C /* ConnectivityDaemon.swift */; }; - 0E2ADCF11FE09C6C00BB170C /* ServersPinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCEF1FE09C6C00BB170C /* ServersPinger.swift */; }; - 0E2ADCFD1FE1372400BB170C /* ConnectivityDaemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCEE1FE09C6C00BB170C /* ConnectivityDaemon.swift */; }; - 0E2ADCFE1FE1372D00BB170C /* ServersPinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADCEF1FE09C6C00BB170C /* ServersPinger.swift */; }; - 0E2ADD211FE13B8600BB170C /* PIALibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E7BC6D61F96B0AF0035C8B2 /* PIALibrary.framework */; }; - 0E2ADD281FE13C3B00BB170C /* AccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AFF1F818A20002E4CDD /* AccountTests.swift */; }; - 0E2ADD291FE13C3B00BB170C /* ServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4C4411FDDFD830041C3D8 /* ServerTests.swift */; }; - 0E2ADD311FE1468400BB170C /* VPNProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD301FE1468400BB170C /* VPNProvider.swift */; }; - 0E2ADD331FE1472F00BB170C /* VPNStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD321FE1472F00BB170C /* VPNStatus.swift */; }; - 0E2ADD341FE1472F00BB170C /* VPNStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD321FE1472F00BB170C /* VPNStatus.swift */; }; - 0E2ADD351FE1473600BB170C /* VPNProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD301FE1468400BB170C /* VPNProvider.swift */; }; - 0E2ADD371FE14F0000BB170C /* DefaultVPNProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD361FE14F0000BB170C /* DefaultVPNProvider.swift */; }; - 0E2ADD381FE14F0000BB170C /* DefaultVPNProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD361FE14F0000BB170C /* DefaultVPNProvider.swift */; }; - 0E2ADD3A1FE14F8600BB170C /* VPNProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD391FE14F8600BB170C /* VPNProfile.swift */; }; - 0E2ADD3B1FE14F8600BB170C /* VPNProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD391FE14F8600BB170C /* VPNProfile.swift */; }; - 0E2ADD451FE1583A00BB170C /* VPNTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD441FE1583A00BB170C /* VPNTests.swift */; }; - 0E2ADD461FE1583A00BB170C /* VPNTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD441FE1583A00BB170C /* VPNTests.swift */; }; - 0E2ADD481FE1595300BB170C /* IPSecProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD471FE1595300BB170C /* IPSecProfile.swift */; }; - 0E2ADD491FE1595300BB170C /* IPSecProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD471FE1595300BB170C /* IPSecProfile.swift */; }; - 0E2ADD4F1FE15C2200BB170C /* VPNConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD4E1FE15C2200BB170C /* VPNConfiguration.swift */; }; - 0E2ADD501FE15C2200BB170C /* VPNConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD4E1FE15C2200BB170C /* VPNConfiguration.swift */; }; - 0E38E4101FF81722008223AB /* Notification+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E38E40F1FF81722008223AB /* Notification+UI.swift */; }; - 0E392D7A1FE2E47D0002160D /* TransientStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D791FE2E47D0002160D /* TransientStore.swift */; }; - 0E392D7B1FE2E47D0002160D /* TransientStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D791FE2E47D0002160D /* TransientStore.swift */; }; - 0E392D7D1FE2E4C10002160D /* MemoryStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D7C1FE2E4C10002160D /* MemoryStore.swift */; }; - 0E392D7E1FE2E4C10002160D /* MemoryStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D7C1FE2E4C10002160D /* MemoryStore.swift */; }; - 0E392D8C1FE2F8780002160D /* ConnectivityStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D8B1FE2F8780002160D /* ConnectivityStatus.swift */; }; - 0E392D8D1FE2F8780002160D /* ConnectivityStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D8B1FE2F8780002160D /* ConnectivityStatus.swift */; }; - 0E392D8F1FE2FBBE0002160D /* GlossConnectivityStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D8E1FE2FBBE0002160D /* GlossConnectivityStatus.swift */; }; - 0E392D901FE2FBBE0002160D /* GlossConnectivityStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D8E1FE2FBBE0002160D /* GlossConnectivityStatus.swift */; }; - 0E392D9D1FE31D630002160D /* MockVPNProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD3F1FE156EA00BB170C /* MockVPNProvider.swift */; }; - 0E392D9E1FE31D630002160D /* MockVPNProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2ADD3F1FE156EA00BB170C /* MockVPNProvider.swift */; }; - 0E392DA01FE323ED0002160D /* PIAWebServices+Ephemeral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D9F1FE323ED0002160D /* PIAWebServices+Ephemeral.swift */; }; - 0E392DA11FE323ED0002160D /* PIAWebServices+Ephemeral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392D9F1FE323ED0002160D /* PIAWebServices+Ephemeral.swift */; }; - 0E392DA31FE3247E0002160D /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392DA21FE3247E0002160D /* Endpoint.swift */; }; - 0E392DA41FE3247E0002160D /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E392DA21FE3247E0002160D /* Endpoint.swift */; }; - 0E392DB01FE3366B0002160D /* NSData+Compression.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E392DAE1FE3366A0002160D /* NSData+Compression.m */; }; - 0E392DB11FE3366B0002160D /* NSData+Compression.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E392DAF1FE3366B0002160D /* NSData+Compression.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0E392DB21FE33AF00002160D /* NSData+Compression.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E392DAF1FE3366B0002160D /* NSData+Compression.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0E392DB91FE34B5A0002160D /* NSString+URL.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E392DB71FE34B5A0002160D /* NSString+URL.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0E392DBA1FE34B5A0002160D /* NSString+URL.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E392DB71FE34B5A0002160D /* NSString+URL.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0E392DBB1FE34B5A0002160D /* NSString+URL.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E392DB81FE34B5A0002160D /* NSString+URL.m */; }; - 0E392DBC1FE34B5A0002160D /* NSString+URL.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E392DB81FE34B5A0002160D /* NSString+URL.m */; }; - 0E3A35331FD9E97E000B0F99 /* Macros.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0471F9CCE07005857E4 /* Macros.swift */; }; - 0E3D13CD1F9DDD2400434A48 /* NotificationKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13CC1F9DDD2400434A48 /* NotificationKey.swift */; }; - 0E3D13CE1F9DDD2400434A48 /* NotificationKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13CC1F9DDD2400434A48 /* NotificationKey.swift */; }; - 0E3D13D01F9E26FD00434A48 /* GlossCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13CF1F9E26FD00434A48 /* GlossCredentials.swift */; }; - 0E3D13D11F9E26FD00434A48 /* GlossCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13CF1F9E26FD00434A48 /* GlossCredentials.swift */; }; - 0E3D13D31F9E270A00434A48 /* GlossAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13D21F9E270A00434A48 /* GlossAccountInfo.swift */; }; - 0E3D13D41F9E270A00434A48 /* GlossAccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13D21F9E270A00434A48 /* GlossAccountInfo.swift */; }; - 0E3D13D61F9E272B00434A48 /* GlossPayment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13D51F9E272B00434A48 /* GlossPayment.swift */; }; - 0E3D13D71F9E272B00434A48 /* GlossPayment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13D51F9E272B00434A48 /* GlossPayment.swift */; }; - 0E3D13D91F9E273300434A48 /* GlossSignup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13D81F9E273300434A48 /* GlossSignup.swift */; }; - 0E3D13DA1F9E273300434A48 /* GlossSignup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3D13D81F9E273300434A48 /* GlossSignup.swift */; }; - 0E48A8531FDAD60900B9A4C0 /* OptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E48A8521FDAD60900B9A4C0 /* OptionsViewController.swift */; }; - 0E492C5B1FE5EA06007F23DF /* CMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E492C591FE5EA06007F23DF /* CMacros.h */; }; - 0E492C5C1FE5EA06007F23DF /* CMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C5A1FE5EA06007F23DF /* CMacros.m */; }; - 0E492C5E1FE5F7C0007F23DF /* MockAccountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C5D1FE5F7C0007F23DF /* MockAccountProvider.swift */; }; - 0E492C5F1FE5F7C0007F23DF /* MockAccountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C5D1FE5F7C0007F23DF /* MockAccountProvider.swift */; }; - 0E492C641FE5F949007F23DF /* MockServerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C631FE5F949007F23DF /* MockServerProvider.swift */; }; - 0E492C651FE5F949007F23DF /* MockServerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C631FE5F949007F23DF /* MockServerProvider.swift */; }; - 0E492C6A1FE61485007F23DF /* Client+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C691FE61485007F23DF /* Client+Database.swift */; }; - 0E492C6B1FE61485007F23DF /* Client+Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E492C691FE61485007F23DF /* Client+Database.swift */; }; - 0E4D4E9E1FA4CA7A007DA6DA /* PurchasePlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4D4E9A1FA4CA7A007DA6DA /* PurchasePlan.swift */; }; - 0E4D4E9F1FA4CA7A007DA6DA /* Restylable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4D4E9B1FA4CA7A007DA6DA /* Restylable.swift */; }; - 0E4D4EA01FA4CA7A007DA6DA /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4D4E9C1FA4CA7A007DA6DA /* Validator.swift */; }; - 0E53A83E1FE5A4C8000C2A18 /* Client+Daemons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A83D1FE5A4C8000C2A18 /* Client+Daemons.swift */; }; - 0E53A83F1FE5A4C8000C2A18 /* Client+Daemons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A83D1FE5A4C8000C2A18 /* Client+Daemons.swift */; }; - 0E53A8471FE5BA0B000C2A18 /* ServersDaemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8461FE5BA0B000C2A18 /* ServersDaemon.swift */; }; - 0E53A8481FE5BA0B000C2A18 /* ServersDaemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8461FE5BA0B000C2A18 /* ServersDaemon.swift */; }; - 0E53A84A1FE5BA52000C2A18 /* Daemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8491FE5BA52000C2A18 /* Daemon.swift */; }; - 0E53A84B1FE5BA52000C2A18 /* Daemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8491FE5BA52000C2A18 /* Daemon.swift */; }; - 0E53A84D1FE5BB25000C2A18 /* VPNDaemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A84C1FE5BB25000C2A18 /* VPNDaemon.swift */; }; - 0E53A84E1FE5BB25000C2A18 /* VPNDaemon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A84C1FE5BB25000C2A18 /* VPNDaemon.swift */; }; - 0E53A8531FE5D73F000C2A18 /* Client+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8521FE5D73F000C2A18 /* Client+Mock.swift */; }; - 0E53A8541FE5D73F000C2A18 /* Client+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8521FE5D73F000C2A18 /* Client+Mock.swift */; }; - 0E53A8551FE5D770000C2A18 /* MockWebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED2B50A1F82364C00C9DB2B /* MockWebServices.swift */; }; - 0E53A8561FE5D770000C2A18 /* MockWebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED2B50A1F82364C00C9DB2B /* MockWebServices.swift */; }; - 0E53A8571FE5DA16000C2A18 /* MockInAppProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0431F9CCB76005857E4 /* MockInAppProvider.swift */; }; - 0E53A8581FE5DA16000C2A18 /* MockInAppProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0431F9CCB76005857E4 /* MockInAppProvider.swift */; }; - 0E53A85A1FE5E3CD000C2A18 /* MockProviders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8591FE5E3CD000C2A18 /* MockProviders.swift */; }; - 0E53A85B1FE5E3CD000C2A18 /* MockProviders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E53A8591FE5E3CD000C2A18 /* MockProviders.swift */; }; - 0E5BCBFF20172C8300E3E4B4 /* Theme+LightPalette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5BCBFE20172C8300E3E4B4 /* Theme+LightPalette.swift */; }; - 0E6B0A791FA4986D00EBB916 /* UI.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E6B0A771FA4986D00EBB916 /* UI.strings */; }; - 0E7361B41FD9683B00706BFF /* Signup.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E7361B21FD9683B00706BFF /* Signup.strings */; }; - 0E7361CF1FD96AF000706BFF /* Welcome.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E7361D11FD96AF000706BFF /* Welcome.strings */; }; - 0E7361E51FD9731F00706BFF /* Welcome.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E7361E31FD9731E00706BFF /* Welcome.storyboard */; }; - 0E7361E61FD9731F00706BFF /* Signup.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E7361E41FD9731F00706BFF /* Signup.storyboard */; }; - 0E75D8D31F9E3F9F00658D1E /* UserAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E75D8D21F9E3F9F00658D1E /* UserAccount.swift */; }; - 0E75D8D41F9E3F9F00658D1E /* UserAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E75D8D21F9E3F9F00658D1E /* UserAccount.swift */; }; - 0E7BC6DF1F96B0F40035C8B2 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1108931F77B6B600A92462 /* Keychain.swift */; }; - 0E7BC6E61F96B1000035C8B2 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1743121F82E1A4001E7DD6 /* Client.swift */; }; - 0E7BC6E71F96B1000035C8B2 /* ClientError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AEF1F818767002E4CDD /* ClientError.swift */; }; - 0E7BC6E81F96B1000035C8B2 /* Client+Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED2B5121F82444E00C9DB2B /* Client+Preferences.swift */; }; - 0E7BC6E91F96B1040035C8B2 /* DefaultAccountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB51291F82D45F0033B81F /* DefaultAccountProvider.swift */; }; - 0E7BC6EB1F96B1040035C8B2 /* PIAWebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB512D1F82D7C50033B81F /* PIAWebServices.swift */; }; - 0E7BC6EC1F96B1040035C8B2 /* KeychainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B121F8297DE00022CD0 /* KeychainStore.swift */; }; - 0E7BC6ED1F96B1040035C8B2 /* UserDefaultsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B101F8297D200022CD0 /* UserDefaultsStore.swift */; }; - 0E7BC6EE1F96B1120035C8B2 /* AccountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA7065E1F80F448001E4F88 /* AccountProvider.swift */; }; - 0E7BC6EF1F96B1120035C8B2 /* LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AF11F8187F8002E4CDD /* LoginRequest.swift */; }; - 0E7BC6F21F96B1120035C8B2 /* UpdateAccountRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B141F829EC500022CD0 /* UpdateAccountRequest.swift */; }; - 0E7BC6F31F96B1120035C8B2 /* PlainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B0C1F8297BD00022CD0 /* PlainStore.swift */; }; - 0E7BC6F41F96B1120035C8B2 /* SecureStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0E5B0E1F8297C500022CD0 /* SecureStore.swift */; }; - 0E7BC6F51F96B1120035C8B2 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AF51F81880E002E4CDD /* Credentials.swift */; }; - 0E7BC6F61F96B1120035C8B2 /* AccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AF71F818815002E4CDD /* AccountInfo.swift */; }; - 0E7BC6F71F96B1120035C8B2 /* WebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC849C81F82329F002480CA /* WebServices.swift */; }; - 0E7BC6F81F96B1120035C8B2 /* Plan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE1068B1F8250A1009514E9 /* Plan.swift */; }; - 0E7BC6F91F96B1120035C8B2 /* Signup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE1068D1F828813009514E9 /* Signup.swift */; }; - 0E7BC6FA1F96B1120035C8B2 /* Notification+Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB51261F82A5F80033B81F /* Notification+Core.swift */; }; - 0E7BC6FB1F96B1120035C8B2 /* LibraryCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AED1F818720002E4CDD /* LibraryCallback.swift */; }; - 0E9D62711FDE83BD009A90CF /* GlossServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D626F1FDE83BD009A90CF /* GlossServer.swift */; }; - 0E9D62721FDE83BD009A90CF /* GlossServersBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D62701FDE83BD009A90CF /* GlossServersBundle.swift */; }; - 0E9D62D21FDEBBC8009A90CF /* GlossServersBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D62701FDE83BD009A90CF /* GlossServersBundle.swift */; }; - 0E9D62D31FDEBBFD009A90CF /* GlossServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D626F1FDE83BD009A90CF /* GlossServer.swift */; }; - 0E9D62DA1FDEE3FE009A90CF /* ServerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D62D91FDEE3FE009A90CF /* ServerProvider.swift */; }; - 0E9D62DB1FDEE3FE009A90CF /* ServerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D62D91FDEE3FE009A90CF /* ServerProvider.swift */; }; - 0E9D62DD1FDEE45A009A90CF /* DefaultServerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D62DC1FDEE45A009A90CF /* DefaultServerProvider.swift */; }; - 0E9D62DE1FDEE45A009A90CF /* DefaultServerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9D62DC1FDEE45A009A90CF /* DefaultServerProvider.swift */; }; - 0EA4C4311FDDD48F0041C3D8 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4C4301FDDD48F0041C3D8 /* Server.swift */; }; - 0EA4C4321FDDD48F0041C3D8 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4C4301FDDD48F0041C3D8 /* Server.swift */; }; - 0EA4C4391FDDE24B0041C3D8 /* ServersBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4C4381FDDE24B0041C3D8 /* ServersBundle.swift */; }; - 0EA4C43A1FDDE24B0041C3D8 /* ServersBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4C4381FDDE24B0041C3D8 /* ServersBundle.swift */; }; - 0EA4C4421FDDFD840041C3D8 /* ServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4C4411FDDFD830041C3D8 /* ServerTests.swift */; }; - 0EA7065F1F80F448001E4F88 /* AccountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA7065E1F80F448001E4F88 /* AccountProvider.swift */; }; - 0EA8072720A1A0090033EC1A /* Redeem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8072620A1A0090033EC1A /* Redeem.swift */; }; - 0EA8072820A1A0090033EC1A /* Redeem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8072620A1A0090033EC1A /* Redeem.swift */; }; - 0EA8072C20A1C7A30033EC1A /* RedeemRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8072B20A1C7A20033EC1A /* RedeemRequest.swift */; }; - 0EA8072D20A1C7A30033EC1A /* RedeemRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8072B20A1C7A20033EC1A /* RedeemRequest.swift */; }; - 0EA8072F20A1E7C60033EC1A /* GlossRedeem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8072E20A1E7C60033EC1A /* GlossRedeem.swift */; }; - 0EA8073020A1E7C60033EC1A /* GlossRedeem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8072E20A1E7C60033EC1A /* GlossRedeem.swift */; }; - 0EA8073220A2F50A0033EC1A /* SignupMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA8073120A2F50A0033EC1A /* SignupMetadata.swift */; }; - 0EAA388B1F9CC4C4000149CF /* InAppProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA38881F9CC4C4000149CF /* InAppProduct.swift */; }; - 0EAA388C1F9CC4C4000149CF /* InAppProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA38891F9CC4C4000149CF /* InAppProvider.swift */; }; - 0EAA388D1F9CC4C4000149CF /* InAppTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA388A1F9CC4C4000149CF /* InAppTransaction.swift */; }; - 0EAA38931F9CC682000149CF /* SignupRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA38921F9CC682000149CF /* SignupRequest.swift */; }; - 0EAA38971F9CC7E4000149CF /* AppStoreProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA38941F9CC7E4000149CF /* AppStoreProvider.swift */; }; - 0EAA38981F9CC7E4000149CF /* AppStoreProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA38951F9CC7E4000149CF /* AppStoreProduct.swift */; }; - 0EAA38991F9CC7E4000149CF /* AppStoreTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EAA38961F9CC7E4000149CF /* AppStoreTransaction.swift */; }; - 0EB3D9821FF02FE5005B11F4 /* VPNAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB3D9811FF02FE5005B11F4 /* VPNAction.swift */; }; - 0EB3D9831FF02FE5005B11F4 /* VPNAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB3D9811FF02FE5005B11F4 /* VPNAction.swift */; }; - 0EB3D9881FF06F37005B11F4 /* NetworkExtensionProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB3D9871FF06F37005B11F4 /* NetworkExtensionProfile.swift */; }; - 0EB3D9891FF06F37005B11F4 /* NetworkExtensionProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB3D9871FF06F37005B11F4 /* NetworkExtensionProfile.swift */; }; - 0EB8C0461F9CCB7C005857E4 /* AccountSignupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0451F9CCB7C005857E4 /* AccountSignupTests.swift */; }; - 0EB8C0481F9CCE07005857E4 /* Macros.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0471F9CCE07005857E4 /* Macros.swift */; }; - 0EB8C0641F9CD38B005857E4 /* ActivityButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C04F1F9CD38A005857E4 /* ActivityButton.swift */; }; - 0EB8C0651F9CD38B005857E4 /* BorderedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0501F9CD38A005857E4 /* BorderedTextField.swift */; }; - 0EB8C0661F9CD38B005857E4 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0511F9CD38A005857E4 /* LoginViewController.swift */; }; - 0EB8C0671F9CD38B005857E4 /* AutolayoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0521F9CD38A005857E4 /* AutolayoutViewController.swift */; }; - 0EB8C0681F9CD38B005857E4 /* PIAWelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0531F9CD38A005857E4 /* PIAWelcomeViewController.swift */; }; - 0EB8C0691F9CD38B005857E4 /* PurchasePlanCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0541F9CD38A005857E4 /* PurchasePlanCell.swift */; }; - 0EB8C06A1F9CD38B005857E4 /* PurchaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0551F9CD38A005857E4 /* PurchaseViewController.swift */; }; - 0EB8C06B1F9CD38B005857E4 /* RestoreSignupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0561F9CD38A005857E4 /* RestoreSignupViewController.swift */; }; - 0EB8C06C1F9CD38B005857E4 /* SignupFailureViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0571F9CD38A005857E4 /* SignupFailureViewController.swift */; }; - 0EB8C06D1F9CD38B005857E4 /* SignupInProgressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0581F9CD38A005857E4 /* SignupInProgressViewController.swift */; }; - 0EB8C06E1F9CD38B005857E4 /* SignupInternetUnreachableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C0591F9CD38A005857E4 /* SignupInternetUnreachableViewController.swift */; }; - 0EB8C06F1F9CD38B005857E4 /* SignupSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C05A1F9CD38A005857E4 /* SignupSuccessViewController.swift */; }; - 0EB8C0701F9CD38B005857E4 /* WelcomePageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C05B1F9CD38A005857E4 /* WelcomePageViewController.swift */; }; - 0EB8C0711F9CD38B005857E4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C05C1F9CD38A005857E4 /* Theme.swift */; }; - 0EB8C0721F9CD38B005857E4 /* Macros+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8C05D1F9CD38A005857E4 /* Macros+UI.swift */; }; - 0EB8C0831F9CE11A005857E4 /* UI.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0EB8C0811F9CE11A005857E4 /* UI.xcassets */; }; - 0EB9667E1FDF36490086ABC2 /* GlossParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB9667D1FDF36490086ABC2 /* GlossParser.swift */; }; - 0EB9667F1FDF36490086ABC2 /* GlossParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EB9667D1FDF36490086ABC2 /* GlossParser.swift */; }; - 0EBBC6DC1F9F64E700B8BD21 /* Client+Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EBBC6DB1F9F64E700B8BD21 /* Client+Environment.swift */; }; - 0EBBC6DD1F9F64E700B8BD21 /* Client+Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EBBC6DB1F9F64E700B8BD21 /* Client+Environment.swift */; }; - 0EC7A2A41F9D3D78006DDB91 /* RenewRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC7A2A31F9D3D78006DDB91 /* RenewRequest.swift */; }; - 0EC849C91F82329F002480CA /* WebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC849C81F82329F002480CA /* WebServices.swift */; }; - 0ED1585A1FDC083F008F6522 /* SwiftGen+Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED158591FDC083F008F6522 /* SwiftGen+Strings.swift */; }; - 0ED2B5131F82444E00C9DB2B /* Client+Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED2B5121F82444E00C9DB2B /* Client+Preferences.swift */; }; - 0EE1068C1F8250A1009514E9 /* Plan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE1068B1F8250A1009514E9 /* Plan.swift */; }; - 0EE1068E1F828813009514E9 /* Signup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE1068D1F828813009514E9 /* Signup.swift */; }; - 0EE14D1B1FF16B39008D9AC2 /* InvalidatingFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE14D1A1FF16B39008D9AC2 /* InvalidatingFlowLayout.swift */; }; - 0EE261E01FEFD69F00E11955 /* Notification+Library.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE261DF1FEFD69F00E11955 /* Notification+Library.swift */; }; - 0EE261E11FEFD69F00E11955 /* Notification+Library.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE261DF1FEFD69F00E11955 /* Notification+Library.swift */; }; - 0EE771031F9D0DCA0029A77B /* Client+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE771021F9D0DCA0029A77B /* Client+Configuration.swift */; }; - 0EE771041F9D0DCA0029A77B /* Client+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE771021F9D0DCA0029A77B /* Client+Configuration.swift */; }; - 0EE771091F9D21020029A77B /* Payment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE771081F9D21020029A77B /* Payment.swift */; }; - 0EE7710A1F9D21020029A77B /* Payment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE771081F9D21020029A77B /* Payment.swift */; }; - 0EE78AEE1F818720002E4CDD /* LibraryCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AED1F818720002E4CDD /* LibraryCallback.swift */; }; - 0EE78AF01F818767002E4CDD /* ClientError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AEF1F818767002E4CDD /* ClientError.swift */; }; - 0EE78AF21F8187F8002E4CDD /* LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AF11F8187F8002E4CDD /* LoginRequest.swift */; }; - 0EE78AF61F81880E002E4CDD /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AF51F81880E002E4CDD /* Credentials.swift */; }; - 0EE78AF81F818815002E4CDD /* AccountInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AF71F818815002E4CDD /* AccountInfo.swift */; }; - 0EE78B001F818A20002E4CDD /* AccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78AFF1F818A20002E4CDD /* AccountTests.swift */; }; - 0EE78B021F818A20002E4CDD /* PIALibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0EBFFFD51F693F800009D4F4 /* PIALibrary.framework */; }; - 0EE78B0F1F818A32002E4CDD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78B0E1F818A32002E4CDD /* AppDelegate.swift */; }; - 0EE78B111F818A32002E4CDD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE78B101F818A32002E4CDD /* ViewController.swift */; }; - 0EE78B141F818A32002E4CDD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE78B121F818A32002E4CDD /* Main.storyboard */; }; - 0EE78B161F818A32002E4CDD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0EE78B151F818A32002E4CDD /* Assets.xcassets */; }; - 0EE78B191F818A32002E4CDD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EE78B171F818A32002E4CDD /* LaunchScreen.storyboard */; }; - 0EF14E4B1FEAE6350007485A /* Client+Providers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF14E4A1FEAE6350007485A /* Client+Providers.swift */; }; - 0EF14E4C1FEAE6350007485A /* Client+Providers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF14E4A1FEAE6350007485A /* Client+Providers.swift */; }; - 0EFB51271F82A5F80033B81F /* Notification+Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB51261F82A5F80033B81F /* Notification+Core.swift */; }; - 0EFB512A1F82D45F0033B81F /* DefaultAccountProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB51291F82D45F0033B81F /* DefaultAccountProvider.swift */; }; - 0EFB512E1F82D7C50033B81F /* PIAWebServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFB512D1F82D7C50033B81F /* PIAWebServices.swift */; }; - 0EFDC1CE1FE36D45007C0B9B /* Restylable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4D4E9B1FA4CA7A007DA6DA /* Restylable.swift */; }; - 0EFDC1CF1FE36D45007C0B9B /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4D4E9C1FA4CA7A007DA6DA /* Validator.swift */; }; - 0EFEB4C12007784A00F81029 /* PIATunnelProvider+Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEB4BF2007784A00F81029 /* PIATunnelProvider+Profile.swift */; }; - 0EFEB4C22007784A00F81029 /* PIATunnelProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEB4C02007784A00F81029 /* PIATunnelProfile.swift */; }; - 0EFEB4C3200778BC00F81029 /* NSData+Compression.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E392DAE1FE3366A0002160D /* NSData+Compression.m */; }; - 0EFEB4C420077AC900F81029 /* PIATunnelProvider+Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEB4BF2007784A00F81029 /* PIATunnelProvider+Profile.swift */; }; - 0EFEB4C520077AC900F81029 /* PIATunnelProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEB4C02007784A00F81029 /* PIATunnelProfile.swift */; }; - 33A542AFDFD3AF0C27B27F45 /* Pods_PIALibrary_PIALibraryTests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C71CB55833441BB6B5D0B9FD /* Pods_PIALibrary_PIALibraryTests_iOS.framework */; }; - 354B015F27732095000A73B4 /* NavigationBar+Appearence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */; }; - 3D93D3414A3DA19ECB04B778 /* Pods_PIALibrary_PIALibraryHost_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */; }; - 7E9D038028479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */; }; - 7E9D038128479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */; }; - 7E9D038228479DCC00BE85DC /* PIACSIUserInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */; }; - 7E9D038428479DE100BE85DC /* TimeInterval+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */; }; - 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */; }; - 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */; }; - 7E9D038C2847A8FC00BE85DC /* WhitelistUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */; }; - 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; - 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821674F6267A47670028E4FD /* LibraryConstants.swift */; }; - 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; - 82183D8025011D200033023F /* MagicLinkLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */; }; - 8221921C24CEBA3800C24F1C /* NMTRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8221921B24CEBA3800C24F1C /* NMTRules.swift */; }; - 8221921D24CEBA3800C24F1C /* NMTRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8221921B24CEBA3800C24F1C /* NMTRules.swift */; }; - 8221921F24CEBABA00C24F1C /* NMTType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8221921E24CEBABA00C24F1C /* NMTType.swift */; }; - 8221922024CEBABA00C24F1C /* NMTType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8221921E24CEBABA00C24F1C /* NMTType.swift */; }; - 822BC1D024BF20C90041BF9A /* UIControl+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 822BC1CF24BF20C90041BF9A /* UIControl+Action.swift */; }; - 824D981E266A1AC500FCD7DA /* staging.json in Resources */ = {isa = PBXBuildFile; fileRef = 824D981D266A1AC500FCD7DA /* staging.json */; }; - 824D981F266A1AC500FCD7DA /* staging.json in Resources */ = {isa = PBXBuildFile; fileRef = 824D981D266A1AC500FCD7DA /* staging.json */; }; - 8276E175260B5ED400BB7B40 /* ServiceQualityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8276E174260B5ED400BB7B40 /* ServiceQualityManager.swift */; }; - 8276E1E6260B961C00BB7B40 /* PIAKPIClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8276E1E5260B961B00BB7B40 /* PIAKPIClientStateProvider.swift */; }; - 8276E1ED260B962900BB7B40 /* PIAKPIStagingClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8276E1EC260B962900BB7B40 /* PIAKPIStagingClientStateProvider.swift */; }; - 8289AD882685C1FC00DA6A17 /* ShareDataInformationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8289AD862685C1FC00DA6A17 /* ShareDataInformationViewController.swift */; }; - 8289AD892685C1FC00DA6A17 /* ShareDataInformationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8289AD862685C1FC00DA6A17 /* ShareDataInformationViewController.swift */; }; - 8289AD8A2685C1FC00DA6A17 /* GDPRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8289AD872685C1FC00DA6A17 /* GDPRViewController.swift */; }; - 8289AD8B2685C1FC00DA6A17 /* GDPRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8289AD872685C1FC00DA6A17 /* GDPRViewController.swift */; }; - 829EB63F2535C432003E74DD /* DedicatedIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829EB63E2535C432003E74DD /* DedicatedIP.swift */; }; - 829EB6402535C432003E74DD /* DedicatedIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829EB63E2535C432003E74DD /* DedicatedIP.swift */; }; - 82C374F82514DE7D00E391EE /* EndpointManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C374F42514DC6D00E391EE /* EndpointManagerTests.swift */; }; - 82C374F92514DE8200E391EE /* server.json in Resources */ = {isa = PBXBuildFile; fileRef = 82C374F62514DC7200E391EE /* server.json */; }; - 82C374FB2514DEC700E391EE /* EndpointManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C374FA2514DEC700E391EE /* EndpointManager.swift */; }; - 82C4962925642D5800233CB1 /* String+Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C4962825642D5800233CB1 /* String+Random.swift */; }; - 82C4962A25642D5800233CB1 /* String+Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C4962825642D5800233CB1 /* String+Random.swift */; }; - 82CAB808255A9ACB00BB08EF /* InAppMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CAB807255A9ACB00BB08EF /* InAppMessage.swift */; }; - 82CAB809255A9ACB00BB08EF /* InAppMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CAB807255A9ACB00BB08EF /* InAppMessage.swift */; }; - 82CDC2E2257A5B440001669D /* DateUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CDC2E1257A5B440001669D /* DateUtil.swift */; }; - 82CDC2E3257A5B440001669D /* DateUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CDC2E1257A5B440001669D /* DateUtil.swift */; }; - 82DDD5302539CFDC0049E79E /* DIPTokenKeychainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82DDD52F2539CFDC0049E79E /* DIPTokenKeychainTests.swift */; }; - 82E20B1124F652ED0065EFE3 /* AccountInfo+Kotlin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E20B1024F652ED0065EFE3 /* AccountInfo+Kotlin.swift */; }; - 82E20B1224F652ED0065EFE3 /* AccountInfo+Kotlin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E20B1024F652ED0065EFE3 /* AccountInfo+Kotlin.swift */; }; - 82FD5D562521F2DD00E390CB /* PIARegionClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FD5D552521F2DD00E390CB /* PIARegionClientStateProvider.swift */; }; - 82FD5D572521F2DD00E390CB /* PIARegionClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FD5D552521F2DD00E390CB /* PIARegionClientStateProvider.swift */; }; - 82FD5D5E2521F30300E390CB /* PIAAccountClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FD5D5D2521F30300E390CB /* PIAAccountClientStateProvider.swift */; }; - 82FD5D5F2521F30300E390CB /* PIAAccountClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FD5D5D2521F30300E390CB /* PIAAccountClientStateProvider.swift */; }; - 82FD5D662521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FD5D652521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift */; }; - 82FD5D672521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82FD5D652521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift */; }; - 84125E08213D7DFF001BCC19 /* PIAColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84125E07213D7DFF001BCC19 /* PIAColors.swift */; }; - 84125E09213D7E04001BCC19 /* PIAColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84125E07213D7DFF001BCC19 /* PIAColors.swift */; }; - 84125E0B213D7E0E001BCC19 /* PIAFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84125E0A213D7E0E001BCC19 /* PIAFonts.swift */; }; - 84125E0C213D7E0E001BCC19 /* PIAFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84125E0A213D7E0E001BCC19 /* PIAFonts.swift */; }; - 841BE60D212AD0F3002EF2D1 /* ValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841BE60C212AD0F3002EF2D1 /* ValidatorTests.swift */; }; - 841BE60F212AFE49002EF2D1 /* GiftCardUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841BE60E212AFE49002EF2D1 /* GiftCardUtil.swift */; }; - 841BE610212AFE69002EF2D1 /* GiftCardUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841BE60E212AFE49002EF2D1 /* GiftCardUtil.swift */; }; - 841BE612212AFFA7002EF2D1 /* GiftCardUtilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841BE611212AFFA7002EF2D1 /* GiftCardUtilTests.swift */; }; - 843C67C22122E714005A3FDA /* AccountInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843C67C12122E714005A3FDA /* AccountInfoTests.swift */; }; - 843C67C32122EA13005A3FDA /* AccountInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 843C67C12122E714005A3FDA /* AccountInfoTests.swift */; }; - 84577FBB213D8ED1006DEC3D /* StyleGuideHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84577FBA213D8ED1006DEC3D /* StyleGuideHelpers.swift */; }; - 84577FBD213D8EDD006DEC3D /* TextStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84577FBC213D8EDD006DEC3D /* TextStyles.swift */; }; - 84577FBF213D8EE6006DEC3D /* ViewStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84577FBE213D8EE6006DEC3D /* ViewStyles.swift */; }; - 84577FC1213D9A23006DEC3D /* UIImage+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84577FC0213D9A23006DEC3D /* UIImage+Color.swift */; }; - 84577FC3213D9AEA006DEC3D /* UITextField+PlaceholderColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84577FC2213D9AEA006DEC3D /* UITextField+PlaceholderColor.swift */; }; - 84577FC5213D9B4D006DEC3D /* UILabel+LineHeight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84577FC4213D9B4D006DEC3D /* UILabel+LineHeight.swift */; }; - AA319C4D25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA319C4A25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift */; }; - AA319C4E25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA319C4A25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift */; }; - AA319C4F25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA319C4B25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift */; }; - AA319C5025833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA319C4B25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift */; }; - AA319C5125833088004BECF6 /* PIACrashlabClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA319C4C25833088004BECF6 /* PIACrashlabClientStateProvider.swift */; }; - AA319C5225833088004BECF6 /* PIACrashlabClientStateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA319C4C25833088004BECF6 /* PIACrashlabClientStateProvider.swift */; }; - BB70402C95EE5B6078D88D96 /* Pods_PIALibrary_PIALibrary_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBC846CEFD1620AE3960B8AD /* Pods_PIALibrary_PIALibrary_iOS.framework */; }; - DD0AC790218715B8009B576B /* PIAButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD0AC78F218715B8009B576B /* PIAButton.swift */; }; - DD1AB10123FAD79000396E74 /* PIAPageControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1AB10023FAD79000396E74 /* PIAPageControl.swift */; }; - DD1AB10323FAD83900396E74 /* WalkthroughPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1AB10223FAD83900396E74 /* WalkthroughPageView.swift */; }; - DD1AB10523FC280000396E74 /* DeviceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1AB10423FC280000396E74 /* DeviceModel.swift */; }; - DD2683E924617F0300C65DAA /* PingTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2683E824617F0300C65DAA /* PingTask.swift */; }; - DD2683EA24617F0300C65DAA /* PingTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2683E824617F0300C65DAA /* PingTask.swift */; }; - DD2F4AD1248A6D4D00A2F6D8 /* LoginReceiptRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2F4AD0248A6D4D00A2F6D8 /* LoginReceiptRequest.swift */; }; - DD31498F21834B3F008E26E8 /* GetStartedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD31498E21834B3F008E26E8 /* GetStartedViewController.swift */; }; - DD314990218350D1008E26E8 /* SwiftGen+ScenesStoryboards.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC812472176166500CB290C /* SwiftGen+ScenesStoryboards.swift */; }; - DD314991218350D1008E26E8 /* SwiftGen+SeguesStoryboards.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC81249217617F900CB290C /* SwiftGen+SeguesStoryboards.swift */; }; - DD36CB7E21CCFFFB00FC815A /* CAGradientLayer+Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD36CB7D21CCFFFB00FC815A /* CAGradientLayer+Image.swift */; }; - DD36CB7F21CD000200FC815A /* CAGradientLayer+Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD36CB7D21CCFFFB00FC815A /* CAGradientLayer+Image.swift */; }; - DD56E3F4225F5D22002EDFB2 /* GlossProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD56E3F3225F5D22002EDFB2 /* GlossProduct.swift */; }; - DD56E3F6225F5D77002EDFB2 /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD56E3F5225F5D77002EDFB2 /* Product.swift */; }; - DD58F4BB21AEB99C00D043F7 /* GlossToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD58F4BA21AEB99C00D043F7 /* GlossToken.swift */; }; - DD58F4BD21AEF76100D043F7 /* String+Components.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD58F4BC21AEF76100D043F7 /* String+Components.swift */; }; - DD6768E322FAB19D00B9FDD0 /* AppStoreInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6768E222FAB19D00B9FDD0 /* AppStoreInformation.swift */; }; - DD6DC5B921B6A83400F9D538 /* UIViewLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6DC5B821B6A83400F9D538 /* UIViewLoading.swift */; }; - DD6DC5BC21B6A8FC00F9D538 /* pia-spinner.json in Resources */ = {isa = PBXBuildFile; fileRef = DD6DC5BB21B6A8FC00F9D538 /* pia-spinner.json */; }; - DD6FB0372224355600A84F05 /* UIDevice+WiFi.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6FB0362224355600A84F05 /* UIDevice+WiFi.swift */; }; - DD7411A923EC35B40058CEF3 /* PIAWGTunnelProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7411A823EC35B40058CEF3 /* PIAWGTunnelProfile.swift */; }; - DD76292821ECDFF80092DF50 /* Usage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD76292721ECDFF80092DF50 /* Usage.swift */; }; - DD76292921ECDFF80092DF50 /* Usage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD76292721ECDFF80092DF50 /* Usage.swift */; }; - DD76292E21ECEC3F0092DF50 /* DataManipulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD76292D21ECEC3F0092DF50 /* DataManipulation.swift */; }; - DD76292F21ECEC3F0092DF50 /* DataManipulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD76292D21ECEC3F0092DF50 /* DataManipulation.swift */; }; - DD86BAF121EF5B6D004A988F /* UIViewAutolayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86BAF021EF5B6D004A988F /* UIViewAutolayout.swift */; }; - DD8BF3CB219C6BAA0041357C /* ConfirmVPNPlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8BF3CA219C6BAA0041357C /* ConfirmVPNPlanViewController.swift */; }; - DD8C3E612327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8C3E602327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift */; }; - DD8C3E622327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8C3E602327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift */; }; - DD8C3E642327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8C3E632327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift */; }; - DD8C3E652327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8C3E632327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift */; }; - DDA184D122FC1F79003239CC /* TermsAndConditionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA184D022FC1F79003239CC /* TermsAndConditionsViewController.swift */; }; - DDA4A7BE21F5C31400A02ACD /* IKEv2Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA4A7BD21F5C31400A02ACD /* IKEv2Profile.swift */; }; - DDA4A7BF21F5C31B00A02ACD /* IKEv2Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA4A7BD21F5C31400A02ACD /* IKEv2Profile.swift */; }; - DDD824E32189969400151709 /* Preset.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD824E22189969400151709 /* Preset.swift */; }; - DDD824E5218996CD00151709 /* Pages.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD824E4218996CD00151709 /* Pages.swift */; }; - DDD824E72189C0E800151709 /* BrandableNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD824E62189C0E800151709 /* BrandableNavigationBar.swift */; }; - DDD824E82189C0EE00151709 /* BrandableNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD824E62189C0E800151709 /* BrandableNavigationBar.swift */; }; - DDD824EA2189CD5700151709 /* NavigationLogoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD824E92189CD5700151709 /* NavigationLogoView.swift */; }; - DDF7F73F2405846800A671C7 /* PIAWGTunnelProvider+Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDF7F73E2405846800A671C7 /* PIAWGTunnelProvider+Profile.swift */; }; - DDFCFAA821E924A70081F235 /* TileProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAA721E924A70081F235 /* TileProvider.swift */; }; - DDFCFAA921E924AD0081F235 /* TileProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAA721E924A70081F235 /* TileProvider.swift */; }; - DDFCFAAB21E925160081F235 /* DefaultTileProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAA21E925160081F235 /* DefaultTileProvider.swift */; }; - DDFCFAAF21E925B60081F235 /* TileableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAC21E925B60081F235 /* TileableCell.swift */; }; - DDFCFAB021E925B60081F235 /* Tileable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAD21E925B60081F235 /* Tileable.swift */; }; - DDFCFAB121E925B60081F235 /* AvailableTiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAE21E925B60081F235 /* AvailableTiles.swift */; }; - DDFCFAB221E925BB0081F235 /* AvailableTiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAE21E925B60081F235 /* AvailableTiles.swift */; }; - DDFCFAB321E925BB0081F235 /* Tileable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAD21E925B60081F235 /* Tileable.swift */; }; - DDFCFAB421E925BB0081F235 /* TileableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAAC21E925B60081F235 /* TileableCell.swift */; }; - DDFCFAB621E925F70081F235 /* EnumsBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAB521E925F70081F235 /* EnumsBuilder.swift */; }; - DDFCFAB721E925F70081F235 /* EnumsBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAB521E925F70081F235 /* EnumsBuilder.swift */; }; - DDFCFABA21E929660081F235 /* MockTileProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAB921E929660081F235 /* MockTileProvider.swift */; }; - DDFCFABB21E929660081F235 /* MockTileProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDFCFAB921E929660081F235 /* MockTileProvider.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 0E2ADD221FE13B8600BB170C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0EBFFFCC1F693F800009D4F4 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E7BC6D51F96B0AF0035C8B2; - remoteInfo = "PIALibrary-macOS"; - }; - 0EE78B031F818A20002E4CDD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0EBFFFCC1F693F800009D4F4 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0EBFFFD41F693F800009D4F4; - remoteInfo = PIAClient; - }; - 0EE78B1E1F818A36002E4CDD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0EBFFFCC1F693F800009D4F4 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0EE78B0B1F818A32002E4CDD; - remoteInfo = PIAClientHost; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 074169C08AFB53B68EB65334 /* Pods-PIALibrary-PIALibraryHost-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryHost-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryHost-iOS/Pods-PIALibrary-PIALibraryHost-iOS.release.xcconfig"; sourceTree = ""; }; - 0E0E5B0C1F8297BD00022CD0 /* PlainStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlainStore.swift; sourceTree = ""; }; - 0E0E5B0E1F8297C500022CD0 /* SecureStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureStore.swift; sourceTree = ""; }; - 0E0E5B101F8297D200022CD0 /* UserDefaultsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsStore.swift; sourceTree = ""; }; - 0E0E5B121F8297DE00022CD0 /* KeychainStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainStore.swift; sourceTree = ""; }; - 0E0E5B141F829EC500022CD0 /* UpdateAccountRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateAccountRequest.swift; sourceTree = ""; }; - 0E0F95951FD560C40046DC64 /* CircleProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircleProgressView.swift; sourceTree = ""; }; - 0E1108931F77B6B600A92462 /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = ""; }; - 0E1743121F82E1A4001E7DD6 /* Client.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Client.swift; sourceTree = ""; }; - 0E2215CE2008DFD900F5FB4D /* SwiftGen+Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Assets.swift"; sourceTree = ""; }; - 0E245C9C1FECF0C20010DEF2 /* ClientAccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ClientAccess.swift; path = PIALibrary/Sources/Library/ClientAccess.swift; sourceTree = SOURCE_ROOT; }; - 0E2ADCC91FE06D7A00BB170C /* Array+Math.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Math.swift"; sourceTree = ""; }; - 0E2ADCD81FE072ED00BB170C /* Pinger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pinger.h; sourceTree = ""; }; - 0E2ADCD91FE072ED00BB170C /* Pinger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Pinger.m; sourceTree = ""; }; - 0E2ADCE81FE0843000BB170C /* Macros+Pinger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Macros+Pinger.swift"; sourceTree = ""; }; - 0E2ADCEE1FE09C6C00BB170C /* ConnectivityDaemon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectivityDaemon.swift; sourceTree = ""; }; - 0E2ADCEF1FE09C6C00BB170C /* ServersPinger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServersPinger.swift; sourceTree = ""; }; - 0E2ADCF91FE1363900BB170C /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 0E2ADD1C1FE13B8600BB170C /* PIALibraryTests-macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PIALibraryTests-macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 0E2ADD201FE13B8600BB170C /* Info-macOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = ""; }; - 0E2ADD301FE1468400BB170C /* VPNProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNProvider.swift; sourceTree = ""; }; - 0E2ADD321FE1472F00BB170C /* VPNStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNStatus.swift; sourceTree = ""; }; - 0E2ADD361FE14F0000BB170C /* DefaultVPNProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultVPNProvider.swift; sourceTree = ""; }; - 0E2ADD391FE14F8600BB170C /* VPNProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNProfile.swift; sourceTree = ""; }; - 0E2ADD3F1FE156EA00BB170C /* MockVPNProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockVPNProvider.swift; sourceTree = ""; }; - 0E2ADD441FE1583A00BB170C /* VPNTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNTests.swift; sourceTree = ""; }; - 0E2ADD471FE1595300BB170C /* IPSecProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPSecProfile.swift; sourceTree = ""; }; - 0E2ADD4E1FE15C2200BB170C /* VPNConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNConfiguration.swift; sourceTree = ""; }; - 0E38E40F1FF81722008223AB /* Notification+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+UI.swift"; sourceTree = ""; }; - 0E392D791FE2E47D0002160D /* TransientStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientStore.swift; sourceTree = ""; }; - 0E392D7C1FE2E4C10002160D /* MemoryStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryStore.swift; sourceTree = ""; }; - 0E392D8B1FE2F8780002160D /* ConnectivityStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectivityStatus.swift; sourceTree = ""; }; - 0E392D8E1FE2FBBE0002160D /* GlossConnectivityStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossConnectivityStatus.swift; sourceTree = ""; }; - 0E392D9F1FE323ED0002160D /* PIAWebServices+Ephemeral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PIAWebServices+Ephemeral.swift"; sourceTree = ""; }; - 0E392DA21FE3247E0002160D /* Endpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Endpoint.swift; sourceTree = ""; }; - 0E392DAE1FE3366A0002160D /* NSData+Compression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Compression.m"; sourceTree = ""; }; - 0E392DAF1FE3366B0002160D /* NSData+Compression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+Compression.h"; sourceTree = ""; }; - 0E392DB71FE34B5A0002160D /* NSString+URL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSString+URL.h"; sourceTree = ""; }; - 0E392DB81FE34B5A0002160D /* NSString+URL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+URL.m"; sourceTree = ""; }; - 0E3D13CC1F9DDD2400434A48 /* NotificationKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationKey.swift; sourceTree = ""; }; - 0E3D13CF1F9E26FD00434A48 /* GlossCredentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossCredentials.swift; sourceTree = ""; }; - 0E3D13D21F9E270A00434A48 /* GlossAccountInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossAccountInfo.swift; sourceTree = ""; }; - 0E3D13D51F9E272B00434A48 /* GlossPayment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossPayment.swift; sourceTree = ""; }; - 0E3D13D81F9E273300434A48 /* GlossSignup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossSignup.swift; sourceTree = ""; }; - 0E48A8521FDAD60900B9A4C0 /* OptionsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionsViewController.swift; sourceTree = ""; }; - 0E492C591FE5EA06007F23DF /* CMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CMacros.h; sourceTree = ""; }; - 0E492C5A1FE5EA06007F23DF /* CMacros.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CMacros.m; sourceTree = ""; }; - 0E492C5D1FE5F7C0007F23DF /* MockAccountProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAccountProvider.swift; sourceTree = ""; }; - 0E492C631FE5F949007F23DF /* MockServerProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockServerProvider.swift; sourceTree = ""; }; - 0E492C691FE61485007F23DF /* Client+Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Database.swift"; sourceTree = ""; }; - 0E4D4E9A1FA4CA7A007DA6DA /* PurchasePlan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchasePlan.swift; sourceTree = ""; }; - 0E4D4E9B1FA4CA7A007DA6DA /* Restylable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Restylable.swift; sourceTree = ""; }; - 0E4D4E9C1FA4CA7A007DA6DA /* Validator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; - 0E4D4EC81FA5C409007DA6DA /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/UI.strings; sourceTree = ""; }; - 0E53A83D1FE5A4C8000C2A18 /* Client+Daemons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Daemons.swift"; sourceTree = ""; }; - 0E53A8461FE5BA0B000C2A18 /* ServersDaemon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServersDaemon.swift; sourceTree = ""; }; - 0E53A8491FE5BA52000C2A18 /* Daemon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Daemon.swift; sourceTree = ""; }; - 0E53A84C1FE5BB25000C2A18 /* VPNDaemon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNDaemon.swift; sourceTree = ""; }; - 0E53A8521FE5D73F000C2A18 /* Client+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Mock.swift"; sourceTree = ""; }; - 0E53A8591FE5E3CD000C2A18 /* MockProviders.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockProviders.swift; sourceTree = ""; }; - 0E5BCBFE20172C8300E3E4B4 /* Theme+LightPalette.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Theme+LightPalette.swift"; sourceTree = ""; }; - 0E6B0A781FA4986D00EBB916 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/UI.strings; sourceTree = ""; }; - 0E7361A21FD938B200706BFF /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/UI.strings; sourceTree = ""; }; - 0E7361A31FD938B400706BFF /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/UI.strings; sourceTree = ""; }; - 0E7361A41FD938B500706BFF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/UI.strings"; sourceTree = ""; }; - 0E7361A51FD938B600706BFF /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/UI.strings"; sourceTree = ""; }; - 0E7361A61FD938B800706BFF /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/UI.strings; sourceTree = ""; }; - 0E7361A71FD938B900706BFF /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/UI.strings"; sourceTree = ""; }; - 0E7361A81FD938BA00706BFF /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/UI.strings; sourceTree = ""; }; - 0E7361A91FD938BC00706BFF /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/UI.strings; sourceTree = ""; }; - 0E7361AA1FD938BD00706BFF /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/UI.strings"; sourceTree = ""; }; - 0E7361AB1FD938BE00706BFF /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/UI.strings; sourceTree = ""; }; - 0E7361AC1FD938BF00706BFF /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/UI.strings; sourceTree = ""; }; - 0E7361AD1FD938C100706BFF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/UI.strings; sourceTree = ""; }; - 0E7361AE1FD938C200706BFF /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/UI.strings; sourceTree = ""; }; - 0E7361AF1FD938C300706BFF /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/UI.strings; sourceTree = ""; }; - 0E7361B01FD938C400706BFF /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/UI.strings; sourceTree = ""; }; - 0E7361B11FD938C700706BFF /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/UI.strings; sourceTree = ""; }; - 0E7361BB1FD96A0800706BFF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Signup.strings; sourceTree = ""; }; - 0E7361BC1FD96A1000706BFF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Signup.strings; sourceTree = ""; }; - 0E7361BD1FD96A1100706BFF /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Signup.strings; sourceTree = ""; }; - 0E7361BE1FD96A1300706BFF /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Signup.strings; sourceTree = ""; }; - 0E7361BF1FD96A1500706BFF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Signup.strings"; sourceTree = ""; }; - 0E7361C01FD96A1600706BFF /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Signup.strings"; sourceTree = ""; }; - 0E7361C11FD96A1700706BFF /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Signup.strings; sourceTree = ""; }; - 0E7361C21FD96A1900706BFF /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Signup.strings"; sourceTree = ""; }; - 0E7361C31FD96A1A00706BFF /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Signup.strings; sourceTree = ""; }; - 0E7361C41FD96A1B00706BFF /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Signup.strings; sourceTree = ""; }; - 0E7361C51FD96A1C00706BFF /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Signup.strings"; sourceTree = ""; }; - 0E7361C61FD96A1D00706BFF /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Signup.strings; sourceTree = ""; }; - 0E7361C71FD96A1E00706BFF /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Signup.strings; sourceTree = ""; }; - 0E7361C81FD96A1E00706BFF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Signup.strings; sourceTree = ""; }; - 0E7361C91FD96A1F00706BFF /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Signup.strings; sourceTree = ""; }; - 0E7361CA1FD96A2100706BFF /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Signup.strings; sourceTree = ""; }; - 0E7361CB1FD96A2200706BFF /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Signup.strings; sourceTree = ""; }; - 0E7361CC1FD96A2300706BFF /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Signup.strings; sourceTree = ""; }; - 0E7361D01FD96AF000706BFF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361D21FD96B0900706BFF /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361D31FD96B0B00706BFF /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361D41FD96B1000706BFF /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361D51FD96B1100706BFF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Welcome.strings"; sourceTree = ""; }; - 0E7361D61FD96B1300706BFF /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Welcome.strings"; sourceTree = ""; }; - 0E7361D71FD96B1400706BFF /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361D81FD96B1500706BFF /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Welcome.strings"; sourceTree = ""; }; - 0E7361D91FD96B1600706BFF /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361DA1FD96B1800706BFF /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361DB1FD96B1900706BFF /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Welcome.strings"; sourceTree = ""; }; - 0E7361DC1FD96B1A00706BFF /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361DD1FD96B1B00706BFF /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361DE1FD96B1C00706BFF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361DF1FD96B1D00706BFF /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361E01FD96B1E00706BFF /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361E11FD96B1F00706BFF /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361E21FD96B2100706BFF /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Welcome.strings; sourceTree = ""; }; - 0E7361E31FD9731E00706BFF /* Welcome.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Welcome.storyboard; sourceTree = ""; }; - 0E7361E41FD9731F00706BFF /* Signup.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Signup.storyboard; sourceTree = ""; }; - 0E75D8D21F9E3F9F00658D1E /* UserAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserAccount.swift; sourceTree = ""; }; - 0E7BC6D61F96B0AF0035C8B2 /* PIALibrary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PIALibrary.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0E9D626F1FDE83BD009A90CF /* GlossServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlossServer.swift; sourceTree = ""; }; - 0E9D62701FDE83BD009A90CF /* GlossServersBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlossServersBundle.swift; sourceTree = ""; }; - 0E9D628B1FDEAC2D009A90CF /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 0E9D62D91FDEE3FE009A90CF /* ServerProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerProvider.swift; sourceTree = ""; }; - 0E9D62DC1FDEE45A009A90CF /* DefaultServerProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultServerProvider.swift; sourceTree = ""; }; - 0EA4C4301FDDD48F0041C3D8 /* Server.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Server.swift; sourceTree = ""; }; - 0EA4C4381FDDE24B0041C3D8 /* ServersBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServersBundle.swift; sourceTree = ""; }; - 0EA4C4411FDDFD830041C3D8 /* ServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerTests.swift; sourceTree = ""; }; - 0EA7065E1F80F448001E4F88 /* AccountProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountProvider.swift; sourceTree = ""; }; - 0EA8072620A1A0090033EC1A /* Redeem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Redeem.swift; sourceTree = ""; }; - 0EA8072B20A1C7A20033EC1A /* RedeemRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemRequest.swift; sourceTree = ""; }; - 0EA8072E20A1E7C60033EC1A /* GlossRedeem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossRedeem.swift; sourceTree = ""; }; - 0EA8073120A2F50A0033EC1A /* SignupMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupMetadata.swift; sourceTree = ""; }; - 0EAA38881F9CC4C4000149CF /* InAppProduct.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InAppProduct.swift; sourceTree = ""; }; - 0EAA38891F9CC4C4000149CF /* InAppProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InAppProvider.swift; sourceTree = ""; }; - 0EAA388A1F9CC4C4000149CF /* InAppTransaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InAppTransaction.swift; sourceTree = ""; }; - 0EAA38921F9CC682000149CF /* SignupRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupRequest.swift; sourceTree = ""; }; - 0EAA38941F9CC7E4000149CF /* AppStoreProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppStoreProvider.swift; sourceTree = ""; }; - 0EAA38951F9CC7E4000149CF /* AppStoreProduct.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppStoreProduct.swift; sourceTree = ""; }; - 0EAA38961F9CC7E4000149CF /* AppStoreTransaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppStoreTransaction.swift; sourceTree = ""; }; - 0EB3D9811FF02FE5005B11F4 /* VPNAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNAction.swift; sourceTree = ""; }; - 0EB3D9871FF06F37005B11F4 /* NetworkExtensionProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkExtensionProfile.swift; sourceTree = ""; }; - 0EB8C0431F9CCB76005857E4 /* MockInAppProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockInAppProvider.swift; sourceTree = ""; }; - 0EB8C0451F9CCB7C005857E4 /* AccountSignupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountSignupTests.swift; sourceTree = ""; }; - 0EB8C0471F9CCE07005857E4 /* Macros.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Macros.swift; sourceTree = ""; }; - 0EB8C04F1F9CD38A005857E4 /* ActivityButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityButton.swift; sourceTree = ""; }; - 0EB8C0501F9CD38A005857E4 /* BorderedTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BorderedTextField.swift; sourceTree = ""; }; - 0EB8C0511F9CD38A005857E4 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; - 0EB8C0521F9CD38A005857E4 /* AutolayoutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutolayoutViewController.swift; sourceTree = ""; }; - 0EB8C0531F9CD38A005857E4 /* PIAWelcomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIAWelcomeViewController.swift; sourceTree = ""; }; - 0EB8C0541F9CD38A005857E4 /* PurchasePlanCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchasePlanCell.swift; sourceTree = ""; }; - 0EB8C0551F9CD38A005857E4 /* PurchaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchaseViewController.swift; sourceTree = ""; }; - 0EB8C0561F9CD38A005857E4 /* RestoreSignupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RestoreSignupViewController.swift; sourceTree = ""; }; - 0EB8C0571F9CD38A005857E4 /* SignupFailureViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupFailureViewController.swift; sourceTree = ""; }; - 0EB8C0581F9CD38A005857E4 /* SignupInProgressViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupInProgressViewController.swift; sourceTree = ""; }; - 0EB8C0591F9CD38A005857E4 /* SignupInternetUnreachableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupInternetUnreachableViewController.swift; sourceTree = ""; }; - 0EB8C05A1F9CD38A005857E4 /* SignupSuccessViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupSuccessViewController.swift; sourceTree = ""; }; - 0EB8C05B1F9CD38A005857E4 /* WelcomePageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WelcomePageViewController.swift; sourceTree = ""; }; - 0EB8C05C1F9CD38A005857E4 /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; - 0EB8C05D1F9CD38A005857E4 /* Macros+UI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Macros+UI.swift"; sourceTree = ""; }; - 0EB8C0811F9CE11A005857E4 /* UI.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = UI.xcassets; sourceTree = ""; }; - 0EB9667D1FDF36490086ABC2 /* GlossParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossParser.swift; sourceTree = ""; }; - 0EBBC6DB1F9F64E700B8BD21 /* Client+Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Environment.swift"; sourceTree = ""; }; - 0EBFFFD51F693F800009D4F4 /* PIALibrary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PIALibrary.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0EBFFFD91F693F800009D4F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0EC7A2A31F9D3D78006DDB91 /* RenewRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenewRequest.swift; sourceTree = ""; }; - 0EC849C81F82329F002480CA /* WebServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebServices.swift; sourceTree = ""; }; - 0ED158591FDC083F008F6522 /* SwiftGen+Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+Strings.swift"; sourceTree = ""; }; - 0ED2B50A1F82364C00C9DB2B /* MockWebServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockWebServices.swift; sourceTree = ""; }; - 0ED2B5121F82444E00C9DB2B /* Client+Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Preferences.swift"; sourceTree = ""; }; - 0ED2CA3B1F6C3028008E7AD7 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; - 0ED976DE1F84D36B005307B8 /* PIALibraryHost.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PIALibraryHost.entitlements; sourceTree = ""; }; - 0EE1068B1F8250A1009514E9 /* Plan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Plan.swift; sourceTree = ""; }; - 0EE1068D1F828813009514E9 /* Signup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Signup.swift; sourceTree = ""; }; - 0EE14D1A1FF16B39008D9AC2 /* InvalidatingFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvalidatingFlowLayout.swift; sourceTree = ""; }; - 0EE261DF1FEFD69F00E11955 /* Notification+Library.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Library.swift"; sourceTree = ""; }; - 0EE771021F9D0DCA0029A77B /* Client+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Configuration.swift"; sourceTree = ""; }; - 0EE771081F9D21020029A77B /* Payment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Payment.swift; sourceTree = ""; }; - 0EE78AED1F818720002E4CDD /* LibraryCallback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryCallback.swift; sourceTree = ""; }; - 0EE78AEF1F818767002E4CDD /* ClientError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientError.swift; sourceTree = ""; }; - 0EE78AF11F8187F8002E4CDD /* LoginRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginRequest.swift; sourceTree = ""; }; - 0EE78AF51F81880E002E4CDD /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = ""; }; - 0EE78AF71F818815002E4CDD /* AccountInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInfo.swift; sourceTree = ""; }; - 0EE78AFD1F818A20002E4CDD /* PIALibraryTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PIALibraryTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 0EE78AFF1F818A20002E4CDD /* AccountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTests.swift; sourceTree = ""; }; - 0EE78B011F818A20002E4CDD /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 0EE78B0C1F818A32002E4CDD /* PIALibraryHost-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PIALibraryHost-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 0EE78B0E1F818A32002E4CDD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 0EE78B101F818A32002E4CDD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 0EE78B131F818A32002E4CDD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 0EE78B151F818A32002E4CDD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 0EE78B181F818A32002E4CDD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 0EE78B1A1F818A32002E4CDD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0EF14E4A1FEAE6350007485A /* Client+Providers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Client+Providers.swift"; sourceTree = ""; }; - 0EFB51261F82A5F80033B81F /* Notification+Core.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Core.swift"; sourceTree = ""; }; - 0EFB51291F82D45F0033B81F /* DefaultAccountProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultAccountProvider.swift; sourceTree = ""; }; - 0EFB512D1F82D7C50033B81F /* PIAWebServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAWebServices.swift; sourceTree = ""; }; - 0EFEB4BF2007784A00F81029 /* PIATunnelProvider+Profile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PIATunnelProvider+Profile.swift"; sourceTree = ""; }; - 0EFEB4C02007784A00F81029 /* PIATunnelProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIATunnelProfile.swift; sourceTree = ""; }; - 10DD9676BB5539C7984C65D9 /* Pods-PIALibrary-PIALibrary-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibrary-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibrary-iOS/Pods-PIALibrary-PIALibrary-iOS.release.xcconfig"; sourceTree = ""; }; - 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NavigationBar+Appearence.swift"; sourceTree = ""; }; - 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig"; sourceTree = ""; }; - 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSILastKnownExceptionProvider.swift; sourceTree = ""; }; - 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIDeviceInformationProvider.swift; sourceTree = ""; }; - 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACSIUserInformationProvider.swift; sourceTree = ""; }; - 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TimeInterval+Date.swift"; sourceTree = ""; }; - 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccessibilityIdentifiers.swift; path = PIALibrary/Sources/UI/iOS/AccessibilityIdentifiers.swift; sourceTree = SOURCE_ROOT; }; - 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibilityIdentifiers.swift; sourceTree = ""; }; - 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhitelistUtil.swift; sourceTree = ""; }; - 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig"; sourceTree = ""; }; - 821674F6267A47670028E4FD /* LibraryConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryConstants.swift; sourceTree = ""; }; - 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicLinkLoginViewController.swift; sourceTree = ""; }; - 8221921B24CEBA3800C24F1C /* NMTRules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NMTRules.swift; sourceTree = ""; }; - 8221921E24CEBABA00C24F1C /* NMTType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NMTType.swift; sourceTree = ""; }; - 822BC1CF24BF20C90041BF9A /* UIControl+Action.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIControl+Action.swift"; sourceTree = ""; }; - 824D981D266A1AC500FCD7DA /* staging.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = staging.json; sourceTree = ""; }; - 8276E174260B5ED400BB7B40 /* ServiceQualityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceQualityManager.swift; sourceTree = ""; }; - 8276E1E5260B961B00BB7B40 /* PIAKPIClientStateProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAKPIClientStateProvider.swift; sourceTree = ""; }; - 8276E1EC260B962900BB7B40 /* PIAKPIStagingClientStateProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAKPIStagingClientStateProvider.swift; sourceTree = ""; }; - 8289AD862685C1FC00DA6A17 /* ShareDataInformationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareDataInformationViewController.swift; sourceTree = ""; }; - 8289AD872685C1FC00DA6A17 /* GDPRViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GDPRViewController.swift; sourceTree = ""; }; - 829EB63E2535C432003E74DD /* DedicatedIP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DedicatedIP.swift; sourceTree = ""; }; - 82C374F42514DC6D00E391EE /* EndpointManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndpointManagerTests.swift; sourceTree = ""; }; - 82C374F62514DC7200E391EE /* server.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = server.json; sourceTree = ""; }; - 82C374FA2514DEC700E391EE /* EndpointManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndpointManager.swift; sourceTree = ""; }; - 82C4962825642D5800233CB1 /* String+Random.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Random.swift"; sourceTree = ""; }; - 82CAB807255A9ACB00BB08EF /* InAppMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppMessage.swift; sourceTree = ""; }; - 82CDC2E1257A5B440001669D /* DateUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateUtil.swift; sourceTree = ""; }; - 82DDD52F2539CFDC0049E79E /* DIPTokenKeychainTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DIPTokenKeychainTests.swift; sourceTree = ""; }; - 82E20B1024F652ED0065EFE3 /* AccountInfo+Kotlin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AccountInfo+Kotlin.swift"; sourceTree = ""; }; - 82FD5D552521F2DD00E390CB /* PIARegionClientStateProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIARegionClientStateProvider.swift; sourceTree = ""; }; - 82FD5D5D2521F30300E390CB /* PIAAccountClientStateProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAAccountClientStateProvider.swift; sourceTree = ""; }; - 82FD5D652521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAAccountStagingClientStateProvider.swift; sourceTree = ""; }; - 84125E07213D7DFF001BCC19 /* PIAColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAColors.swift; sourceTree = ""; }; - 84125E0A213D7E0E001BCC19 /* PIAFonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAFonts.swift; sourceTree = ""; }; - 841BE60C212AD0F3002EF2D1 /* ValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidatorTests.swift; sourceTree = ""; }; - 841BE60E212AFE49002EF2D1 /* GiftCardUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GiftCardUtil.swift; sourceTree = ""; }; - 841BE611212AFFA7002EF2D1 /* GiftCardUtilTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GiftCardUtilTests.swift; sourceTree = ""; }; - 843C67C12122E714005A3FDA /* AccountInfoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInfoTests.swift; sourceTree = ""; }; - 84577FBA213D8ED1006DEC3D /* StyleGuideHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleGuideHelpers.swift; sourceTree = ""; }; - 84577FBC213D8EDD006DEC3D /* TextStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextStyles.swift; sourceTree = ""; }; - 84577FBE213D8EE6006DEC3D /* ViewStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewStyles.swift; sourceTree = ""; }; - 84577FC0213D9A23006DEC3D /* UIImage+Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Color.swift"; sourceTree = ""; }; - 84577FC2213D9AEA006DEC3D /* UITextField+PlaceholderColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+PlaceholderColor.swift"; sourceTree = ""; }; - 84577FC4213D9B4D006DEC3D /* UILabel+LineHeight.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+LineHeight.swift"; sourceTree = ""; }; - AA319C4A25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACrashlabRegionInformationProvider.swift; sourceTree = ""; }; - AA319C4B25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACrashlabProtocolInformationProvider.swift; sourceTree = ""; }; - AA319C4C25833088004BECF6 /* PIACrashlabClientStateProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIACrashlabClientStateProvider.swift; sourceTree = ""; }; - C71CB55833441BB6B5D0B9FD /* Pods_PIALibrary_PIALibraryTests_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PIALibrary_PIALibraryTests_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CBC846CEFD1620AE3960B8AD /* Pods_PIALibrary_PIALibrary_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PIALibrary_PIALibrary_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D9F51336EB1D7EC915A230E8 /* Pods-PIALibrary-PIALibraryHost-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibraryHost-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibraryHost-iOS/Pods-PIALibrary-PIALibraryHost-iOS.debug.xcconfig"; sourceTree = ""; }; - DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PIALibrary_PIALibraryHost_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DD0AC78F218715B8009B576B /* PIAButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAButton.swift; sourceTree = ""; }; - DD1AB10023FAD79000396E74 /* PIAPageControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PIAPageControl.swift; sourceTree = ""; }; - DD1AB10223FAD83900396E74 /* WalkthroughPageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalkthroughPageView.swift; sourceTree = ""; }; - DD1AB10423FC280000396E74 /* DeviceModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceModel.swift; sourceTree = ""; }; - DD2683E824617F0300C65DAA /* PingTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PingTask.swift; sourceTree = ""; }; - DD2F4AD0248A6D4D00A2F6D8 /* LoginReceiptRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginReceiptRequest.swift; sourceTree = ""; }; - DD31498E21834B3F008E26E8 /* GetStartedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetStartedViewController.swift; sourceTree = ""; }; - DD36CB7D21CCFFFB00FC815A /* CAGradientLayer+Image.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CAGradientLayer+Image.swift"; sourceTree = ""; }; - DD56E3F3225F5D22002EDFB2 /* GlossProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossProduct.swift; sourceTree = ""; }; - DD56E3F5225F5D77002EDFB2 /* Product.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; }; - DD58F4BA21AEB99C00D043F7 /* GlossToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossToken.swift; sourceTree = ""; }; - DD58F4BC21AEF76100D043F7 /* String+Components.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Components.swift"; sourceTree = ""; }; - DD6768E222FAB19D00B9FDD0 /* AppStoreInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreInformation.swift; sourceTree = ""; }; - DD6DC5B821B6A83400F9D538 /* UIViewLoading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewLoading.swift; sourceTree = ""; }; - DD6DC5BB21B6A8FC00F9D538 /* pia-spinner.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "pia-spinner.json"; sourceTree = ""; }; - DD6FB0362224355600A84F05 /* UIDevice+WiFi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+WiFi.swift"; sourceTree = ""; }; - DD7411A823EC35B40058CEF3 /* PIAWGTunnelProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PIAWGTunnelProfile.swift; sourceTree = ""; }; - DD76292721ECDFF80092DF50 /* Usage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Usage.swift; sourceTree = ""; }; - DD76292D21ECEC3F0092DF50 /* DataManipulation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataManipulation.swift; sourceTree = ""; }; - DD86BAF021EF5B6D004A988F /* UIViewAutolayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewAutolayout.swift; sourceTree = ""; }; - DD8BF3CA219C6BAA0041357C /* ConfirmVPNPlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmVPNPlanViewController.swift; sourceTree = ""; }; - DD8C3E602327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IKEv2IntegrityAlgorithm.swift; sourceTree = ""; }; - DD8C3E632327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IKEv2EncryptionAlgorithm.swift; sourceTree = ""; }; - DDA184D022FC1F79003239CC /* TermsAndConditionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsAndConditionsViewController.swift; sourceTree = ""; }; - DDA4A7BD21F5C31400A02ACD /* IKEv2Profile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IKEv2Profile.swift; sourceTree = ""; }; - DDC812472176166500CB290C /* SwiftGen+ScenesStoryboards.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+ScenesStoryboards.swift"; sourceTree = ""; }; - DDC81249217617F900CB290C /* SwiftGen+SeguesStoryboards.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftGen+SeguesStoryboards.swift"; sourceTree = ""; }; - DDD824E22189969400151709 /* Preset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preset.swift; sourceTree = ""; }; - DDD824E4218996CD00151709 /* Pages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pages.swift; sourceTree = ""; }; - DDD824E62189C0E800151709 /* BrandableNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrandableNavigationBar.swift; sourceTree = ""; }; - DDD824E92189CD5700151709 /* NavigationLogoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationLogoView.swift; sourceTree = ""; }; - DDF7F73E2405846800A671C7 /* PIAWGTunnelProvider+Profile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PIAWGTunnelProvider+Profile.swift"; sourceTree = ""; }; - DDFCFAA721E924A70081F235 /* TileProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileProvider.swift; sourceTree = ""; }; - DDFCFAAA21E925160081F235 /* DefaultTileProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultTileProvider.swift; sourceTree = ""; }; - DDFCFAAC21E925B60081F235 /* TileableCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TileableCell.swift; sourceTree = ""; }; - DDFCFAAD21E925B60081F235 /* Tileable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tileable.swift; sourceTree = ""; }; - DDFCFAAE21E925B60081F235 /* AvailableTiles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvailableTiles.swift; sourceTree = ""; }; - DDFCFAB521E925F70081F235 /* EnumsBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumsBuilder.swift; sourceTree = ""; }; - DDFCFAB921E929660081F235 /* MockTileProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTileProvider.swift; sourceTree = ""; }; - E0DA4F82F77C7132D2A82078 /* Pods-PIALibrary-PIALibrary-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PIALibrary-PIALibrary-iOS.debug.xcconfig"; path = "Target Support Files/Pods-PIALibrary-PIALibrary-iOS/Pods-PIALibrary-PIALibrary-iOS.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 0E2ADD191FE13B8600BB170C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E2ADD211FE13B8600BB170C /* PIALibrary.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0E7BC6D21F96B0AF0035C8B2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EBFFFD11F693F800009D4F4 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BB70402C95EE5B6078D88D96 /* Pods_PIALibrary_PIALibrary_iOS.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EE78AFA1F818A20002E4CDD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0EE78B021F818A20002E4CDD /* PIALibrary.framework in Frameworks */, - 33A542AFDFD3AF0C27B27F45 /* Pods_PIALibrary_PIALibraryTests_iOS.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EE78B091F818A32002E4CDD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D93D3414A3DA19ECB04B778 /* Pods_PIALibrary_PIALibraryHost_iOS.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0E1108911F77B6B600A92462 /* Util */ = { - isa = PBXGroup; - children = ( - 0E2ADCFB1FE136D600BB170C /* iOS */, - 0E2ADCFC1FE136DA00BB170C /* macOS */, - 0E2ADCC91FE06D7A00BB170C /* Array+Math.swift */, - 0E1108931F77B6B600A92462 /* Keychain.swift */, - 0E2ADCE81FE0843000BB170C /* Macros+Pinger.swift */, - 0E392DAF1FE3366B0002160D /* NSData+Compression.h */, - 0E392DAE1FE3366A0002160D /* NSData+Compression.m */, - 0E392DB71FE34B5A0002160D /* NSString+URL.h */, - 0E392DB81FE34B5A0002160D /* NSString+URL.m */, - 0E2ADCD81FE072ED00BB170C /* Pinger.h */, - 0E2ADCD91FE072ED00BB170C /* Pinger.m */, - DDD824E22189969400151709 /* Preset.swift */, - DDD824E4218996CD00151709 /* Pages.swift */, - DD76292D21ECEC3F0092DF50 /* DataManipulation.swift */, - DD6FB0362224355600A84F05 /* UIDevice+WiFi.swift */, - 7E9D038328479DE100BE85DC /* TimeInterval+Date.swift */, - 82CDC2E1257A5B440001669D /* DateUtil.swift */, - 7E9D038B2847A8FC00BE85DC /* WhitelistUtil.swift */, - ); - path = Util; - sourceTree = ""; - }; - 0E2ADCD71FE072ED00BB170C /* Daemons */ = { - isa = PBXGroup; - children = ( - 0E2ADCEE1FE09C6C00BB170C /* ConnectivityDaemon.swift */, - 0E53A8491FE5BA52000C2A18 /* Daemon.swift */, - 0E53A8461FE5BA0B000C2A18 /* ServersDaemon.swift */, - 0E2ADCEF1FE09C6C00BB170C /* ServersPinger.swift */, - 0E53A84C1FE5BB25000C2A18 /* VPNDaemon.swift */, - DD2683E824617F0300C65DAA /* PingTask.swift */, - ); - path = Daemons; - sourceTree = ""; - }; - 0E2ADCFB1FE136D600BB170C /* iOS */ = { - isa = PBXGroup; - children = ( - 0E9D628B1FDEAC2D009A90CF /* module.modulemap */, - 0E492C591FE5EA06007F23DF /* CMacros.h */, - 0E492C5A1FE5EA06007F23DF /* CMacros.m */, - DD58F4BC21AEF76100D043F7 /* String+Components.swift */, - 82C4962825642D5800233CB1 /* String+Random.swift */, - ); - path = iOS; - sourceTree = ""; - }; - 0E2ADCFC1FE136DA00BB170C /* macOS */ = { - isa = PBXGroup; - children = ( - 0E2ADCF91FE1363900BB170C /* module.modulemap */, - ); - path = macOS; - sourceTree = ""; - }; - 0E2ADD2F1FE1468400BB170C /* VPN */ = { - isa = PBXGroup; - children = ( - 0E2ADD4E1FE15C2200BB170C /* VPNConfiguration.swift */, - 0E2ADD391FE14F8600BB170C /* VPNProfile.swift */, - 0E2ADD301FE1468400BB170C /* VPNProvider.swift */, - 0E2ADD321FE1472F00BB170C /* VPNStatus.swift */, - DD8C3E602327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift */, - DD8C3E632327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift */, - ); - path = VPN; - sourceTree = ""; - }; - 0E2ADD4A1FE1598B00BB170C /* VPN */ = { - isa = PBXGroup; - children = ( - 0E2ADD361FE14F0000BB170C /* DefaultVPNProvider.swift */, - 0E2ADD471FE1595300BB170C /* IPSecProfile.swift */, - 0EB3D9871FF06F37005B11F4 /* NetworkExtensionProfile.swift */, - 0EB3D9811FF02FE5005B11F4 /* VPNAction.swift */, - DDA4A7BD21F5C31400A02ACD /* IKEv2Profile.swift */, - ); - path = VPN; - sourceTree = ""; - }; - 0E392D821FE2E7900002160D /* Mock */ = { - isa = PBXGroup; - children = ( - 0E53A8521FE5D73F000C2A18 /* Client+Mock.swift */, - 0E492C5D1FE5F7C0007F23DF /* MockAccountProvider.swift */, - DDFCFAB921E929660081F235 /* MockTileProvider.swift */, - 0EB8C0431F9CCB76005857E4 /* MockInAppProvider.swift */, - 0E492C631FE5F949007F23DF /* MockServerProvider.swift */, - 0E2ADD3F1FE156EA00BB170C /* MockVPNProvider.swift */, - 0ED2B50A1F82364C00C9DB2B /* MockWebServices.swift */, - ); - path = Mock; - sourceTree = ""; - }; - 0E3D13DB1F9E28B600434A48 /* WebServices */ = { - isa = PBXGroup; - children = ( - 82C374FA2514DEC700E391EE /* EndpointManager.swift */, - 0E392DA21FE3247E0002160D /* Endpoint.swift */, - 0E3D13D21F9E270A00434A48 /* GlossAccountInfo.swift */, - 0E392D8E1FE2FBBE0002160D /* GlossConnectivityStatus.swift */, - 0E3D13CF1F9E26FD00434A48 /* GlossCredentials.swift */, - 0EB9667D1FDF36490086ABC2 /* GlossParser.swift */, - 0E3D13D51F9E272B00434A48 /* GlossPayment.swift */, - 0EA8072E20A1E7C60033EC1A /* GlossRedeem.swift */, - 0E9D626F1FDE83BD009A90CF /* GlossServer.swift */, - 0E9D62701FDE83BD009A90CF /* GlossServersBundle.swift */, - 0E3D13D81F9E273300434A48 /* GlossSignup.swift */, - DD58F4BA21AEB99C00D043F7 /* GlossToken.swift */, - DD56E3F3225F5D22002EDFB2 /* GlossProduct.swift */, - 0EFB512D1F82D7C50033B81F /* PIAWebServices.swift */, - 0E392D9F1FE323ED0002160D /* PIAWebServices+Ephemeral.swift */, - ); - path = WebServices; - sourceTree = ""; - }; - 0E3D13DC1F9E28D100434A48 /* Persistence */ = { - isa = PBXGroup; - children = ( - 0E0E5B121F8297DE00022CD0 /* KeychainStore.swift */, - 0E392D7C1FE2E4C10002160D /* MemoryStore.swift */, - 0E0E5B101F8297D200022CD0 /* UserDefaultsStore.swift */, - ); - path = Persistence; - sourceTree = ""; - }; - 0E3D13DD1F9E28DB00434A48 /* InApp */ = { - isa = PBXGroup; - children = ( - 0EAA38951F9CC7E4000149CF /* AppStoreProduct.swift */, - 0EAA38941F9CC7E4000149CF /* AppStoreProvider.swift */, - 0EAA38961F9CC7E4000149CF /* AppStoreTransaction.swift */, - ); - path = InApp; - sourceTree = ""; - }; - 0E4D4E981FA4CA7A007DA6DA /* Shared */ = { - isa = PBXGroup; - children = ( - DD1AB10023FAD79000396E74 /* PIAPageControl.swift */, - 0E4D4E9B1FA4CA7A007DA6DA /* Restylable.swift */, - 0E4D4E9C1FA4CA7A007DA6DA /* Validator.swift */, - 841BE60E212AFE49002EF2D1 /* GiftCardUtil.swift */, - 84125E07213D7DFF001BCC19 /* PIAColors.swift */, - 84125E0A213D7E0E001BCC19 /* PIAFonts.swift */, - 354B015E27732095000A73B4 /* NavigationBar+Appearence.swift */, - DDD824E62189C0E800151709 /* BrandableNavigationBar.swift */, - DD36CB7D21CCFFFB00FC815A /* CAGradientLayer+Image.swift */, - DD1AB10423FC280000396E74 /* DeviceModel.swift */, - ); - path = Shared; - sourceTree = ""; - }; - 0E6B0A761FA4986D00EBB916 /* Shared */ = { - isa = PBXGroup; - children = ( - 0E6B0A771FA4986D00EBB916 /* UI.strings */, - ); - path = Shared; - sourceTree = ""; - }; - 0EA4C42F1FDDD47C0041C3D8 /* Server */ = { - isa = PBXGroup; - children = ( - 0E9D62D91FDEE3FE009A90CF /* ServerProvider.swift */, - ); - path = Server; - sourceTree = ""; - }; - 0EA7065C1F80F448001E4F88 /* WebServices */ = { - isa = PBXGroup; - children = ( - 0EE78AF71F818815002E4CDD /* AccountInfo.swift */, - 82E20B1024F652ED0065EFE3 /* AccountInfo+Kotlin.swift */, - 0E392D8B1FE2F8780002160D /* ConnectivityStatus.swift */, - 0EE78AF51F81880E002E4CDD /* Credentials.swift */, - 0EE771081F9D21020029A77B /* Payment.swift */, - 0EE1068B1F8250A1009514E9 /* Plan.swift */, - 0EA8072620A1A0090033EC1A /* Redeem.swift */, - 0EA4C4301FDDD48F0041C3D8 /* Server.swift */, - 0EA4C4381FDDE24B0041C3D8 /* ServersBundle.swift */, - 0EE1068D1F828813009514E9 /* Signup.swift */, - 0EC849C81F82329F002480CA /* WebServices.swift */, - DD76292721ECDFF80092DF50 /* Usage.swift */, - DD56E3F5225F5D77002EDFB2 /* Product.swift */, - DD6768E222FAB19D00B9FDD0 /* AppStoreInformation.swift */, - 829EB63E2535C432003E74DD /* DedicatedIP.swift */, - 82CAB807255A9ACB00BB08EF /* InAppMessage.swift */, - ); - path = WebServices; - sourceTree = ""; - }; - 0EA7065D1F80F448001E4F88 /* Account */ = { - isa = PBXGroup; - children = ( - DD2F4AD0248A6D4D00A2F6D8 /* LoginReceiptRequest.swift */, - 0EFDC1D11FE36E5B007C0B9B /* InApp */, - 0EA7065E1F80F448001E4F88 /* AccountProvider.swift */, - 0EE78AF11F8187F8002E4CDD /* LoginRequest.swift */, - 0E0E5B141F829EC500022CD0 /* UpdateAccountRequest.swift */, - 0E75D8D21F9E3F9F00658D1E /* UserAccount.swift */, - ); - path = Account; - sourceTree = ""; - }; - 0EAA38871F9CC4C4000149CF /* InApp */ = { - isa = PBXGroup; - children = ( - 0EAA38881F9CC4C4000149CF /* InAppProduct.swift */, - 0EAA38891F9CC4C4000149CF /* InAppProvider.swift */, - 0EAA388A1F9CC4C4000149CF /* InAppTransaction.swift */, - ); - path = InApp; - sourceTree = ""; - }; - 0EB8C0491F9CD38A005857E4 /* UI */ = { - isa = PBXGroup; - children = ( - 0E4D4E981FA4CA7A007DA6DA /* Shared */, - 0EB8C04E1F9CD38A005857E4 /* iOS */, - ); - path = UI; - sourceTree = ""; - }; - 0EB8C04E1F9CD38A005857E4 /* iOS */ = { - isa = PBXGroup; - children = ( - 84577FC6213E7D68006DEC3D /* ViewControllers */, - 0EB8C04F1F9CD38A005857E4 /* ActivityButton.swift */, - 7E9D038728479FB200BE85DC /* AccessibilityIdentifiers.swift */, - 0EB8C0501F9CD38A005857E4 /* BorderedTextField.swift */, - 0E0F95951FD560C40046DC64 /* CircleProgressView.swift */, - 0EE14D1A1FF16B39008D9AC2 /* InvalidatingFlowLayout.swift */, - 0EB8C05D1F9CD38A005857E4 /* Macros+UI.swift */, - 0E38E40F1FF81722008223AB /* Notification+UI.swift */, - 0E4D4E9A1FA4CA7A007DA6DA /* PurchasePlan.swift */, - 0EB8C0541F9CD38A005857E4 /* PurchasePlanCell.swift */, - 0EA8073120A2F50A0033EC1A /* SignupMetadata.swift */, - 0E2215CE2008DFD900F5FB4D /* SwiftGen+Assets.swift */, - DDC812472176166500CB290C /* SwiftGen+ScenesStoryboards.swift */, - DDC81249217617F900CB290C /* SwiftGen+SeguesStoryboards.swift */, - 0ED158591FDC083F008F6522 /* SwiftGen+Strings.swift */, - 0EB8C05C1F9CD38A005857E4 /* Theme.swift */, - 0E5BCBFE20172C8300E3E4B4 /* Theme+LightPalette.swift */, - 84577FC0213D9A23006DEC3D /* UIImage+Color.swift */, - 84577FC2213D9AEA006DEC3D /* UITextField+PlaceholderColor.swift */, - 84577FC4213D9B4D006DEC3D /* UILabel+LineHeight.swift */, - DD0AC78F218715B8009B576B /* PIAButton.swift */, - DD1AB10223FAD83900396E74 /* WalkthroughPageView.swift */, - DDD824E92189CD5700151709 /* NavigationLogoView.swift */, - 84577FB9213D8EB2006DEC3D /* Styles */, - DD6DC5B821B6A83400F9D538 /* UIViewLoading.swift */, - 822BC1CF24BF20C90041BF9A /* UIControl+Action.swift */, - ); - path = iOS; - sourceTree = ""; - }; - 0EB8C07E1F9CE11A005857E4 /* Resources */ = { - isa = PBXGroup; - children = ( - 824D981C266A1A4900FCD7DA /* Staging */, - DD6DC5BA21B6A8F200F9D538 /* Lottie */, - 0EB8C07F1F9CE11A005857E4 /* UI */, - ); - path = Resources; - sourceTree = ""; - }; - 0EB8C07F1F9CE11A005857E4 /* UI */ = { - isa = PBXGroup; - children = ( - 0E6B0A761FA4986D00EBB916 /* Shared */, - 0EB8C0801F9CE11A005857E4 /* iOS */, - ); - path = UI; - sourceTree = ""; - }; - 0EB8C0801F9CE11A005857E4 /* iOS */ = { - isa = PBXGroup; - children = ( - 0E7361E41FD9731F00706BFF /* Signup.storyboard */, - 0E7361E31FD9731E00706BFF /* Welcome.storyboard */, - 0E7361B21FD9683B00706BFF /* Signup.strings */, - 0E7361D11FD96AF000706BFF /* Welcome.strings */, - 0EB8C0811F9CE11A005857E4 /* UI.xcassets */, - ); - path = iOS; - sourceTree = ""; - }; - 0EBFFFCB1F693F800009D4F4 = { - isa = PBXGroup; - children = ( - 0EBFFFD71F693F800009D4F4 /* PIALibrary */, - 0EE78AFE1F818A20002E4CDD /* PIALibraryTests */, - 0EE78B0D1F818A32002E4CDD /* PIALibraryHost-iOS */, - 0EBFFFD61F693F800009D4F4 /* Products */, - 5E2704A12A75C0E06858358C /* Frameworks */, - B81F68944904872213E4AFE3 /* Pods */, - ); - sourceTree = ""; - }; - 0EBFFFD61F693F800009D4F4 /* Products */ = { - isa = PBXGroup; - children = ( - 0EBFFFD51F693F800009D4F4 /* PIALibrary.framework */, - 0EE78AFD1F818A20002E4CDD /* PIALibraryTests-iOS.xctest */, - 0EE78B0C1F818A32002E4CDD /* PIALibraryHost-iOS.app */, - 0E7BC6D61F96B0AF0035C8B2 /* PIALibrary.framework */, - 0E2ADD1C1FE13B8600BB170C /* PIALibraryTests-macOS.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 0EBFFFD71F693F800009D4F4 /* PIALibrary */ = { - isa = PBXGroup; - children = ( - 0EB8C07E1F9CE11A005857E4 /* Resources */, - 0EDD36B31F741C9300A5A7B9 /* Sources */, - 0EBFFFD91F693F800009D4F4 /* Info.plist */, - ); - path = PIALibrary; - sourceTree = ""; - }; - 0EDD36B31F741C9300A5A7B9 /* Sources */ = { - isa = PBXGroup; - children = ( - 0EE106901F82900B009514E9 /* Core */, - 0EFB51281F82D4450033B81F /* Library */, - 0E392D821FE2E7900002160D /* Mock */, - 0EB8C0491F9CD38A005857E4 /* UI */, - 0E1108911F77B6B600A92462 /* Util */, - 0EFEB4BE2007784A00F81029 /* VPN */, - ); - path = Sources; - sourceTree = ""; - }; - 0EE106901F82900B009514E9 /* Core */ = { - isa = PBXGroup; - children = ( - 8276E173260B5EC500BB7B40 /* ServiceQuality */, - 8221921A24CEBA0800C24F1C /* NMT */, - DDFCFAB821E926750081F235 /* Util */, - DDFCFAA521E900650081F235 /* Tiles */, - 0EA7065D1F80F448001E4F88 /* Account */, - 0EAA38871F9CC4C4000149CF /* InApp */, - 0EE106911F829097009514E9 /* Persistence */, - 0EA4C42F1FDDD47C0041C3D8 /* Server */, - 0E2ADD2F1FE1468400BB170C /* VPN */, - 0EA7065C1F80F448001E4F88 /* WebServices */, - 0EE78AED1F818720002E4CDD /* LibraryCallback.swift */, - 0EB8C0471F9CCE07005857E4 /* Macros.swift */, - 0EFB51261F82A5F80033B81F /* Notification+Core.swift */, - 0E3D13CC1F9DDD2400434A48 /* NotificationKey.swift */, - 821674F6267A47670028E4FD /* LibraryConstants.swift */, - ); - path = Core; - sourceTree = ""; - }; - 0EE106911F829097009514E9 /* Persistence */ = { - isa = PBXGroup; - children = ( - 0E0E5B0C1F8297BD00022CD0 /* PlainStore.swift */, - 0E0E5B0E1F8297C500022CD0 /* SecureStore.swift */, - 0E392D791FE2E47D0002160D /* TransientStore.swift */, - ); - path = Persistence; - sourceTree = ""; - }; - 0EE14CF31FF0F91C008D9AC2 /* Account */ = { - isa = PBXGroup; - children = ( - 0EFB51291F82D45F0033B81F /* DefaultAccountProvider.swift */, - ); - path = Account; - sourceTree = ""; - }; - 0EE14CF41FF0F921008D9AC2 /* Server */ = { - isa = PBXGroup; - children = ( - 0E9D62DC1FDEE45A009A90CF /* DefaultServerProvider.swift */, - ); - path = Server; - sourceTree = ""; - }; - 0EE78AFE1F818A20002E4CDD /* PIALibraryTests */ = { - isa = PBXGroup; - children = ( - 82C374F62514DC7200E391EE /* server.json */, - 82C374F42514DC6D00E391EE /* EndpointManagerTests.swift */, - 0EB8C0451F9CCB7C005857E4 /* AccountSignupTests.swift */, - 0EE78AFF1F818A20002E4CDD /* AccountTests.swift */, - 0E53A8591FE5E3CD000C2A18 /* MockProviders.swift */, - 0EA4C4411FDDFD830041C3D8 /* ServerTests.swift */, - 0E2ADD441FE1583A00BB170C /* VPNTests.swift */, - 843C67C12122E714005A3FDA /* AccountInfoTests.swift */, - 841BE60C212AD0F3002EF2D1 /* ValidatorTests.swift */, - 841BE611212AFFA7002EF2D1 /* GiftCardUtilTests.swift */, - 82DDD52F2539CFDC0049E79E /* DIPTokenKeychainTests.swift */, - 0EE78B011F818A20002E4CDD /* Info-iOS.plist */, - 0E2ADD201FE13B8600BB170C /* Info-macOS.plist */, - ); - path = PIALibraryTests; - sourceTree = ""; - }; - 0EE78B0D1F818A32002E4CDD /* PIALibraryHost-iOS */ = { - isa = PBXGroup; - children = ( - 0ED976DE1F84D36B005307B8 /* PIALibraryHost.entitlements */, - 0EE78B0E1F818A32002E4CDD /* AppDelegate.swift */, - 0EE78B101F818A32002E4CDD /* ViewController.swift */, - 0EE78B121F818A32002E4CDD /* Main.storyboard */, - 0EE78B151F818A32002E4CDD /* Assets.xcassets */, - 0EE78B171F818A32002E4CDD /* LaunchScreen.storyboard */, - 0EE78B1A1F818A32002E4CDD /* Info.plist */, - ); - path = "PIALibraryHost-iOS"; - sourceTree = ""; - }; - 0EFB51281F82D4450033B81F /* Library */ = { - isa = PBXGroup; - children = ( - 82FD5D542521F2B600E390CB /* Providers */, - DDFCFAA621E9008E0081F235 /* Tiles */, - 0EE14CF31FF0F91C008D9AC2 /* Account */, - 0E2ADCD71FE072ED00BB170C /* Daemons */, - 0E3D13DD1F9E28DB00434A48 /* InApp */, - 0E3D13DC1F9E28D100434A48 /* Persistence */, - 0EE14CF41FF0F921008D9AC2 /* Server */, - 0E2ADD4A1FE1598B00BB170C /* VPN */, - 0E3D13DB1F9E28B600434A48 /* WebServices */, - 0E1743121F82E1A4001E7DD6 /* Client.swift */, - 0E245C9C1FECF0C20010DEF2 /* ClientAccess.swift */, - 0EE771021F9D0DCA0029A77B /* Client+Configuration.swift */, - 0E53A83D1FE5A4C8000C2A18 /* Client+Daemons.swift */, - 0E492C691FE61485007F23DF /* Client+Database.swift */, - 0EBBC6DB1F9F64E700B8BD21 /* Client+Environment.swift */, - 0ED2B5121F82444E00C9DB2B /* Client+Preferences.swift */, - 0EF14E4A1FEAE6350007485A /* Client+Providers.swift */, - 0EE78AEF1F818767002E4CDD /* ClientError.swift */, - 0EE261DF1FEFD69F00E11955 /* Notification+Library.swift */, - ); - path = Library; - sourceTree = ""; - }; - 0EFDC1D11FE36E5B007C0B9B /* InApp */ = { - isa = PBXGroup; - children = ( - 0EA8072B20A1C7A20033EC1A /* RedeemRequest.swift */, - 0EC7A2A31F9D3D78006DDB91 /* RenewRequest.swift */, - 0EAA38921F9CC682000149CF /* SignupRequest.swift */, - ); - path = InApp; - sourceTree = ""; - }; - 0EFEB4BE2007784A00F81029 /* VPN */ = { - isa = PBXGroup; - children = ( - 0EFEB4BF2007784A00F81029 /* PIATunnelProvider+Profile.swift */, - DDF7F73E2405846800A671C7 /* PIAWGTunnelProvider+Profile.swift */, - 0EFEB4C02007784A00F81029 /* PIATunnelProfile.swift */, - DD7411A823EC35B40058CEF3 /* PIAWGTunnelProfile.swift */, - ); - path = VPN; - sourceTree = ""; - }; - 5E2704A12A75C0E06858358C /* Frameworks */ = { - isa = PBXGroup; - children = ( - 0ED2CA3B1F6C3028008E7AD7 /* NetworkExtension.framework */, - CBC846CEFD1620AE3960B8AD /* Pods_PIALibrary_PIALibrary_iOS.framework */, - DB01CE68711A898531418458 /* Pods_PIALibrary_PIALibraryHost_iOS.framework */, - C71CB55833441BB6B5D0B9FD /* Pods_PIALibrary_PIALibraryTests_iOS.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 8221921A24CEBA0800C24F1C /* NMT */ = { - isa = PBXGroup; - children = ( - 8221921B24CEBA3800C24F1C /* NMTRules.swift */, - 8221921E24CEBABA00C24F1C /* NMTType.swift */, - ); - path = NMT; - sourceTree = ""; - }; - 824D981C266A1A4900FCD7DA /* Staging */ = { - isa = PBXGroup; - children = ( - 824D981D266A1AC500FCD7DA /* staging.json */, - ); - path = Staging; - sourceTree = ""; - }; - 8276E173260B5EC500BB7B40 /* ServiceQuality */ = { - isa = PBXGroup; - children = ( - 8276E174260B5ED400BB7B40 /* ServiceQualityManager.swift */, - ); - path = ServiceQuality; - sourceTree = ""; - }; - 82FD5D542521F2B600E390CB /* Providers */ = { - isa = PBXGroup; - children = ( - 7E9D037E28479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift */, - 7E9D037D28479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift */, - 7E9D037F28479DCC00BE85DC /* PIACSIUserInformationProvider.swift */, - AA319C4C25833088004BECF6 /* PIACrashlabClientStateProvider.swift */, - AA319C4B25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift */, - AA319C4A25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift */, - 82FD5D552521F2DD00E390CB /* PIARegionClientStateProvider.swift */, - 82FD5D5D2521F30300E390CB /* PIAAccountClientStateProvider.swift */, - 82FD5D652521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift */, - 8276E1E5260B961B00BB7B40 /* PIAKPIClientStateProvider.swift */, - 8276E1EC260B962900BB7B40 /* PIAKPIStagingClientStateProvider.swift */, - ); - path = Providers; - sourceTree = ""; - }; - 84577FB9213D8EB2006DEC3D /* Styles */ = { - isa = PBXGroup; - children = ( - 84577FBA213D8ED1006DEC3D /* StyleGuideHelpers.swift */, - 84577FBC213D8EDD006DEC3D /* TextStyles.swift */, - 84577FBE213D8EE6006DEC3D /* ViewStyles.swift */, - ); - path = Styles; - sourceTree = ""; - }; - 84577FC6213E7D68006DEC3D /* ViewControllers */ = { - isa = PBXGroup; - children = ( - 7E9D038528479F9F00BE85DC /* AccessibilityIdentifiers.swift */, - 8289AD872685C1FC00DA6A17 /* GDPRViewController.swift */, - 8289AD862685C1FC00DA6A17 /* ShareDataInformationViewController.swift */, - 0EB8C0521F9CD38A005857E4 /* AutolayoutViewController.swift */, - 0EB8C0511F9CD38A005857E4 /* LoginViewController.swift */, - 0E48A8521FDAD60900B9A4C0 /* OptionsViewController.swift */, - 0EB8C0531F9CD38A005857E4 /* PIAWelcomeViewController.swift */, - 0EB8C0551F9CD38A005857E4 /* PurchaseViewController.swift */, - DDA184D022FC1F79003239CC /* TermsAndConditionsViewController.swift */, - 0EB8C0561F9CD38A005857E4 /* RestoreSignupViewController.swift */, - 0EB8C0571F9CD38A005857E4 /* SignupFailureViewController.swift */, - 0EB8C0581F9CD38A005857E4 /* SignupInProgressViewController.swift */, - 0EB8C0591F9CD38A005857E4 /* SignupInternetUnreachableViewController.swift */, - 0EB8C05A1F9CD38A005857E4 /* SignupSuccessViewController.swift */, - 0EB8C05B1F9CD38A005857E4 /* WelcomePageViewController.swift */, - DD31498E21834B3F008E26E8 /* GetStartedViewController.swift */, - DD8BF3CA219C6BAA0041357C /* ConfirmVPNPlanViewController.swift */, - 82183D7D25011D200033023F /* MagicLinkLoginViewController.swift */, - ); - path = ViewControllers; - sourceTree = ""; - }; - B81F68944904872213E4AFE3 /* Pods */ = { - isa = PBXGroup; - children = ( - E0DA4F82F77C7132D2A82078 /* Pods-PIALibrary-PIALibrary-iOS.debug.xcconfig */, - 10DD9676BB5539C7984C65D9 /* Pods-PIALibrary-PIALibrary-iOS.release.xcconfig */, - D9F51336EB1D7EC915A230E8 /* Pods-PIALibrary-PIALibraryHost-iOS.debug.xcconfig */, - 074169C08AFB53B68EB65334 /* Pods-PIALibrary-PIALibraryHost-iOS.release.xcconfig */, - 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */, - 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - DD6DC5BA21B6A8F200F9D538 /* Lottie */ = { - isa = PBXGroup; - children = ( - DD6DC5BB21B6A8FC00F9D538 /* pia-spinner.json */, - ); - path = Lottie; - sourceTree = ""; - }; - DDFCFAA521E900650081F235 /* Tiles */ = { - isa = PBXGroup; - children = ( - DDFCFAA721E924A70081F235 /* TileProvider.swift */, - DDFCFAAE21E925B60081F235 /* AvailableTiles.swift */, - DDFCFAAD21E925B60081F235 /* Tileable.swift */, - DDFCFAAC21E925B60081F235 /* TileableCell.swift */, - ); - path = Tiles; - sourceTree = ""; - }; - DDFCFAA621E9008E0081F235 /* Tiles */ = { - isa = PBXGroup; - children = ( - DDFCFAAA21E925160081F235 /* DefaultTileProvider.swift */, - ); - path = Tiles; - sourceTree = ""; - }; - DDFCFAB821E926750081F235 /* Util */ = { - isa = PBXGroup; - children = ( - DDFCFAB521E925F70081F235 /* EnumsBuilder.swift */, - DD86BAF021EF5B6D004A988F /* UIViewAutolayout.swift */, - ); - path = Util; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 0E7BC6D31F96B0AF0035C8B2 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E392DBA1FE34B5A0002160D /* NSString+URL.h in Headers */, - 0E392DB21FE33AF00002160D /* NSData+Compression.h in Headers */, - 0E2ADCDC1FE072ED00BB170C /* Pinger.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EBFFFD21F693F800009D4F4 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E392DB91FE34B5A0002160D /* NSString+URL.h in Headers */, - 0E392DB11FE3366B0002160D /* NSData+Compression.h in Headers */, - 0E2ADCDB1FE072ED00BB170C /* Pinger.h in Headers */, - 0E492C5B1FE5EA06007F23DF /* CMacros.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 0E2ADD1B1FE13B8600BB170C /* PIALibraryTests-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0E2ADD241FE13B8600BB170C /* Build configuration list for PBXNativeTarget "PIALibraryTests-macOS" */; - buildPhases = ( - 0E2ADD181FE13B8600BB170C /* Sources */, - 0E2ADD191FE13B8600BB170C /* Frameworks */, - 0E2ADD1A1FE13B8600BB170C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 0E2ADD231FE13B8600BB170C /* PBXTargetDependency */, - ); - name = "PIALibraryTests-macOS"; - productName = "PIALibraryTests-macOS"; - productReference = 0E2ADD1C1FE13B8600BB170C /* PIALibraryTests-macOS.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 0E7BC6D51F96B0AF0035C8B2 /* PIALibrary-macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0E7BC6DB1F96B0B00035C8B2 /* Build configuration list for PBXNativeTarget "PIALibrary-macOS" */; - buildPhases = ( - 0E7BC6D11F96B0AF0035C8B2 /* Sources */, - 0E7BC6D21F96B0AF0035C8B2 /* Frameworks */, - 0E7BC6D31F96B0AF0035C8B2 /* Headers */, - 0E7BC6D41F96B0AF0035C8B2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "PIALibrary-macOS"; - productName = "PIAClient-macOS"; - productReference = 0E7BC6D61F96B0AF0035C8B2 /* PIALibrary.framework */; - productType = "com.apple.product-type.framework"; - }; - 0EBFFFD41F693F800009D4F4 /* PIALibrary-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0EBFFFE91F693F800009D4F4 /* Build configuration list for PBXNativeTarget "PIALibrary-iOS" */; - buildPhases = ( - E105A1C28295BC4802E3EFB3 /* [CP] Check Pods Manifest.lock */, - 0EBFFFD01F693F800009D4F4 /* Sources */, - 0EBFFFD11F693F800009D4F4 /* Frameworks */, - 0EBFFFD21F693F800009D4F4 /* Headers */, - 0EBFFFD31F693F800009D4F4 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "PIALibrary-iOS"; - productName = PIAClient; - productReference = 0EBFFFD51F693F800009D4F4 /* PIALibrary.framework */; - productType = "com.apple.product-type.framework"; - }; - 0EE78AFC1F818A20002E4CDD /* PIALibraryTests-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0EE78B071F818A20002E4CDD /* Build configuration list for PBXNativeTarget "PIALibraryTests-iOS" */; - buildPhases = ( - 6878D421F1015190538AD6F5 /* [CP] Check Pods Manifest.lock */, - 0EE78AF91F818A20002E4CDD /* Sources */, - 0EE78AFA1F818A20002E4CDD /* Frameworks */, - 0EE78AFB1F818A20002E4CDD /* Resources */, - 3F481C5494B9F42C4058B529 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 0EE78B041F818A20002E4CDD /* PBXTargetDependency */, - 0EE78B1F1F818A36002E4CDD /* PBXTargetDependency */, - ); - name = "PIALibraryTests-iOS"; - productName = PIAClientTests; - productReference = 0EE78AFD1F818A20002E4CDD /* PIALibraryTests-iOS.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 0EE78B0B1F818A32002E4CDD /* PIALibraryHost-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0EE78B1B1F818A32002E4CDD /* Build configuration list for PBXNativeTarget "PIALibraryHost-iOS" */; - buildPhases = ( - 5D3BC8DB079E50BAF24FD991 /* [CP] Check Pods Manifest.lock */, - 0EE78B081F818A32002E4CDD /* Sources */, - 0EE78B091F818A32002E4CDD /* Frameworks */, - 0EE78B0A1F818A32002E4CDD /* Resources */, - EE7CC4EF5F9A3E7E652DB53C /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "PIALibraryHost-iOS"; - productName = PIAClientHost; - productReference = 0EE78B0C1F818A32002E4CDD /* PIALibraryHost-iOS.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0EBFFFCC1F693F800009D4F4 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = "London Trust Media"; - TargetAttributes = { - 0E2ADD1B1FE13B8600BB170C = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - }; - 0E7BC6D51F96B0AF0035C8B2 = { - CreatedOnToolsVersion = 9.0; - ProvisioningStyle = Automatic; - }; - 0EBFFFD41F693F800009D4F4 = { - CreatedOnToolsVersion = 9.0; - ProvisioningStyle = Automatic; - }; - 0EE78AFC1F818A20002E4CDD = { - CreatedOnToolsVersion = 9.0; - ProvisioningStyle = Automatic; - TestTargetID = 0EE78B0B1F818A32002E4CDD; - }; - 0EE78B0B1F818A32002E4CDD = { - CreatedOnToolsVersion = 9.0; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 1; - }; - com.apple.Keychain = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = 0EBFFFCF1F693F800009D4F4 /* Build configuration list for PBXProject "PIALibrary" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - it, - fr, - de, - "zh-Hans", - "zh-Hant", - ja, - "es-MX", - nl, - ko, - "pt-BR", - da, - nb, - ru, - pl, - tr, - th, - ar, - ); - mainGroup = 0EBFFFCB1F693F800009D4F4; - productRefGroup = 0EBFFFD61F693F800009D4F4 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 0EBFFFD41F693F800009D4F4 /* PIALibrary-iOS */, - 0E7BC6D51F96B0AF0035C8B2 /* PIALibrary-macOS */, - 0EE78AFC1F818A20002E4CDD /* PIALibraryTests-iOS */, - 0E2ADD1B1FE13B8600BB170C /* PIALibraryTests-macOS */, - 0EE78B0B1F818A32002E4CDD /* PIALibraryHost-iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 0E2ADD1A1FE13B8600BB170C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0E7BC6D41F96B0AF0035C8B2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 824D981F266A1AC500FCD7DA /* staging.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EBFFFD31F693F800009D4F4 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E7361E51FD9731F00706BFF /* Welcome.storyboard in Resources */, - 824D981E266A1AC500FCD7DA /* staging.json in Resources */, - 0E6B0A791FA4986D00EBB916 /* UI.strings in Resources */, - 0E7361B41FD9683B00706BFF /* Signup.strings in Resources */, - DD6DC5BC21B6A8FC00F9D538 /* pia-spinner.json in Resources */, - 0EB8C0831F9CE11A005857E4 /* UI.xcassets in Resources */, - 0E7361E61FD9731F00706BFF /* Signup.storyboard in Resources */, - 0E7361CF1FD96AF000706BFF /* Welcome.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EE78AFB1F818A20002E4CDD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 82C374F92514DE8200E391EE /* server.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EE78B0A1F818A32002E4CDD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0EE78B191F818A32002E4CDD /* LaunchScreen.storyboard in Resources */, - 0EE78B161F818A32002E4CDD /* Assets.xcassets in Resources */, - 0EE78B141F818A32002E4CDD /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3F481C5494B9F42C4058B529 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", - "${BUILT_PRODUCTS_DIR}/DynamicBlurView/DynamicBlurView.framework", - "${BUILT_PRODUCTS_DIR}/FXPageControl/FXPageControl.framework", - "${BUILT_PRODUCTS_DIR}/Gloss/Gloss.framework", - "${PODS_ROOT}/PIAAccountModule/build/cocoapods/framework/PIAAccount.framework", - "${BUILT_PRODUCTS_DIR}/PIAAccountModule/PIAAccountModule.framework", - "${PODS_ROOT}/PIACSIModule/build/cocoapods/framework/PIACSI.framework", - "${BUILT_PRODUCTS_DIR}/PIACSIModule/PIACSIModule.framework", - "${PODS_ROOT}/PIAKPIModule/build/cocoapods/framework/PIAKPI.framework", - "${BUILT_PRODUCTS_DIR}/PIAKPIModule/PIAKPIModule.framework", - "${PODS_ROOT}/PIARegionsModule/build/cocoapods/framework/PIARegions.framework", - "${BUILT_PRODUCTS_DIR}/PIARegionsModule/PIARegionsModule.framework", - "${BUILT_PRODUCTS_DIR}/PIAWireguard/PIAWireguard.framework", - "${BUILT_PRODUCTS_DIR}/PopupDialog/PopupDialog.framework", - "${BUILT_PRODUCTS_DIR}/QuickLayout/QuickLayout.framework", - "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework", - "${BUILT_PRODUCTS_DIR}/SwiftyBeaver/SwiftyBeaver.framework", - "${BUILT_PRODUCTS_DIR}/TunnelKit/TunnelKit.framework", - "${BUILT_PRODUCTS_DIR}/TweetNacl/TweetNacl.framework", - "${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Apple/openssl.framework/openssl", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DynamicBlurView.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FXPageControl.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Gloss.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAAccount.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAAccountModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIACSI.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIACSIModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAKPI.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAKPIModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIARegions.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIARegionsModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAWireguard.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PopupDialog.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QuickLayout.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftEntryKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyBeaver.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TunnelKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TweetNacl.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Lottie.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PIALibrary-PIALibraryTests-iOS/Pods-PIALibrary-PIALibraryTests-iOS-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 5D3BC8DB079E50BAF24FD991 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-PIALibrary-PIALibraryHost-iOS-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 6878D421F1015190538AD6F5 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-PIALibrary-PIALibraryTests-iOS-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - E105A1C28295BC4802E3EFB3 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-PIALibrary-PIALibrary-iOS-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - EE7CC4EF5F9A3E7E652DB53C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-PIALibrary-PIALibraryHost-iOS/Pods-PIALibrary-PIALibraryHost-iOS-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", - "${BUILT_PRODUCTS_DIR}/DynamicBlurView/DynamicBlurView.framework", - "${BUILT_PRODUCTS_DIR}/FXPageControl/FXPageControl.framework", - "${BUILT_PRODUCTS_DIR}/Gloss/Gloss.framework", - "${PODS_ROOT}/PIAAccountModule/build/cocoapods/framework/PIAAccount.framework", - "${BUILT_PRODUCTS_DIR}/PIAAccountModule/PIAAccountModule.framework", - "${PODS_ROOT}/PIACSIModule/build/cocoapods/framework/PIACSI.framework", - "${BUILT_PRODUCTS_DIR}/PIACSIModule/PIACSIModule.framework", - "${PODS_ROOT}/PIAKPIModule/build/cocoapods/framework/PIAKPI.framework", - "${BUILT_PRODUCTS_DIR}/PIAKPIModule/PIAKPIModule.framework", - "${PODS_ROOT}/PIARegionsModule/build/cocoapods/framework/PIARegions.framework", - "${BUILT_PRODUCTS_DIR}/PIARegionsModule/PIARegionsModule.framework", - "${BUILT_PRODUCTS_DIR}/PIAWireguard/PIAWireguard.framework", - "${BUILT_PRODUCTS_DIR}/PopupDialog/PopupDialog.framework", - "${BUILT_PRODUCTS_DIR}/QuickLayout/QuickLayout.framework", - "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/SwiftEntryKit/SwiftEntryKit.framework", - "${BUILT_PRODUCTS_DIR}/SwiftyBeaver/SwiftyBeaver.framework", - "${BUILT_PRODUCTS_DIR}/TunnelKit/TunnelKit.framework", - "${BUILT_PRODUCTS_DIR}/TweetNacl/TweetNacl.framework", - "${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Apple/openssl.framework/openssl", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DynamicBlurView.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FXPageControl.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Gloss.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAAccount.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAAccountModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIACSI.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIACSIModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAKPI.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAKPIModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIARegions.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIARegionsModule.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PIAWireguard.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PopupDialog.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QuickLayout.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftEntryKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyBeaver.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TunnelKit.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TweetNacl.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Lottie.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PIALibrary-PIALibraryHost-iOS/Pods-PIALibrary-PIALibraryHost-iOS-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 0E2ADD181FE13B8600BB170C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E2ADD291FE13C3B00BB170C /* ServerTests.swift in Sources */, - 843C67C32122EA13005A3FDA /* AccountInfoTests.swift in Sources */, - 0E2ADD461FE1583A00BB170C /* VPNTests.swift in Sources */, - 0E53A85B1FE5E3CD000C2A18 /* MockProviders.swift in Sources */, - 0E2ADD281FE13C3B00BB170C /* AccountTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0E7BC6D11F96B0AF0035C8B2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E492C5F1FE5F7C0007F23DF /* MockAccountProvider.swift in Sources */, - 82CDC2E3257A5B440001669D /* DateUtil.swift in Sources */, - 0E392DBC1FE34B5A0002160D /* NSString+URL.m in Sources */, - 84125E0C213D7E0E001BCC19 /* PIAFonts.swift in Sources */, - 0E3D13DA1F9E273300434A48 /* GlossSignup.swift in Sources */, - 0E7BC6EB1F96B1040035C8B2 /* PIAWebServices.swift in Sources */, - 829EB6402535C432003E74DD /* DedicatedIP.swift in Sources */, - 0E245C9E1FECF0C20010DEF2 /* ClientAccess.swift in Sources */, - DD2683EA24617F0300C65DAA /* PingTask.swift in Sources */, - 821674F8267A47670028E4FD /* LibraryConstants.swift in Sources */, - 0E9D62D21FDEBBC8009A90CF /* GlossServersBundle.swift in Sources */, - 0E7BC6FB1F96B1120035C8B2 /* LibraryCallback.swift in Sources */, - 0E3D13D41F9E270A00434A48 /* GlossAccountInfo.swift in Sources */, - 0E9D62D31FDEBBFD009A90CF /* GlossServer.swift in Sources */, - 8289AD8B2685C1FC00DA6A17 /* GDPRViewController.swift in Sources */, - AA319C4E25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift in Sources */, - 82FD5D672521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift in Sources */, - 82C4962A25642D5800233CB1 /* String+Random.swift in Sources */, - 0E9D62DB1FDEE3FE009A90CF /* ServerProvider.swift in Sources */, - 0E7BC6FA1F96B1120035C8B2 /* Notification+Core.swift in Sources */, - 0EA4C4321FDDD48F0041C3D8 /* Server.swift in Sources */, - 0E7BC6F81F96B1120035C8B2 /* Plan.swift in Sources */, - 0E2ADCFE1FE1372D00BB170C /* ServersPinger.swift in Sources */, - 0E2ADD501FE15C2200BB170C /* VPNConfiguration.swift in Sources */, - 0E2ADCFD1FE1372400BB170C /* ConnectivityDaemon.swift in Sources */, - 0E7BC6F51F96B1120035C8B2 /* Credentials.swift in Sources */, - 0E2ADCCB1FE06D7A00BB170C /* Array+Math.swift in Sources */, - DD36CB7F21CD000200FC815A /* CAGradientLayer+Image.swift in Sources */, - 82FD5D5F2521F30300E390CB /* PIAAccountClientStateProvider.swift in Sources */, - 82E20B1224F652ED0065EFE3 /* AccountInfo+Kotlin.swift in Sources */, - 0E7BC6EE1F96B1120035C8B2 /* AccountProvider.swift in Sources */, - 841BE610212AFE69002EF2D1 /* GiftCardUtil.swift in Sources */, - 0E7BC6F61F96B1120035C8B2 /* AccountInfo.swift in Sources */, - DDFCFAB721E925F70081F235 /* EnumsBuilder.swift in Sources */, - 84125E09213D7E04001BCC19 /* PIAColors.swift in Sources */, - 0E3D13D71F9E272B00434A48 /* GlossPayment.swift in Sources */, - 0E2ADD491FE1595300BB170C /* IPSecProfile.swift in Sources */, - 0E7BC6F41F96B1120035C8B2 /* SecureStore.swift in Sources */, - 8289AD892685C1FC00DA6A17 /* ShareDataInformationViewController.swift in Sources */, - 8221922024CEBABA00C24F1C /* NMTType.swift in Sources */, - 0EFEB4C3200778BC00F81029 /* NSData+Compression.m in Sources */, - 0EFEB4C520077AC900F81029 /* PIATunnelProfile.swift in Sources */, - DDA4A7BF21F5C31B00A02ACD /* IKEv2Profile.swift in Sources */, - 0E2ADD3B1FE14F8600BB170C /* VPNProfile.swift in Sources */, - 0EFDC1CF1FE36D45007C0B9B /* Validator.swift in Sources */, - 0E7BC6E91F96B1040035C8B2 /* DefaultAccountProvider.swift in Sources */, - 0E7BC6F21F96B1120035C8B2 /* UpdateAccountRequest.swift in Sources */, - 0E53A83F1FE5A4C8000C2A18 /* Client+Daemons.swift in Sources */, - 0EFDC1CE1FE36D45007C0B9B /* Restylable.swift in Sources */, - 0E392DA41FE3247E0002160D /* Endpoint.swift in Sources */, - 0EE7710A1F9D21020029A77B /* Payment.swift in Sources */, - 0E7BC6ED1F96B1040035C8B2 /* UserDefaultsStore.swift in Sources */, - DDFCFAB221E925BB0081F235 /* AvailableTiles.swift in Sources */, - 0E2ADD341FE1472F00BB170C /* VPNStatus.swift in Sources */, - 0EB3D9891FF06F37005B11F4 /* NetworkExtensionProfile.swift in Sources */, - DDFCFABB21E929660081F235 /* MockTileProvider.swift in Sources */, - 0E392D901FE2FBBE0002160D /* GlossConnectivityStatus.swift in Sources */, - 0EE771041F9D0DCA0029A77B /* Client+Configuration.swift in Sources */, - 0E7BC6E81F96B1000035C8B2 /* Client+Preferences.swift in Sources */, - DDD824E82189C0EE00151709 /* BrandableNavigationBar.swift in Sources */, - 0E53A8571FE5DA16000C2A18 /* MockInAppProvider.swift in Sources */, - DDFCFAA921E924AD0081F235 /* TileProvider.swift in Sources */, - 0E392D9E1FE31D630002160D /* MockVPNProvider.swift in Sources */, - 0E3A35331FD9E97E000B0F99 /* Macros.swift in Sources */, - 0EE261E11FEFD69F00E11955 /* Notification+Library.swift in Sources */, - DD76292F21ECEC3F0092DF50 /* DataManipulation.swift in Sources */, - 0E7BC6EF1F96B1120035C8B2 /* LoginRequest.swift in Sources */, - 0EA8072820A1A0090033EC1A /* Redeem.swift in Sources */, - 0E492C651FE5F949007F23DF /* MockServerProvider.swift in Sources */, - DDFCFAB421E925BB0081F235 /* TileableCell.swift in Sources */, - 0E53A84E1FE5BB25000C2A18 /* VPNDaemon.swift in Sources */, - 0EFEB4C420077AC900F81029 /* PIATunnelProvider+Profile.swift in Sources */, - DDFCFAB321E925BB0081F235 /* Tileable.swift in Sources */, - 0E2ADCEA1FE0843000BB170C /* Macros+Pinger.swift in Sources */, - 0E7BC6F71F96B1120035C8B2 /* WebServices.swift in Sources */, - 0E7BC6E71F96B1000035C8B2 /* ClientError.swift in Sources */, - 0E53A8541FE5D73F000C2A18 /* Client+Mock.swift in Sources */, - 0E2ADCDE1FE072ED00BB170C /* Pinger.m in Sources */, - 0EB9667F1FDF36490086ABC2 /* GlossParser.swift in Sources */, - 0EB3D9831FF02FE5005B11F4 /* VPNAction.swift in Sources */, - 0EBBC6DD1F9F64E700B8BD21 /* Client+Environment.swift in Sources */, - 0E3D13CE1F9DDD2400434A48 /* NotificationKey.swift in Sources */, - AA319C5225833088004BECF6 /* PIACrashlabClientStateProvider.swift in Sources */, - 0E7BC6EC1F96B1040035C8B2 /* KeychainStore.swift in Sources */, - 0E392D7B1FE2E47D0002160D /* TransientStore.swift in Sources */, - 0EA8073020A1E7C60033EC1A /* GlossRedeem.swift in Sources */, - AA319C5025833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift in Sources */, - 0E53A8551FE5D770000C2A18 /* MockWebServices.swift in Sources */, - 0E7BC6F91F96B1120035C8B2 /* Signup.swift in Sources */, - 0E492C6B1FE61485007F23DF /* Client+Database.swift in Sources */, - 0E2ADD351FE1473600BB170C /* VPNProvider.swift in Sources */, - 0E392DA11FE323ED0002160D /* PIAWebServices+Ephemeral.swift in Sources */, - 0E3D13D11F9E26FD00434A48 /* GlossCredentials.swift in Sources */, - 0E53A8481FE5BA0B000C2A18 /* ServersDaemon.swift in Sources */, - 0E53A84B1FE5BA52000C2A18 /* Daemon.swift in Sources */, - DD8C3E622327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift in Sources */, - 0EA4C43A1FDDE24B0041C3D8 /* ServersBundle.swift in Sources */, - 0E7BC6F31F96B1120035C8B2 /* PlainStore.swift in Sources */, - 0E392D8D1FE2F8780002160D /* ConnectivityStatus.swift in Sources */, - 0E7BC6DF1F96B0F40035C8B2 /* Keychain.swift in Sources */, - 0EA8072D20A1C7A30033EC1A /* RedeemRequest.swift in Sources */, - 8221921D24CEBA3800C24F1C /* NMTRules.swift in Sources */, - 0E9D62DE1FDEE45A009A90CF /* DefaultServerProvider.swift in Sources */, - 82183D8025011D200033023F /* MagicLinkLoginViewController.swift in Sources */, - DD8C3E652327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift in Sources */, - 0EF14E4C1FEAE6350007485A /* Client+Providers.swift in Sources */, - 0E7BC6E61F96B1000035C8B2 /* Client.swift in Sources */, - 82CAB809255A9ACB00BB08EF /* InAppMessage.swift in Sources */, - 0E392D7E1FE2E4C10002160D /* MemoryStore.swift in Sources */, - DD76292921ECDFF80092DF50 /* Usage.swift in Sources */, - 0E2ADD381FE14F0000BB170C /* DefaultVPNProvider.swift in Sources */, - 82FD5D572521F2DD00E390CB /* PIARegionClientStateProvider.swift in Sources */, - 0E75D8D41F9E3F9F00658D1E /* UserAccount.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EBFFFD01F693F800009D4F4 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84577FBD213D8EDD006DEC3D /* TextStyles.swift in Sources */, - 0E3D13CD1F9DDD2400434A48 /* NotificationKey.swift in Sources */, - 0EB8C06B1F9CD38B005857E4 /* RestoreSignupViewController.swift in Sources */, - DD1AB10123FAD79000396E74 /* PIAPageControl.swift in Sources */, - 0EAA38931F9CC682000149CF /* SignupRequest.swift in Sources */, - 0E392DB01FE3366B0002160D /* NSData+Compression.m in Sources */, - 0E53A84D1FE5BB25000C2A18 /* VPNDaemon.swift in Sources */, - 84577FBB213D8ED1006DEC3D /* StyleGuideHelpers.swift in Sources */, - 82FD5D5E2521F30300E390CB /* PIAAccountClientStateProvider.swift in Sources */, - DD314991218350D1008E26E8 /* SwiftGen+SeguesStoryboards.swift in Sources */, - 0EB8C0701F9CD38B005857E4 /* WelcomePageViewController.swift in Sources */, - DD0AC790218715B8009B576B /* PIAButton.swift in Sources */, - 0EB8C0651F9CD38B005857E4 /* BorderedTextField.swift in Sources */, - DD76292E21ECEC3F0092DF50 /* DataManipulation.swift in Sources */, - DDFCFABA21E929660081F235 /* MockTileProvider.swift in Sources */, - 0EA4C4391FDDE24B0041C3D8 /* ServersBundle.swift in Sources */, - 82C4962925642D5800233CB1 /* String+Random.swift in Sources */, - 0E53A84A1FE5BA52000C2A18 /* Daemon.swift in Sources */, - 0E492C641FE5F949007F23DF /* MockServerProvider.swift in Sources */, - 0E53A8471FE5BA0B000C2A18 /* ServersDaemon.swift in Sources */, - 0EE78AF81F818815002E4CDD /* AccountInfo.swift in Sources */, - DD8C3E642327EF6000BAD18E /* IKEv2EncryptionAlgorithm.swift in Sources */, - DDFCFAAF21E925B60081F235 /* TileableCell.swift in Sources */, - DDFCFAB621E925F70081F235 /* EnumsBuilder.swift in Sources */, - 0EFB512A1F82D45F0033B81F /* DefaultAccountProvider.swift in Sources */, - 0E3D13D91F9E273300434A48 /* GlossSignup.swift in Sources */, - 84577FBF213D8EE6006DEC3D /* ViewStyles.swift in Sources */, - 0E0E5B0F1F8297C500022CD0 /* SecureStore.swift in Sources */, - DD6FB0372224355600A84F05 /* UIDevice+WiFi.swift in Sources */, - 0EAA388B1F9CC4C4000149CF /* InAppProduct.swift in Sources */, - DD56E3F6225F5D77002EDFB2 /* Product.swift in Sources */, - DD314990218350D1008E26E8 /* SwiftGen+ScenesStoryboards.swift in Sources */, - 0EAA388D1F9CC4C4000149CF /* InAppTransaction.swift in Sources */, - 0E4D4E9E1FA4CA7A007DA6DA /* PurchasePlan.swift in Sources */, - DD58F4BB21AEB99C00D043F7 /* GlossToken.swift in Sources */, - DD1AB10323FAD83900396E74 /* WalkthroughPageView.swift in Sources */, - 0E2215CF2008DFD900F5FB4D /* SwiftGen+Assets.swift in Sources */, - 0EE78AF21F8187F8002E4CDD /* LoginRequest.swift in Sources */, - DDD824E72189C0E800151709 /* BrandableNavigationBar.swift in Sources */, - 84125E08213D7DFF001BCC19 /* PIAColors.swift in Sources */, - DD2F4AD1248A6D4D00A2F6D8 /* LoginReceiptRequest.swift in Sources */, - 0EE78AF01F818767002E4CDD /* ClientError.swift in Sources */, - 0E0E5B151F829EC500022CD0 /* UpdateAccountRequest.swift in Sources */, - 0E392D8F1FE2FBBE0002160D /* GlossConnectivityStatus.swift in Sources */, - 0EB8C06F1F9CD38B005857E4 /* SignupSuccessViewController.swift in Sources */, - 0E492C5E1FE5F7C0007F23DF /* MockAccountProvider.swift in Sources */, - 82FD5D662521F32B00E390CB /* PIAAccountStagingClientStateProvider.swift in Sources */, - 0E2ADCDD1FE072ED00BB170C /* Pinger.m in Sources */, - 0EB8C0721F9CD38B005857E4 /* Macros+UI.swift in Sources */, - 0E3D13D01F9E26FD00434A48 /* GlossCredentials.swift in Sources */, - 0EB8C06A1F9CD38B005857E4 /* PurchaseViewController.swift in Sources */, - 0E392DA01FE323ED0002160D /* PIAWebServices+Ephemeral.swift in Sources */, - 0EE1068E1F828813009514E9 /* Signup.swift in Sources */, - 0E392D8C1FE2F8780002160D /* ConnectivityStatus.swift in Sources */, - DD31498F21834B3F008E26E8 /* GetStartedViewController.swift in Sources */, - 0E5BCBFF20172C8300E3E4B4 /* Theme+LightPalette.swift in Sources */, - DDFCFAAB21E925160081F235 /* DefaultTileProvider.swift in Sources */, - DD86BAF121EF5B6D004A988F /* UIViewAutolayout.swift in Sources */, - 0EC849C91F82329F002480CA /* WebServices.swift in Sources */, - 0E9D62711FDE83BD009A90CF /* GlossServer.swift in Sources */, - 0EE14D1B1FF16B39008D9AC2 /* InvalidatingFlowLayout.swift in Sources */, - 82CAB808255A9ACB00BB08EF /* InAppMessage.swift in Sources */, - 82183D7F25011D200033023F /* MagicLinkLoginViewController.swift in Sources */, - 354B015F27732095000A73B4 /* NavigationBar+Appearence.swift in Sources */, - 0EE1068C1F8250A1009514E9 /* Plan.swift in Sources */, - DD36CB7E21CCFFFB00FC815A /* CAGradientLayer+Image.swift in Sources */, - 0EBBC6DC1F9F64E700B8BD21 /* Client+Environment.swift in Sources */, - 7E9D038C2847A8FC00BE85DC /* WhitelistUtil.swift in Sources */, - 0EB3D9821FF02FE5005B11F4 /* VPNAction.swift in Sources */, - 0E2ADD371FE14F0000BB170C /* DefaultVPNProvider.swift in Sources */, - 829EB63F2535C432003E74DD /* DedicatedIP.swift in Sources */, - 0EA8073220A2F50A0033EC1A /* SignupMetadata.swift in Sources */, - 0E4D4E9F1FA4CA7A007DA6DA /* Restylable.swift in Sources */, - AA319C5125833088004BECF6 /* PIACrashlabClientStateProvider.swift in Sources */, - 0EB8C06E1F9CD38B005857E4 /* SignupInternetUnreachableViewController.swift in Sources */, - 0E75D8D31F9E3F9F00658D1E /* UserAccount.swift in Sources */, - 7E9D038228479DCC00BE85DC /* PIACSIUserInformationProvider.swift in Sources */, - 0EB8C0691F9CD38B005857E4 /* PurchasePlanCell.swift in Sources */, - 0EA8072F20A1E7C60033EC1A /* GlossRedeem.swift in Sources */, - 0EA4C4311FDDD48F0041C3D8 /* Server.swift in Sources */, - DD56E3F4225F5D22002EDFB2 /* GlossProduct.swift in Sources */, - 8276E175260B5ED400BB7B40 /* ServiceQualityManager.swift in Sources */, - 7E9D038828479FB200BE85DC /* AccessibilityIdentifiers.swift in Sources */, - DD7411A923EC35B40058CEF3 /* PIAWGTunnelProfile.swift in Sources */, - 84577FC5213D9B4D006DEC3D /* UILabel+LineHeight.swift in Sources */, - 0EB9667E1FDF36490086ABC2 /* GlossParser.swift in Sources */, - DDA4A7BE21F5C31400A02ACD /* IKEv2Profile.swift in Sources */, - 0EAA38991F9CC7E4000149CF /* AppStoreTransaction.swift in Sources */, - 82E20B1124F652ED0065EFE3 /* AccountInfo+Kotlin.swift in Sources */, - 0EA8072720A1A0090033EC1A /* Redeem.swift in Sources */, - DDFCFAB121E925B60081F235 /* AvailableTiles.swift in Sources */, - 84125E0B213D7E0E001BCC19 /* PIAFonts.swift in Sources */, - 0EAA38981F9CC7E4000149CF /* AppStoreProduct.swift in Sources */, - 0E1743131F82E1A4001E7DD6 /* Client.swift in Sources */, - 0EE771031F9D0DCA0029A77B /* Client+Configuration.swift in Sources */, - DDD824E5218996CD00151709 /* Pages.swift in Sources */, - 0E0E5B131F8297DE00022CD0 /* KeychainStore.swift in Sources */, - 0E0E5B0D1F8297BD00022CD0 /* PlainStore.swift in Sources */, - DDF7F73F2405846800A671C7 /* PIAWGTunnelProvider+Profile.swift in Sources */, - 0EE78AEE1F818720002E4CDD /* LibraryCallback.swift in Sources */, - 0E53A8561FE5D770000C2A18 /* MockWebServices.swift in Sources */, - DDA184D122FC1F79003239CC /* TermsAndConditionsViewController.swift in Sources */, - 0E392D7D1FE2E4C10002160D /* MemoryStore.swift in Sources */, - 0E9D62DD1FDEE45A009A90CF /* DefaultServerProvider.swift in Sources */, - 82C374FB2514DEC700E391EE /* EndpointManager.swift in Sources */, - 0EB3D9881FF06F37005B11F4 /* NetworkExtensionProfile.swift in Sources */, - 0E2ADD311FE1468400BB170C /* VPNProvider.swift in Sources */, - 0E1108951F77B6B600A92462 /* Keychain.swift in Sources */, - 0EB8C0711F9CD38B005857E4 /* Theme.swift in Sources */, - 8221921C24CEBA3800C24F1C /* NMTRules.swift in Sources */, - 0E2ADCF01FE09C6C00BB170C /* ConnectivityDaemon.swift in Sources */, - 0EAA38971F9CC7E4000149CF /* AppStoreProvider.swift in Sources */, - AA319C4D25833088004BECF6 /* PIACrashlabRegionInformationProvider.swift in Sources */, - 0EB8C0661F9CD38B005857E4 /* LoginViewController.swift in Sources */, - 0EA8072C20A1C7A30033EC1A /* RedeemRequest.swift in Sources */, - 0EC7A2A41F9D3D78006DDB91 /* RenewRequest.swift in Sources */, - DD58F4BD21AEF76100D043F7 /* String+Components.swift in Sources */, - 0EE771091F9D21020029A77B /* Payment.swift in Sources */, - 0E53A8531FE5D73F000C2A18 /* Client+Mock.swift in Sources */, - 0E392D9D1FE31D630002160D /* MockVPNProvider.swift in Sources */, - 7E9D038028479DCC00BE85DC /* PIACSILastKnownExceptionProvider.swift in Sources */, - 0E9D62DA1FDEE3FE009A90CF /* ServerProvider.swift in Sources */, - DD76292821ECDFF80092DF50 /* Usage.swift in Sources */, - 0E2ADD3A1FE14F8600BB170C /* VPNProfile.swift in Sources */, - 0E492C5C1FE5EA06007F23DF /* CMacros.m in Sources */, - DD6768E322FAB19D00B9FDD0 /* AppStoreInformation.swift in Sources */, - 0EB8C0671F9CD38B005857E4 /* AutolayoutViewController.swift in Sources */, - 0E3D13D31F9E270A00434A48 /* GlossAccountInfo.swift in Sources */, - 0E245C9D1FECF0C20010DEF2 /* ClientAccess.swift in Sources */, - 0EF14E4B1FEAE6350007485A /* Client+Providers.swift in Sources */, - 8289AD882685C1FC00DA6A17 /* ShareDataInformationViewController.swift in Sources */, - DD2683E924617F0300C65DAA /* PingTask.swift in Sources */, - 84577FC1213D9A23006DEC3D /* UIImage+Color.swift in Sources */, - 82FD5D562521F2DD00E390CB /* PIARegionClientStateProvider.swift in Sources */, - 0E38E4101FF81722008223AB /* Notification+UI.swift in Sources */, - 0EB8C0481F9CCE07005857E4 /* Macros.swift in Sources */, - 84577FC3213D9AEA006DEC3D /* UITextField+PlaceholderColor.swift in Sources */, - 0EFEB4C12007784A00F81029 /* PIATunnelProvider+Profile.swift in Sources */, - 7E9D038128479DCC00BE85DC /* PIACSIDeviceInformationProvider.swift in Sources */, - DD8C3E612327EF4C00BAD18E /* IKEv2IntegrityAlgorithm.swift in Sources */, - 0E392DA31FE3247E0002160D /* Endpoint.swift in Sources */, - 82CDC2E2257A5B440001669D /* DateUtil.swift in Sources */, - 0E53A8581FE5DA16000C2A18 /* MockInAppProvider.swift in Sources */, - 822BC1D024BF20C90041BF9A /* UIControl+Action.swift in Sources */, - DDD824E32189969400151709 /* Preset.swift in Sources */, - 0E9D62721FDE83BD009A90CF /* GlossServersBundle.swift in Sources */, - 0E492C6A1FE61485007F23DF /* Client+Database.swift in Sources */, - 0E48A8531FDAD60900B9A4C0 /* OptionsViewController.swift in Sources */, - 0EB8C06C1F9CD38B005857E4 /* SignupFailureViewController.swift in Sources */, - 841BE60F212AFE49002EF2D1 /* GiftCardUtil.swift in Sources */, - 0EB8C0681F9CD38B005857E4 /* PIAWelcomeViewController.swift in Sources */, - 0E2ADD481FE1595300BB170C /* IPSecProfile.swift in Sources */, - 0EFB51271F82A5F80033B81F /* Notification+Core.swift in Sources */, - 0EE261E01FEFD69F00E11955 /* Notification+Library.swift in Sources */, - 821674F7267A47670028E4FD /* LibraryConstants.swift in Sources */, - 0EFEB4C22007784A00F81029 /* PIATunnelProfile.swift in Sources */, - DD1AB10523FC280000396E74 /* DeviceModel.swift in Sources */, - 7E9D038428479DE100BE85DC /* TimeInterval+Date.swift in Sources */, - 0E392DBB1FE34B5A0002160D /* NSString+URL.m in Sources */, - AA319C4F25833088004BECF6 /* PIACrashlabProtocolInformationProvider.swift in Sources */, - 8276E1E6260B961C00BB7B40 /* PIAKPIClientStateProvider.swift in Sources */, - 0E2ADCCA1FE06D7A00BB170C /* Array+Math.swift in Sources */, - 0E2ADD331FE1472F00BB170C /* VPNStatus.swift in Sources */, - 0E0F95961FD560C40046DC64 /* CircleProgressView.swift in Sources */, - DD6DC5B921B6A83400F9D538 /* UIViewLoading.swift in Sources */, - 0E2ADCF11FE09C6C00BB170C /* ServersPinger.swift in Sources */, - 0E2ADD4F1FE15C2200BB170C /* VPNConfiguration.swift in Sources */, - 8289AD8A2685C1FC00DA6A17 /* GDPRViewController.swift in Sources */, - 0EA7065F1F80F448001E4F88 /* AccountProvider.swift in Sources */, - 0E392D7A1FE2E47D0002160D /* TransientStore.swift in Sources */, - 8221921F24CEBABA00C24F1C /* NMTType.swift in Sources */, - 0EAA388C1F9CC4C4000149CF /* InAppProvider.swift in Sources */, - DDFCFAA821E924A70081F235 /* TileProvider.swift in Sources */, - 0EB8C06D1F9CD38B005857E4 /* SignupInProgressViewController.swift in Sources */, - 8276E1ED260B962900BB7B40 /* PIAKPIStagingClientStateProvider.swift in Sources */, - 0ED1585A1FDC083F008F6522 /* SwiftGen+Strings.swift in Sources */, - 0E2ADCE91FE0843000BB170C /* Macros+Pinger.swift in Sources */, - DDD824EA2189CD5700151709 /* NavigationLogoView.swift in Sources */, - 0EFB512E1F82D7C50033B81F /* PIAWebServices.swift in Sources */, - 0EB8C0641F9CD38B005857E4 /* ActivityButton.swift in Sources */, - 7E9D038628479F9F00BE85DC /* AccessibilityIdentifiers.swift in Sources */, - 0ED2B5131F82444E00C9DB2B /* Client+Preferences.swift in Sources */, - 0EE78AF61F81880E002E4CDD /* Credentials.swift in Sources */, - DD8BF3CB219C6BAA0041357C /* ConfirmVPNPlanViewController.swift in Sources */, - 0E53A83E1FE5A4C8000C2A18 /* Client+Daemons.swift in Sources */, - DDFCFAB021E925B60081F235 /* Tileable.swift in Sources */, - 0E4D4EA01FA4CA7A007DA6DA /* Validator.swift in Sources */, - 0E0E5B111F8297D200022CD0 /* UserDefaultsStore.swift in Sources */, - 0E3D13D61F9E272B00434A48 /* GlossPayment.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EE78AF91F818A20002E4CDD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E53A85A1FE5E3CD000C2A18 /* MockProviders.swift in Sources */, - 841BE60D212AD0F3002EF2D1 /* ValidatorTests.swift in Sources */, - 82C374F82514DE7D00E391EE /* EndpointManagerTests.swift in Sources */, - 843C67C22122E714005A3FDA /* AccountInfoTests.swift in Sources */, - 0EE78B001F818A20002E4CDD /* AccountTests.swift in Sources */, - 82DDD5302539CFDC0049E79E /* DIPTokenKeychainTests.swift in Sources */, - 0EA4C4421FDDFD840041C3D8 /* ServerTests.swift in Sources */, - 0EB8C0461F9CCB7C005857E4 /* AccountSignupTests.swift in Sources */, - 0E2ADD451FE1583A00BB170C /* VPNTests.swift in Sources */, - 841BE612212AFFA7002EF2D1 /* GiftCardUtilTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0EE78B081F818A32002E4CDD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0EE78B111F818A32002E4CDD /* ViewController.swift in Sources */, - 0EE78B0F1F818A32002E4CDD /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 0E2ADD231FE13B8600BB170C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 0E7BC6D51F96B0AF0035C8B2 /* PIALibrary-macOS */; - targetProxy = 0E2ADD221FE13B8600BB170C /* PBXContainerItemProxy */; - }; - 0EE78B041F818A20002E4CDD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 0EBFFFD41F693F800009D4F4 /* PIALibrary-iOS */; - targetProxy = 0EE78B031F818A20002E4CDD /* PBXContainerItemProxy */; - }; - 0EE78B1F1F818A36002E4CDD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 0EE78B0B1F818A32002E4CDD /* PIALibraryHost-iOS */; - targetProxy = 0EE78B1E1F818A36002E4CDD /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 0E6B0A771FA4986D00EBB916 /* UI.strings */ = { - isa = PBXVariantGroup; - children = ( - 0E6B0A781FA4986D00EBB916 /* en */, - 0E4D4EC81FA5C409007DA6DA /* it */, - 0E7361A21FD938B200706BFF /* fr */, - 0E7361A31FD938B400706BFF /* de */, - 0E7361A41FD938B500706BFF /* zh-Hans */, - 0E7361A51FD938B600706BFF /* zh-Hant */, - 0E7361A61FD938B800706BFF /* ja */, - 0E7361A71FD938B900706BFF /* es-MX */, - 0E7361A81FD938BA00706BFF /* nl */, - 0E7361A91FD938BC00706BFF /* ko */, - 0E7361AA1FD938BD00706BFF /* pt-BR */, - 0E7361AB1FD938BE00706BFF /* da */, - 0E7361AC1FD938BF00706BFF /* nb */, - 0E7361AD1FD938C100706BFF /* ru */, - 0E7361AE1FD938C200706BFF /* pl */, - 0E7361AF1FD938C300706BFF /* tr */, - 0E7361B01FD938C400706BFF /* th */, - 0E7361B11FD938C700706BFF /* ar */, - ); - name = UI.strings; - sourceTree = ""; - }; - 0E7361B21FD9683B00706BFF /* Signup.strings */ = { - isa = PBXVariantGroup; - children = ( - 0E7361BB1FD96A0800706BFF /* en */, - 0E7361BC1FD96A1000706BFF /* it */, - 0E7361BD1FD96A1100706BFF /* fr */, - 0E7361BE1FD96A1300706BFF /* de */, - 0E7361BF1FD96A1500706BFF /* zh-Hans */, - 0E7361C01FD96A1600706BFF /* zh-Hant */, - 0E7361C11FD96A1700706BFF /* ja */, - 0E7361C21FD96A1900706BFF /* es-MX */, - 0E7361C31FD96A1A00706BFF /* nl */, - 0E7361C41FD96A1B00706BFF /* ko */, - 0E7361C51FD96A1C00706BFF /* pt-BR */, - 0E7361C61FD96A1D00706BFF /* da */, - 0E7361C71FD96A1E00706BFF /* nb */, - 0E7361C81FD96A1E00706BFF /* ru */, - 0E7361C91FD96A1F00706BFF /* pl */, - 0E7361CA1FD96A2100706BFF /* tr */, - 0E7361CB1FD96A2200706BFF /* th */, - 0E7361CC1FD96A2300706BFF /* ar */, - ); - name = Signup.strings; - sourceTree = ""; - }; - 0E7361D11FD96AF000706BFF /* Welcome.strings */ = { - isa = PBXVariantGroup; - children = ( - 0E7361D01FD96AF000706BFF /* en */, - 0E7361D21FD96B0900706BFF /* it */, - 0E7361D31FD96B0B00706BFF /* fr */, - 0E7361D41FD96B1000706BFF /* de */, - 0E7361D51FD96B1100706BFF /* zh-Hans */, - 0E7361D61FD96B1300706BFF /* zh-Hant */, - 0E7361D71FD96B1400706BFF /* ja */, - 0E7361D81FD96B1500706BFF /* es-MX */, - 0E7361D91FD96B1600706BFF /* nl */, - 0E7361DA1FD96B1800706BFF /* ko */, - 0E7361DB1FD96B1900706BFF /* pt-BR */, - 0E7361DC1FD96B1A00706BFF /* da */, - 0E7361DD1FD96B1B00706BFF /* nb */, - 0E7361DE1FD96B1C00706BFF /* ru */, - 0E7361DF1FD96B1D00706BFF /* pl */, - 0E7361E01FD96B1E00706BFF /* tr */, - 0E7361E11FD96B1F00706BFF /* th */, - 0E7361E21FD96B2100706BFF /* ar */, - ); - name = Welcome.strings; - sourceTree = ""; - }; - 0EE78B121F818A32002E4CDD /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 0EE78B131F818A32002E4CDD /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 0EE78B171F818A32002E4CDD /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 0EE78B181F818A32002E4CDD /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 0E2ADD251FE13B8600BB170C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "PIALibraryTests/Info-macOS.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "com.privateinternetaccess.apple.PIALibraryTests-macOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 0E2ADD261FE13B8600BB170C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = "PIALibraryTests/Info-macOS.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = "com.privateinternetaccess.apple.PIALibraryTests-macOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 0E7BC6DC1F96B0B00035C8B2 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = PIALibrary/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibrary; - PRODUCT_NAME = PIALibrary; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = "$(SRCROOT)/PIALibrary/Sources/Util/macOS"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 0E7BC6DD1F96B0B00035C8B2 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = PIALibrary/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibrary; - PRODUCT_NAME = PIALibrary; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = "$(SRCROOT)/PIALibrary/Sources/Util/macOS"; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 0EBFFFE71F693F800009D4F4 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - 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_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 = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = 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; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 0EBFFFE81F693F800009D4F4 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - 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_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 = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = 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; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 0EBFFFEA1F693F800009D4F4 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E0DA4F82F77C7132D2A82078 /* Pods-PIALibrary-PIALibrary-iOS.debug.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = YES; - INFOPLIST_FILE = PIALibrary/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 2.9.0; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibrary; - PRODUCT_NAME = PIALibrary; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = "$(SRCROOT)/PIALibrary/Sources/Util/iOS"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 0EBFFFEB1F693F800009D4F4 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 10DD9676BB5539C7984C65D9 /* Pods-PIALibrary-PIALibrary-iOS.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = YES; - INFOPLIST_FILE = PIALibrary/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 2.9.0; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibrary; - PRODUCT_NAME = PIALibrary; - PROVISIONING_PROFILE_SPECIFIER = ""; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = "$(SRCROOT)/PIALibrary/Sources/Util/iOS"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 0EE78B051F818A20002E4CDD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 67D8A0C15205E19B5912E3B7 /* Pods-PIALibrary-PIALibraryTests-iOS.debug.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 5357M5NW9W; - INFOPLIST_FILE = "PIALibraryTests/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibraryTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PIALibraryHost-iOS.app/PIALibraryHost-iOS"; - }; - name = Debug; - }; - 0EE78B061F818A20002E4CDD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 81CAB800806A3F61AEBB267F /* Pods-PIALibrary-PIALibraryTests-iOS.release.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 5357M5NW9W; - INFOPLIST_FILE = "PIALibraryTests/Info-iOS.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibraryTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PIALibraryHost-iOS.app/PIALibraryHost-iOS"; - }; - name = Release; - }; - 0EE78B1C1F818A32002E4CDD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D9F51336EB1D7EC915A230E8 /* Pods-PIALibrary-PIALibraryHost-iOS.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = "PIALibraryHost-iOS/PIALibraryHost.entitlements"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 5357M5NW9W; - INFOPLIST_FILE = "$(SRCROOT)/PIALibraryHost-iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibraryHost; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 0EE78B1D1F818A32002E4CDD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 074169C08AFB53B68EB65334 /* Pods-PIALibrary-PIALibraryHost-iOS.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = "PIALibraryHost-iOS/PIALibraryHost.entitlements"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 5357M5NW9W; - INFOPLIST_FILE = "$(SRCROOT)/PIALibraryHost-iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.privateinternetaccess.apple.PIALibraryHost; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 0E2ADD241FE13B8600BB170C /* Build configuration list for PBXNativeTarget "PIALibraryTests-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0E2ADD251FE13B8600BB170C /* Debug */, - 0E2ADD261FE13B8600BB170C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0E7BC6DB1F96B0B00035C8B2 /* Build configuration list for PBXNativeTarget "PIALibrary-macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0E7BC6DC1F96B0B00035C8B2 /* Debug */, - 0E7BC6DD1F96B0B00035C8B2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0EBFFFCF1F693F800009D4F4 /* Build configuration list for PBXProject "PIALibrary" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0EBFFFE71F693F800009D4F4 /* Debug */, - 0EBFFFE81F693F800009D4F4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0EBFFFE91F693F800009D4F4 /* Build configuration list for PBXNativeTarget "PIALibrary-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0EBFFFEA1F693F800009D4F4 /* Debug */, - 0EBFFFEB1F693F800009D4F4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0EE78B071F818A20002E4CDD /* Build configuration list for PBXNativeTarget "PIALibraryTests-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0EE78B051F818A20002E4CDD /* Debug */, - 0EE78B061F818A20002E4CDD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0EE78B1B1F818A32002E4CDD /* Build configuration list for PBXNativeTarget "PIALibraryHost-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0EE78B1C1F818A32002E4CDD /* Debug */, - 0EE78B1D1F818A32002E4CDD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0EBFFFCC1F693F800009D4F4 /* Project object */; -} diff --git a/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-iOS.xcscheme b/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-iOS.xcscheme deleted file mode 100644 index 971f78a8..00000000 --- a/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-iOS.xcscheme +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-macOS.xcscheme b/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-macOS.xcscheme deleted file mode 100644 index f5e0d0ee..00000000 --- a/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibrary-macOS.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibraryHost-iOS.xcscheme b/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibraryHost-iOS.xcscheme deleted file mode 100644 index e36aeb2a..00000000 --- a/PIALibrary.xcodeproj/xcshareddata/xcschemes/PIALibraryHost-iOS.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PIALibrary.xcworkspace/contents.xcworkspacedata b/PIALibrary.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 7ccc8794..00000000 --- a/PIALibrary.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/PIALibrary.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/PIALibrary.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/PIALibrary.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/PIALibrary/Info.plist b/PIALibrary/Info.plist deleted file mode 100644 index fcd36391..00000000 --- a/PIALibrary/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/PIALibrary/Resources/Lottie/pia-spinner.json b/PIALibrary/Resources/Lottie/pia-spinner.json deleted file mode 100644 index 7104820a..00000000 --- a/PIALibrary/Resources/Lottie/pia-spinner.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.1.17","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":160,"h":160,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"spinner2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[1080]},{"t":90.0000036657751}],"ix":10},"p":{"a":0,"k":[80,80,0],"ix":2},"a":{"a":0,"k":[80,80,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-25.344],[0,0],[20.629,12.196],[0,0]],"o":[[0,0],[0,-23.936],[0,0],[21.841,12.912]],"v":[[18.722,31.01],[14.722,31.01],[-18.722,-27.567],[-16.687,-31.01]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.298,0.714,0.286,0.5,0.298,0.714,0.286,1,0.298,0.714,0.286,0,1,0.5,0.9,0.999,0.8],"ix":9}},"s":{"a":0,"k":[17.593,28.038],"ix":5},"e":{"a":0,"k":[17.708,-27.53],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.331,49.101],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.669,-11.968],[0,0],[-18.463,0],[-11.042,-6.528],[0,0],[12.18,0]],"o":[[0,0],[13.415,-12.673],[12.895,0],[0,0],[-10.427,-6.164],[-17.437,0]],"v":[[-40.265,11.28],[-43.012,8.372],[6.422,-11.28],[43.012,-1.301],[40.977,2.142],[6.422,-7.28]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.298,0.714,0.286,0.5,0.298,0.714,0.286,1,0.298,0.714,0.286,0,0.8,0.5,0.7,1,0.6],"ix":9}},"s":{"a":0,"k":[36.252,1.852],"ix":5},"e":{"a":0,"k":[-36.911,1.539],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.578,19.28],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,16.235],[-14.552,13.747],[0,0],[0,-18.9],[-9.422,-12.049]],"o":[[-9.979,-12.76],[0,-20.011],[0,0],[-13.744,12.983],[0,15.333],[0,0]],"v":[[2.596,48.335],[-12.656,4.015],[9.91,-48.335],[12.656,-45.426],[-8.656,4.015],[5.747,45.87]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.298,0.714,0.286,0.5,0.298,0.714,0.286,1,0.298,0.714,0.286,0,0.4,0.5,0.5,1,0.6],"ix":9}},"s":{"a":0,"k":[1.303,42.93],"ix":5},"e":{"a":0,"k":[0.576,-44.195],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.657,75.986],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.645,0],[13.758,17.591],[0,0],[-21.066,0],[-12.446,11.055],[0,0]],"o":[[-22.306,0],[0,0],[12.994,16.616],[16.664,0],[0,0],[-13.178,11.706]],"v":[[4.475,15.073],[-52.272,-12.607],[-49.121,-15.072],[4.475,11.073],[49.616,-6.07],[52.272,-3.079]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.298,0.714,0.286,0.5,0.298,0.714,0.286,1,0.298,0.714,0.286,0,0.4,0.5,0.3,1,0.2],"ix":9}},"s":{"a":0,"k":[-48.376,-12.58],"ix":5},"e":{"a":0,"k":[51.078,-4.37],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.525,136.927],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[13.066,-11.606],[0,0],[-2.053,16.294],[0,0]],"o":[[0,0],[12.342,-10.963],[0,0],[-2.175,17.256]],"v":[[-10.49,22.629],[-13.146,19.639],[9.176,-22.629],[13.145,-22.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":3,"k":{"a":0,"k":[0,0.298,0.714,0.286,0.5,0.298,0.714,0.286,1,0.298,0.714,0.286,0,0,0.5,0.1,1,0.2],"ix":9}},"s":{"a":0,"k":[11.308,-22.716],"ix":5},"e":{"a":0,"k":[-11.557,20.516],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138.286,111.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"circle Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80,80,0],"ix":2},"a":{"a":0,"k":[80,80,0],"ix":1},"s":{"a":0,"k":[102.564,102.564,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[43.078,0],[0,-43.078],[-43.078,0],[0,43.078]],"o":[[-43.078,0],[0,43.078],[43.078,0],[0,-43.078]],"v":[[0,-78],[-78,0],[0,78],[78,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,38.66],[-38.66,0],[0,-38.66],[38.66,0]],"o":[[0,-38.66],[38.66,0],[0,38.66],[-38.66,0]],"v":[[-70,0],[0,-70],[70,0],[0,70]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.13300000359,0.144999994016,0.180000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80,80],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/PIALibrary/Resources/Staging/staging.json b/PIALibrary/Resources/Staging/staging.json deleted file mode 100644 index 9e74ca16..00000000 --- a/PIALibrary/Resources/Staging/staging.json +++ /dev/null @@ -1,258 +0,0 @@ -{ - "groups": { - "ovpntcp": [ - { - "name": "openvpn_tcp", - "ports": [ - 80, - 443, - 853, - 8443 - ] - } - ], - "ovpnudp": [ - { - "name": "openvpn_udp", - "ports": [ - 8080, - 853, - 123, - 53 - ] - } - ], - "wg": [ - { - "name": "wireguard", - "ports": [ - 1337 - ] - } - ], - "ikev2": [ - { - "name": "ikev2", - "ports": [ - 500, - 4500 - ] - } - ], - "proxysocks": [ - { - "name": "socks", - "ports": [ - 1080 - ] - } - ], - "proxyss": [ - { - "name": "shadowsocks", - "ports": [ - 443 - ] - } - ], - "meta": [ - { - "name": "meta", - "ports": [ - 443, - 8080 - ] - } - ] - }, - "regions": [ - { - "id": "us_new_york_city", - "name": "New York", - "country": "US", - "auto_region": true, - "dns": "us-newyorkcity.privacy.network", - "port_forward": true, - "geo": false, - "offline": false, - "servers": { - "ovpnudp": [ - { - "ip": "37.19.198.171", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.170", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.169", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.168", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.167", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.166", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.165", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.164", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.163", - "cn": "newyork405", - "van": false - } - ], - "ovpntcp": [ - { - "ip": "37.19.198.171", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.170", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.169", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.168", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.167", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.166", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.165", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.164", - "cn": "newyork405", - "van": false - }, - { - "ip": "37.19.198.163", - "cn": "newyork405", - "van": false - } - ], - "ikev2": [ - { - "ip": "37.19.198.171", - "cn": "newyork405" - }, - { - "ip": "37.19.198.170", - "cn": "newyork405" - }, - { - "ip": "37.19.198.169", - "cn": "newyork405" - }, - { - "ip": "37.19.198.168", - "cn": "newyork405" - }, - { - "ip": "37.19.198.167", - "cn": "newyork405" - }, - { - "ip": "37.19.198.166", - "cn": "newyork405" - }, - { - "ip": "37.19.198.165", - "cn": "newyork405" - }, - { - "ip": "37.19.198.164", - "cn": "newyork405" - }, - { - "ip": "37.19.198.163", - "cn": "newyork405" - } - ], - "wg": [ - { - "ip": "37.19.198.171", - "cn": "newyork405" - }, - { - "ip": "37.19.198.170", - "cn": "newyork405" - }, - { - "ip": "37.19.198.169", - "cn": "newyork405" - }, - { - "ip": "37.19.198.168", - "cn": "newyork405" - }, - { - "ip": "37.19.198.167", - "cn": "newyork405" - }, - { - "ip": "37.19.198.166", - "cn": "newyork405" - }, - { - "ip": "37.19.198.165", - "cn": "newyork405" - }, - { - "ip": "37.19.198.164", - "cn": "newyork405" - }, - { - "ip": "37.19.198.163", - "cn": "newyork405" - } - ], - "meta": [ - { - "ip": "37.19.198.161", - "cn": "newyork405" - } - ] - } - } - ] -} diff --git a/PIALibrary/Sources/Util/iOS/module.modulemap b/PIALibrary/Sources/Util/iOS/module.modulemap deleted file mode 100644 index fa87cb74..00000000 --- a/PIALibrary/Sources/Util/iOS/module.modulemap +++ /dev/null @@ -1,8 +0,0 @@ -module __PIALibraryNative { - header "../Pinger.h" - header "../NSData+Compression.h" - header "../NSString+URL.h" - header "CMacros.h" - export * -} - diff --git a/PIALibrary/Sources/Util/macOS/module.modulemap b/PIALibrary/Sources/Util/macOS/module.modulemap deleted file mode 100644 index 24813611..00000000 --- a/PIALibrary/Sources/Util/macOS/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -module __PIALibraryNative { - header "../Pinger.h" - header "../NSData+Compression.h" - header "../NSString+URL.h" - export * -} diff --git a/PIALibraryHost-iOS/AppDelegate.swift b/PIALibraryHost-iOS/AppDelegate.swift deleted file mode 100644 index d793da41..00000000 --- a/PIALibraryHost-iOS/AppDelegate.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// AppDelegate.swift -// PIALibraryHost-iOS -// -// Created by Davide De Rosa on 10/1/17. -// Copyright © 2020 Private Internet Access, Inc. -// -// This file is part of the Private Internet Access iOS Client. -// -// The Private Internet Access iOS Client is free software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3 of the License, or (at your option) any later version. -// -// The Private Internet Access iOS Client is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -// details. -// -// You should have received a copy of the GNU General Public License along with the Private -// Internet Access iOS Client. If not, see . -// - -import UIKit - -@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:. - } - - -} - diff --git a/PIALibraryHost-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/PIALibraryHost-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9221b9bb..00000000 --- a/PIALibraryHost-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/PIALibraryHost-iOS/Base.lproj/LaunchScreen.storyboard b/PIALibraryHost-iOS/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f83f6fd5..00000000 --- a/PIALibraryHost-iOS/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PIALibraryHost-iOS/Base.lproj/Main.storyboard b/PIALibraryHost-iOS/Base.lproj/Main.storyboard deleted file mode 100644 index 03c13c22..00000000 --- a/PIALibraryHost-iOS/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PIALibraryHost-iOS/Info.plist b/PIALibraryHost-iOS/Info.plist deleted file mode 100644 index f87da23a..00000000 --- a/PIALibraryHost-iOS/Info.plist +++ /dev/null @@ -1,50 +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 - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/PIALibraryHost-iOS/PIALibraryHost.entitlements b/PIALibraryHost-iOS/PIALibraryHost.entitlements deleted file mode 100644 index 0e617b37..00000000 --- a/PIALibraryHost-iOS/PIALibraryHost.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.application-groups - - group.com.privateinternetaccess - - keychain-access-groups - - $(AppIdentifierPrefix)group.com.privateinternetaccess - - - diff --git a/PIALibraryHost-iOS/ViewController.swift b/PIALibraryHost-iOS/ViewController.swift deleted file mode 100644 index a8a477c9..00000000 --- a/PIALibraryHost-iOS/ViewController.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ViewController.swift -// PIALibraryHost-iOS -// -// Created by Davide De Rosa on 10/1/17. -// Copyright © 2020 Private Internet Access, Inc. -// -// This file is part of the Private Internet Access iOS Client. -// -// The Private Internet Access iOS Client is free software: you can redistribute it and/or -// modify it under the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3 of the License, or (at your option) any later version. -// -// The Private Internet Access iOS Client is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -// details. -// -// You should have received a copy of the GNU General Public License along with the Private -// Internet Access iOS Client. If not, see . -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} - diff --git a/Package.swift b/Package.swift new file mode 100644 index 00000000..d123bdd4 --- /dev/null +++ b/Package.swift @@ -0,0 +1,74 @@ +// swift-tools-version:5.5 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "PIALibrary", + defaultLocalization: "en", + platforms: [ + .iOS(.v12) + ], + products: [ + .library( + name: "PIALibrary", + targets: [ + "PIALibrary", + "PIALibraryUtilObjC", + ] + ), + ], + dependencies: [ + .package(url: "git@github.com:xvpn/kp_releases_apple_kpi.git", .exact("1.1.0")), + .package(url: "git@github.com:xvpn/kp_releases_apple_csi.git", .exact("1.2.0")), + .package(url: "git@github.com:xvpn/kp_releases_apple_account.git", .exact("1.3.1")), + .package(url: "git@github.com:xvpn/kp_releases_apple_regions.git", .exact("1.3.2")), + .package(url: "git@github.com:xvpn/cpz_pia-mobile_ios_pia-tunnelkit.git", revision: "d134257f300b90821bf6138f5c39c1b2cf1fd632"), + .package(url: "git@github.com:xvpn/cpz_pia-mobile_ios_pia-wireguard.git", branch: "release/1.2.0"), + .package(url: "https://github.com/hkellaway/Gloss.git", from: "3.1.0"), + .package(url: "https://github.com/airbnb/lottie-ios.git", from: "3.4.1"), + .package(url: "https://github.com/huri000/SwiftEntryKit.git", from: "1.0.3"), + .package(url: "https://github.com/Orderella/PopupDialog.git", branch: "master"), + .package(url: "https://github.com/SwiftyBeaver/SwiftyBeaver.git", from: "1.9.0"), + .package(url: "https://github.com/ashleymills/Reachability.swift.git", from: "4.3.0"), + .package(url: "https://github.com/michaeltyson/TPKeyboardAvoiding.git", from: "1.3.5"), + ], + targets: [ + .target( + name: "PIALibrary", + dependencies: [ + "SwiftyBeaver", + "Gloss", + "PIALibraryUtilObjC", + "SwiftEntryKit", + "PopupDialog", + .product(name: "Lottie", package: "lottie-ios"), + .product(name: "Reachability", package: "Reachability.swift"), + .product(name: "PIAKPI", package: "kp_releases_apple_kpi"), + .product(name: "PIACSI", package: "kp_releases_apple_csi"), + .product(name: "PIARegions", package: "kp_releases_apple_regions"), + .product(name: "PIAAccount", package: "kp_releases_apple_account"), + .product(name: "PIAWireguard", package: "cpz_pia-mobile_ios_pia-wireguard"), + .product(name: "TunnelKit", package: "cpz_pia-mobile_ios_pia-tunnelkit"), + .product(name: "TunnelKitOpenVPN", package: "cpz_pia-mobile_ios_pia-tunnelkit"), + .product(name: "TunnelKitOpenVPNAppExtension", package: "cpz_pia-mobile_ios_pia-tunnelkit"), + ], + resources: [ + .process("Resources") + ] + ), + .target( + name: "PIALibraryUtilObjC", + dependencies: [] + ), + .testTarget( + name: "PIALibraryTests", + dependencies: [ + "PIALibrary", + ], + resources: [ + .process("Resources") + ] + ), + ] +) diff --git a/Podfile b/Podfile deleted file mode 100644 index 185bd751..00000000 --- a/Podfile +++ /dev/null @@ -1,71 +0,0 @@ -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '12.0' -use_frameworks! - -install! 'cocoapods', - :deterministic_uuids => false - -# ignore all warnings from all pods -inhibit_all_warnings! - -$git_root = "https://github.com/pia-foss" -$gitlab_vpn_root = "git@gitlab.kape.com:pia-mobile/ios" -$gitlab_kn_root = "git@gitlab.kape.com:pia-mobile/shared" - -$regions_repo = 'mobile-common-regions' -$accounts_repo = 'mobile-common-account' - -$regions_gitlab_repo = 'regions.git' -$accounts_gitlab_repo = 'account.git' -$csi_gitlab_repo = 'csi.git' -$kpi_gitlab_repo = 'kpi.git' - -abstract_target 'PIALibrary' do - pod 'SwiftyBeaver', '~> 1.7.0' - pod 'Gloss', '~> 2' - pod 'Alamofire', '~> 4' - pod 'ReachabilitySwift', '4.3.0' - pod 'SwiftEntryKit', '0.7.2' - pod 'lottie-ios' - pod 'FXPageControl' - pod 'PopupDialog' - pod 'TunnelKit', :git => 'https://github.com/pia-foss/tunnelkit', :branch => 'master' - pod 'OpenSSL-Apple', :git => 'https://github.com/keeshux/openssl-apple' - pod 'PIAWireguard', :git => "#{$gitlab_vpn_root}/pia-wireguard.git", :branch => 'develop' - pod "PIAAccountModule", :git => "#{$gitlab_kn_root}/#{$accounts_gitlab_repo}", :commit => '6e3f7be' - pod "PIARegionsModule", :git => "#{$gitlab_kn_root}/#{$regions_gitlab_repo}", :branch => 'release/1.3.1' - pod "PIACSIModule", :git => "#{$gitlab_kn_root}/#{$csi_gitlab_repo}", :branch => 'release/1.1.1' - pod "PIAKPIModule", :git => "#{$gitlab_kn_root}/#{$kpi_gitlab_repo}", :branch => 'release/1.1.0' - - target 'PIALibrary-iOS' do - platform :ios, '12.0' - end - target 'PIALibraryTests-iOS' do - platform :ios, '12.0' - end - target 'PIALibraryHost-iOS' do - platform :ios, '12.0' - end - - #target 'PIALibrary-macOS' do - # platform :osx, '10.11' - #end - #target 'PIALibraryTests-macOS' do - # platform :osx, '10.11' - #end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - if ['PopupDialog'].include? target.name - target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '4.2' - end - end - if ['SwiftEntryKit', 'QuickLayout'].include? target.name - target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '4.0' - end - end - end -end diff --git a/Podfile.lock b/Podfile.lock deleted file mode 100644 index dc02f917..00000000 --- a/Podfile.lock +++ /dev/null @@ -1,157 +0,0 @@ -PODS: - - Alamofire (4.8.1) - - DynamicBlurView (3.0.1) - - FXPageControl (1.5) - - Gloss (2.1.0) - - lottie-ios (3.0.3) - - OpenSSL-Apple (1.1.1j.11) - - PIAAccountModule (1.2.1): - - PIAAccountModule/account (= 1.2.1) - - PIAAccountModule/gradle (= 1.2.1) - - PIAAccountModule/account (1.2.1) - - PIAAccountModule/gradle (1.2.1) - - PIACSIModule (1.1.1): - - PIACSIModule/csi (= 1.1.1) - - PIACSIModule/gradle (= 1.1.1) - - PIACSIModule/csi (1.1.1) - - PIACSIModule/gradle (1.1.1) - - PIAKPIModule (1.1.0): - - PIAKPIModule/gradle (= 1.1.0) - - PIAKPIModule/kpi (= 1.1.0) - - PIAKPIModule/gradle (1.1.0) - - PIAKPIModule/kpi (1.1.0) - - PIARegionsModule (1.3.1): - - PIARegionsModule/gradle (= 1.3.1) - - PIARegionsModule/regions (= 1.3.1) - - PIARegionsModule/gradle (1.3.1) - - PIARegionsModule/regions (1.3.1) - - PIAWireguard (1.2.0): - - PIAWireguard/AppExtension (= 1.2.0) - - PIAWireguard/Core (= 1.2.0) - - PIAWireguard/AppExtension (1.2.0): - - PIAWireguard/Core - - PIAWireguard/Core (1.2.0): - - Alamofire - - TweetNacl - - PopupDialog (0.9.2): - - DynamicBlurView (~> 3.0.1) - - QuickLayout (2.0.2) - - ReachabilitySwift (4.3.0) - - SwiftEntryKit (0.7.2): - - QuickLayout (= 2.0.2) - - SwiftyBeaver (1.7.0) - - TunnelKit (3.3.0): - - TunnelKit/Protocols/OpenVPN (= 3.3.0) - - TunnelKit/AppExtension (3.3.0): - - SwiftyBeaver - - TunnelKit/Core - - TunnelKit/Core (3.3.0): - - SwiftyBeaver - - TunnelKit/Manager (3.3.0): - - SwiftyBeaver - - TunnelKit/Protocols/OpenVPN (3.3.0): - - OpenSSL-Apple (~> 1.1.1h.10) - - TunnelKit/AppExtension - - TunnelKit/Core - - TunnelKit/Manager - - TweetNacl (1.0.2) - -DEPENDENCIES: - - Alamofire (~> 4) - - FXPageControl - - Gloss (~> 2) - - lottie-ios - - OpenSSL-Apple (from `https://github.com/keeshux/openssl-apple`) - - "PIAAccountModule (from `git@gitlab.kape.com:pia-mobile/shared/account.git`, commit `6e3f7be`)" - - "PIACSIModule (from `git@gitlab.kape.com:pia-mobile/shared/csi.git`, branch `release/1.1.1`)" - - "PIAKPIModule (from `git@gitlab.kape.com:pia-mobile/shared/kpi.git`, branch `release/1.1.0`)" - - "PIARegionsModule (from `git@gitlab.kape.com:pia-mobile/shared/regions.git`, branch `release/1.3.1`)" - - "PIAWireguard (from `git@gitlab.kape.com:pia-mobile/ios/pia-wireguard.git`, branch `develop`)" - - PopupDialog - - ReachabilitySwift (= 4.3.0) - - SwiftEntryKit (= 0.7.2) - - SwiftyBeaver (~> 1.7.0) - - TunnelKit (from `https://github.com/pia-foss/tunnelkit`, branch `master`) - -SPEC REPOS: - https://github.com/CocoaPods/Specs.git: - - Alamofire - - DynamicBlurView - - FXPageControl - - Gloss - - lottie-ios - - PopupDialog - - QuickLayout - - ReachabilitySwift - - SwiftEntryKit - - SwiftyBeaver - - TweetNacl - -EXTERNAL SOURCES: - OpenSSL-Apple: - :git: https://github.com/keeshux/openssl-apple - PIAAccountModule: - :commit: 6e3f7be - :git: "git@gitlab.kape.com:pia-mobile/shared/account.git" - PIACSIModule: - :branch: release/1.1.1 - :git: "git@gitlab.kape.com:pia-mobile/shared/csi.git" - PIAKPIModule: - :branch: release/1.1.0 - :git: "git@gitlab.kape.com:pia-mobile/shared/kpi.git" - PIARegionsModule: - :branch: release/1.3.1 - :git: "git@gitlab.kape.com:pia-mobile/shared/regions.git" - PIAWireguard: - :branch: develop - :git: "git@gitlab.kape.com:pia-mobile/ios/pia-wireguard.git" - TunnelKit: - :branch: master - :git: https://github.com/pia-foss/tunnelkit - -CHECKOUT OPTIONS: - OpenSSL-Apple: - :commit: ada87845f854a21fea436c76deb97be2acc58c8a - :git: https://github.com/keeshux/openssl-apple - PIAAccountModule: - :commit: 6e3f7be - :git: "git@gitlab.kape.com:pia-mobile/shared/account.git" - PIACSIModule: - :commit: 5e93ae8ff84bc04ac4e1cfbb6d3dd0aa7dc92a01 - :git: "git@gitlab.kape.com:pia-mobile/shared/csi.git" - PIAKPIModule: - :commit: 4ffb43cc4bb9d66da9b0b966d98934507b2cb04f - :git: "git@gitlab.kape.com:pia-mobile/shared/kpi.git" - PIARegionsModule: - :commit: 6b3b763b3b1d066cb73d2d8833563669ff8e87bb - :git: "git@gitlab.kape.com:pia-mobile/shared/regions.git" - PIAWireguard: - :commit: 7e9d8d480ef8d8d15090dabc5a76524e1057c440 - :git: "git@gitlab.kape.com:pia-mobile/ios/pia-wireguard.git" - TunnelKit: - :commit: 2556fbe9feb53adc88e97e5bdc09779da31468f5 - :git: https://github.com/pia-foss/tunnelkit - -SPEC CHECKSUMS: - Alamofire: 16ce2c353fb72865124ddae8a57c5942388f4f11 - DynamicBlurView: b1df5415f9bd31897549e5d7077e5ec120a4d636 - FXPageControl: 97620412515365d10a3282ec0660f49f6401a8f0 - Gloss: 13ab6b4b0ff4cb2448466edc957479b1bccea8ba - lottie-ios: 06e0b54aab85ba128e332687d7f4ac4861a7a7ae - OpenSSL-Apple: bb7c9715a259404de040f5359ed3b3170cedf8d6 - PIAAccountModule: 31264ad54dfa98cd8be6810885f910b8bedc9592 - PIACSIModule: 2db8a7fa393d5bef757e856fff3327b8c37dac5d - PIAKPIModule: 37c56c0153d693db4d4adb43fd12b9c96ec7ad6d - PIARegionsModule: eff00bd28dea554d7b766ec5d7e9a74ab448f5fe - PIAWireguard: e6fc3a37758af8d83704dd61e327c2ff6da88b13 - PopupDialog: f4bb461bf70ff422be0b56656566424ee9273080 - QuickLayout: a730730b646b231fd4ef7cffaeb1e81fe0e1ca92 - ReachabilitySwift: 408477d1b6ed9779dba301953171e017c31241f3 - SwiftEntryKit: 83d312243af7397e38a222b17b7a744b9a7d2145 - SwiftyBeaver: 4cc0080d2e23f980652e28978db11a5c9da39165 - TunnelKit: 2a6aadea2d772a2760b153aee27d1c334c9ca6db - TweetNacl: 3abf4d1d2082b0114e7a67410e300892448951e6 - -PODFILE CHECKSUM: 09fe8617e5b4f6378d0549e274916d181b7ad401 - -COCOAPODS: 1.11.2 diff --git a/README.md b/README.md index c9d7f504..01ae2b6e 100644 --- a/README.md +++ b/README.md @@ -31,50 +31,19 @@ The library has been tested on both iOS and macOS and includes the following fea - Xcode 9+ (Swift 4) - Git (preinstalled with Xcode Command Line Tools) - Ruby (preinstalled with macOS) -- [CocoaPods 1.5.0][dep-cocoapods] - [SwiftGen][dep-swiftgen] - [jazzy][dep-jazzy] (optional, for documentation) It's highly recommended to use the Git and Ruby packages provided by [Homebrew][dep-brew]. -### CocoaPods +### Swift Package Manager -To use with CocoaPods just add this to your Podfile: +To use with Swift Package Manager just add the repo as part of your packages dependencies via Xcode or via Package.swift. e.g. ```ruby -pod 'PIALibrary' +.package(url: "https://github.com/pia-foss/client-library-apple.git", from: "2.18.0") ``` -To include other non-default subspecs: - -```ruby -pod 'PIALibrary' -pod 'PIALibrary/VPN' # adds support for TunnelKit -pod 'PIALibrary/Mock' -``` - -### Testing - -Download the library codebase locally: - - $ git clone https://github.com/pia-foss/client-library-apple.git - -Assuming you have a [working CocoaPods environment][dep-cocoapods], setting up the library workspace only requires installing the pod dependencies: - - $ pod install - -After that, open `PIALibrary.xcworkspace` in Xcode and run the unit tests found in the `PIALibraryTests` target. A simple CMD+U while on `PIALibrary-iOS` should do that as well. - -#### Demo - -There is a `Demo` directory containing a simple project for testing the library. As usual, prepare for CocoaPods: - - $ pod install - -then open `Demo.xcworkspace`. You can test the account-related business with the `WelcomeDemo-iOS` target which is, unsurprisingly, for iOS only. - -We'd definitely like to offer a more extensive showcase later on. - ## Documentation Due to its complexity, the library is split into several modules named after their context. The *Core* and *Library* modules make up the foundation of the library and are the bare requirements. @@ -343,7 +312,6 @@ This project is licensed under the [MIT (Expat) license](https://choosealicense. [pia-url]: https://www.privateinternetaccess.com/ [pia-wiki]: https://en.wikipedia.org/wiki/Private_Internet_Access -[dep-cocoapods]: https://guides.cocoapods.org/using/getting-started.html [dep-swiftgen]: https://github.com/SwiftGen/SwiftGen [dep-jazzy]: https://github.com/realm/jazzy [dep-brew]: https://brew.sh/ diff --git a/PIALibrary/Sources/Core/Account/AccountProvider.swift b/Sources/PIALibrary/Account/AccountProvider.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/AccountProvider.swift rename to Sources/PIALibrary/Account/AccountProvider.swift diff --git a/PIALibrary/Sources/Library/Account/DefaultAccountProvider.swift b/Sources/PIALibrary/Account/DefaultAccountProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Account/DefaultAccountProvider.swift rename to Sources/PIALibrary/Account/DefaultAccountProvider.swift diff --git a/Sources/PIALibrary/Account/EphemeralAccountProvider.swift b/Sources/PIALibrary/Account/EphemeralAccountProvider.swift new file mode 100644 index 00000000..4b092444 --- /dev/null +++ b/Sources/PIALibrary/Account/EphemeralAccountProvider.swift @@ -0,0 +1,191 @@ +// +// EphemeralAccountProvider.swift +// +// +// Created by Juan Docal on 2022-08-10. +// + +import Foundation + +class EphemeralAccountProvider: AccountProvider, ProvidersAccess, InAppAccess { + + // XXX: we want legit web services calls, yet allow the option to mock them + private var webServices: WebServices? { + guard let accountProvider = accessedProviders.accountProvider as? WebServicesConsumer else { + fatalError("Current accountProvider is not a WebServicesConsumer. Use MockAccountProvider for mocking ephemeral Welcome process") + } + return accountProvider.webServices + } + + var planProducts: [Plan : InAppProduct]? { + return accessedProviders.accountProvider.planProducts + } + + var shouldCleanAccount = false + + var isLoggedIn = false + + var currentUser: UserAccount? + + var oldToken: String? + + var vpnToken: String? + + var vpnTokenUsername: String? + + var vpnTokenPassword: String? + + var apiToken: String? + + var publicUsername: String? + + var currentPasswordReference: Data? { + return nil + } + + var lastSignupRequest: SignupRequest? { + return nil + } + + func migrateOldTokenIfNeeded(_ callback: ((Error?) -> Void)?) { + fatalError("Not implemented") + } + + func login(with request: LoginRequest, _ callback: ((UserAccount?, Error?) -> Void)?) { + + webServices?.token(credentials: request.credentials) { (error) in + guard error == nil else { + callback?(nil, error) + return + } + + self.webServices?.info() { (info, error) in + guard let info = info else { + callback?(nil, error) + return + } + let user = UserAccount(credentials: request.credentials, info: info) + self.currentUser = user + self.isLoggedIn = true + callback?(user, nil) + } + } + } + + func login(with receiptRequest: LoginReceiptRequest, _ callback: ((UserAccount?, Error?) -> Void)?) { + + webServices?.token(receipt: receiptRequest.receipt) { (error) in + guard error == nil else { + callback?(nil, error) + return + } + + self.webServices?.info() { (info, error) in + guard let info = info else { + callback?(nil, error) + return + } + let user = UserAccount(credentials: Credentials(username: "", password: ""), info: info) + self.currentUser = user + self.isLoggedIn = true + callback?(user, nil) + } + } + } + + func refreshAccountInfo(_ callback: ((AccountInfo?, Error?) -> Void)?) { + fatalError("Not implemented") + } + + func accountInformation(_ callback: ((AccountInfo?, Error?) -> Void)?) { + fatalError("Not implemented") + } + + func update(with request: UpdateAccountRequest, resetPassword reset: Bool, andPassword password: String, _ callback: ((AccountInfo?, Error?) -> Void)?) { + fatalError("Not implemented") + } + + func login(with token: String, _ callback: ((UserAccount?, Error?) -> Void)?) { + fatalError("Not implemented") + } + + func loginUsingMagicLink(withEmail email: String, _ callback: SuccessLibraryCallback?) { + fatalError("Not implemented") + } + + func logout(_ callback: SuccessLibraryCallback?) { + fatalError("Not implemented") + } + + func deleteAccount(_ callback: SuccessLibraryCallback?) { + fatalError("Not implemented") + } + + func activateDIPTokens(_ dipToken: String, _ callback: LibraryCallback?) { + fatalError("Not implemented") + } + + func cleanDatabase() { + fatalError("Not implemented") + } + + func subscriptionInformation(_ callback: LibraryCallback?) { + fatalError("Not implemented") + } + + func listPlanProducts(_ callback: (([Plan : InAppProduct]?, Error?) -> Void)?) { + accessedProviders.accountProvider.listPlanProducts(callback) + } + + func purchase(plan: Plan, _ callback: ((InAppTransaction?, Error?) -> Void)?) { + accessedProviders.accountProvider.purchase(plan: plan, callback) + } + + func restorePurchases(_ callback: SuccessLibraryCallback?) { + accessedProviders.accountProvider.restorePurchases(callback) + } + + func signup(with request: SignupRequest, _ callback: ((UserAccount?, Error?) -> Void)?) { + guard let signup = request.signup(withStore: accessedStore) else { + callback?(nil, ClientError.noReceipt) + return + } + + webServices?.signup(with: signup) { (credentials, error) in + guard let credentials = credentials else { + callback?(nil, error) + return + } + let user = UserAccount(credentials: credentials, info: nil) + self.currentUser = user + self.isLoggedIn = true + callback?(user, nil) + } + } + + func listRenewablePlans(_ callback: (([Plan]?, Error?) -> Void)?) { + fatalError("Not implemented") + } + + func renew(with request: RenewRequest, _ callback: ((UserAccount?, Error?) -> Void)?) { + fatalError("Not implemented") + } + + func isAPIEndpointAvailable(_ callback: LibraryCallback?) { + guard let webServices = webServices else { + callback?(false, nil) + return + } + webServices.taskForConnectivityCheck { (_, error) in + callback?(error == nil, error) + } + } + + func featureFlags(_ callback: SuccessLibraryCallback?) { + callback?(nil) + } + + func inAppMessages(forAppVersion version: String, _ callback: LibraryCallback?) { + callback?(nil, nil) + } +} diff --git a/PIALibrary/Sources/Core/Account/InApp/RedeemRequest.swift b/Sources/PIALibrary/Account/InApp/RedeemRequest.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/InApp/RedeemRequest.swift rename to Sources/PIALibrary/Account/InApp/RedeemRequest.swift diff --git a/PIALibrary/Sources/Core/Account/InApp/RenewRequest.swift b/Sources/PIALibrary/Account/InApp/RenewRequest.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/InApp/RenewRequest.swift rename to Sources/PIALibrary/Account/InApp/RenewRequest.swift diff --git a/PIALibrary/Sources/Core/Account/InApp/SignupRequest.swift b/Sources/PIALibrary/Account/InApp/SignupRequest.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/InApp/SignupRequest.swift rename to Sources/PIALibrary/Account/InApp/SignupRequest.swift diff --git a/PIALibrary/Sources/Core/Account/LoginReceiptRequest.swift b/Sources/PIALibrary/Account/LoginReceiptRequest.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/LoginReceiptRequest.swift rename to Sources/PIALibrary/Account/LoginReceiptRequest.swift diff --git a/PIALibrary/Sources/Core/Account/LoginRequest.swift b/Sources/PIALibrary/Account/LoginRequest.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/LoginRequest.swift rename to Sources/PIALibrary/Account/LoginRequest.swift diff --git a/PIALibrary/Sources/Core/Account/UpdateAccountRequest.swift b/Sources/PIALibrary/Account/UpdateAccountRequest.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/UpdateAccountRequest.swift rename to Sources/PIALibrary/Account/UpdateAccountRequest.swift diff --git a/PIALibrary/Sources/Core/Account/UserAccount.swift b/Sources/PIALibrary/Account/UserAccount.swift similarity index 100% rename from PIALibrary/Sources/Core/Account/UserAccount.swift rename to Sources/PIALibrary/Account/UserAccount.swift diff --git a/PIALibrary/Sources/Library/Client+Configuration.swift b/Sources/PIALibrary/Client+Configuration.swift similarity index 99% rename from PIALibrary/Sources/Library/Client+Configuration.swift rename to Sources/PIALibrary/Client+Configuration.swift index 9ca357ab..55e26da0 100644 --- a/PIALibrary/Sources/Library/Client+Configuration.swift +++ b/Sources/PIALibrary/Client+Configuration.swift @@ -143,7 +143,7 @@ extension Client { let maceDelay: Int - let sessionManager: SessionManager + let sessionManager: Session // MARK: VPN @@ -245,7 +245,7 @@ extension Client { urlscfg.timeoutIntervalForRequest = Double(webTimeout) / 1000.0 urlscfg.timeoutIntervalForResource = Double(webTimeout) / 1000.0 urlscfg.urlCache = nil - sessionManager = SessionManager(configuration: urlscfg) + sessionManager = Session(configuration: urlscfg) #if os(iOS) inAppPlans = [:] diff --git a/PIALibrary/Sources/Library/Client+Daemons.swift b/Sources/PIALibrary/Client+Daemons.swift similarity index 100% rename from PIALibrary/Sources/Library/Client+Daemons.swift rename to Sources/PIALibrary/Client+Daemons.swift diff --git a/PIALibrary/Sources/Library/Client+Database.swift b/Sources/PIALibrary/Client+Database.swift similarity index 100% rename from PIALibrary/Sources/Library/Client+Database.swift rename to Sources/PIALibrary/Client+Database.swift diff --git a/PIALibrary/Sources/Library/Client+Environment.swift b/Sources/PIALibrary/Client+Environment.swift similarity index 100% rename from PIALibrary/Sources/Library/Client+Environment.swift rename to Sources/PIALibrary/Client+Environment.swift diff --git a/PIALibrary/Sources/Library/Client+Preferences.swift b/Sources/PIALibrary/Client+Preferences.swift similarity index 100% rename from PIALibrary/Sources/Library/Client+Preferences.swift rename to Sources/PIALibrary/Client+Preferences.swift diff --git a/PIALibrary/Sources/Library/Client+Providers.swift b/Sources/PIALibrary/Client+Providers.swift similarity index 100% rename from PIALibrary/Sources/Library/Client+Providers.swift rename to Sources/PIALibrary/Client+Providers.swift diff --git a/PIALibrary/Sources/Library/Client.swift b/Sources/PIALibrary/Client.swift similarity index 100% rename from PIALibrary/Sources/Library/Client.swift rename to Sources/PIALibrary/Client.swift diff --git a/PIALibrary/Sources/Library/ClientAccess.swift b/Sources/PIALibrary/ClientAccess.swift similarity index 100% rename from PIALibrary/Sources/Library/ClientAccess.swift rename to Sources/PIALibrary/ClientAccess.swift diff --git a/PIALibrary/Sources/Library/ClientError.swift b/Sources/PIALibrary/ClientError.swift similarity index 87% rename from PIALibrary/Sources/Library/ClientError.swift rename to Sources/PIALibrary/ClientError.swift index 5b3baac0..b7b52a67 100644 --- a/PIALibrary/Sources/Library/ClientError.swift +++ b/Sources/PIALibrary/ClientError.swift @@ -87,15 +87,3 @@ public enum ClientError: Error, Equatable { case noRegions #endif } - -extension ClientError: LocalizedError { - public var errorDescription: String? { - switch self { - case .sandboxPurchase: - return NSLocalizedString(L10n.Signup.Failure.Purchase.Sandbox.message, - comment: L10n.Signup.Failure.Purchase.Sandbox.message) - default: - return nil - } - } -} diff --git a/PIALibrary/Sources/Library/Daemons/ConnectivityDaemon.swift b/Sources/PIALibrary/Daemons/ConnectivityDaemon.swift similarity index 100% rename from PIALibrary/Sources/Library/Daemons/ConnectivityDaemon.swift rename to Sources/PIALibrary/Daemons/ConnectivityDaemon.swift diff --git a/PIALibrary/Sources/Library/Daemons/Daemon.swift b/Sources/PIALibrary/Daemons/Daemon.swift similarity index 100% rename from PIALibrary/Sources/Library/Daemons/Daemon.swift rename to Sources/PIALibrary/Daemons/Daemon.swift diff --git a/PIALibrary/Sources/Library/Daemons/PingTask.swift b/Sources/PIALibrary/Daemons/PingTask.swift similarity index 100% rename from PIALibrary/Sources/Library/Daemons/PingTask.swift rename to Sources/PIALibrary/Daemons/PingTask.swift diff --git a/PIALibrary/Sources/Library/Daemons/ServersDaemon.swift b/Sources/PIALibrary/Daemons/ServersDaemon.swift similarity index 99% rename from PIALibrary/Sources/Library/Daemons/ServersDaemon.swift rename to Sources/PIALibrary/Daemons/ServersDaemon.swift index 26b96145..bf0a6fc6 100644 --- a/PIALibrary/Sources/Library/Daemons/ServersDaemon.swift +++ b/Sources/PIALibrary/Daemons/ServersDaemon.swift @@ -22,6 +22,7 @@ import Foundation import SwiftyBeaver +import UIKit private let log = SwiftyBeaver.self diff --git a/PIALibrary/Sources/Library/Daemons/ServersPinger.swift b/Sources/PIALibrary/Daemons/ServersPinger.swift similarity index 100% rename from PIALibrary/Sources/Library/Daemons/ServersPinger.swift rename to Sources/PIALibrary/Daemons/ServersPinger.swift diff --git a/PIALibrary/Sources/Library/Daemons/VPNDaemon.swift b/Sources/PIALibrary/Daemons/VPNDaemon.swift similarity index 100% rename from PIALibrary/Sources/Library/Daemons/VPNDaemon.swift rename to Sources/PIALibrary/Daemons/VPNDaemon.swift diff --git a/PIALibrary/Sources/UI/Shared/DeviceModel.swift b/Sources/PIALibrary/DeviceModel.swift similarity index 100% rename from PIALibrary/Sources/UI/Shared/DeviceModel.swift rename to Sources/PIALibrary/DeviceModel.swift diff --git a/PIALibrary/Sources/Library/InApp/AppStoreProduct.swift b/Sources/PIALibrary/InApp/AppStoreProduct.swift similarity index 100% rename from PIALibrary/Sources/Library/InApp/AppStoreProduct.swift rename to Sources/PIALibrary/InApp/AppStoreProduct.swift diff --git a/PIALibrary/Sources/Library/InApp/AppStoreProvider.swift b/Sources/PIALibrary/InApp/AppStoreProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/InApp/AppStoreProvider.swift rename to Sources/PIALibrary/InApp/AppStoreProvider.swift diff --git a/PIALibrary/Sources/Library/InApp/AppStoreTransaction.swift b/Sources/PIALibrary/InApp/AppStoreTransaction.swift similarity index 100% rename from PIALibrary/Sources/Library/InApp/AppStoreTransaction.swift rename to Sources/PIALibrary/InApp/AppStoreTransaction.swift diff --git a/PIALibrary/Sources/Core/InApp/InAppProduct.swift b/Sources/PIALibrary/InApp/InAppProduct.swift similarity index 100% rename from PIALibrary/Sources/Core/InApp/InAppProduct.swift rename to Sources/PIALibrary/InApp/InAppProduct.swift diff --git a/PIALibrary/Sources/Core/InApp/InAppProvider.swift b/Sources/PIALibrary/InApp/InAppProvider.swift similarity index 100% rename from PIALibrary/Sources/Core/InApp/InAppProvider.swift rename to Sources/PIALibrary/InApp/InAppProvider.swift diff --git a/PIALibrary/Sources/Core/InApp/InAppTransaction.swift b/Sources/PIALibrary/InApp/InAppTransaction.swift similarity index 100% rename from PIALibrary/Sources/Core/InApp/InAppTransaction.swift rename to Sources/PIALibrary/InApp/InAppTransaction.swift diff --git a/PIALibrary/Sources/Core/LibraryCallback.swift b/Sources/PIALibrary/LibraryCallback.swift similarity index 100% rename from PIALibrary/Sources/Core/LibraryCallback.swift rename to Sources/PIALibrary/LibraryCallback.swift diff --git a/PIALibrary/Sources/Core/LibraryConstants.swift b/Sources/PIALibrary/LibraryConstants.swift similarity index 100% rename from PIALibrary/Sources/Core/LibraryConstants.swift rename to Sources/PIALibrary/LibraryConstants.swift diff --git a/PIALibrary/Sources/Core/Macros.swift b/Sources/PIALibrary/Macros.swift similarity index 100% rename from PIALibrary/Sources/Core/Macros.swift rename to Sources/PIALibrary/Macros.swift diff --git a/PIALibrary/Sources/Mock/Client+Mock.swift b/Sources/PIALibrary/Mock/Client+Mock.swift similarity index 100% rename from PIALibrary/Sources/Mock/Client+Mock.swift rename to Sources/PIALibrary/Mock/Client+Mock.swift diff --git a/PIALibrary/Sources/Mock/MockAccountProvider.swift b/Sources/PIALibrary/Mock/MockAccountProvider.swift similarity index 100% rename from PIALibrary/Sources/Mock/MockAccountProvider.swift rename to Sources/PIALibrary/Mock/MockAccountProvider.swift diff --git a/PIALibrary/Sources/Mock/MockInAppProvider.swift b/Sources/PIALibrary/Mock/MockInAppProvider.swift similarity index 100% rename from PIALibrary/Sources/Mock/MockInAppProvider.swift rename to Sources/PIALibrary/Mock/MockInAppProvider.swift diff --git a/PIALibrary/Sources/Mock/MockServerProvider.swift b/Sources/PIALibrary/Mock/MockServerProvider.swift similarity index 100% rename from PIALibrary/Sources/Mock/MockServerProvider.swift rename to Sources/PIALibrary/Mock/MockServerProvider.swift diff --git a/PIALibrary/Sources/Mock/MockTileProvider.swift b/Sources/PIALibrary/Mock/MockTileProvider.swift similarity index 100% rename from PIALibrary/Sources/Mock/MockTileProvider.swift rename to Sources/PIALibrary/Mock/MockTileProvider.swift diff --git a/PIALibrary/Sources/Mock/MockVPNProvider.swift b/Sources/PIALibrary/Mock/MockVPNProvider.swift similarity index 100% rename from PIALibrary/Sources/Mock/MockVPNProvider.swift rename to Sources/PIALibrary/Mock/MockVPNProvider.swift diff --git a/PIALibrary/Sources/Mock/MockWebServices.swift b/Sources/PIALibrary/Mock/MockWebServices.swift similarity index 100% rename from PIALibrary/Sources/Mock/MockWebServices.swift rename to Sources/PIALibrary/Mock/MockWebServices.swift diff --git a/PIALibrary/Sources/Core/NMT/NMTRules.swift b/Sources/PIALibrary/NMT/NMTRules.swift similarity index 100% rename from PIALibrary/Sources/Core/NMT/NMTRules.swift rename to Sources/PIALibrary/NMT/NMTRules.swift diff --git a/PIALibrary/Sources/Core/NMT/NMTType.swift b/Sources/PIALibrary/NMT/NMTType.swift similarity index 100% rename from PIALibrary/Sources/Core/NMT/NMTType.swift rename to Sources/PIALibrary/NMT/NMTType.swift diff --git a/PIALibrary/Sources/Core/Notification+Core.swift b/Sources/PIALibrary/Notification+Core.swift similarity index 100% rename from PIALibrary/Sources/Core/Notification+Core.swift rename to Sources/PIALibrary/Notification+Core.swift diff --git a/PIALibrary/Sources/Library/Notification+Library.swift b/Sources/PIALibrary/Notification+Library.swift similarity index 100% rename from PIALibrary/Sources/Library/Notification+Library.swift rename to Sources/PIALibrary/Notification+Library.swift diff --git a/PIALibrary/Sources/UI/iOS/Notification+UI.swift b/Sources/PIALibrary/Notification+UI.swift similarity index 100% rename from PIALibrary/Sources/UI/iOS/Notification+UI.swift rename to Sources/PIALibrary/Notification+UI.swift diff --git a/PIALibrary/Sources/Core/NotificationKey.swift b/Sources/PIALibrary/NotificationKey.swift similarity index 100% rename from PIALibrary/Sources/Core/NotificationKey.swift rename to Sources/PIALibrary/NotificationKey.swift diff --git a/PIALibrary/Sources/Library/Persistence/KeychainStore.swift b/Sources/PIALibrary/Persistence/KeychainStore.swift similarity index 100% rename from PIALibrary/Sources/Library/Persistence/KeychainStore.swift rename to Sources/PIALibrary/Persistence/KeychainStore.swift diff --git a/PIALibrary/Sources/Library/Persistence/MemoryStore.swift b/Sources/PIALibrary/Persistence/MemoryStore.swift similarity index 100% rename from PIALibrary/Sources/Library/Persistence/MemoryStore.swift rename to Sources/PIALibrary/Persistence/MemoryStore.swift diff --git a/PIALibrary/Sources/Core/Persistence/PlainStore.swift b/Sources/PIALibrary/Persistence/PlainStore.swift similarity index 100% rename from PIALibrary/Sources/Core/Persistence/PlainStore.swift rename to Sources/PIALibrary/Persistence/PlainStore.swift diff --git a/PIALibrary/Sources/Core/Persistence/SecureStore.swift b/Sources/PIALibrary/Persistence/SecureStore.swift similarity index 100% rename from PIALibrary/Sources/Core/Persistence/SecureStore.swift rename to Sources/PIALibrary/Persistence/SecureStore.swift diff --git a/PIALibrary/Sources/Core/Persistence/TransientStore.swift b/Sources/PIALibrary/Persistence/TransientStore.swift similarity index 100% rename from PIALibrary/Sources/Core/Persistence/TransientStore.swift rename to Sources/PIALibrary/Persistence/TransientStore.swift diff --git a/PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift b/Sources/PIALibrary/Persistence/UserDefaultsStore.swift similarity index 100% rename from PIALibrary/Sources/Library/Persistence/UserDefaultsStore.swift rename to Sources/PIALibrary/Persistence/UserDefaultsStore.swift diff --git a/PIALibrary/Sources/Library/Providers/PIAAccountClientStateProvider.swift b/Sources/PIALibrary/Providers/PIAAccountClientStateProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIAAccountClientStateProvider.swift rename to Sources/PIALibrary/Providers/PIAAccountClientStateProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIAAccountStagingClientStateProvider.swift b/Sources/PIALibrary/Providers/PIAAccountStagingClientStateProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIAAccountStagingClientStateProvider.swift rename to Sources/PIALibrary/Providers/PIAAccountStagingClientStateProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift b/Sources/PIALibrary/Providers/PIACSIDeviceInformationProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIACSIDeviceInformationProvider.swift rename to Sources/PIALibrary/Providers/PIACSIDeviceInformationProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACSILastKnownExceptionProvider.swift b/Sources/PIALibrary/Providers/PIACSILastKnownExceptionProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIACSILastKnownExceptionProvider.swift rename to Sources/PIALibrary/Providers/PIACSILastKnownExceptionProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift b/Sources/PIALibrary/Providers/PIACSIUserInformationProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIACSIUserInformationProvider.swift rename to Sources/PIALibrary/Providers/PIACSIUserInformationProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift b/Sources/PIALibrary/Providers/PIACrashlabClientStateProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIACrashlabClientStateProvider.swift rename to Sources/PIALibrary/Providers/PIACrashlabClientStateProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift b/Sources/PIALibrary/Providers/PIACrashlabProtocolInformationProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIACrashlabProtocolInformationProvider.swift rename to Sources/PIALibrary/Providers/PIACrashlabProtocolInformationProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift b/Sources/PIALibrary/Providers/PIACrashlabRegionInformationProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIACrashlabRegionInformationProvider.swift rename to Sources/PIALibrary/Providers/PIACrashlabRegionInformationProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIAKPIClientStateProvider.swift b/Sources/PIALibrary/Providers/PIAKPIClientStateProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIAKPIClientStateProvider.swift rename to Sources/PIALibrary/Providers/PIAKPIClientStateProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIAKPIStagingClientStateProvider.swift b/Sources/PIALibrary/Providers/PIAKPIStagingClientStateProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIAKPIStagingClientStateProvider.swift rename to Sources/PIALibrary/Providers/PIAKPIStagingClientStateProvider.swift diff --git a/PIALibrary/Sources/Library/Providers/PIARegionClientStateProvider.swift b/Sources/PIALibrary/Providers/PIARegionClientStateProvider.swift similarity index 100% rename from PIALibrary/Sources/Library/Providers/PIARegionClientStateProvider.swift rename to Sources/PIALibrary/Providers/PIARegionClientStateProvider.swift diff --git a/PIALibrary/Resources/UI/Shared/ar.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/ar.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/ar.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/ar.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/da.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/da.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/da.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/da.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/de.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/de.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/de.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/de.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/en.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/en.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/en.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/en.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/es-MX.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/es-MX.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/es-MX.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/es-MX.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/fr.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/fr.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/fr.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/fr.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/it.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/it.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/it.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/it.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/ja.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/ja.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/ja.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/ja.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/ko.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/ko.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/ko.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/ko.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/nb.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/nb.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/nb.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/nb.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/nl.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/nl.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/nl.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/nl.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/pl.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/pl.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/pl.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/pl.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/pt-BR.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/pt-BR.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/pt-BR.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/pt-BR.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/ru.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/ru.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/ru.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/ru.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/th.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/th.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/th.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/th.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/tr.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/tr.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/tr.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/tr.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/zh-Hans.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/zh-Hans.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/zh-Hans.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/zh-Hans.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/Shared/zh-Hant.lproj/UI.strings b/Sources/PIALibrary/Resources/Shared/zh-Hant.lproj/UI.strings similarity index 100% rename from PIALibrary/Resources/UI/Shared/zh-Hant.lproj/UI.strings rename to Sources/PIALibrary/Resources/Shared/zh-Hant.lproj/UI.strings diff --git a/PIALibrary/Resources/UI/iOS/Signup.storyboard b/Sources/PIALibrary/Resources/iOS/Signup.storyboard similarity index 98% rename from PIALibrary/Resources/UI/iOS/Signup.storyboard rename to Sources/PIALibrary/Resources/iOS/Signup.storyboard index 0bdb0444..543ebe91 100644 --- a/PIALibrary/Resources/UI/iOS/Signup.storyboard +++ b/Sources/PIALibrary/Resources/iOS/Signup.storyboard @@ -1,9 +1,9 @@ - + - + @@ -12,7 +12,7 @@ - + @@ -142,7 +142,7 @@ - + @@ -238,7 +238,7 @@ - - - - + @@ -1019,7 +1019,7 @@ You can come back to the app later to finish the process. - + @@ -1045,7 +1045,7 @@ You can come back to the app later to finish the process. - - -