From 7dbd3777ec21389bd2979388b37e63c49f78e2e1 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 7 Mar 2021 10:17:20 +0900 Subject: [PATCH 1/9] added sugar syntax for ForEach that removes requirement for the "id:" argument --- Sources/ForEach+SwiftUI.swift | 29 +++++++++++++++++++++++++++++ Sources/ObjectSnapshot.swift | 5 +++++ 2 files changed, 34 insertions(+) diff --git a/Sources/ForEach+SwiftUI.swift b/Sources/ForEach+SwiftUI.swift index 45dd41e..d91027a 100644 --- a/Sources/ForEach+SwiftUI.swift +++ b/Sources/ForEach+SwiftUI.swift @@ -35,6 +35,35 @@ import SwiftUI extension ForEach where Content: View { // MARK: Public + + /** + Creates an instance that creates views for each object in a collection of `ObjectSnapshot`s. The objects' `NSManagedObjectID` are used as the identifier + ``` + let people: [ObjectSnapshot] + + var body: some View { + + List { + + ForEach(self.people) { person in + + ProfileView(person) + } + } + .animation(.default) + } + ``` + + - parameter objectSnapshots: The collection of `ObjectSnapshot`s that the `ForEach` instance uses to create views dynamically + - parameter content: The view builder that receives an `ObjectPublisher` instance and creates views dynamically. + */ + public init( + _ objectSnapshots: Data, + @ViewBuilder content: @escaping (ObjectSnapshot) -> Content + ) where Data.Element == ObjectSnapshot, ID == O.ObjectID { + + self.init(objectSnapshots, id: \.cs_objectID, content: content) + } /** Creates an instance that creates views for each object in a `ListSnapshot`. diff --git a/Sources/ObjectSnapshot.swift b/Sources/ObjectSnapshot.swift index d80f8ae..3f39a18 100644 --- a/Sources/ObjectSnapshot.swift +++ b/Sources/ObjectSnapshot.swift @@ -127,6 +127,11 @@ public struct ObjectSnapshot: ObjectRepresentation, Hashable { self.values = values self.generation = .init() } + + internal var cs_objectID: O.ObjectID { + + return self.objectID() + } // MARK: FilePrivate From 0b127956d385459571130946cb68a54934207ec2 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 7 Mar 2021 10:38:53 +0900 Subject: [PATCH 2/9] Removed ObservableObject implementations of ListPublisher/ObjectPublisher in favor of LiveList/LiveObject and ".reactive" publishers --- .../⭐️Modern.PlacemarksDemo.MainView.swift | 54 +++--- README.md | 2 +- Sources/ListPublisher.swift | 175 ----------------- Sources/LiveObject.swift | 5 + Sources/ObjectPublisher.swift | 178 ------------------ 5 files changed, 38 insertions(+), 376 deletions(-) diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift index bfa3e4f..f6a2c27 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift @@ -25,7 +25,7 @@ extension Modern.PlacemarksDemo { Modern.PlacemarksDemo.dataStack.perform( asynchronous: { (transaction) in - let place = self.place.asEditable(in: transaction) + let place = self.$place?.asEditable(in: transaction) place?.annotation = .init(coordinate: coordinate) }, completion: { _ in } @@ -42,7 +42,7 @@ extension Modern.PlacemarksDemo { _ = try? Modern.PlacemarksDemo.dataStack.perform( synchronous: { (transaction) in - let place = self.place.asEditable(in: transaction) + let place = self.$place?.asEditable(in: transaction) place?.setRandomLocation() } ) @@ -71,22 +71,25 @@ extension Modern.PlacemarksDemo { // MARK: Internal - @ObservedObject - var place: ObjectPublisher + @LiveObject(Modern.PlacemarksDemo.placePublisher) + var place: ObjectSnapshot? init() { - self.place = Modern.PlacemarksDemo.placePublisher - self.sinkCancellable = self.place.sink( + self.sinkCancellable = self.$place?.reactive.snapshot().sink( receiveCompletion: { _ in // Deleted, do nothing }, receiveValue: { [self] (snapshot) in + guard let snapshot = snapshot else { + + return + } self.geocoder.geocode(place: snapshot) { (title, subtitle) in - guard self.place.snapshot == snapshot else { + guard self.place == snapshot else { return } @@ -104,22 +107,29 @@ extension Modern.PlacemarksDemo { // MARK: View var body: some View { - Modern.PlacemarksDemo.MapView( - place: self.place.snapshot, - onTap: { coordinate in + + Group { + + if let place = self.place { - self.demoAsynchronousTransaction(coordinate: coordinate) + Modern.PlacemarksDemo.MapView( + place: place, + onTap: { coordinate in + + self.demoAsynchronousTransaction(coordinate: coordinate) + } + ) + .overlay( + InstructionsView( + ("Random", "Sets random coordinate"), + ("Tap", "Sets to tapped coordinate") + ) + .padding(.leading, 10) + .padding(.bottom, 40), + alignment: .bottomLeading + ) } - ) - .overlay( - InstructionsView( - ("Random", "Sets random coordinate"), - ("Tap", "Sets to tapped coordinate") - ) - .padding(.leading, 10) - .padding(.bottom, 40), - alignment: .bottomLeading - ) + } .navigationBarTitle("Placemarks") .navigationBarItems( trailing: Button("Random") { @@ -132,7 +142,7 @@ extension Modern.PlacemarksDemo { // MARK: Private - private var sinkCancellable: AnyCancellable? = nil + private var sinkCancellable: AnyCancellable? private let geocoder = Modern.PlacemarksDemo.Geocoder() } } diff --git a/README.md b/README.md index 81e2482..94a9044 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ CoreStore was (and is) heavily shaped by real-world needs of developing data-dep ### Features -- **SwiftUI and Combine API utilities.** +- **🆕SwiftUI and Combine API utilities.** `ListPublisher`s and `ObjectPublisher`s now have their `@LiveList` and `@LiveObject` SwiftUI property wrappers. Combine `Publisher` s are also available through the `ListPublisher.reactive`, `ObjectPublisher.reactive`, and `DataStack.reactive` namespaces. - **Backwards-portable DiffableDataSources implementation!** `UITableViews` and `UICollectionViews` now have a new ally: `ListPublisher`s provide diffable snapshots that make reloading animations very easy and very safe. Say goodbye to `UITableViews` and `UICollectionViews` reload errors! - **💎Tight design around Swift’s code elegance and type safety.** CoreStore fully utilizes Swift's community-driven language features. - **🚦Safer concurrency architecture.** CoreStore makes it hard to fall into common concurrency mistakes. The main `NSManagedObjectContext` is strictly read-only, while all updates are done through serial *transactions*. *(See [Saving and processing transactions](#saving-and-processing-transactions))* diff --git a/Sources/ListPublisher.swift b/Sources/ListPublisher.swift index 95446fb..0ac296b 100644 --- a/Sources/ListPublisher.swift +++ b/Sources/ListPublisher.swift @@ -25,16 +25,6 @@ import CoreData -#if canImport(Combine) -import Combine - -#endif - -#if canImport(SwiftUI) -import SwiftUI - -#endif - // MARK: - ListPublisher @@ -89,13 +79,8 @@ public final class ListPublisher: Hashable { */ public fileprivate(set) var snapshot: ListSnapshot = .init() { - willSet { - - self.willChange() - } didSet { - self.didChange() self.notifyObservers() } } @@ -315,11 +300,6 @@ public final class ListPublisher: Hashable { self.fetchedResultsControllerDelegate.fetchedResultsController = nil self.observers.removeAllObjects() } - - - // MARK: FilePrivate - - fileprivate let rawObjectWillChange: Any? // MARK: Private @@ -375,21 +355,6 @@ public final class ListPublisher: Hashable { applyFetchClauses: applyFetchClauses ) - if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) { - - #if canImport(Combine) - self.rawObjectWillChange = ObservableObjectPublisher() - - #else - self.rawObjectWillChange = nil - - #endif - } - else { - - self.rawObjectWillChange = nil - } - self.fetchedResultsControllerDelegate.handler = self try! self.fetchedResultsController.performFetchFromSpecifiedStores() @@ -428,143 +393,3 @@ extension ListPublisher: FetchedDiffableDataSourceSnapshotHandler { ) } } - - -#if canImport(Combine) -import Combine - -@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -extension ListPublisher: ObservableObject {} - -@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -extension ListPublisher: Publisher { - - // MARK: Publisher - - public typealias Output = ListSnapshot - public typealias Failure = Never - - public func receive(subscriber: S) where S.Input == Output, S.Failure == Failure { - - subscriber.receive( - subscription: ListSnapshotSubscription( - publisher: self, - subscriber: subscriber - ) - ) - } - - - // MARK: - ListSnapshotSubscriber - - fileprivate final class ListSnapshotSubscriber: Subscriber { - - // MARK: Subscriber - - typealias Failure = Never - - func receive(subscription: Subscription) { - - subscription.request(.unlimited) - } - - func receive(_ input: Output) -> Subscribers.Demand { - - return .unlimited - } - - func receive(completion: Subscribers.Completion) {} - } - - - // MARK: - ListSnapshotSubscription - - fileprivate final class ListSnapshotSubscription: Subscription where S.Input == Output, S.Failure == Never { - - // MARK: FilePrivate - - init(publisher: ListPublisher, subscriber: S) { - - self.publisher = publisher - self.subscriber = subscriber - } - - - // MARK: Subscription - - func request(_ demand: Subscribers.Demand) { - - guard demand > 0 else { - - return - } - self.publisher.addObserver(self) { [weak self] (publisher) in - - guard let self = self, let subscriber = self.subscriber else { - - return - } - _ = subscriber.receive(publisher.snapshot) - } - } - - - // MARK: Cancellable - - func cancel() { - self.publisher.removeObserver(self) - self.subscriber = nil - } - - - // MARK: Private - - private let publisher: ListPublisher - private var subscriber: S? - } -} - -#endif - -// MARK: - ListPublisher - -extension ListPublisher { - - // MARK: ObservableObject - - #if canImport(Combine) - - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public var objectWillChange: ObservableObjectPublisher { - - return self.rawObjectWillChange! as! ObservableObjectPublisher - } - - #endif - - fileprivate func willChange() { - - guard #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) else { - - return - } - #if canImport(Combine) - - #if canImport(SwiftUI) - withAnimation { - - self.objectWillChange.send() - } - - #endif - - self.objectWillChange.send() - - #endif - } - - fileprivate func didChange() { - - // nothing - } -} diff --git a/Sources/LiveObject.swift b/Sources/LiveObject.swift index 76519ad..b415baf 100644 --- a/Sources/LiveObject.swift +++ b/Sources/LiveObject.swift @@ -76,6 +76,11 @@ public struct LiveObject: DynamicProperty { return self.observer.item } + public var projectedValue: ObjectPublisher? { + + return self.observer.objectPublisher + } + // MARK: DynamicProperty diff --git a/Sources/ObjectPublisher.swift b/Sources/ObjectPublisher.swift index 958f4ef..c958bee 100644 --- a/Sources/ObjectPublisher.swift +++ b/Sources/ObjectPublisher.swift @@ -25,16 +25,6 @@ import CoreData -#if canImport(Combine) -import Combine - -#endif - -#if canImport(SwiftUI) -import SwiftUI - -#endif - // MARK: - ObjectPublisher @@ -226,26 +216,10 @@ public final class ObjectPublisher: ObjectRepresentation, Hash // MARK: FilePrivate - fileprivate let rawObjectWillChange: Any? - fileprivate init(objectID: O.ObjectID, context: NSManagedObjectContext, initializer: @escaping (NSManagedObjectID, NSManagedObjectContext) -> ObjectSnapshot?) { self.id = objectID self.context = context - if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) { - - #if canImport(Combine) - self.rawObjectWillChange = ObservableObjectPublisher() - - #else - self.rawObjectWillChange = nil - - #endif - } - else { - - self.rawObjectWillChange = nil - } self.$lazySnapshot.initialize { [weak self] in guard let self = self else { @@ -262,16 +236,12 @@ public final class ObjectPublisher: ObjectRepresentation, Hash self.object = nil - self.willChange() self.$lazySnapshot.reset({ nil }) - self.didChange() self.notifyObservers() } else if updatedIDs.contains(objectID) { - self.willChange() self.$lazySnapshot.reset({ initializer(objectID, context) }) - self.didChange() self.notifyObservers() } } @@ -305,154 +275,6 @@ public final class ObjectPublisher: ObjectRepresentation, Hash } -#if canImport(Combine) -import Combine - -@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -extension ObjectPublisher: ObservableObject {} - -@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -extension ObjectPublisher: Publisher { - - // MARK: Publisher - - public typealias Output = ObjectSnapshot - public typealias Failure = Never - - public func receive(subscriber: S) where S.Input == Output, S.Failure == Failure { - - subscriber.receive( - subscription: ObjectSnapshotSubscription( - publisher: self, - subscriber: subscriber - ) - ) - } - - - // MARK: - ObjectSnapshotSubscriber - - fileprivate final class ObjectSnapshotSubscriber: Subscriber { - - // MARK: Subscriber - - typealias Failure = Never - - func receive(subscription: Subscription) { - - subscription.request(.unlimited) - } - - func receive(_ input: Output) -> Subscribers.Demand { - - return .unlimited - } - - func receive(completion: Subscribers.Completion) {} - } - - - // MARK: - ObjectSnapshotSubscription - - fileprivate final class ObjectSnapshotSubscription: Subscription where S.Input == Output, S.Failure == Never { - - // MARK: FilePrivate - - init(publisher: ObjectPublisher, subscriber: S) { - - self.publisher = publisher - self.subscriber = subscriber - } - - - // MARK: Subscription - - func request(_ demand: Subscribers.Demand) { - - guard demand > 0 else { - - return - } - self.publisher.addObserver(self) { [weak self] (publisher) in - - guard let self = self, let subscriber = self.subscriber else { - - return - } - if let snapshot = publisher.snapshot { - - _ = subscriber.receive(snapshot) - } - else { - - subscriber.receive(completion: .finished) - } - } - } - - - // MARK: Cancellable - - func cancel() { - self.publisher.removeObserver(self) - self.subscriber = nil - } - - - // MARK: Private - - private let publisher: ObjectPublisher - private var subscriber: S? - } -} - -#endif - -// MARK: - ObjectPublisher - -extension ObjectPublisher { - - // MARK: ObservableObject - - #if canImport(Combine) - - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - public var objectWillChange: ObservableObjectPublisher { - - return self.rawObjectWillChange! as! ObservableObjectPublisher - } - - #endif - - fileprivate func willChange() { - - guard #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) else { - - return - } - #if canImport(Combine) - - #if canImport(SwiftUI) - - withAnimation { - - self.objectWillChange.send() - } - - #endif - - self.objectWillChange.send() - - #endif - } - - fileprivate func didChange() { - - // nothing - } -} - - // MARK: - ObjectPublisher where O: NSManagedObject extension ObjectPublisher where O: NSManagedObject { From 003bf897e251ab3663ccd4edf8f7a089aaa0621b Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 7 Mar 2021 12:01:08 +0900 Subject: [PATCH 3/9] Cleanup unnecessary #available branches --- CoreStore.xcodeproj/project.pbxproj | 4 +- CoreStoreTests/BridgingTests.m | 12 +- CoreStoreTests/ConvenienceTests.swift | 1 - CoreStoreTests/ListObserverTests.swift | 2 - CoreStoreTests/ObjectObserverTests.swift | 2 - CoreStoreTests/ObjectPublisherTests.swift | 1 - CoreStoreTests/SectionByTests.swift | 1 - CoreStoreTests/StorageInterfaceTests.swift | 100 ++++---------- CoreStoreTests/TransactionTests.swift | 2 - Sources/CSDataStack+Observing.swift | 1 - Sources/CSListMonitor.swift | 2 - Sources/CSListObserver.swift | 3 - Sources/CSObjectMonitor.swift | 2 - Sources/CSObjectObserver.swift | 1 - Sources/CSSectionBy.swift | 2 - ...reStore+CustomDebugStringConvertible.swift | 26 +--- Sources/CoreStoreSchema.swift | 49 +++---- Sources/DataStack+Migration.swift | 11 +- Sources/DataStack+Observing.swift | 1 - ...bleDataSource.TableViewAdapter-UIKit.swift | 11 +- Sources/Entity.swift | 2 - Sources/FieldCoders.NSCoding.swift | 27 ++-- Sources/From+Querying.swift | 30 ----- Sources/Internals.CoreStoreFetchRequest.swift | 14 -- ...ls.CoreStoreFetchedResultsController.swift | 1 - ...als.FetchedResultsControllerDelegate.swift | 124 +----------------- Sources/ListMonitor.swift | 5 - Sources/ListObserver.swift | 6 - Sources/ListPublisher.swift | 1 - ...FetchedResultsController+Convenience.swift | 3 - .../NSManagedObjectContext+Transaction.swift | 9 +- Sources/ObjectMonitor.swift | 3 - Sources/ObjectObserver.swift | 2 - Sources/SQLiteStore.swift | 13 +- Sources/SectionBy.swift | 3 - Sources/SectionMonitorBuilder.swift | 2 - Sources/UnsafeDataTransaction+Observing.swift | 1 - 37 files changed, 65 insertions(+), 415 deletions(-) diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 9103e4b..f231963 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -3372,7 +3372,7 @@ SWIFT_SWIFT3_OBJC_INFERENCE = Off; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 10.0; + TVOS_DEPLOYMENT_TARGET = 11.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; WATCHOS_DEPLOYMENT_TARGET = 3.0; @@ -3436,7 +3436,7 @@ SWIFT_SWIFT3_OBJC_INFERENCE = Off; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 10.0; + TVOS_DEPLOYMENT_TARGET = 11.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; diff --git a/CoreStoreTests/BridgingTests.m b/CoreStoreTests/BridgingTests.m index 853db4e..31040ea 100644 --- a/CoreStoreTests/BridgingTests.m +++ b/CoreStoreTests/BridgingTests.m @@ -191,16 +191,8 @@ XCTAssertEqualObjects([[sqliteStorage class] storeType], [CSSQLiteStore storeType]); XCTAssertEqualObjects([[sqliteStorage class] storeType], NSSQLiteStoreType); XCTAssertNil(sqliteStorage.configuration); - NSDictionary *storeOptions; - if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, *)) { - - storeOptions = @{ NSSQLitePragmasOption: @{ @"journal_mode": @"WAL" }, - NSBinaryStoreInsecureDecodingCompatibilityOption: @YES }; - } - else { - - storeOptions = @{ NSSQLitePragmasOption: @{ @"journal_mode": @"WAL" }}; - } + NSDictionary *storeOptions = @{ NSSQLitePragmasOption: @{ @"journal_mode": @"WAL" }, + NSBinaryStoreInsecureDecodingCompatibilityOption: @YES }; XCTAssertEqualObjects(sqliteStorage.storeOptions, storeOptions); XCTAssertNil(sqliteError); } diff --git a/CoreStoreTests/ConvenienceTests.swift b/CoreStoreTests/ConvenienceTests.swift index 9e7fd2e..d59e463 100644 --- a/CoreStoreTests/ConvenienceTests.swift +++ b/CoreStoreTests/ConvenienceTests.swift @@ -29,7 +29,6 @@ import CoreStore // MARK: - ConvenienceTests -@available(macOS 10.12, *) class ConvenienceTests: BaseTestCase { @objc diff --git a/CoreStoreTests/ListObserverTests.swift b/CoreStoreTests/ListObserverTests.swift index ac1bb5a..e3c5c86 100644 --- a/CoreStoreTests/ListObserverTests.swift +++ b/CoreStoreTests/ListObserverTests.swift @@ -31,7 +31,6 @@ import CoreStore // MARK: - ListObserverTests -@available(macOS 10.12, *) class ListObserverTests: BaseTestDataTestCase { @objc @@ -551,7 +550,6 @@ class ListObserverTests: BaseTestDataTestCase { // MARK: TestListObserver -@available(macOS 10.12, *) class TestListObserver: ListSectionObserver { // MARK: ListObserver diff --git a/CoreStoreTests/ObjectObserverTests.swift b/CoreStoreTests/ObjectObserverTests.swift index 4072916..8ca76d3 100644 --- a/CoreStoreTests/ObjectObserverTests.swift +++ b/CoreStoreTests/ObjectObserverTests.swift @@ -31,7 +31,6 @@ import CoreStore // MARK: - ObjectObserverTests -@available(macOS 10.12, *) class ObjectObserverTests: BaseTestDataTestCase { @objc @@ -203,7 +202,6 @@ class ObjectObserverTests: BaseTestDataTestCase { // MARK: TestObjectObserver -@available(macOS 10.12, *) class TestObjectObserver: ObjectObserver { typealias ObjectEntityType = TestEntity1 diff --git a/CoreStoreTests/ObjectPublisherTests.swift b/CoreStoreTests/ObjectPublisherTests.swift index 58d4817..b6ff73a 100644 --- a/CoreStoreTests/ObjectPublisherTests.swift +++ b/CoreStoreTests/ObjectPublisherTests.swift @@ -31,7 +31,6 @@ import CoreStore // MARK: - ObjectPublisherTests -@available(macOS 10.12, *) class ObjectPublisherTests: BaseTestDataTestCase { @objc diff --git a/CoreStoreTests/SectionByTests.swift b/CoreStoreTests/SectionByTests.swift index a0711e3..fc4d031 100644 --- a/CoreStoreTests/SectionByTests.swift +++ b/CoreStoreTests/SectionByTests.swift @@ -31,7 +31,6 @@ import CoreStore //MARK: - SectionByTests -@available(macOS 10.12, *) final class SectionByTests: XCTestCase { @objc diff --git a/CoreStoreTests/StorageInterfaceTests.swift b/CoreStoreTests/StorageInterfaceTests.swift index ef94b85..f00f81e 100644 --- a/CoreStoreTests/StorageInterfaceTests.swift +++ b/CoreStoreTests/StorageInterfaceTests.swift @@ -83,21 +83,11 @@ final class StorageInterfaceTests: XCTestCase { let store = SQLiteStore() XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType) XCTAssertNil(store.configuration) - if #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"], - NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary - ) - } - else { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary - ) - } + XCTAssertEqual( + store.storeOptions as NSDictionary?, + [NSSQLitePragmasOption: ["journal_mode": "WAL"], + NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary + ) XCTAssertEqual(store.fileURL, SQLiteStore.defaultFileURL) XCTAssertTrue(store.migrationMappingProviders.isEmpty) @@ -123,21 +113,11 @@ final class StorageInterfaceTests: XCTestCase { ) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType) XCTAssertEqual(store.configuration, "config1") - if #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"], - NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary - ) - } - else { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary - ) - } + XCTAssertEqual( + store.storeOptions as NSDictionary?, + [NSSQLitePragmasOption: ["journal_mode": "WAL"], + NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary + ) XCTAssertEqual(store.fileURL, fileURL) XCTAssertEqual(store.migrationMappingProviders as! [XcodeSchemaMappingProvider], [mappingProvider]) @@ -160,21 +140,11 @@ final class StorageInterfaceTests: XCTestCase { ) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType) XCTAssertEqual(store.configuration, "config1") - if #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"], - NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary - ) - } - else { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary - ) - } + XCTAssertEqual( + store.storeOptions as NSDictionary?, + [NSSQLitePragmasOption: ["journal_mode": "WAL"], + NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary + ) XCTAssertEqual(store.fileURL.deletingLastPathComponent(), SQLiteStore.defaultRootDirectory) XCTAssertEqual(store.fileURL.lastPathComponent, fileName) @@ -209,21 +179,11 @@ final class StorageInterfaceTests: XCTestCase { let store = SQLiteStore.legacy() XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType) XCTAssertNil(store.configuration) - if #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"], - NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary - ) - } - else { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary - ) - } + XCTAssertEqual( + store.storeOptions as NSDictionary?, + [NSSQLitePragmasOption: ["journal_mode": "WAL"], + NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary + ) XCTAssertEqual(store.fileURL, SQLiteStore.legacyDefaultFileURL) XCTAssertTrue(store.migrationMappingProviders.isEmpty) @@ -246,21 +206,11 @@ final class StorageInterfaceTests: XCTestCase { ) XCTAssertEqual(type(of: store).storeType, NSSQLiteStoreType) XCTAssertEqual(store.configuration, "config1") - if #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"], - NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary - ) - } - else { - - XCTAssertEqual( - store.storeOptions as NSDictionary?, - [NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary - ) - } + XCTAssertEqual( + store.storeOptions as NSDictionary?, + [NSSQLitePragmasOption: ["journal_mode": "WAL"], + NSBinaryStoreInsecureDecodingCompatibilityOption: true] as NSDictionary + ) XCTAssertEqual(store.fileURL.deletingLastPathComponent(), SQLiteStore.legacyDefaultRootDirectory) XCTAssertEqual(store.fileURL.lastPathComponent, fileName) diff --git a/CoreStoreTests/TransactionTests.swift b/CoreStoreTests/TransactionTests.swift index 2477569..d06a18e 100644 --- a/CoreStoreTests/TransactionTests.swift +++ b/CoreStoreTests/TransactionTests.swift @@ -383,8 +383,6 @@ final class TransactionTests: BaseTestCase { } } - - @available(macOS 10.12, *) @objc dynamic func test_ThatSynchronousTransactions_CanCommitWithoutWaitingForMerges() { diff --git a/Sources/CSDataStack+Observing.swift b/Sources/CSDataStack+Observing.swift index 78c0141..d0c2ff4 100644 --- a/Sources/CSDataStack+Observing.swift +++ b/Sources/CSDataStack+Observing.swift @@ -30,7 +30,6 @@ import CoreData // MARK: - CSDataStack @available(*, deprecated, message: "CoreStore Objective-C API will be removed soon.") -@available(macOS 10.12, *) extension CSDataStack { /** diff --git a/Sources/CSListMonitor.swift b/Sources/CSListMonitor.swift index a5b3fae..f4a5d67 100644 --- a/Sources/CSListMonitor.swift +++ b/Sources/CSListMonitor.swift @@ -34,7 +34,6 @@ import CoreData - SeeAlso: `ListMonitor` */ -@available(macOS 10.12, *) @objc public final class CSListMonitor: NSObject { @@ -546,7 +545,6 @@ public final class CSListMonitor: NSObject { // MARK: - ListMonitor -@available(macOS 10.12, *) extension ListMonitor where ListMonitor.ObjectType: NSManagedObject { // MARK: CoreStoreSwiftType diff --git a/Sources/CSListObserver.swift b/Sources/CSListObserver.swift index b12c3f4..8c48e7f 100644 --- a/Sources/CSListObserver.swift +++ b/Sources/CSListObserver.swift @@ -40,7 +40,6 @@ import CoreData - SeeAlso: `ListObserver` */ -@available(macOS 10.12, *) @objc public protocol CSListObserver: AnyObject { @@ -91,7 +90,6 @@ public protocol CSListObserver: AnyObject { - SeeAlso: `ListObjectObserver` */ -@available(macOS 10.12, *) @objc public protocol CSListObjectObserver: CSListObserver { @@ -152,7 +150,6 @@ public protocol CSListObjectObserver: CSListObserver { - SeeAlso: `ListSectionObserver` */ -@available(macOS 10.12, *) @objc public protocol CSListSectionObserver: CSListObjectObserver { diff --git a/Sources/CSObjectMonitor.swift b/Sources/CSObjectMonitor.swift index a0e7561..41f78c5 100644 --- a/Sources/CSObjectMonitor.swift +++ b/Sources/CSObjectMonitor.swift @@ -34,7 +34,6 @@ import CoreData - SeeAlso: `ObjectMonitor` */ -@available(macOS 10.12, *) @objc public final class CSObjectMonitor: NSObject { @@ -139,7 +138,6 @@ public final class CSObjectMonitor: NSObject { // MARK: - ObjectMonitor -@available(macOS 10.12, *) extension ObjectMonitor where ObjectMonitor.ObjectType: NSManagedObject { // MARK: CoreStoreSwiftType diff --git a/Sources/CSObjectObserver.swift b/Sources/CSObjectObserver.swift index a69e968..3490882 100644 --- a/Sources/CSObjectObserver.swift +++ b/Sources/CSObjectObserver.swift @@ -38,7 +38,6 @@ import CoreData - SeeAlso: `ObjectObserver` */ -@available(macOS 10.12, *) @objc public protocol CSObjectObserver: AnyObject { diff --git a/Sources/CSSectionBy.swift b/Sources/CSSectionBy.swift index 0755cf6..b7363c6 100644 --- a/Sources/CSSectionBy.swift +++ b/Sources/CSSectionBy.swift @@ -34,7 +34,6 @@ import CoreData - SeeAlso: `SectionBy` */ -@available(macOS 10.12, *) @objc public final class CSSectionBy: NSObject { @@ -91,7 +90,6 @@ public final class CSSectionBy: NSObject { // MARK: - SectionBy -@available(macOS 10.12, *) extension SectionBy { // MARK: CoreStoreSwiftType diff --git a/Sources/CoreStore+CustomDebugStringConvertible.swift b/Sources/CoreStore+CustomDebugStringConvertible.swift index 32aa7c5..ff56e49 100644 --- a/Sources/CoreStore+CustomDebugStringConvertible.swift +++ b/Sources/CoreStore+CustomDebugStringConvertible.swift @@ -359,7 +359,6 @@ extension UnsafeDataModelSchema: CustomDebugStringConvertible, CoreStoreDebugStr // MARK: - ListMonitor -@available(macOS 10.12, *) fileprivate struct CoreStoreFetchedSectionInfoWrapper: CoreStoreDebugStringConvertible { // MARK: CustomDebugStringConvertible @@ -404,7 +403,6 @@ fileprivate struct CoreStoreFetchedSectionInfoWrapper: CoreStoreDebugStringConve private let numberOfObjects: Int } -@available(macOS 10.12, *) extension ListMonitor: CustomDebugStringConvertible, CoreStoreDebugStringConvertible { // MARK: CustomDebugStringConvertible @@ -431,7 +429,6 @@ extension ListMonitor: CustomDebugStringConvertible, CoreStoreDebugStringConvert // MARK: - ListPublisher -@available(macOS 10.12, *) extension ListPublisher: CustomDebugStringConvertible, CoreStoreDebugStringConvertible { // MARK: CustomDebugStringConvertible @@ -614,7 +611,6 @@ extension MigrationType: CoreStoreDebugStringConvertible { // MARK: - ObjectMonitor -@available(macOS 10.12, *) extension ObjectMonitor: CustomDebugStringConvertible, CoreStoreDebugStringConvertible { // MARK: CustomDebugStringConvertible @@ -738,7 +734,6 @@ extension PartialObject: CustomDebugStringConvertible, CoreStoreDebugStringConve // MARK: - SectionBy -@available(macOS 10.12, *) extension SectionBy: CustomDebugStringConvertible, CoreStoreDebugStringConvertible { // MARK: CustomDebugStringConvertible @@ -1259,33 +1254,20 @@ extension NSEntityDescription: CoreStoreDebugStringConvertible { public var coreStoreDumpString: String { - var info: DumpInfo = [ + return createFormattedString( + "(", ")", ("managedObjectClassName", self.managedObjectClassName!), ("name", self.name as Any), + ("indexes", self.indexes), ("isAbstract", self.isAbstract), ("superentity?.name", self.superentity?.name as Any), ("subentities", self.subentities.map({ $0.name })), ("properties", self.properties), + ("uniquenessConstraints", self.uniquenessConstraints), ("userInfo", self.userInfo as Any), ("versionHash", self.versionHash), ("versionHashModifier", self.versionHashModifier as Any), ("renamingIdentifier", self.renamingIdentifier as Any) - ] - if #available(iOS 11.0, macOS 10.13, watchOS 4.0, tvOS 11.0, *) { - - info.append(("indexes", self.indexes)) - } - else { - - info.append(("compoundIndexes", self.compoundIndexes)) - } - if #available(macOS 10.11, iOS 9.0, *) { - - info.append(("uniquenessConstraints", self.uniquenessConstraints)) - } - return createFormattedString( - "(", ")", - info ) } } diff --git a/Sources/CoreStoreSchema.swift b/Sources/CoreStoreSchema.swift index 7c976f3..98150f5 100644 --- a/Sources/CoreStoreSchema.swift +++ b/Sources/CoreStoreSchema.swift @@ -564,18 +564,14 @@ public final class CoreStoreSchema: DynamicSchema { ) } for (entity, entityDescription) in entityDescriptionsByEntity { + + if entity.uniqueConstraints.contains(where: { !$0.isEmpty }) { - if #available(macOS 10.11, iOS 9.0, *) { - - let uniqueConstraints = entity.uniqueConstraints.filter({ !$0.isEmpty }) - if !uniqueConstraints.isEmpty { - - Internals.assert( - entityDescription.superentity == nil, - "Uniqueness constraints must be defined at the highest level possible." - ) - entityDescription.uniquenessConstraints = entity.uniqueConstraints.map { $0.map { $0 as NSString } } - } + Internals.assert( + entityDescription.superentity == nil, + "Uniqueness constraints must be defined at the highest level possible." + ) + entityDescription.uniquenessConstraints = entity.uniqueConstraints.map { $0.map { $0 as NSString } } } guard !entity.indexes.isEmpty else { @@ -586,31 +582,18 @@ public final class CoreStoreSchema: DynamicSchema { entityDescription.coreStoreEntity = entity // reserialize } let attributesByName = entityDescription.attributesByName - if #available(iOS 11.0, macOS 10.13, watchOS 4.0, tvOS 11.0, *) { + entityDescription.indexes = entity.indexes.map { (compoundIndexes) in - entityDescription.indexes = entity.indexes.map { (compoundIndexes) in - - return NSFetchIndexDescription.init( - name: "_CoreStoreSchema_indexes_\(entityDescription.name!)_\(compoundIndexes.joined(separator: "-"))", - elements: compoundIndexes.map { (keyPath) in - - return NSFetchIndexElementDescription( - property: attributesByName[keyPath]!, - collationType: .binary - ) - } - ) - } - } - else { - - entityDescription.compoundIndexes = entity.indexes.map { (compoundIndexes) in - - return compoundIndexes.map { (keyPath) in + return NSFetchIndexDescription.init( + name: "_CoreStoreSchema_indexes_\(entityDescription.name!)_\(compoundIndexes.joined(separator: "-"))", + elements: compoundIndexes.map { (keyPath) in - return attributesByName[keyPath]! + return NSFetchIndexElementDescription( + property: attributesByName[keyPath]!, + collationType: .binary + ) } - } + ) } } } diff --git a/Sources/DataStack+Migration.swift b/Sources/DataStack+Migration.swift index 68a797d..856e376 100644 --- a/Sources/DataStack+Migration.swift +++ b/Sources/DataStack+Migration.swift @@ -613,16 +613,7 @@ extension DataStack { } } let fileManager = FileManager.default - let systemTemporaryDirectoryURL: URL - if #available(macOS 10.12, iOS 10.0, *) { - - systemTemporaryDirectoryURL = fileManager.temporaryDirectory - } - else { - - systemTemporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory()) - } - let temporaryDirectoryURL = systemTemporaryDirectoryURL + let temporaryDirectoryURL = fileManager.temporaryDirectory .appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack") .appendingPathComponent(ProcessInfo().globallyUniqueString) diff --git a/Sources/DataStack+Observing.swift b/Sources/DataStack+Observing.swift index 8c7adba..f4bc077 100644 --- a/Sources/DataStack+Observing.swift +++ b/Sources/DataStack+Observing.swift @@ -29,7 +29,6 @@ import CoreData // MARK: - DataStack -@available(macOS 10.12, *) extension DataStack { /** diff --git a/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift b/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift index c390202..88a6ad9 100644 --- a/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift +++ b/Sources/DiffableDataSource.TableViewAdapter-UIKit.swift @@ -247,16 +247,7 @@ extension DiffableDataSource { return } - if #available(iOS 11.0, tvOS 11.0, *) { - - base.performBatchUpdates(updates) - } - else { - - base.beginUpdates() - updates() - base.endUpdates() - } + base.performBatchUpdates(updates) } public func reloadData() { diff --git a/Sources/Entity.swift b/Sources/Entity.swift index 6845763..fe7f787 100644 --- a/Sources/Entity.swift +++ b/Sources/Entity.swift @@ -70,7 +70,6 @@ public final class Entity: DynamicEntity { - parameter indexes: the compound indexes for the entity as an array of arrays. The arrays contained in the returned array contain `KeyPath`s to properties of the entity. - parameter uniqueConstraints: sets uniqueness constraints for the entity. A uniqueness constraint is a set of one or more `KeyPath`s whose value must be unique over the set of instances of that entity. This value forms part of the entity's version hash. Uniqueness constraint violations can be computationally expensive to handle. It is highly suggested that there be only one uniqueness constraint per entity hierarchy. Uniqueness constraints must be defined at the highest level possible, and CoreStore will raise an assertion failure if unique constraints are added to a sub entity. */ - @available(macOS 10.11, *) public convenience init(_ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = [], uniqueConstraints: [[PartialKeyPath]]) { self.init( @@ -116,7 +115,6 @@ public final class Entity: DynamicEntity { - parameter indexes: the compound indexes for the entity as an array of arrays. The arrays contained in the returned array contain KeyPath's to properties of the entity. - parameter uniqueConstraints: sets uniqueness constraints for the entity. A uniqueness constraint is a set of one or more `KeyPath`s whose value must be unique over the set of instances of that entity. This value forms part of the entity's version hash. Uniqueness constraint violations can be computationally expensive to handle. It is highly suggested that there be only one uniqueness constraint per entity hierarchy. Uniqueness constraints must be defined at the highest level possible, and CoreStore will raise an assertion failure if unique constraints are added to a sub entity. */ - @available(macOS 10.11, *) public init(_ type: O.Type, _ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = [], uniqueConstraints: [[PartialKeyPath]]) { let meta = O.meta diff --git a/Sources/FieldCoders.NSCoding.swift b/Sources/FieldCoders.NSCoding.swift index 6e57afc..abb4f77 100644 --- a/Sources/FieldCoders.NSCoding.swift +++ b/Sources/FieldCoders.NSCoding.swift @@ -47,17 +47,10 @@ extension FieldCoders { return nil } - if #available(iOS 11.0, macOS 10.13, watchOS 4.0, tvOS 11.0, *) { - - return try! NSKeyedArchiver.archivedData( - withRootObject: fieldValue, - requiringSecureCoding: self.requiresSecureCoding - ) - } - else { - - return NSKeyedArchiver.archivedData(withRootObject: fieldValue) - } + return try! NSKeyedArchiver.archivedData( + withRootObject: fieldValue, + requiringSecureCoding: self.requiresSecureCoding + ) } public static func decodeFromStoredData(_ data: Data?) -> FieldStoredValue? { @@ -66,14 +59,10 @@ extension FieldCoders { return nil } - if #available(iOS 11.0, macOS 10.13, watchOS 4.0, tvOS 11.0, *) { - - return try! NSKeyedUnarchiver.unarchivedObject(ofClass: FieldStoredValue.self, from: data) - } - else { - - return NSKeyedUnarchiver.unarchiveObject(with: data) as! FieldStoredValue? - } + return try! NSKeyedUnarchiver.unarchivedObject( + ofClass: FieldStoredValue.self, + from: data + ) } diff --git a/Sources/From+Querying.swift b/Sources/From+Querying.swift index 0d9a4d6..d092e1b 100644 --- a/Sources/From+Querying.swift +++ b/Sources/From+Querying.swift @@ -221,7 +221,6 @@ extension From { - parameter clause: the `SectionBy` to be used by the `ListMonitor` - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ clause: SectionBy) -> SectionMonitorChainBuilder { return .init( @@ -237,7 +236,6 @@ extension From { - parameter sectionKeyPath: the key path to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPathString) -> SectionMonitorChainBuilder { return self.sectionBy(sectionKeyPath, sectionIndexTransformer: { _ in nil }) @@ -251,7 +249,6 @@ extension From { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPathString, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -284,7 +281,6 @@ extension From { // MARK: Deprecated @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPathString, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -319,7 +315,6 @@ extension From where O: NSManagedObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -336,7 +331,6 @@ extension From where O: NSManagedObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -352,7 +346,6 @@ extension From where O: NSManagedObject { // MARK: Deprecated @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -431,7 +424,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Stored>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -446,7 +438,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Virtual>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -461,7 +452,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Coded>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -476,7 +466,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Required>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -491,7 +480,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Optional>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -506,7 +494,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Required>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -521,7 +508,6 @@ extension From where O: CoreStoreObject { - parameter sectionKeyPath: the `KeyPath` to use to group the objects into sections - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy(_ sectionKeyPath: KeyPath.Optional>) -> SectionMonitorChainBuilder { return self.sectionBy( @@ -538,7 +524,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Stored>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -558,7 +543,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Virtual>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -578,7 +562,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Coded>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -598,7 +581,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Required>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -618,7 +600,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Optional>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -638,7 +619,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Required>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -658,7 +638,6 @@ extension From where O: CoreStoreObject { - parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section index title - returns: a `SectionMonitorChainBuilder` that is sectioned by the specified key path */ - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Optional>, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -674,7 +653,6 @@ extension From where O: CoreStoreObject { // MARK: Deprecated @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Stored>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -687,7 +665,6 @@ extension From where O: CoreStoreObject { } @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Virtual>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -700,7 +677,6 @@ extension From where O: CoreStoreObject { } @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Coded>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -713,7 +689,6 @@ extension From where O: CoreStoreObject { } @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Required>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -726,7 +701,6 @@ extension From where O: CoreStoreObject { } @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Optional>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -739,7 +713,6 @@ extension From where O: CoreStoreObject { } @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Required>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -752,7 +725,6 @@ extension From where O: CoreStoreObject { } @available(*, deprecated, renamed: "sectionBy(_:sectionIndexTransformer:)") - @available(macOS 10.12, *) public func sectionBy( _ sectionKeyPath: KeyPath.Optional>, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String? @@ -1224,7 +1196,6 @@ extension QueryChainBuilder where O: CoreStoreObject { // MARK: - SectionMonitorChainBuilder -@available(macOS 10.12, *) extension SectionMonitorChainBuilder { /** @@ -1376,7 +1347,6 @@ extension SectionMonitorChainBuilder { // MARK: - SectionMonitorChainBuilder where O: CoreStoreObject -@available(macOS 10.12, *) extension SectionMonitorChainBuilder where O: CoreStoreObject { /** diff --git a/Sources/Internals.CoreStoreFetchRequest.swift b/Sources/Internals.CoreStoreFetchRequest.swift index aaf43f7..d0e8f55 100644 --- a/Sources/Internals.CoreStoreFetchRequest.swift +++ b/Sources/Internals.CoreStoreFetchRequest.swift @@ -68,22 +68,8 @@ extension Internals { } set { - if #available(iOS 11.0, macOS 10.13, watchOS 4.0, tvOS 11.0, *) { - - self.copiedAffectedStores = (newValue as NSArray?)?.copy() as! NSArray? - super.affectedStores = newValue - return - } - // Bugfix for NSFetchRequest messing up memory management for `affectedStores` - // http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified - if let releaseArray = self.releaseArray { - - releaseArray.release() - self.releaseArray = nil - } self.copiedAffectedStores = (newValue as NSArray?)?.copy() as! NSArray? super.affectedStores = newValue - self.releaseArray = (super.affectedStores as NSArray?).map(Unmanaged.passRetained(_:)) } } diff --git a/Sources/Internals.CoreStoreFetchedResultsController.swift b/Sources/Internals.CoreStoreFetchedResultsController.swift index 699b7db..bda6c6f 100644 --- a/Sources/Internals.CoreStoreFetchedResultsController.swift +++ b/Sources/Internals.CoreStoreFetchedResultsController.swift @@ -33,7 +33,6 @@ extension Internals { // MARK: - CoreStoreFetchedResultsController - @available(macOS 10.12, *) internal final class CoreStoreFetchedResultsController: NSFetchedResultsController { // MARK: Internal diff --git a/Sources/Internals.FetchedResultsControllerDelegate.swift b/Sources/Internals.FetchedResultsControllerDelegate.swift index 4cfec36..2931ee0 100644 --- a/Sources/Internals.FetchedResultsControllerDelegate.swift +++ b/Sources/Internals.FetchedResultsControllerDelegate.swift @@ -29,7 +29,6 @@ import CoreData // MARK: - FetchedResultsControllerHandler -@available(macOS 10.12, *) internal protocol FetchedResultsControllerHandler: AnyObject { var sectionIndexTransformer: (_ sectionName: KeyPathString?) -> String? { get } @@ -50,7 +49,6 @@ extension Internals { // MARK: - FetchedResultsControllerDelegate - @available(macOS 10.12, *) internal final class FetchedResultsControllerDelegate: NSObject, NSFetchedResultsControllerDelegate { // MARK: Internal @@ -90,14 +88,6 @@ extension Internals { return } - - if #available(iOS 10.3, tvOS 10.3, watchOS 3.2, macOS 10.13, *) {} - else { - - self.deletedSections = [] - self.insertedSections = [] - } - self.handler?.controllerWillChangeContent(controller) } @@ -123,102 +113,11 @@ extension Internals { return } - - if #available(iOS 10.3, tvOS 10.3, watchOS 3.2, macOS 10.13, *) { - - self.handler?.controller( - controller, - didChangeObject: anObject, - atIndexPath: indexPath, - forChangeType: type, - newIndexPath: newIndexPath - ) - return - } - - guard var actualType = NSFetchedResultsChangeType(rawValue: type.rawValue) else { - - // This fix is for a bug where iOS passes 0 for NSFetchedResultsChangeType, but this is not a valid enum case. - // Swift will then always execute the first case of the switch causing strange behaviour. - // https://forums.developer.apple.com/thread/12184#31850 - return - } - - // This whole dance is a workaround for a nasty bug introduced in XCode 7 targeted at iOS 8 devices - // http://stackoverflow.com/questions/31383760/ios-9-attempt-to-delete-and-reload-the-same-index-path/31384014#31384014 - // https://forums.developer.apple.com/message/9998#9998 - // https://forums.developer.apple.com/message/31849#31849 - - if case .update = actualType, - indexPath != nil, - newIndexPath != nil { - - actualType = .move - } - - switch actualType { - - case .update: - guard let section = indexPath?[0] else { - - return - } - if self.deletedSections.contains(section) - || self.insertedSections.contains(section) { - - return - } - - case .move: - guard let indexPath = indexPath, let newIndexPath = newIndexPath else { - - return - } - guard indexPath == newIndexPath else { - - break - } - if self.insertedSections.contains(indexPath[0]) { - - // Observers that handle the .Move change are advised to delete then reinsert the object instead of just moving. This is especially true when indexPath and newIndexPath are equal. For example, calling tableView.moveRowAtIndexPath(_:toIndexPath) when both indexPaths are the same will crash the tableView. - self.handler?.controller( - controller, - didChangeObject: anObject, - atIndexPath: indexPath, - forChangeType: .move, - newIndexPath: newIndexPath - ) - return - } - if self.deletedSections.contains(indexPath[0]) { - - self.handler?.controller( - controller, - didChangeObject: anObject, - atIndexPath: nil, - forChangeType: .insert, - newIndexPath: indexPath - ) - return - } - self.handler?.controller( - controller, - didChangeObject: anObject, - atIndexPath: indexPath, - forChangeType: .update, - newIndexPath: nil - ) - return - - default: - break - } - self.handler?.controller( controller, didChangeObject: anObject, atIndexPath: indexPath, - forChangeType: actualType, + forChangeType: type, newIndexPath: newIndexPath ) } @@ -230,18 +129,6 @@ extension Internals { return } - - if #available(iOS 10.3, tvOS 10.3, watchOS 3.2, macOS 10.13, *) {} - else { - - switch type { - - case .delete: self.deletedSections.insert(sectionIndex) - case .insert: self.insertedSections.insert(sectionIndex) - default: break - } - } - self.handler?.controller( controller, didChangeSection: sectionInfo, @@ -255,14 +142,5 @@ extension Internals { return self.handler?.sectionIndexTransformer(sectionName) } - - - // MARK: Private - - @nonobjc - private var deletedSections = Set() - - @nonobjc - private var insertedSections = Set() } } diff --git a/Sources/ListMonitor.swift b/Sources/ListMonitor.swift index 168a448..79e0789 100644 --- a/Sources/ListMonitor.swift +++ b/Sources/ListMonitor.swift @@ -66,7 +66,6 @@ import CoreData ``` In the example above, both `person1` and `person2` will contain the object at section=2, index=3. */ -@available(macOS 10.12, *) public final class ListMonitor: Hashable { // MARK: Public (Accessors) @@ -1178,7 +1177,6 @@ public final class ListMonitor: Hashable { // MARK: - ListMonitor where O: NSManagedObject -@available(macOS 10.12, *) extension ListMonitor where O: NSManagedObject { /** @@ -1236,7 +1234,6 @@ extension ListMonitor where O: NSManagedObject { // MARK: - ListMonitor where O: CoreStoreObject -@available(macOS 10.12, *) extension ListMonitor where O: CoreStoreObject { /** @@ -1288,7 +1285,6 @@ extension ListMonitor where O: CoreStoreObject { // MARK: - ListMonitor: FetchedResultsControllerHandler -@available(macOS 10.12, *) extension ListMonitor: FetchedResultsControllerHandler { // MARK: FetchedResultsControllerHandler @@ -1402,7 +1398,6 @@ extension ListMonitor: FetchedResultsControllerHandler { // MARK: - Notification Keys -@available(macOS 10.12, *) extension Notification.Name { fileprivate static let listMonitorWillChangeList = Notification.Name(rawValue: "listMonitorWillChangeList") diff --git a/Sources/ListObserver.swift b/Sources/ListObserver.swift index 820767e..ff6f256 100644 --- a/Sources/ListObserver.swift +++ b/Sources/ListObserver.swift @@ -39,7 +39,6 @@ import CoreData monitor.addObserver(self) ``` */ -@available(macOS 10.12, *) public protocol ListObserver: AnyObject { /** @@ -82,7 +81,6 @@ public protocol ListObserver: AnyObject { // MARK: - ListObserver (Default Implementations) -@available(macOS 10.12, *) extension ListObserver { public func listMonitorWillChange(_ monitor: ListMonitor) { } @@ -103,7 +101,6 @@ extension ListObserver { monitor.addObserver(self) ``` */ -@available(macOS 10.12, *) public protocol ListObjectObserver: ListObserver { /** @@ -151,7 +148,6 @@ public protocol ListObjectObserver: ListObserver { // MARK: - ListObjectObserver (Default Implementations) -@available(macOS 10.12, *) extension ListObjectObserver { public func listMonitor(_ monitor: ListMonitor, didInsertObject object: ListEntityType, toIndexPath indexPath: IndexPath) { } @@ -177,7 +173,6 @@ extension ListObjectObserver { monitor.addObserver(self) ``` */ -@available(macOS 10.12, *) public protocol ListSectionObserver: ListObjectObserver { /** @@ -204,7 +199,6 @@ public protocol ListSectionObserver: ListObjectObserver { // MARK: - ListSectionObserver (Default Implementations) -@available(macOS 10.12, *) extension ListSectionObserver { public func listMonitor(_ monitor: ListMonitor, didInsertSection sectionInfo: NSFetchedResultsSectionInfo, toSectionIndex sectionIndex: Int) { } diff --git a/Sources/ListPublisher.swift b/Sources/ListPublisher.swift index 0ac296b..9a35e4f 100644 --- a/Sources/ListPublisher.swift +++ b/Sources/ListPublisher.swift @@ -54,7 +54,6 @@ import CoreData ``` All access to the `ListPublisher` items should be done via its `snapshot` value, which is a `struct` of type `ListSnapshot`. `ListSnapshot`s are also designed to work well with `DiffableDataSource.TableViewAdapter`s and `DiffableDataSource.CollectionViewAdapter`s. For detailed examples, refer to the documentation for `DiffableDataSource.TableViewAdapter` and `DiffableDataSource.CollectionViewAdapter`. */ -@available(macOS 10.12, *) public final class ListPublisher: Hashable { // MARK: Public (Accessors) diff --git a/Sources/NSFetchedResultsController+Convenience.swift b/Sources/NSFetchedResultsController+Convenience.swift index e94c291..7e53430 100644 --- a/Sources/NSFetchedResultsController+Convenience.swift +++ b/Sources/NSFetchedResultsController+Convenience.swift @@ -29,7 +29,6 @@ import CoreData // MARK: - DataStack -@available(macOS 10.12, *) extension DataStack { /** @@ -114,7 +113,6 @@ extension DataStack { // MARK: - UnsafeDataTransaction -@available(macOS 10.12, *) extension UnsafeDataTransaction { /** @@ -204,7 +202,6 @@ extension Internals { // MARK: FilePrivate - @available(macOS 10.12, *) fileprivate static func createFRC(fromContext context: NSManagedObjectContext, from: From, sectionBy: SectionBy? = nil, fetchClauses: [FetchClause]) -> NSFetchedResultsController { let controller = Internals.CoreStoreFetchedResultsController( diff --git a/Sources/NSManagedObjectContext+Transaction.swift b/Sources/NSManagedObjectContext+Transaction.swift index 4c5ad1c..4bbcdb5 100644 --- a/Sources/NSManagedObjectContext+Transaction.swift +++ b/Sources/NSManagedObjectContext+Transaction.swift @@ -230,14 +230,7 @@ extension NSManagedObjectContext { @nonobjc internal func refreshAndMergeAllObjects() { - if #available(iOS 8.3, macOS 10.11, *) { - - self.refreshAllObjects() - } - else { - - self.registeredObjects.forEach { self.refresh($0, mergeChanges: true) } - } + self.refreshAllObjects() } diff --git a/Sources/ObjectMonitor.swift b/Sources/ObjectMonitor.swift index d550b25..dcc9c1b 100644 --- a/Sources/ObjectMonitor.swift +++ b/Sources/ObjectMonitor.swift @@ -39,7 +39,6 @@ import CoreData Observers registered via `addObserver(_:)` are not retained. `ObjectMonitor` only keeps a `weak` reference to all observers, thus keeping itself free from retain-cycles. */ -@available(macOS 10.12, *) public final class ObjectMonitor: Hashable, ObjectRepresentation { /** @@ -376,7 +375,6 @@ public final class ObjectMonitor: Hashable, ObjectRepresentati // MARK: - ObjectMonitor: FetchedResultsControllerHandler -@available(macOS 10.12, *) extension ObjectMonitor: FetchedResultsControllerHandler { // MARK: FetchedResultsControllerHandler @@ -426,7 +424,6 @@ extension ObjectMonitor: FetchedResultsControllerHandler { // MARK: - Notification.Name -@available(macOS 10.12, *) extension Notification.Name { fileprivate static let objectMonitorWillChangeObject = Notification.Name(rawValue: "objectMonitorWillChangeObject") diff --git a/Sources/ObjectObserver.swift b/Sources/ObjectObserver.swift index e0cfbac..f2fa9cb 100644 --- a/Sources/ObjectObserver.swift +++ b/Sources/ObjectObserver.swift @@ -36,7 +36,6 @@ import CoreData monitor.addObserver(self) ``` */ -@available(macOS 10.12, *) public protocol ObjectObserver: AnyObject { /** @@ -76,7 +75,6 @@ public protocol ObjectObserver: AnyObject { // MARK: - ObjectObserver (Default Implementations) -@available(macOS 10.12, *) extension ObjectObserver { public func objectMonitor(_ monitor: ObjectMonitor, willUpdateObject object: ObjectEntityType) { } diff --git a/Sources/SQLiteStore.swift b/Sources/SQLiteStore.swift index a469ea4..f8d2abc 100644 --- a/Sources/SQLiteStore.swift +++ b/Sources/SQLiteStore.swift @@ -150,15 +150,10 @@ public final class SQLiteStore: LocalStorage { [NSSQLitePragmasOption: ["journal_mode": "WAL"]] ``` */ - public let storeOptions: [AnyHashable: Any]? = autoreleasepool { - - var storeOptions: [AnyHashable: Any] = [NSSQLitePragmasOption: ["journal_mode": "WAL"]] - if #available(iOS 11.0, macOS 10.13, tvOSApplicationExtension 11.0, watchOSApplicationExtension 4.0, *) { - - storeOptions[NSBinaryStoreInsecureDecodingCompatibilityOption] = true - } - return storeOptions - } + public let storeOptions: [AnyHashable: Any]? = [ + NSSQLitePragmasOption: ["journal_mode": "WAL"], + NSBinaryStoreInsecureDecodingCompatibilityOption: true + ] /** Do not call directly. Used by the `DataStack` internally. diff --git a/Sources/SectionBy.swift b/Sources/SectionBy.swift index 43e624c..0765945 100644 --- a/Sources/SectionBy.swift +++ b/Sources/SectionBy.swift @@ -39,7 +39,6 @@ import CoreData ) ``` */ -@available(macOS 10.12, *) public struct SectionBy { /** @@ -99,7 +98,6 @@ public struct SectionBy { // MARK: - SectionBy where O: NSManagedObject -@available(macOS 10.12, *) extension SectionBy where O: NSManagedObject { /** @@ -152,7 +150,6 @@ extension SectionBy where O: NSManagedObject { // MARK: - SectionBy where O: CoreStoreObject -@available(macOS 10.12, *) extension SectionBy where O: CoreStoreObject { /** diff --git a/Sources/SectionMonitorBuilder.swift b/Sources/SectionMonitorBuilder.swift index 173e07d..de1efd3 100644 --- a/Sources/SectionMonitorBuilder.swift +++ b/Sources/SectionMonitorBuilder.swift @@ -40,7 +40,6 @@ import CoreData ) ``` */ -@available(macOS 10.12, *) public struct SectionMonitorChainBuilder: SectionMonitorBuilderType { // MARK: SectionMonitorBuilderType @@ -62,7 +61,6 @@ public struct SectionMonitorChainBuilder: SectionMonitorBuilde /** Utility protocol for `SectionMonitorChainBuilder`. Used in methods that support chained fetch builders. */ -@available(macOS 10.12, *) public protocol SectionMonitorBuilderType { /** diff --git a/Sources/UnsafeDataTransaction+Observing.swift b/Sources/UnsafeDataTransaction+Observing.swift index 389df8e..bd22faf 100644 --- a/Sources/UnsafeDataTransaction+Observing.swift +++ b/Sources/UnsafeDataTransaction+Observing.swift @@ -29,7 +29,6 @@ import CoreData // MARK: - UnsafeDataTransaction -@available(macOS 10.12, *) extension UnsafeDataTransaction { /** From bfb1df3c408cbfefbc1d7ccddd789ef11a9cbbc2 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 7 Mar 2021 16:08:19 +0900 Subject: [PATCH 4/9] added Publishers for `addStorage` functions --- CoreStore.xcodeproj/project.pbxproj | 10 + Sources/DataStack+Reactive.swift | 72 ++++++ Sources/DataStack.AddStoragePublisher.swift | 238 ++++++++++++++++++ Sources/ListPublisher.SnapshotPublisher.swift | 2 + .../ObjectPublisher.SnapshotPublisher.swift | 2 + 5 files changed, 324 insertions(+) create mode 100644 Sources/DataStack.AddStoragePublisher.swift diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index f231963..55e0184 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -693,6 +693,10 @@ B5B866E125E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866DF25E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift */; }; B5B866E225E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866DF25E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift */; }; B5B866E325E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866DF25E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift */; }; + B5B866ED25F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866EC25F4800800335476 /* DataStack.AddStoragePublisher.swift */; }; + B5B866EE25F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866EC25F4800800335476 /* DataStack.AddStoragePublisher.swift */; }; + B5B866EF25F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866EC25F4800800335476 /* DataStack.AddStoragePublisher.swift */; }; + B5B866F025F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B866EC25F4800800335476 /* DataStack.AddStoragePublisher.swift */; }; B5BF7FAD234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BF7FAC234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift */; }; B5BF7FAE234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BF7FAC234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift */; }; B5BF7FAF234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BF7FAC234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift */; }; @@ -1157,6 +1161,7 @@ B5AEFAB41C9962AE00AD137F /* CoreStoreBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreStoreBridge.swift; sourceTree = ""; }; B5B866DA25E9012F00335476 /* ListPublisher+Reactive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ListPublisher+Reactive.swift"; sourceTree = ""; }; B5B866DF25E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectPublisher.SnapshotPublisher.swift; sourceTree = ""; }; + B5B866EC25F4800800335476 /* DataStack.AddStoragePublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStack.AddStoragePublisher.swift; sourceTree = ""; }; B5BF7FAC234C41E90070E741 /* Internals.DiffableDataSourceSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Internals.DiffableDataSourceSnapshot.swift; sourceTree = ""; }; B5BF7FB1234C97910070E741 /* DiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiffableDataSource.swift; sourceTree = ""; }; B5BF7FB6234C97CE0070E741 /* DiffableDataSource.TableViewAdapter-UIKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiffableDataSource.TableViewAdapter-UIKit.swift"; sourceTree = ""; }; @@ -1769,6 +1774,7 @@ B5C795C225DD651F00BDACC1 /* DataStack+Reactive.swift */, B5B866DA25E9012F00335476 /* ListPublisher+Reactive.swift */, B5944EF525E269F9001D1D81 /* ObjectPublisher+Reactive.swift */, + B5B866EC25F4800800335476 /* DataStack.AddStoragePublisher.swift */, B5944EFA25E8E8DA001D1D81 /* ListPublisher.SnapshotPublisher.swift */, B5B866DF25E9048000335476 /* ObjectPublisher.SnapshotPublisher.swift */, ); @@ -2356,6 +2362,7 @@ B5AA37F1235C28EE00FFD4B9 /* DiffableDataSource.CollectionViewAdapter-AppKit.swift in Sources */, B5D7A5B61CA3BF8F005C752B /* CSInto.swift in Sources */, B56007141B3F6C2800A9A8F9 /* SectionBy.swift in Sources */, + B5B866ED25F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */, B5DE522B230BD7CC00A22534 /* Internals.swift in Sources */, B5E84F371AFF85470064E85B /* NSManagedObjectContext+Transaction.swift in Sources */, B509D7BC23C847BC00F42824 /* Value.Optional.swift in Sources */, @@ -2608,6 +2615,7 @@ 82BA18C21C4BBD5300A0916E /* ObjectMonitor.swift in Sources */, B5D7A5B81CA3BF8F005C752B /* CSInto.swift in Sources */, 82BA18BD1C4BBD4A00A0916E /* GroupBy.swift in Sources */, + B5B866EE25F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */, B5ECDC1F1CA81A2100C7F112 /* CSDataStack+Querying.swift in Sources */, B5BF7FCC234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */, B5C976E41C6C9F9A00B1AF90 /* UnsafeDataTransaction+Observing.swift in Sources */, @@ -2860,6 +2868,7 @@ B50E175523517C6B004F033C /* Internals.DiffableDataUIDispatcher.Changeset.swift in Sources */, B5A5F26A1CAEC50F004AB9AF /* CSSelect.swift in Sources */, B5FEC1911C9166E700532541 /* NSPersistentStore+Setup.swift in Sources */, + B5B866F025F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */, B52DD1AB1BE1F93900949AFE /* From.swift in Sources */, B52DD1A11BE1F92C00949AFE /* DataStack+Transaction.swift in Sources */, B5220E1C1D130801009BC71E /* Internals.FetchedResultsControllerDelegate.swift in Sources */, @@ -3112,6 +3121,7 @@ B56321891BD65216006C9394 /* AsynchronousDataTransaction.swift in Sources */, B5ECDC201CA81A2100C7F112 /* CSDataStack+Querying.swift in Sources */, B5C976E51C6C9F9B00B1AF90 /* UnsafeDataTransaction+Observing.swift in Sources */, + B5B866EF25F4800800335476 /* DataStack.AddStoragePublisher.swift in Sources */, B5BF7FCD234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */, B53FBA151CAB63CB00F0D40A /* Progress+ObjectiveC.swift in Sources */, B50564D52350CC3100482308 /* PropertyProtocol.swift in Sources */, diff --git a/Sources/DataStack+Reactive.swift b/Sources/DataStack+Reactive.swift index f1f2c7b..d069265 100644 --- a/Sources/DataStack+Reactive.swift +++ b/Sources/DataStack+Reactive.swift @@ -75,6 +75,78 @@ extension DataStack.ReactiveNamespace { // MARK: Public + /** + Reactive extension for `CoreStore.DataStack`'s `addStorage(...)` API. Asynchronously adds a `StorageInterface` to the stack. + ``` + dataStack.reactive + .addStorage( + InMemoryStore(configuration: "Config1") + ) + .sink( + receiveCompletion: { result in + // ... + }, + receiveValue: { storage in + // ... + } + ) + .store(in: &cancellables) + ``` + - parameter storage: the storage + - returns: A `Future` that emits a `StorageInterface` instance added to the `DataStack`. Note that the `StorageInterface` event value may not always be the same instance as the parameter argument if a previous `StorageInterface` was already added at the same URL and with the same configuration. + */ + public func addStorage(_ storage: T) -> Future { + + return .init { (promise) in + + self.base.addStorage( + storage, + completion: { (result) in + + switch result { + + case .success(let storage): + promise(.success(storage)) + + case .failure(let error): + promise(.failure(error)) + } + } + ) + } + } + + /** + Reactive extension for `CoreStore.DataStack`'s `addStorage(...)` API. Asynchronously adds a `LocalStorage` to the stack. Migrations are also initiated by default. The event emits `DataStack.AddStoragePublisher.Progress` `enum` values. + ``` + dataStack.reactive + .addStorage( + SQLiteStore( + fileName: "core_data.sqlite", + configuration: "Config1" + ) + ) + .sink( + receiveCompletion: { result in + // ... + }, + receiveValue: { (progress) in + print("\(round(progress.fractionCompleted * 100)) %") // 0.0 ~ 1.0 + } + ) + .store(in: &cancellables) + ``` + - parameter storage: the local storage + - returns: A `DataStack.AddStoragePublisher` that emits a `DataStack.AddStoragePublisher.Progress` value with metadata for migration progress. Note that the `LocalStorage` event value may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration. + */ + public func addStorage(_ storage: T) -> DataStack.AddStoragePublisher { + + return .init( + dataStack: self.base, + storage: storage + ) + } + /** Reactive extension for `CoreStore.DataStack`'s `importObject(...)` API. Creates an `ImportableObject` by importing from the specified import source. The event value will be the object instance correctly associated for the `DataStack`. ``` diff --git a/Sources/DataStack.AddStoragePublisher.swift b/Sources/DataStack.AddStoragePublisher.swift new file mode 100644 index 0000000..bc2c443 --- /dev/null +++ b/Sources/DataStack.AddStoragePublisher.swift @@ -0,0 +1,238 @@ +// +// DataStack.AddStoragePublisher.swift +// CoreStore +// +// Copyright © 2021 John Rommel Estropia +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +#if canImport(Combine) +import Combine +import CoreData + + +// MARK: - DataStack + +@available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) +extension DataStack { + + // MARK: - AddStoragePublisher + + /** + A `Publisher` that emits a `ListSnapshot` whenever changes occur in the `ListPublisher`. + + - SeeAlso: DataStack.reactive.addStorage(_:) + */ + public struct AddStoragePublisher: Publisher { + + // MARK: Internal + + internal let dataStack: DataStack + internal let storage: Storage + + + // MARK: Publisher + + public typealias Output = Progress + public typealias Failure = CoreStoreError + + public func receive(subscriber: S) where S.Input == Output, S.Failure == Failure { + + subscriber.receive( + subscription: AddStorageSubscription( + dataStack: self.dataStack, + storage: self.storage, + subscriber: subscriber + ) + ) + } + + // MARK: - Progress + + /** + A `Progress` contains info on a `LocalStorage`'s setup progress. + + - SeeAlso: DataStack.reactive.addStorage(_:) + */ + public enum Progress { + + /** + The `LocalStorage` is currently being migrated + */ + case migrating(storage: Storage, progressObject: Foundation.Progress) + + /** + The `LocalStorage` has been added to the `DataStack` and is ready for reading and writing + */ + case finished(storage: Storage, migrationRequired: Bool) + + /** + The fraction of the overall work completed by the migration. Returns a value between 0.0 and 1.0, inclusive. + */ + public var fractionCompleted: Double { + + switch self { + + case .migrating(_, let progressObject): + return progressObject.fractionCompleted + + case .finished: + return 1 + } + } + + /** + Returns `true` if the storage was successfully added to the stack, `false` otherwise. + */ + public var isCompleted: Bool { + + switch self { + + case .migrating: + return false + + case .finished: + return true + } + } + } + + + // MARK: - AddStorageSubscriber + + fileprivate final class AddStorageSubscriber: Subscriber { + + // MARK: Subscriber + + typealias Failure = CoreStoreError + + func receive(subscription: Subscription) { + + subscription.request(.unlimited) + } + + func receive(_ input: Output) -> Subscribers.Demand { + + return .unlimited + } + + func receive(completion: Subscribers.Completion) {} + } + + + // MARK: - AddStorageSubscription + + fileprivate final class AddStorageSubscription: Subscription where S.Input == Output, S.Failure == CoreStoreError { + + // MARK: FilePrivate + + init( + dataStack: DataStack, + storage: Storage, + subscriber: S + ) { + + self.dataStack = dataStack + self.storage = storage + self.subscriber = subscriber + } + + + // MARK: Subscription + + func request(_ demand: Subscribers.Demand) { + + guard demand > 0 else { + + return + } + var progress: Foundation.Progress? + progress = self.dataStack.addStorage( + self.storage, + completion: { [weak self] result in + + guard + let self = self, + let subscriber = self.subscriber + else { + + return + } + switch result { + + case .success(let storage): + _ = subscriber.receive( + .finished( + storage: storage, + migrationRequired: progress != nil + ) + ) + subscriber.receive( + completion: .finished + ) + + case .failure(let error): + subscriber.receive( + completion: .failure(error) + ) + } + } + ) + guard let progress = progress else { + + return + } + progress.cs_setProgressHandler { [weak self] progress in + + guard + let self = self, + let subscriber = self.subscriber + else { + + return + } + _ = subscriber.receive( + .migrating( + storage: self.storage, + progressObject: progress + ) + ) + } + } + + + // MARK: Cancellable + + func cancel() { + + self.subscriber = nil + } + + + // MARK: Private + + private let dataStack: DataStack + private let storage: Storage + private var subscriber: S? + } + } +} + +#endif diff --git a/Sources/ListPublisher.SnapshotPublisher.swift b/Sources/ListPublisher.SnapshotPublisher.swift index 8a8e04a..0b04190 100644 --- a/Sources/ListPublisher.SnapshotPublisher.swift +++ b/Sources/ListPublisher.SnapshotPublisher.swift @@ -37,6 +37,8 @@ extension ListPublisher { /** A `Publisher` that emits a `ListSnapshot` whenever changes occur in the `ListPublisher`. + + - SeeAlso: ListPublisher.reactive.snapshot(emitInitialValue:) */ public struct SnapshotPublisher: Publisher { diff --git a/Sources/ObjectPublisher.SnapshotPublisher.swift b/Sources/ObjectPublisher.SnapshotPublisher.swift index 93d4e73..00a9a44 100644 --- a/Sources/ObjectPublisher.SnapshotPublisher.swift +++ b/Sources/ObjectPublisher.SnapshotPublisher.swift @@ -37,6 +37,8 @@ extension ObjectPublisher { /** A `Publisher` that emits an `ObjectSnapshot?` whenever changes occur in the `ObjectPublisher`. The event emits `nil` if the object has been deletd. + + - SeeAlso: ObjectPublisher.reactive.snapshot(emitInitialValue:) */ public struct SnapshotPublisher: Publisher { From 338e4ddc9f4d6544718398bd8528fd135aa80659 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 7 Mar 2021 17:02:09 +0900 Subject: [PATCH 5/9] Fix sig abort error --- Sources/DataStack+Reactive.swift | 4 +- Sources/DataStack.AddStoragePublisher.swift | 47 +++++++++++---------- Sources/Internals.AnyFieldCoder.swift | 43 +++++++++++++------ 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/Sources/DataStack+Reactive.swift b/Sources/DataStack+Reactive.swift index d069265..dfdf1d4 100644 --- a/Sources/DataStack+Reactive.swift +++ b/Sources/DataStack+Reactive.swift @@ -117,7 +117,7 @@ extension DataStack.ReactiveNamespace { } /** - Reactive extension for `CoreStore.DataStack`'s `addStorage(...)` API. Asynchronously adds a `LocalStorage` to the stack. Migrations are also initiated by default. The event emits `DataStack.AddStoragePublisher.Progress` `enum` values. + Reactive extension for `CoreStore.DataStack`'s `addStorage(...)` API. Asynchronously adds a `LocalStorage` to the stack. Migrations are also initiated by default. The event emits `DataStack.AddStoragePublisher.MigrationProgress` `enum` values. ``` dataStack.reactive .addStorage( @@ -137,7 +137,7 @@ extension DataStack.ReactiveNamespace { .store(in: &cancellables) ``` - parameter storage: the local storage - - returns: A `DataStack.AddStoragePublisher` that emits a `DataStack.AddStoragePublisher.Progress` value with metadata for migration progress. Note that the `LocalStorage` event value may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration. + - returns: A `DataStack.AddStoragePublisher` that emits a `DataStack.AddStoragePublisher.MigrationProgress` value with metadata for migration progress. Note that the `LocalStorage` event value may not always be the same instance as the parameter argument if a previous `LocalStorage` was already added at the same URL and with the same configuration. */ public func addStorage(_ storage: T) -> DataStack.AddStoragePublisher { diff --git a/Sources/DataStack.AddStoragePublisher.swift b/Sources/DataStack.AddStoragePublisher.swift index bc2c443..ddc1763 100644 --- a/Sources/DataStack.AddStoragePublisher.swift +++ b/Sources/DataStack.AddStoragePublisher.swift @@ -50,7 +50,7 @@ extension DataStack { // MARK: Publisher - public typealias Output = Progress + public typealias Output = MigrationProgress public typealias Failure = CoreStoreError public func receive(subscriber: S) where S.Input == Output, S.Failure == Failure { @@ -64,19 +64,19 @@ extension DataStack { ) } - // MARK: - Progress + // MARK: - MigrationProgress /** - A `Progress` contains info on a `LocalStorage`'s setup progress. + A `MigrationProgress` contains info on a `LocalStorage`'s setup progress. - SeeAlso: DataStack.reactive.addStorage(_:) */ - public enum Progress { + public enum MigrationProgress { /** The `LocalStorage` is currently being migrated */ - case migrating(storage: Storage, progressObject: Foundation.Progress) + case migrating(storage: Storage, progressObject: Progress) /** The `LocalStorage` has been added to the `DataStack` and is ready for reading and writing @@ -143,7 +143,7 @@ extension DataStack { // MARK: FilePrivate - init( + fileprivate init( dataStack: DataStack, storage: Storage, subscriber: S @@ -163,11 +163,13 @@ extension DataStack { return } - var progress: Foundation.Progress? + var progress: Progress? = nil progress = self.dataStack.addStorage( self.storage, completion: { [weak self] result in + progress?.setProgressHandler(nil) + guard let self = self, let subscriber = self.subscriber @@ -195,25 +197,24 @@ extension DataStack { } } ) - guard let progress = progress else { + if let progress = progress { - return - } - progress.cs_setProgressHandler { [weak self] progress in - - guard - let self = self, - let subscriber = self.subscriber - else { + progress.cs_setProgressHandler { [weak self] progress in - return - } - _ = subscriber.receive( - .migrating( - storage: self.storage, - progressObject: progress + guard + let self = self, + let subscriber = self.subscriber + else { + + return + } + _ = subscriber.receive( + .migrating( + storage: self.storage, + progressObject: progress + ) ) - ) + } } } diff --git a/Sources/Internals.AnyFieldCoder.swift b/Sources/Internals.AnyFieldCoder.swift index a59482e..19c10fc 100644 --- a/Sources/Internals.AnyFieldCoder.swift +++ b/Sources/Internals.AnyFieldCoder.swift @@ -77,27 +77,42 @@ extension Internals { let transformerName = self.transformerName if #available(iOS 12.0, tvOS 12.0, watchOS 5.0, macOS 10.14, *) { - if transformerName == .secureUnarchiveFromDataTransformerName { + switch transformerName { + case .secureUnarchiveFromDataTransformerName, + .isNotNilTransformerName, + .isNilTransformerName, + .negateBooleanTransformerName: return + + case let transformerName: + Self.cachedCoders[transformerName] = self + + Foundation.ValueTransformer.setValueTransformer( + self.transformer, + forName: transformerName + ) } } - switch transformerName { + else { + + switch transformerName { - case .keyedUnarchiveFromDataTransformerName, - .unarchiveFromDataTransformerName, - .isNotNilTransformerName, - .isNilTransformerName, - .negateBooleanTransformerName: - return + case .keyedUnarchiveFromDataTransformerName, + .unarchiveFromDataTransformerName, + .isNotNilTransformerName, + .isNilTransformerName, + .negateBooleanTransformerName: + return - case let transformerName: - Self.cachedCoders[transformerName] = self + case let transformerName: + Self.cachedCoders[transformerName] = self - Foundation.ValueTransformer.setValueTransformer( - self.transformer, - forName: transformerName - ) + Foundation.ValueTransformer.setValueTransformer( + self.transformer, + forName: transformerName + ) + } } } From 593c0510d3a426c4c775c6f77a3a4112b29a778d Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sat, 13 Mar 2021 11:25:27 +0900 Subject: [PATCH 6/9] Allow placeholder Views in ObjectReader when an object becomes nil --- Sources/ObjectReader.swift | 51 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/Sources/ObjectReader.swift b/Sources/ObjectReader.swift index cad3eb0..c0ec228 100644 --- a/Sources/ObjectReader.swift +++ b/Sources/ObjectReader.swift @@ -35,7 +35,7 @@ import SwiftUI A container view that reads changes to an `ObjectPublisher` */ @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -public struct ObjectReader: View { +public struct ObjectReader: View { // MARK: Internal @@ -48,10 +48,30 @@ public struct ObjectReader: View { public init( _ objectPublisher: ObjectPublisher?, @ViewBuilder content: @escaping (ObjectSnapshot) -> Content + ) where Value == ObjectSnapshot, Placeholder == EmptyView { + + self._object = .init(objectPublisher) + self.content = content + self.placeholder = EmptyView.init + self.keyPath = \.self + } + + /** + Creates an instance that creates views for `ObjectPublisher` changes. + + - parameter objectPublisher: The `ObjectPublisher` that the `ObjectReader` instance uses to create views dynamically + - parameter content: The view builder that receives an `Optional>` instance and creates views dynamically. + - parameter placeholder: The view builder that creates a view for `nil` objects. + */ + public init( + _ objectPublisher: ObjectPublisher?, + @ViewBuilder content: @escaping (ObjectSnapshot) -> Content, + @ViewBuilder placeholder: @escaping () -> Placeholder ) where Value == ObjectSnapshot { self._object = .init(objectPublisher) self.content = content + self.placeholder = placeholder self.keyPath = \.self } @@ -66,10 +86,32 @@ public struct ObjectReader: View { _ objectPublisher: ObjectPublisher?, keyPath: KeyPath, Value>, @ViewBuilder content: @escaping (Value) -> Content - ) { + ) where Placeholder == EmptyView { self._object = .init(objectPublisher) self.content = content + self.placeholder = EmptyView.init + self.keyPath = keyPath + } + + /** + Creates an instance that creates views for `ObjectPublisher` changes. + + - parameter objectPublisher: The `ObjectPublisher` that the `ObjectReader` instance uses to create views dynamically + - parameter keyPath: A `KeyPath` for a property in the `ObjectSnapshot` whose value will be sent to the views + - parameter content: The view builder that receives the value from the property `KeyPath` and creates views dynamically. + - parameter placeholder: The view builder that creates a view for `nil` objects. + */ + public init( + _ objectPublisher: ObjectPublisher?, + keyPath: KeyPath, Value>, + @ViewBuilder content: @escaping (Value) -> Content, + @ViewBuilder placeholder: @escaping () -> Placeholder + ) where Placeholder == EmptyView { + + self._object = .init(objectPublisher) + self.content = content + self.placeholder = placeholder self.keyPath = keyPath } @@ -82,6 +124,10 @@ public struct ObjectReader: View { self.content(object[keyPath: self.keyPath]) } + else { + + self.placeholder() + } } @@ -91,6 +137,7 @@ public struct ObjectReader: View { private var object: ObjectSnapshot? private let content: (Value) -> Content + private let placeholder: () -> Placeholder private let keyPath: KeyPath, Value> } From 1f562b25a75c2e222174ed8e5d63f228c453da7b Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 11 Apr 2021 11:03:17 +0900 Subject: [PATCH 7/9] Updated README --- CoreStore.xcodeproj/project.pbxproj | 40 +- .../⭐️ColorsDemo/Modern.ColorsDemo.MainView.swift | 2 +- .../⭐️Modern.ColorsDemo.SwiftUI.DetailView.swift | 4 +- .../⭐️Modern.ColorsDemo.SwiftUI.ItemView.swift | 6 +- .../⭐️Modern.ColorsDemo.SwiftUI.ListView.swift | 6 +- .../⭐️Modern.PlacemarksDemo.MainView.swift | 2 +- .../⭐️PokedexDemo/Modern.PokedexDemo.MainView.swift | 2 +- README.md | 591 ++++++++++++++++-- Sources/ForEach+SwiftUI.swift | 6 +- Sources/ListReader.swift | 14 +- Sources/{LiveList.swift => ListState.swift} | 40 +- Sources/ObjectReader.swift | 21 +- .../{LiveObject.swift => ObjectState.swift} | 10 +- 13 files changed, 616 insertions(+), 128 deletions(-) rename Sources/{LiveList.swift => ListState.swift} (93%) rename Sources/{LiveObject.swift => ObjectState.swift} (95%) diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 55e0184..59de5a0 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -725,14 +725,14 @@ B5BF7FCC234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BF7FCA234D80910070E741 /* Internals.LazyNonmutating.swift */; }; B5BF7FCD234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BF7FCA234D80910070E741 /* Internals.LazyNonmutating.swift */; }; B5BF7FCE234D80910070E741 /* Internals.LazyNonmutating.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BF7FCA234D80910070E741 /* Internals.LazyNonmutating.swift */; }; - B5C7958F25D7D18000BDACC1 /* LiveList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* LiveList.swift */; }; - B5C7959025D7D18000BDACC1 /* LiveList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* LiveList.swift */; }; - B5C7959125D7D18000BDACC1 /* LiveList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* LiveList.swift */; }; - B5C7959225D7D18000BDACC1 /* LiveList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* LiveList.swift */; }; - B5C7959425D7D18700BDACC1 /* LiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* LiveObject.swift */; }; - B5C7959525D7D18700BDACC1 /* LiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* LiveObject.swift */; }; - B5C7959625D7D18700BDACC1 /* LiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* LiveObject.swift */; }; - B5C7959725D7D18700BDACC1 /* LiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* LiveObject.swift */; }; + B5C7958F25D7D18000BDACC1 /* ListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* ListState.swift */; }; + B5C7959025D7D18000BDACC1 /* ListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* ListState.swift */; }; + B5C7959125D7D18000BDACC1 /* ListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* ListState.swift */; }; + B5C7959225D7D18000BDACC1 /* ListState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7958E25D7D18000BDACC1 /* ListState.swift */; }; + B5C7959425D7D18700BDACC1 /* ObjectState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* ObjectState.swift */; }; + B5C7959525D7D18700BDACC1 /* ObjectState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* ObjectState.swift */; }; + B5C7959625D7D18700BDACC1 /* ObjectState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* ObjectState.swift */; }; + B5C7959725D7D18700BDACC1 /* ObjectState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959325D7D18700BDACC1 /* ObjectState.swift */; }; B5C7959925D7D8B300BDACC1 /* ListReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959825D7D8B300BDACC1 /* ListReader.swift */; }; B5C7959A25D7D8B300BDACC1 /* ListReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959825D7D8B300BDACC1 /* ListReader.swift */; }; B5C7959B25D7D8B300BDACC1 /* ListReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C7959825D7D8B300BDACC1 /* ListReader.swift */; }; @@ -1169,8 +1169,8 @@ B5BF7FC0234D7B2E0070E741 /* ObjectPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectPublisher.swift; sourceTree = ""; }; B5BF7FC5234D7E460070E741 /* ObjectSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectSnapshot.swift; sourceTree = ""; }; B5BF7FCA234D80910070E741 /* Internals.LazyNonmutating.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Internals.LazyNonmutating.swift; sourceTree = ""; }; - B5C7958E25D7D18000BDACC1 /* LiveList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveList.swift; sourceTree = ""; }; - B5C7959325D7D18700BDACC1 /* LiveObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveObject.swift; sourceTree = ""; }; + B5C7958E25D7D18000BDACC1 /* ListState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListState.swift; sourceTree = ""; }; + B5C7959325D7D18700BDACC1 /* ObjectState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjectState.swift; sourceTree = ""; }; B5C7959825D7D8B300BDACC1 /* ListReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListReader.swift; sourceTree = ""; }; B5C795A025D7EB2200BDACC1 /* ForEach+SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ForEach+SwiftUI.swift"; sourceTree = ""; }; B5C795C225DD651F00BDACC1 /* DataStack+Reactive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataStack+Reactive.swift"; sourceTree = ""; }; @@ -1745,8 +1745,8 @@ B5C7959D25D7E89B00BDACC1 /* PropertyWrappers */ = { isa = PBXGroup; children = ( - B5C7958E25D7D18000BDACC1 /* LiveList.swift */, - B5C7959325D7D18700BDACC1 /* LiveObject.swift */, + B5C7958E25D7D18000BDACC1 /* ListState.swift */, + B5C7959325D7D18700BDACC1 /* ObjectState.swift */, ); name = PropertyWrappers; sourceTree = ""; @@ -2421,7 +2421,7 @@ B5E84F2F1AFF849C0064E85B /* Internals.NotificationObserver.swift in Sources */, B5F1DA8D1B9AA97D007C5CBB /* ImportableObject.swift in Sources */, B56965241B356B820075EE4A /* MigrationResult.swift in Sources */, - B5C7958F25D7D18000BDACC1 /* LiveList.swift in Sources */, + B5C7958F25D7D18000BDACC1 /* ListState.swift in Sources */, B5FE4DAC1C85D44E00FA6A91 /* SQLiteStore.swift in Sources */, B501FDE71CA8D20500BE22EF /* CSListObserver.swift in Sources */, B5E41EC01EA9BB37006240F0 /* DynamicSchema+Convenience.swift in Sources */, @@ -2494,7 +2494,7 @@ B5C795D225E0DD1B00BDACC1 /* ListSnapshot.SectionInfo.swift in Sources */, B51B5C2B22D43931009FA3BA /* String+KeyPaths.swift in Sources */, B512607F1E97A18000402229 /* CoreStoreObject+Convenience.swift in Sources */, - B5C7959425D7D18700BDACC1 /* LiveObject.swift in Sources */, + B5C7959425D7D18700BDACC1 /* ObjectState.swift in Sources */, B509D7CE23C8492800F42824 /* Relationship.ToManyUnordered.swift in Sources */, B5E84F301AFF849C0064E85B /* NSManagedObjectContext+CoreStore.swift in Sources */, B5D4A6B723A236DC00D7373F /* DiffableDataSource.BaseAdapter.swift in Sources */, @@ -2673,7 +2673,7 @@ B501FDE41CA8D1F500BE22EF /* CSListMonitor.swift in Sources */, B5A1DAC91F111BFA003CF369 /* KeyPath+Querying.swift in Sources */, B5FE4DA31C8481E100FA6A91 /* StorageInterface.swift in Sources */, - B5C7959025D7D18000BDACC1 /* LiveList.swift in Sources */, + B5C7959025D7D18000BDACC1 /* ListState.swift in Sources */, B5ECDC131CA816E500C7F112 /* CSTweak.swift in Sources */, B56923C51EB823B4007C4DC9 /* NSEntityDescription+Migration.swift in Sources */, 82BA18C91C4BBD5900A0916E /* MigrationType.swift in Sources */, @@ -2743,7 +2743,7 @@ B546F96A1C9AF26D00D5AC55 /* CSInMemoryStore.swift in Sources */, B5277673234F1AEB0056BE9F /* NSManagedObjectContext+Logging.swift in Sources */, B509D7D923C84E2600F42824 /* Transformable.Optional.swift in Sources */, - B5C7959525D7D18700BDACC1 /* LiveObject.swift in Sources */, + B5C7959525D7D18700BDACC1 /* ObjectState.swift in Sources */, B5C795D325E0DD1B00BDACC1 /* ListSnapshot.SectionInfo.swift in Sources */, B5831B7B1F34ACBA00A9F647 /* Transformable.swift in Sources */, 82BA18A81C4BBD2900A0916E /* CoreStoreLogger.swift in Sources */, @@ -2926,7 +2926,7 @@ B52DD19D1BE1F92C00949AFE /* BaseDataTransaction.swift in Sources */, B5220E131D1305ED009BC71E /* SectionBy.swift in Sources */, B559CD4D1CAA8C6D00E4D58B /* CSStorageInterface.swift in Sources */, - B5C7959225D7D18000BDACC1 /* LiveList.swift in Sources */, + B5C7959225D7D18000BDACC1 /* ListState.swift in Sources */, B5E41EC31EA9BB37006240F0 /* DynamicSchema+Convenience.swift in Sources */, B5ECDBE91CA6BEA300C7F112 /* CSClauseTypes.swift in Sources */, B5A1DACB1F111BFA003CF369 /* KeyPath+Querying.swift in Sources */, @@ -2999,7 +2999,7 @@ B52DD1BB1BE1F94000949AFE /* MigrationType.swift in Sources */, B5C795D525E0DD1B00BDACC1 /* ListSnapshot.SectionInfo.swift in Sources */, B509D7DB23C84E2600F42824 /* Transformable.Optional.swift in Sources */, - B5C7959725D7D18700BDACC1 /* LiveObject.swift in Sources */, + B5C7959725D7D18700BDACC1 /* ObjectState.swift in Sources */, B5831B7D1F34ACBA00A9F647 /* Transformable.swift in Sources */, B5277675234F1AEB0056BE9F /* NSManagedObjectContext+Logging.swift in Sources */, B52DD1C91BE1F94600949AFE /* NSManagedObjectContext+Transaction.swift in Sources */, @@ -3178,7 +3178,7 @@ B501FDE51CA8D1F500BE22EF /* CSListMonitor.swift in Sources */, B5E41EC21EA9BB37006240F0 /* DynamicSchema+Convenience.swift in Sources */, B5ECDC141CA816E500C7F112 /* CSTweak.swift in Sources */, - B5C7959125D7D18000BDACC1 /* LiveList.swift in Sources */, + B5C7959125D7D18000BDACC1 /* ListState.swift in Sources */, B5A1DACA1F111BFA003CF369 /* KeyPath+Querying.swift in Sources */, B56321AE1BD6521C006C9394 /* Internals.NotificationObserver.swift in Sources */, B56321931BD65216006C9394 /* DataStack+Querying.swift in Sources */, @@ -3251,7 +3251,7 @@ B5277674234F1AEB0056BE9F /* NSManagedObjectContext+Logging.swift in Sources */, B509D7DA23C84E2600F42824 /* Transformable.Optional.swift in Sources */, B5C795D425E0DD1B00BDACC1 /* ListSnapshot.SectionInfo.swift in Sources */, - B5C7959625D7D18700BDACC1 /* LiveObject.swift in Sources */, + B5C7959625D7D18700BDACC1 /* ObjectState.swift in Sources */, B5831B7C1F34ACBA00A9F647 /* Transformable.swift in Sources */, B563218B1BD65216006C9394 /* UnsafeDataTransaction.swift in Sources */, B549F6601E569C7400FBAB2D /* QueryableAttributeType.swift in Sources */, diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/Modern.ColorsDemo.MainView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/Modern.ColorsDemo.MainView.swift index 6f5eff2..5e78cc8 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/Modern.ColorsDemo.MainView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/Modern.ColorsDemo.MainView.swift @@ -71,7 +71,7 @@ extension Modern.ColorsDemo { // MARK: Private - @LiveList(Modern.ColorsDemo.palettesPublisher) + @ListState(Modern.ColorsDemo.palettesPublisher) private var palettes: ListSnapshot private let listView: ( diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.DetailView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.DetailView.swift index 7068502..b83e1b8 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.DetailView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.DetailView.swift @@ -15,9 +15,9 @@ extension Modern.ColorsDemo.SwiftUI { struct DetailView: View { /** - ⭐️ Sample 1: Using a `LiveObject` to observe object changes. Note that the `ObjectSnapshot` is always `Optional` + ⭐️ Sample 1: Using a `ObjectState` to observe object changes. Note that the `ObjectSnapshot` is always `Optional` */ - @LiveObject + @ObjectState private var palette: ObjectSnapshot? /** diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ItemView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ItemView.swift index ea79711..496edd4 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ItemView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ItemView.swift @@ -14,13 +14,13 @@ extension Modern.ColorsDemo.SwiftUI { struct ItemView: View { /** - ⭐️ Sample 1: Using a `LiveObject` to observe object changes. Note that the `ObjectSnapshot` is always `Optional` + ⭐️ Sample 1: Using a `ObjectState` to observe object changes. Note that the `ObjectSnapshot` is always `Optional` */ - @LiveObject + @ObjectState private var palette: ObjectSnapshot? /** - ⭐️ Sample 2: Initializing a `LiveObject` from an existing `ObjectPublisher` + ⭐️ Sample 2: Initializing a `ObjectState` from an existing `ObjectPublisher` */ internal init(_ palette: ObjectPublisher) { diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ListView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ListView.swift index 17114bf..ab57c19 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ListView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️ColorsDemo/⭐️Modern.ColorsDemo.SwiftUI.ListView.swift @@ -14,13 +14,13 @@ extension Modern.ColorsDemo.SwiftUI { struct ListView: View { /** - ⭐️ Sample 1: Using a `LiveList` to observe list changes + ⭐️ Sample 1: Using a `ListState` to observe list changes */ - @LiveList + @ListState private var palettes: ListSnapshot /** - ⭐️ Sample 2: Initializing a `LiveList` from an existing `ListPublisher` + ⭐️ Sample 2: Initializing a `ListState` from an existing `ListPublisher` */ init( listPublisher: ListPublisher, diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift index f6a2c27..dcc896f 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PlacemarksDemo/⭐️Modern.PlacemarksDemo.MainView.swift @@ -71,7 +71,7 @@ extension Modern.PlacemarksDemo { // MARK: Internal - @LiveObject(Modern.PlacemarksDemo.placePublisher) + @ObjectState(Modern.PlacemarksDemo.placePublisher) var place: ObjectSnapshot? init() { diff --git a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PokedexDemo/Modern.PokedexDemo.MainView.swift b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PokedexDemo/Modern.PokedexDemo.MainView.swift index 49082a0..c84f5d3 100644 --- a/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PokedexDemo/Modern.PokedexDemo.MainView.swift +++ b/Demo/⭐️Sources/⭐️Demos/⭐️Modern/⭐️PokedexDemo/Modern.PokedexDemo.MainView.swift @@ -62,7 +62,7 @@ extension Modern.PokedexDemo { // MARK: Private - @LiveList( + @ListState( From() .orderBy(.ascending(\.$index)), in: Modern.PokedexDemo.dataStack diff --git a/README.md b/README.md index 94a9044..607ff62 100644 --- a/README.md +++ b/README.md @@ -24,38 +24,12 @@ Unleashing the real power of Core Data with the elegance and safety of Swift Upgrading from previous CoreStore versions? Check out the [🆕 features](#features) and make sure to read the [Change logs](https://github.com/JohnEstropia/CoreStore/releases). -CoreStore is now part of the [Swift Source Compatibility projects](https://swift.org/source-compatibility/#current-list-of-projects). - - -## Why use CoreStore? - -CoreStore was (and is) heavily shaped by real-world needs of developing data-dependent apps. It enforces safe and convenient Core Data usage while letting you take advantage of the industry's encouraged best practices. - -### Features - -- **🆕SwiftUI and Combine API utilities.** `ListPublisher`s and `ObjectPublisher`s now have their `@LiveList` and `@LiveObject` SwiftUI property wrappers. Combine `Publisher` s are also available through the `ListPublisher.reactive`, `ObjectPublisher.reactive`, and `DataStack.reactive` namespaces. -- **Backwards-portable DiffableDataSources implementation!** `UITableViews` and `UICollectionViews` now have a new ally: `ListPublisher`s provide diffable snapshots that make reloading animations very easy and very safe. Say goodbye to `UITableViews` and `UICollectionViews` reload errors! -- **💎Tight design around Swift’s code elegance and type safety.** CoreStore fully utilizes Swift's community-driven language features. -- **🚦Safer concurrency architecture.** CoreStore makes it hard to fall into common concurrency mistakes. The main `NSManagedObjectContext` is strictly read-only, while all updates are done through serial *transactions*. *(See [Saving and processing transactions](#saving-and-processing-transactions))* -- **🔍Clean fetching and querying API.** Fetching objects is easy, but querying for raw aggregates (`min`, `max`, etc.) and raw property values is now just as convenient. *(See [Fetching and querying](#fetching-and-querying))* -- **🔭Type-safe, easy to configure observers.** You don't have to deal with the burden of setting up `NSFetchedResultsController`s and KVO. As an added bonus, list and object observable types all support multiple observers. This means you can have multiple view controllers efficiently share a single resource! *(See [Observing changes and notifications](#observing-changes-and-notifications))* -- **📥Efficient importing utilities.** Map your entities once with their corresponding import source (JSON for example), and importing from *transactions* becomes elegant. Uniquing is also done with an efficient find-and-replace algorithm. *(See [Importing data](#importing-data))* -- **🗑Say goodbye to *.xcdatamodeld* files!** While CoreStore supports `NSManagedObject`s, it offers `CoreStoreObject` whose subclasses can declare type-safe properties all in Swift code without the need to maintain separate resource files for the models. As bonus, these special properties support custom types, and can be used to create type-safe keypaths and queries. *(See [Type-safe `CoreStoreObject`s](#type-safe-corestoreobjects))* -- **🔗Progressive migrations.** No need to think how to migrate from all previous model versions to your latest model. Just tell the `DataStack` the sequence of version strings (`MigrationChain`s) and CoreStore will automatically use progressive migrations when needed. *(See [Migrations](#migrations))* -- **Easier custom migrations.** Say goodbye to *.xcmappingmodel* files; CoreStore can now infer entity mappings when possible, while still allowing an easy way to write custom mappings. *(See [Migrations](#migrations))* -- **📝Plug-in your own logging framework.** Although a default logger is built-in, all logging, asserting, and error reporting can be funneled to `CoreStoreLogger` protocol implementations. *(See [Logging and error reporting](#logging-and-error-reporting))* -- **⛓Heavy support for multiple persistent stores per data stack.** CoreStore lets you manage separate stores in a single `DataStack`, just the way *.xcdatamodeld* configurations are designed to. CoreStore will also manage one stack by default, but you can create and manage as many as you need. *(See [Setting up](#setting-up))* -- **🎯Free to name entities and their class names independently.** CoreStore gets around a restriction with other Core Data wrappers where the entity name should be the same as the `NSManagedObject` subclass name. CoreStore loads entity-to-class mappings from the managed object model file, so you can assign independent names for the entities and their class names. -- **📙Full Documentation.** No magic here; all public classes, functions, properties, etc. have detailed *Apple Docs*. This *README* also introduces a lot of concepts and explains a lot of CoreStore's behavior. -- **ℹ️Informative (and pretty) logs.** All CoreStore and Core Data-related types now have very informative and pretty print outputs! *(See [Logging and error reporting](#logging-and-error-reporting))* -- **🎗Objective-C support!** Is your project transitioning from Objective-C to Swift but still can't quite fully convert some huge classes to Swift yet? CoreStore adjusts to the ever-increasing Swift adoption. While still written in pure Swift, all CoreStore types have their corresponding Objective-C-visible "bridging classes". *(See [Objective-C support](#objective-c-support))* -- **🛡More extensive Unit Tests.** Extending CoreStore is safe without having to worry about breaking old behavior. - -*Have ideas that may benefit other Core Data users? [Feature Request](https://github.com/JohnEstropia/CoreStore/issues)s are welcome!* +CoreStore is part of the [Swift Source Compatibility projects](https://swift.org/source-compatibility/#current-list-of-projects). ## Contents - [TL;DR (a.k.a. sample codes)](#tldr-aka-sample-codes) +- [Why use CoreStore?](#why-use-corestore) - [Architecture](#architecture) - CoreStore Tutorials (All of these have demos in the **Demo** app project!) - [Setting up](#setting-up) @@ -95,13 +69,28 @@ CoreStore was (and is) heavily shaped by real-world needs of developing data-dep - [Observe detailed list changes](#observe-detailed-list-changes) - [Objective-C support](#objective-c-support) - [Type-safe `CoreStoreObject`s](#type-safe-corestoreobjects) - - 🆕[New `@Field` Property Wrapper syntax](#new-field-property-wrapper-syntax) - - 🆕[`@Field.Stored` ](#fieldstored) - - 🆕[`@Field.Virtual` ](#fieldvirtual) - - 🆕[`@Field.Coded` ](#fieldcoded) - - 🆕[`@Field.Relationship` ](#fieldrelationship) - - 🆕[`@Field` usage notes](#field-usage-notes) + - [New `@Field` Property Wrapper syntax](#new-field-property-wrapper-syntax) + - [`@Field.Stored` ](#fieldstored) + - [`@Field.Virtual` ](#fieldvirtual) + - [`@Field.Coded` ](#fieldcoded) + - [`@Field.Relationship` ](#fieldrelationship) + - [`@Field` usage notes](#field-usage-notes) - [`VersionLock`s](#versionlocks) + - [Reactive Programming](#reactive-programming) + - [RxSwift](#rxswift) + - 🆕[Combine](#combine) + - 🆕[`DataStack.reactive`](#datastackreactive) + - 🆕[`ListPublisher.reactive`](#listpublisherreactive) + - 🆕[`ObjectPublisher.reactive`](#objectpublisherreactive) + - 🆕[SwiftUI Utilities](#swiftui-utilities) + - 🆕[SwiftUI Views`](#swiftui-views) + - 🆕[`ListReader`](#listreader) + - 🆕[`ObjectReader`](#objectreader) + - 🆕[SwiftUI Property Wrappers](#swiftui-property-wrappers) + - 🆕[`ListState`](#liststate) + - 🆕[`ObjectState`](#objectstate) + - 🆕[SwiftUI Extensions](#swiftui-extensions) + - 🆕[`ForEach`](#foreach) - [Roadmap](#roadmap) - [Installation](#installation) - [Changesets](#changesets) @@ -113,6 +102,18 @@ CoreStore was (and is) heavily shaped by real-world needs of developing data-dep ## TL;DR (a.k.a. sample codes) +Pure-Swift models: +```swift +class Person: CoreStoreObject { + @Field.Stored("name") + var name: String = "" + + @Field.Relationship("pets", inverse: \Dog.$master) + var pets: Set +} +``` +(Classic `NSManagedObject`s also supported) + Setting-up with progressive migration support: ```swift dataStack = DataStack( @@ -135,7 +136,7 @@ Starting transactions: ```swift dataStack.perform( asynchronous: { (transaction) -> Void in - let person = transaction.create(Into()) + let person = transaction.create(Into()) person.name = "John Smith" person.age = 42 }, @@ -150,13 +151,13 @@ dataStack.perform( Fetching objects (simple): ```swift -let people = try dataStack.fetchAll(From()) +let people = try dataStack.fetchAll(From()) ``` Fetching objects (complex): ```swift let people = try dataStack.fetchAll( - From() + From() .where(\.age > 30), .orderBy(.ascending(\.name), .descending(.\age)), .tweak({ $0.includesPendingChanges = false }) @@ -166,7 +167,7 @@ let people = try dataStack.fetchAll( Querying values: ```swift let maxAge = try dataStack.queryValue( - From() + From() .select(Int.self, .maximum(\.age)) ) ``` @@ -176,6 +177,33 @@ But really, there's a reason I wrote this huge *README*. Read up on the details! Check out the **Demo** app project for sample codes as well! +## Why use CoreStore? + +CoreStore was (and is) heavily shaped by real-world needs of developing data-dependent apps. It enforces safe and convenient Core Data usage while letting you take advantage of the industry's encouraged best practices. + +### Features + +- **🆕SwiftUI and Combine API utilities.** `ListPublisher`s and `ObjectPublisher`s now have their `@ListState` and `@ObjectState` SwiftUI property wrappers. Combine `Publisher` s are also available through the `ListPublisher.reactive`, `ObjectPublisher.reactive`, and `DataStack.reactive` namespaces. +- **Backwards-portable DiffableDataSources implementation!** `UITableViews` and `UICollectionViews` now have a new ally: `ListPublisher`s provide diffable snapshots that make reloading animations very easy and very safe. Say goodbye to `UITableViews` and `UICollectionViews` reload errors! +- **💎Tight design around Swift’s code elegance and type safety.** CoreStore fully utilizes Swift's community-driven language features. +- **🚦Safer concurrency architecture.** CoreStore makes it hard to fall into common concurrency mistakes. The main `NSManagedObjectContext` is strictly read-only, while all updates are done through serial *transactions*. *(See [Saving and processing transactions](#saving-and-processing-transactions))* +- **🔍Clean fetching and querying API.** Fetching objects is easy, but querying for raw aggregates (`min`, `max`, etc.) and raw property values is now just as convenient. *(See [Fetching and querying](#fetching-and-querying))* +- **🔭Type-safe, easy to configure observers.** You don't have to deal with the burden of setting up `NSFetchedResultsController`s and KVO. As an added bonus, list and object observable types all support multiple observers. This means you can have multiple view controllers efficiently share a single resource! *(See [Observing changes and notifications](#observing-changes-and-notifications))* +- **📥Efficient importing utilities.** Map your entities once with their corresponding import source (JSON for example), and importing from *transactions* becomes elegant. Uniquing is also done with an efficient find-and-replace algorithm. *(See [Importing data](#importing-data))* +- **🗑Say goodbye to *.xcdatamodeld* files!** While CoreStore supports `NSManagedObject`s, it offers `CoreStoreObject` whose subclasses can declare type-safe properties all in Swift code without the need to maintain separate resource files for the models. As bonus, these special properties support custom types, and can be used to create type-safe keypaths and queries. *(See [Type-safe `CoreStoreObject`s](#type-safe-corestoreobjects))* +- **🔗Progressive migrations.** No need to think how to migrate from all previous model versions to your latest model. Just tell the `DataStack` the sequence of version strings (`MigrationChain`s) and CoreStore will automatically use progressive migrations when needed. *(See [Migrations](#migrations))* +- **Easier custom migrations.** Say goodbye to *.xcmappingmodel* files; CoreStore can now infer entity mappings when possible, while still allowing an easy way to write custom mappings. *(See [Migrations](#migrations))* +- **📝Plug-in your own logging framework.** Although a default logger is built-in, all logging, asserting, and error reporting can be funneled to `CoreStoreLogger` protocol implementations. *(See [Logging and error reporting](#logging-and-error-reporting))* +- **⛓Heavy support for multiple persistent stores per data stack.** CoreStore lets you manage separate stores in a single `DataStack`, just the way *.xcdatamodeld* configurations are designed to. CoreStore will also manage one stack by default, but you can create and manage as many as you need. *(See [Setting up](#setting-up))* +- **🎯Free to name entities and their class names independently.** CoreStore gets around a restriction with other Core Data wrappers where the entity name should be the same as the `NSManagedObject` subclass name. CoreStore loads entity-to-class mappings from the managed object model file, so you can assign independent names for the entities and their class names. +- **📙Full Documentation.** No magic here; all public classes, functions, properties, etc. have detailed *Apple Docs*. This *README* also introduces a lot of concepts and explains a lot of CoreStore's behavior. +- **ℹ️Informative (and pretty) logs.** All CoreStore and Core Data-related types now have very informative and pretty print outputs! *(See [Logging and error reporting](#logging-and-error-reporting))* +- **🎗Objective-C support!** Is your project transitioning from Objective-C to Swift but still can't quite fully convert some huge classes to Swift yet? CoreStore adjusts to the ever-increasing Swift adoption. While still written in pure Swift, all CoreStore types have their corresponding Objective-C-visible "bridging classes". *(See [Objective-C support](#objective-c-support))* +- **🛡More extensive Unit Tests.** Extending CoreStore is safe without having to worry about breaking old behavior. + +*Have ideas that may benefit other Core Data users? [Feature Request](https://github.com/JohnEstropia/CoreStore/issues)s are welcome!* + + ## Architecture For maximum safety and performance, CoreStore will enforce coding patterns and practices it was designed for. (Don't worry, it's not as scary as it sounds.) But it is advisable to understand the "magic" of CoreStore before you use it in your apps. @@ -271,6 +299,19 @@ try dataStack.addStorageAndWait( ) ) ``` +Asynchronous variant: +```swift +try dataStack.addStorage( + InMemoryStore( + configuration: "Config2 + ), + completion: { storage in + // ... + } +) +``` + +(A reactive-programming variant of this method is explained in detail in the section on [`DataStack` Combine publishers](#datastackreactive)) ### Local Store The most common `StorageInterface` you will probably use is the `SQLiteStore`, which saves data in a local SQLite file. @@ -292,7 +333,9 @@ CoreStore can decide the default values for these properties, so `SQLiteStore`s try dataStack.addStorageAndWait(SQLiteStore()) ``` -The file-related properties above are actually requirements of another protocol that `SQLiteStore` implements, the `LocalStorage` protocol: +(The asynchronous variant of this method is explained further in the next section on [Migrations](#starting-migrations), and a reactive-programming variant in the section on [`DataStack` Combine publishers](#datastackreactive)) + +The file-related properties of `SQLiteStore` are actually requirements of another protocol that it implements, the `LocalStorage` protocol: ```swift public protocol LocalStorage: StorageInterface { var fileURL: NSURL { get } @@ -463,6 +506,8 @@ let migrationProgress: Progress? = try dataStack.addStorage( ``` The `completion` block reports a `SetupResult` that indicates success or failure. +(A reactive-programming variant of this method is explained further in the section on [`DataStack` Combine publishers](#datastackreactive)) + Notice that this method also returns an optional `Progress`. If `nil`, no migrations are needed, thus progress reporting is unnecessary as well. If not `nil`, you can use this to track migration progress by using standard KVO on the `"fractionCompleted"` key, or by using a closure-based utility exposed in *Progress+Convenience.swift*: ```swift migrationProgress?.setProgressHandler { [weak self] (progress) -> Void in @@ -1460,6 +1505,8 @@ Note that the owner instance will not be retained. You may call `ObjectPublisher The `ObjectSnapshot` returned from the `ObjectPublisher.snapshot` property returns a full-copy `struct` of all properties of the object. This is ideal for managing states as they are thread-safe and are not affected by further changes to the actual object. `ObjectPublisher` automatically updates its `snapshot` value to the latest state of the object. +(A reactive-programming variant of this method is explained in detail in the section on [`ObjectPublisher` Combine publishers](#objectpublisherreactive)) + ### Observe a single object's per-property updates @@ -1513,6 +1560,8 @@ Note that the owner instance will not be retained. You may call `ListPublisher.r The `ListSnapshot` returned from the `ListPublisher.snapshot` property returns a full-copy `struct` of all sections and `NSManagedObject` items in the list. This is ideal for managing states as they are thread-safe and are not affected by further changes to the result set. `ListPublisher` automatically updates its `snapshot` value to the latest state of the fetch. +(A reactive-programming variant of this method is explained in detail in the section on [`ListPublisher` Combine publishers](#listpublisherreactive)) + Unlike `ListMonitor`s (See [`ListMonitor` examples](#observe-detailed-list-changes) below), a `ListPublisher` does not track detailed inserts, deletes, and moves. In return, a `ListPublisher` is a lot more lightweight and are designed to work well with `DiffableDataSource.TableViewAdapter`s and `DiffableDataSource.CollectionViewAdapter`s: ```swift self.dataSource = DiffableDataSource.CollectionViewAdapter( @@ -1815,13 +1864,13 @@ Starting CoreStore 7.1.0, `CoreStoreObject` properties may be converted to `@Fie The `@Field.Stored` property wrapper is used for persisted value types. This is the replacement for "non-transient" `Value.Required` and `Value.Optional` properties. - +
Before`@Field.Stored`
Before
@Field.Stored
 class Person: CoreStoreObject {
     
- let title = Value.Required("title", initial: "Mr.") - let nickname = Value.Optional("nickname") + let title = Value.Required<String>("title", initial: "Mr.") + let nickname = Value.Optional<String>("nickname") }
@@ -1846,20 +1895,20 @@ class Person: CoreStoreObject {
 The `@Field.Virtual` property wrapper is used for unsaved, computed value types. This is the replacement for "transient" `Value.Required` and `Value.Optional` properties.
 
 
-
+
Before`@Field.Virtual`
Before
@Field.Virtual
 class Animal: CoreStoreObject {
     
- let speciesPlural = Value.Required( + let speciesPlural = Value.Required<String>( "speciesPlural", transient: true, customGetter: Animal.getSpeciesPlural(_:) )
- let species = Value.Required("species", initial: "") + let species = Value.Required<String>("species", initial: "")
- static func getSpeciesPlural(_ partialObject: PartialObject) -> String? { + static func getSpeciesPlural(_ partialObject: PartialObject<Animal>) -> String? { let species = partialObject.value(for: { $0.species }) return species + "s" } @@ -1894,12 +1943,12 @@ The `@Field.Coded` property wrapper is used for binary-codable values. This is t > ‼️ The current `Transformable.Required` and `Transformable.Optional` mechanism have no safe one-to-one conversion to `@Field.Coded`. Please use `@Field.Coded` only for newly added attributes. - +
Before`@Field.Coded`
Before
@Field.Coded
 class Vehicle: CoreStoreObject {
     
- let color = Transformable.Optional("color", initial: .white) + let color = Transformable.Optional<UIColor>("color", initial: .white) }
@@ -1947,16 +1996,16 @@ The type of relationship is determined by the `@Field.Relationship`  generic typ
 - `Set` : To-many unordered relationship
 
 
-
+
@@ -2060,6 +2109,438 @@ Once the version lock is set, any changes in the properties or to the model will
 
 VersionLock failure
 
+## Reactive Programming
+### RxSwift
+RxSwift utilities are available through the [RxCoreStore](https://github.com/JohnEstropia/RxCoreStore) external module.
+
+### Combine
+
+Combine publishers are available from the `DataStack`, `ListPublisher`, and `ObjectPublisher`'s `.reactive` namespace property.
+
+#### `DataStack.reactive`
+
+Adding a storage through `DataStack.reactive.addStorage(_:)` returns a publisher that reports a `MigrationProgress` `enum` value. The `.migrating` value is only emitted if the storage goes through a migration. Refer to the [Setting up](#setting-up) section for details on the storage setup process itself.
+
+```swift
+dataStack.reactive
+    .addStorage(
+        SQLiteStore(fileName: "core_data.sqlite")
+    )
+    .sink(
+        receiveCompletion: { result in
+            // ...
+        },
+        receiveValue: { (progress) in
+            print("\(round(progress.fractionCompleted * 100)) %") // 0.0 ~ 1.0
+            switch progress {
+            case .migrating(let storage, let nsProgress):
+                // ...
+            case .finished(let storage, let migrationRequired):
+                // ...
+            }
+        }
+    )
+    .store(in: &cancellables)
+```
+
+[Transactions](#saving-and-processing-transactions) are also available as publishers through `DataStack.reactive.perform(_:)`, which returns a Combine `Future` that emits any type returned from the closure parameter:
+```swift
+dataStack.reactive
+    .perform(
+        asynchronous: { (transaction) -> (inserted: Set, deleted: Set) in
+
+            // ...
+            return (
+                transaction.insertedObjects(),
+                transaction.deletedObjects()
+            )
+        }
+    )
+    .sink(
+        receiveCompletion: { result in
+            // ...
+        },
+        receiveValue: { value in
+            let inserted = dataStack.fetchExisting(value0.inserted)
+            let deleted = dataStack.fetchExisting(value0.deleted)
+            // ...
+        }
+    )
+    .store(in: &cancellables)
+```
+
+For importing convenience, `ImportableObject` and `ImportableUniqueObjects` can be imported directly through `DataStack.reactive.import[Unique]Object(_:source:)` and `DataStack.reactive.import[Unique]Objects(_:sourceArray:)` without having to create a transaction block. In this case the publisher emits objects that are already usable directly from the main queue:
+```swift
+dataStack.reactive
+    .importUniqueObjects(
+        Into(),
+        sourceArray: [
+            ["name": "John"],
+            ["name": "Bob"],
+            ["name": "Joe"]
+        ]
+    )
+    .sink(
+        receiveCompletion: { result in
+            // ...
+        },
+        receiveValue: { (people) in
+            XCTAssertEqual(people?.count, 3)
+            // ...
+        }
+    )
+    .store(in: &cancellables)
+```
+
+#### `ListPublisher.reactive`
+
+`ListPublisher`s can be used to emit `ListSnapshot`s through Combine using `ListPublisher.reactive.snapshot(emitInitialValue:)`. The snapshot values are emitted in the main queue:
+```swift
+listPublisher.reactive
+    .snapshot(emitInitialValue: true)
+    .sink(
+        receiveCompletion: { result in
+            // ...
+        },
+        receiveValue: { (listSnapshot) in
+            dataSource.apply(
+                listSnapshot,
+                animatingDifferences: true
+            )
+        }
+    )
+    .store(in: &cancellables)
+```
+
+#### `ObjectPublisher.reactive`
+
+`ObjectPublisher`s can be used to emit `ObjectSnapshot`s through Combine using `ObjectPublisher.reactive.snapshot(emitInitialValue:)`. The snapshot values are emitted in the main queue:
+```swift
+objectPublisher.reactive
+    .snapshot(emitInitialValue: true)
+    .sink(
+        receiveCompletion: { result in
+            // ...
+        },
+        receiveValue: { (objectSnapshot) in
+            tableViewCell.setObject(objectSnapshot)
+        }
+    )
+    .store(in: &tableViewCell.cancellables)
+```
+
+
+## SwiftUI Utilities
+
+Observing list and object changes in SwiftUI can be done through a couple of approaches. One is by creating [views that autoupdates their contents](#swiftui-views), or by declaring [property wrappers that trigger view updates](#swiftui-property-wrappers). Both approaches are implemented almost the same internally, but this lets you be flexible depending on the structure of your custom `View`s.
+
+### SwiftUI Views
+
+CoreStore provides `View` containers that automatically update their contents when data changes.
+
+#### `ListReader`
+
+A `ListReader` observes changes to a `ListPublisher` and creates its content views dynamically. The builder closure receives a `ListSnapshot` value that can be used to create the contents:
+```swift
+let people: ListPublisher
+
+var body: some View {
+   List {
+       ListReader(self.people) { listSnapshot in
+           ForEach(objectIn: listSnapshot) { person in
+               // ...
+           }
+       }
+   }
+   .animation(.default)
+}
+```
+As shown above, a typical use case is to use it together with CoreStore's [`ForEach` extensions](#foreach).
+
+A `KeyPath` can also be optionally provided to extract specific properties of the `ListSnapshot`:
+```swift
+let people: ListPublisher
+
+var body: some View {
+    ListReader(self.people, keyPath: \.count) { count in
+        Text("Number of members: \(count)")
+    }
+}
+```
+
+#### `ObjectReader`
+
+An `ObjectReader` observes changes to an `ObjectPublisher` and creates its content views dynamically. The builder closure receives an `ObjectSnapshot` value that can be used to create the contents:
+```swift
+let person: ObjectPublisher
+
+var body: some View {
+   ObjectReader(self.person) { objectSnapshot in
+       // ...
+   }
+   .animation(.default)
+}
+```
+
+A `KeyPath` can also be optionally provided to extract specific properties of the `ObjectSnapshot`:
+```swift
+let person: ObjectPublisher
+
+var body: some View {
+    ObjectReader(self.person, keyPath: \.fullName) { fullName in
+        Text("Name: \(fullName)")
+    }
+}
+```
+
+By default, an `ObjectReader` does not create its views wheen the object observed is deleted from the store. In those cases, the `placeholder:` argument can be used to provide a custom `View` to display when the object is deleted:
+```swift
+let person: ObjectPublisher
+
+var body: some View {
+   ObjectReader(
+       self.person,
+       content: { objectSnapshot in
+           // ...
+       },
+       placeholder: { Text("Record not found") }
+   )
+}
+```
+
+### SwiftUI Property Wrappers
+
+As an alternative to `ListReader` and `ObjectReader`, CoreStore also provides property wrappers that trigger view updates when the data changes.
+
+#### `ListState`
+
+A `@ListState` property exposes a `ListSnapshot` value that automatically updates to the latest changes.
+```swift
+@ListState
+var people: ListSnapshot
+
+init(listPublisher: ListPublisher) {
+   self._people = .init(listPublisher)
+}
+
+var body: some View {
+   List {
+       ForEach(objectIn: self.people) { objectSnapshot in
+           // ...
+       }
+   }
+   .animation(.default)
+}
+```
+As shown above, a typical use case is to use it together with CoreStore's [`ForEach` extensions](#foreach).
+
+If a `ListPublisher` instance is not available yet, the fetch can be done inline by providing the fetch clauses and the `DataStack` instance. By doing so the property can be declared without an initial value:
+```swift
+@ListState(
+    From()
+        .sectionBy(\.age)
+        .where(\.isMember == true)
+        .orderBy(.ascending(\.lastName))
+)
+var people: ListSnapshot
+
+var body: some View {
+    List {
+        ForEach(sectionIn: self.people) { section in
+            Section(header: Text(section.sectionID)) {
+                ForEach(objectIn: section) { person in
+                    // ...
+                }
+            }
+        }
+    }
+    .animation(.default)
+}
+```
+
+For other initialization variants, refer to the *ListState.swift*  source documentations.
+
+
+#### `ObjectState`
+
+An `@ObjectState` property exposes an optional `ObjectSnapshot` value that automatically updates to the latest changes.
+```swift
+@ObjectState
+var person: ObjectSnapshot?
+
+init(objectPublisher: ObjectPublisher) {
+   self._person = .init(objectPublisher)
+}
+
+var body: some View {
+   HStack {
+       if let person = self.person {
+           AsyncImage(person.$avatarURL)
+           Text(person.$fullName)
+       }
+       else {
+           Text("Record removed")
+       }
+   }
+}
+```
+As shown above, the property's value will be `nil` if the object has been deleted, so this can be used to display placeholders if needed.
+
+### SwiftUI Extensions
+
+For convenience, CoreStore provides extensions to the standard SwiftUI types.
+
+#### `ForEach`
+
+Several `ForEach` initializer overloads are available. Choose depending on your input data and the expected closure data. Refer to the table below (Take note of the argument labels as they are important):
+
+
Before`@Field.Stored`
Before
@Field.Stored
 class Pet: CoreStoreObject {
     
- let master = Relationship.ToOne("master") + let master = Relationship.ToOne<Person>("master") } class Person: CoreStoreObject {
- let pets: Relationship.ToManyUnordered("pets", inverse: \.$master) + let pets: Relationship.ToManyUnordered<Pet>("pets", inverse: \.$master) }
@@ -1968,7 +2017,7 @@ class Pet: CoreStoreObject {
 class Person: CoreStoreObject {
     
@Field.Relationship("pets", inverse: \.$master) - var pets: Set + var pets: Set<Pet> }
+ + + + + + + + + + + + + + + + + + + + + +
DataExample
+Signature: +
+ForEach(_: [ObjectSnapshot<O>])
+
+Closure: +
+ObjectSnapshot<O>
+
+
+let array: [ObjectSnapshot<Person>]
+
+var body: some View { +
+ List { +
+ ForEach(self.array) { objectSnapshot in +
+ // ... + } + } +} +
+Signature: +
+ForEach(objectIn: ListSnapshot<O>)
+
+Closure: +
+ObjectPublisher<O>
+
+
+let listSnapshot: ListSnapshot<Person>
+
+var body: some View { +
+ List { +
+ ForEach(objectIn: self.listSnapshot) { objectPublisher in +
+ // ... + } + } +} +
+Signature: +
+ForEach(objectIn: [ObjectSnapshot<O>])
+
+Closure: +
+ObjectPublisher<O>
+
+
+let array: [ObjectSnapshot<Person>]
+
+var body: some View { +
+ List { +
+ ForEach(objectIn: self.array) { objectPublisher in +
+ // ... + } + } +} +
+Signature: +
+ForEach(sectionIn: ListSnapshot<O>)
+
+Closure: +
+[ListSnapshot<O>.SectionInfo]
+
+
+let listSnapshot: ListSnapshot<Person>
+
+var body: some View { +
+ List { +
+ ForEach(sectionIn: self.listSnapshot) { sectionInfo in +
+ // ... + } + } +} +
+Signature: +
+ForEach(objectIn: ListSnapshot<O>.SectionInfo)
+
+Closure: +
+ObjectPublisher<O>
+
+
+let listSnapshot: ListSnapshot<Person>
+
+var body: some View { +
+ List { +
+ ForEach(sectionIn: self.listSnapshot) { sectionInfo in +
+ ForEach(objectIn: sectionInfo) { objectPublisher in +
+ // ... + } + } + } +} +
+ + +# Roadmap + +### Prototyping stage +- [ ] Widget/Extensions storage-sharing support +- [ ] CloudKit support + +### Under consideration +- [ ] Derived attributes +- [ ] Cross-storage relationships (via Fetched Attributes) # Installation - Requires: @@ -2074,7 +2555,7 @@ Once the version lock is set, any changes in the properties or to the model will ### Install with CocoaPods In your `Podfile`, add ``` -pod 'CoreStore', '~> 7.2' +pod 'CoreStore', '~> 8.0' ``` and run ``` @@ -2085,7 +2566,7 @@ This installs CoreStore as a framework. Declare `import CoreStore` in your swift ### Install with Carthage In your `Cartfile`, add ``` -github "JohnEstropia/CoreStore" >= 7.3.0 +github "JohnEstropia/CoreStore" >= 8.0.0 ``` and run ``` @@ -2096,7 +2577,7 @@ This installs CoreStore as a framework. Declare `import CoreStore` in your swift #### Install with Swift Package Manager: ```swift dependencies: [ - .package(url: "https://github.com/JohnEstropia/CoreStore.git", from: "7.3.1")) + .package(url: "https://github.com/JohnEstropia/CoreStore.git", from: "8.0.0")) ] ``` Declare `import CoreStore` in your swift file to use the library. diff --git a/Sources/ForEach+SwiftUI.swift b/Sources/ForEach+SwiftUI.swift index d91027a..703aef9 100644 --- a/Sources/ForEach+SwiftUI.swift +++ b/Sources/ForEach+SwiftUI.swift @@ -68,7 +68,7 @@ extension ForEach where Content: View { /** Creates an instance that creates views for each object in a `ListSnapshot`. ``` - @LiveList + @ListState var people: ListSnapshot var body: some View { @@ -127,7 +127,7 @@ extension ForEach where Content: View { /** Creates an instance that creates views for `ListSnapshot` sections. ``` - @LiveList + @ListState var people: ListSnapshot var body: some View { @@ -164,7 +164,7 @@ extension ForEach where Content: View { /** Creates an instance that creates views for each object in a `ListSnapshot.SectionInfo`. ``` - @LiveList + @ListState var people: ListSnapshot var body: some View { diff --git a/Sources/ListReader.swift b/Sources/ListReader.swift index 5dfaa28..1a8f85e 100644 --- a/Sources/ListReader.swift +++ b/Sources/ListReader.swift @@ -70,7 +70,6 @@ public struct ListReader: View { self._list = .init(listPublisher) self.content = content - self.keyPath = \.self } /** @@ -98,8 +97,10 @@ public struct ListReader: View { ) { self._list = .init(listPublisher) - self.content = content - self.keyPath = keyPath + self.content = { + + content($0[keyPath: keyPath]) + } } @@ -107,17 +108,16 @@ public struct ListReader: View { public var body: some View { - self.content(self.list[keyPath: self.keyPath]) + self.content(self.list) } // MARK: Private - @LiveList + @ListState private var list: ListSnapshot - private let content: (Value) -> Content - private let keyPath: KeyPath, Value> + private let content: (ListSnapshot) -> Content } #endif diff --git a/Sources/LiveList.swift b/Sources/ListState.swift similarity index 93% rename from Sources/LiveList.swift rename to Sources/ListState.swift index c6557c8..f165947 100644 --- a/Sources/LiveList.swift +++ b/Sources/ListState.swift @@ -1,5 +1,5 @@ // -// LiveList.swift +// ListState.swift // CoreStore // // Copyright © 2021 John Rommel Estropia @@ -29,21 +29,21 @@ import Combine import SwiftUI -// MARK: - LiveList +// MARK: - ListState /** A property wrapper type that can read `ListPublisher` changes. */ @propertyWrapper @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -public struct LiveList: DynamicProperty { +public struct ListState: DynamicProperty { // MARK: Public /** Creates an instance that observes `ListPublisher` changes and exposes a `ListSnapshot` value. ``` - @LiveList + @ListState var people: ListSnapshot init(listPublisher: ListPublisher) { @@ -64,7 +64,7 @@ public struct LiveList: DynamicProperty { } ``` - - parameter listPublisher: The `ListPublisher` that the `LiveList` will observe changes for + - parameter listPublisher: The `ListPublisher` that the `ListState` will observe changes for */ public init( _ listPublisher: ListPublisher @@ -76,10 +76,11 @@ public struct LiveList: DynamicProperty { /** Creates an instance that observes the specified `FetchChainableBuilderType` and exposes a `ListSnapshot` value. ``` - @LiveList( + @ListState( From() .where(\.isMember == true) - .orderBy(.ascending(\.lastName)) + .orderBy(.ascending(\.lastName)), + in: Globals.dataStack ) var people: ListSnapshot @@ -109,11 +110,12 @@ public struct LiveList: DynamicProperty { /** Creates an instance that observes the specified `SectionMonitorBuilderType` and exposes a `ListSnapshot` value. ``` - @LiveList( + @ListState( From() .sectionBy(\.age) .where(\.isMember == true) - .orderBy(.ascending(\.lastName)) + .orderBy(.ascending(\.lastName)), + in: Globals.dataStack ) var people: ListSnapshot @@ -149,10 +151,11 @@ public struct LiveList: DynamicProperty { /** Creates an instance that observes the specified `From` and `FetchClause`s and exposes a `ListSnapshot` value. ``` - @LiveList( + @ListState( From(), Where(\.isMember == true), - OrderBy(.ascending(\.lastName)) + OrderBy(.ascending(\.lastName)), + in: Globals.dataStack ) var people: ListSnapshot @@ -184,12 +187,13 @@ public struct LiveList: DynamicProperty { /** Creates an instance that observes the specified `From` and `FetchClause`s and exposes a `ListSnapshot` value. ``` - @LiveList( + @ListState( From(), [ Where(\.isMember == true), OrderBy(.ascending(\.lastName)) - ] + ], + in: Globals.dataStack ) var people: ListSnapshot @@ -221,11 +225,12 @@ public struct LiveList: DynamicProperty { /** Creates an instance that observes the specified `From`, `SectionBy`, and `FetchClause`s and exposes a sectioned `ListSnapshot` value. ``` - @LiveList( + @ListState( From(), SectionBy(\.age), Where(\.isMember == true), - OrderBy(.ascending(\.lastName)) + OrderBy(.ascending(\.lastName)), + in: Globals.dataStack ) var people: ListSnapshot @@ -265,13 +270,14 @@ public struct LiveList: DynamicProperty { /** Creates an instance that observes the specified `From`, `SectionBy`, and `FetchClause`s and exposes a sectioned `ListSnapshot` value. ``` - @LiveList( + @ListState( From(), SectionBy(\.age), [ Where(\.isMember == true), OrderBy(.ascending(\.lastName)) - ] + ], + in: Globals.dataStack ) var people: ListSnapshot diff --git a/Sources/ObjectReader.swift b/Sources/ObjectReader.swift index c0ec228..a66f682 100644 --- a/Sources/ObjectReader.swift +++ b/Sources/ObjectReader.swift @@ -53,7 +53,6 @@ public struct ObjectReader? - private let content: (Value) -> Content + private let content: (ObjectSnapshot) -> Content private let placeholder: () -> Placeholder - private let keyPath: KeyPath, Value> } #endif diff --git a/Sources/LiveObject.swift b/Sources/ObjectState.swift similarity index 95% rename from Sources/LiveObject.swift rename to Sources/ObjectState.swift index b415baf..5e00c56 100644 --- a/Sources/LiveObject.swift +++ b/Sources/ObjectState.swift @@ -1,5 +1,5 @@ // -// LiveObject.swift +// ObjectState.swift // CoreStore // // Copyright © 2021 John Rommel Estropia @@ -29,21 +29,21 @@ import Combine import SwiftUI -// MARK: - LiveObject +// MARK: - ObjectState /** A property wrapper type that can read `ObjectPublisher` changes. */ @propertyWrapper @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) -public struct LiveObject: DynamicProperty { +public struct ObjectState: DynamicProperty { // MARK: Public /** Creates an instance that observes `ObjectPublisher` changes and exposes an `Optional>` value. ``` - @LiveObject + @ObjectState var person: ObjectSnapshot? init(objectPublisher: ObjectPublisher) { @@ -61,7 +61,7 @@ public struct LiveObject: DynamicProperty { } ``` - - parameter objectPublisher: The `ObjectPublisher` that the `LiveObject` will observe changes for + - parameter objectPublisher: The `ObjectPublisher` that the `ObjectState` will observe changes for */ public init(_ objectPublisher: ObjectPublisher?) { From 0ee8fbabd5229ad6418ccdac7d39a4281caf4550 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 11 Apr 2021 11:26:02 +0900 Subject: [PATCH 8/9] version bump, update resources --- CoreStore.png | Bin 54221 -> 62199 bytes CoreStore.sketch | Bin 62385 -> 63581 bytes CoreStore.xcodeproj/project.pbxproj | 16 ++++++++-------- .../CoreStoreIcon.imageset/CoreStoreIcon.pdf | Bin 5540 -> 5548 bytes README.md | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CoreStore.png b/CoreStore.png index b2feee10a2d36ee9decd8a7840cfef0b0010960c..640cb6a9a1cb2a3f73246b0bd3b3958aa61e8f2c 100644 GIT binary patch literal 62199 zcmd43Ra9GD7d8qsXla4sPzVmiy@CXaTPYMRZo!KdmjXqKyF(}xC@#U>DQ?Bx-JK9P zY2W|9`RKVj7iWx}!OkYxd#x$YeCAwp<=gvrQctkRu#k|Dp2$dxD3RWQ&H zSEgz+b`XC6rlJa>NJwQ7k8cf75$|7_XvlyS6p)w^=NL%Hf#yg6#2GT;MTU4GA)#cT z{NF2p{)|We_Z(T}&p&}l7o$i>B1kggqAD)Pduf;%&n43C3+gu4pUTv<(=*w-+XW>j z#K`r_y~=vb9)uoLw^vuUQ@4}+dA_;0;NYHP*T2rC(4_-4I>8o5-Cd03Vwd-Y31b=-Gt zOb)%Qf_hX^&Icg{QXV!{i+nY=Xk|3--fKxkZZd>Npgko(`lxn4<2Nx%_`X#mVSxnQN=7l z&Z~2dS>mLo8RRCtEk3;C{x`Fc%}=hc#7KmhZ9-yaeD^yECee z3iojzeBf|`-Xgu4loSe`$p0Qi@2C>MA1TE3A{JS71uHZ8DS%09mBVG>eqNuk&qCUl zR$tVN-&ku%|?(jbOX*w_Pl&taifOhU-D+4r@}(k5oux7b~WaFzvA_Y0}oVmSadd_ zlDF=%-03VgSzIf#T7+`F%=5rL5Ef$;D$<7u2KSiP=jzNZeo{H1Gy`)KC^hW$oUVFA zFodG-XcWi#o0t2PdT>$3pBo&`a+rFa^kEz9%>WrRgbP(~$IWg#SkBAIU%K_>DE_Yn z{&|A`7hqgO9Gv3FD;c_(9!VE>$&3&8=h_AcJeCdD&GEnf+-bbKJo8a_9%Q(E>Pa!d z2(o#syOjl(W+`*}u38}`v5m7@b4KWSPT^dK?G^n%QjsF7_-1ach4vGBJo1^s0p~sM ze&V$U(c~I!g)V-jC$=@oO~q8mY7X8q(CUoEl22BY?|oCs+2(i=M_j z0E{mHvILPaEU+4r+&Ck(eq&dWKs<#7)5_K9%9w>mkK<Y;h$?6 z@K=I9aHdl^3aNYXW%*yj57o-c>?4nA{(F9R(W~d}U5}>2;1`_l@{Kd&@lx!aggAuT zG$_|r>c0pJWKQuWE`w4Py(%E06+mmR?9XS4$9$IYr>Mx4Y$03^F=mAEy^4>dcLZ7u z`Z{!jwZ$kw?|q&d-+~LKtNc@i4)!bIt<@D%!z8v{e`w+J-5B70_se91Pav99iDUHH zVoirxq!i(Tha-+`iNudoI!<%~_oRwN+uyjxBtsqS3SGpLJ`wGhsENneyXsOEmwB=I zq~b+CqUa>*J^dANk?_s3ast1iY++xD{PSl);TwTQs{z{1ozR$v`fHKKCxQAV)h_++ zi5r*|4o(sQc7$>^oIhhHw!uB1-lO74l>zsenm;4zzNwrO#OVvTH3ONcoLjZ=r?*xE zt+K-vhl? z_q%l(#7P@n#ccqo)H%)Lp!Fu6|0|Gi0=i=L!Gi+k5M%ermq*-f5}$ECf+KqfNR;Tf z6GHGc;}uJGp~9t+!2R5rH}G*d58?%WTN@^w{c#( zqEtZ0kjs!~BGfi8vsOc9ifdQF-tk-i(xNSHP=HaESlPf@;cM>_75hgE$>?SBsq)u& zn;sP3GM2ST232{Dr=y*8xLum0A)^i3|1uaROy1wvJV7RbYSF!lVO*OvetR$CsW}9^FpOy~W#$-`xx{*+ zD&|Z~9+iDP=V3qzMwquz1zf*+sLT`fCbXgUpU^EPo*}7AmTCRej3>@vGrjnkL!8p~ z*-k#@?lY^thrxi!po3s&M!MVB0z=Gt|$CIz!oXssqRXB2*ZV+4gSVd%cMbM)F~ zbk;tM_#*ruiX&lS$BT&da~7oXUG6h02oz~B__@{#C#7JH!}Ob7wv-o`O$rsglGt44 ze?Jy8FI*T^xE7r8RVf_#{R8T5Wc0;Rp(nM_ z`_3O5$|E)604R?J9V<8`rRxwx0p4=S{f9y}{_2 zay$>?r z;$YhFMYvoABpKX#VWjed_f6DRS~g_P&g98+$$xl41~G~Naj9G0Z^&A2%4UO1wgoEq zOUIp({N)vW>=TYpfVT;B)46?CRInVw*LoR=;VX!{F9_PZR+%w2iEyP|j8*KT^L)f7 z+?B`%&f9rT6b%214C`WI7wCiI`vrJq#stccE*(j~T@pZ1vRUUkGb5u2jo_Iil3uFg ze4JD>5q`@9e*26(`0%$cg5M4IseuSI9{c?RjEDVNO4)93%B*BN=_Wsx$u|)}-S#>t z$-Az`gUQ}a+Zt5c@UuSh(9>vJ(Ev%&@Z|nd4E4P*dg0>pK1e!oKljtU4yoZC=a7J+$JmqCS zhOwWSaJRZ8POrW}_|Kf<4In^*Q*JN~u4FXoFi%%zHI+O>a{34^j}+~gM6`P9V4$$@ zl;BhZM{2(qE4h1AGZ-fa;T7KfU-!1y$ z4462cOqR7cRkatMl70C7U-F3jGMV32fgCt+{n(T)Zs0N}Z)RvHsBM<3!0*bcN<$Ub zAu}Rub20gw*{8J#JJ9YX4aT*J+6pT5j3NWiW|7p28o42?Ox|h2TZGr0hFw8OQm=C7 z8j0#(%FPHki;@pA(d#M|V`~j1CjC`U;6W2B^O;?Nn~u)=#2$&`YpEAg{A)E* z@)P{59;@C!GmsU?^AJSEdY~=|F?sS0_z$ze#U@m7|JJOOPX}-HLl5aHR~| z?e_wmNW6vCy5eEJ()^_$=YSHls5dbrs!1P(2)9%kE@Yy6J@aHPah3Xn(bivXtl-phu<|rhTx_bm8j0eB1&|hue z7olgK=kP%Oo!Xk;P8D~pMT*y-LLS~<#1fw*niMSa@fvL**u0aw)!fwg8&f={Q7v;| z4c)nIlXiU14XMCT=OZyev9%AWhkYhVYf@el?;CVnEJX!*@E~tt$jDjalrqY9l57NB z58>crQcDIZ6afV3fuu?y`LuTZzEP^(%X=Oqq~A@m&aAvb2YSZJ%Y{E#mI+^vcujd3 z3-4f@1Fv!<;!ZbKqU_)NBUZH7I&$LnqvpPQSLby5l!y1iIRcM}pHV3{O|>~kDw&)B z+9Vht?WHOv`ZKWTw_FxH=x4_T&(#Hf-qx|p?N$5v<)@jCMuDOKTS7p>ta$DtI>1@r zczDIM77U*kkCdM;O^*1`b1Tn-Cp>4xa}>v_#USU9L~;sk@)z?;iuxic4C92x^^2Q< ziXpwGRv!l<_f1RpyMH>~%Vxu}!r4I& z>SiDNb7N4yqbi6uhNsKtI|4ZG%Au+es*Su8I2eDpJW4b zT0!E2JjCgzap4-otHz2C76O!F|G;=XfjX*PR=7qyR{oI>8afx?7H@)h1R^VaydSYY z^zkha2HYO|VRP#F%F zS_nLZcn6GbjNi$~;qkbAH91PoGpJ<>5aH9#4Nra2%!WwzXCn3?`PKpZxxI#TH#p}O zvy;=%7MusB=A%YC%+V?j)?SKgRh+?Ozur=A1GFaY zRROF5E(-7}-$&(a?HWt6J;YX#KD@0-{Zij)ldd0=YPqrg4aOh5rpR-M+h{6KS2Xz& z&U+#*K3L;4ex34?thgUm@&Iq=&n8^j^C!wbC~^${0NlK8XN@Bzek#G=UdU{BwZ0RT zw!Yr)F=t^?Xj2;r=@fw-7k%AltVUhbbKw;h#)6}JQC)4 z&XB-3a}7vR+U}lPX?Wosq2@3Ecy-W~Pi%pK1{Q>Ci2ZxX<{Aa*(Ngi*R*PUZf8lrb+f? zy0z(tscTc=r6%OoUMmA`tb;upQTYvR7gVZ<&%E_G_dg8W0UvQAwOai< za~H9>K5@eKhJ;Xn$30z+LSF|L-OMxoo!+`P%IW7lL(^Xg70p3aY_C)FVR$6vl!jTC zz*l-41==-BzYA%9Jgh7acL1E26Af_P4T{4t0i?4bS0=#rSgL1M$(}W%ohH9ivg?!R z-r+{>6dq1RLV|u8GW>DKNsb^Fv;FU_FdX?>&lE?Kf7yTn)qAJ~&hNifRqMVn^W=9< zZ3%tEWsISd6Zu^puMc6VhI6^Zo_d2Y;bxM{ZHdK%)21PgE>E|S%k_rC(-1p|?wKdz zW4Hf*`xtP|hD~9?+Qw62vx+KA^dY=4&<^inLyc!cC`ec*f=ul9t_!KYns5i*`VWHK zwj}rtVcdm~fqWF)|J0w}dL6dltr3^PWz-9OW6W(E*A}qJWrrbBOwD{tHfcVvj#Bpxx4mMFid(9 zdi=1snt_S=o3Ni5$2v8nn=7|>=1z^ukJ0kl#dPxaawU+Ub!lO9rZjA6nHd2gW%#dV zB5bJJ+O`dvtjpk`MR&9c<0{*9hef^Hm_$9GS45yXMDkDkg2@N$SmaL z%Y8Mr+QmZeoz0(3vsHbPD+VM#GdI*{P{j)Nmo@Md-t&|xiH+Miu=myxh;4=J%oP6) z-|w~RezQNTtKv51&@0H{J;Vf`894~j&>pxE6EM?^KZ1bI1lbtV z9UHw%W9Y1K!~+iVF-jzY6#VVmhGp8D@2u`;qah}r_%#_aP3mNX+gXXRI8U+ZiiW#x z26M!XPdpkhrZH~CF$8urvT=kyZo{AYa#ocnC$i~5p zjwDBU^w1#{#4>WZ4YARD%EMzQ_&1tDY3AQQYcl?JWYky7nLgBiVuHbrU|MUhc5X}K zH5~gfWr25C*<23t`+ic)jABTcBp|uFOg9_-F;~f3txMWXv<%ek$k2)`2&6Z3!4ci5^iQ z2JDLAbojrln((LQR#TE913Y#$ydAIhp^(w;LFJoYlT4mR2C|Ba?P)k(;Uvf`(oJU= z*~hsX>=lcaN506X-HR-zEgW$-oo?CbUNk9T+dywH%x;%1{M+5?6I!tREzLvR!=u;V zbi1G6@s)Dw?L>I;x)ezF9lxvif5 zlXn6b^YX(epD;4iJWB_C;C5rP_x6zOf-QYn7YYx34?7-)jd)8a#daP4-o62;TOE)8 zV_kq3-G>Z8rk7<->&$=$4yzdaUKga}6LfFZAb` zjxh4$pXtfvRHd-PxTf%^304#q+s=w;Pu6trlgY4rhN5;Pc$CfD1$hG>=(XyYeRWu` zm0hh}KtQ>AcF}Q>P+dB5=&f?{F%gIgWia;>#QtAR904oI`6>UsM6>G#ZqH zqsD6orqSQb&=|Rs*leI{T+9pp>|s6#Tic%$5^_%2IDDodp1#2pm3Hoe< zLk!{*F--0>IiK4r2$F}&U1v&n-GpmBDQP+)2Z?U`+o+DDj$MQMa?A|dopCq(!ZXIVb`U!yk@O@_Z^*(dsjh3v? z{qtEHs-wpZ%LmOfjap81pZxc9W`MIc?_3e^e3mwafeKBfdmw7g3(PfNME=od^3|F#Y`LcJ zz`wPELcG_GCL_!v=+Loz4>hUwOVN{x)C-&tiimH6g1&Z>Dd_xdSTDm@eYcjURA z>}-<*h9dP#i3je=*$c35#a`_egC~wYWhgWHex*vGZ#Ymc&jek!)|lAO$C40kmP%%u zojE_h_Rf|CUi*%^9|-j3rt2;40Xn)?aM~yI9jX+{;W8!sYjENT`ycufdtu+Y|7TLe z_6T!Ha^mS{MJ{onHte1{YD{Ff}Sp3&~HV(z|hu)HhwMG(2lurTERm3>4$Q3%9-H3dzw{SG3$7C95 zwkwju_1*Kn&4MZ9SG%k7gjd_@4QidhHY2;3+^4JNYdJFdlYkDiPNH$H5))XZ?DX)t z-i|*p&fGbvKIZ>I8kJAk+ZHUa484#DfRn?w$1namlsm!fR6AL#L_Wtv#h>S8edzgm zMMz=dvHSY2%IzdX&F%JUnIX>H5CbDs6%&7+?zLOhqV^Tg<33J&8(HDg8$rSUeTvx& z6g5t{xYj+4`>X8BeGl%(?f%BHlAk35@crqudgUmOpH2_~efyuwZZS`Y{dDgNa+Yx3OuGei@09vgFkAP7veaS!GH~ zI0y*7y`dW(24uR1sEl6ggpPeMZLSr0sx^2y*SlhMFR**BQfCt$g8b|k#!}tS@z;zL zv9a~xqmn>Op$n$l{xf^t9CJ=aSNu?T!JK9>bl3#3rlj!VR^6FdbvtpqD0Crs;tD%? zyWQ+Nj%AFn6%G8ob}*&dSf8t}O9yZU?3&fR({s zgu7dl7HzsXJ0^Wr3V90uAq1x&LKtAjx&%S1ZD3#i&4FBjYg6bcz50pxdnnIPM>W@> z9Hx4gHS~Hn1nGP3{=w5!2;J}!phJz%N^QQ$ci$TqPW(nh6F0orA5+7w(CDJfMex%2 zm$6jHt9Zx$F8v;PB3An+{W|;t0uh(gUzkbsNlA?dM6OCbLh_X24#c-jM`dfX;Org) z6mPhlJL>nVbiME0NUcWxOBb-YkR2`>9z_@T=55VJw32LLoHYhA4#ne0-diQqmk9~e zEY#LSoFA-yd`9bB2Xi=|2bY)1s&r-yE#7rFon2q*&z)OdhtR-Tv?;x^)C;FZVG~LJ z(WYTNluVnvUIF4;F1~HK)GL2LuA8bSoolPy$(|KA=G08NKa~Ovn>OffjZhZo`15@R ztq+%Ii{MRU{_R+&S(T>Wr{xPv#VL_+y*yADY+@fh;v4>8+H-Cca8JXFp71qe`4R1) zX}!mGX{oP`$$@JDoL}T@i|**ze^tk;Y&W0fk6%8uk12fj$C=pVT7=(t=el}IFxsGe zeQCgX)+_1fGfQk{d7~@1XRk^iu{hZ`DL7#U`vs>)lzV*2BwNBG`wml^2?d0E4jb<2 z+Xu;Fiq+9Zr>RD1C*irJ3faCD~Te1o(w_Ua4pVCYH*qUw+m%lFJm(pIv#h$SCo$bA&jt&8DuJ2E|0(?W z5HaWz4ZL|HbKXs*wcL#d3o?e7Wki(ddWj(MFjxGGTHL2 zOV|Xo+_4vP$4O1)m9|6b^QwA3z%v0{(A*j`_ns zemlG`acOIsT!yVnk^Z;b;vKz$s=TZlQ!w@>lly)&?d!w zS~Zus@66e)7c5&cvRFeJaxfb98Rg_Lh-eQ)yn_Fg`*Yi1IC}HVsx|lqjrG(+LC^rj ztF{@{hKF3oG@d=|cUtvO+vu>IEgJ~^(NDNjoz%yB0{l5))g5hb_`5!?zh$iC$S>Q8 zFt@V=pp@Q=-I((oPBph@o;w4~qc1yGSGCR%O{o_jT?n}Uv>7wT^=gtN!BLCl9@{D! z=^dzftDoJ+R=Abu)*eirpC-xvjmA^}$7>zNq4xS+n{EjdMe|oo!l9y%Mk9j+OVXyz z=F1B?tX33lN4!lXZlALN`m=EIdvg~CELPC3H7F6 zQj`62xnGBpH?AJH;(1#$SCKu{JAEaGJ4JhDxgl4%L__IuB%i5^*KFEN8Ye3evGP-d z+=$-xy5%8oAHH$pF}O0~Pxs zy6-##=mSmCjTH+gf4VIu`p;KGK*gE(?u`dGV!4VaPsFI;)7H%Jjoj%w^yzzZLWt(g z23sHbMu)xBjYNw!)voI&_z(UY8+VwhE~Uvx)Q#Z}=lgQqGDErMrVM1PlyFp-y2@qX z(bQmP4gV&`4W{!GzjkiAs(Y>Esf!o=>7~0V0oT}nW+}ph`;#>p&K{S1FXF9t*~zwb zcwa~h?=-vVU^%<&y14nVu{X^##_k{-eh#!PfVv;wE^E9Lc?Z+abC|~ocKzGVC{lpm zQu3sS*D+m4JAK1c$CzFm$>Hfd%L!dF<8>it(fAJNJds;V68Fhyw=bqSk2e2XN?+>O>|27r?%#p;<|tb!?|P(e*ssq3eqFfATt6Mq-W{R=y3ncX0c5@#~6JK3)|)O$hZ9j$A(`$6c0j2C&be6>wytYBiEqKlN_ zk0e`hgO2J}w==`Pae_;p)_e@Y-6$rQKF^Hg$WwbS_Ch`Iyx(HAkTw zO8dJOL3j-}Zr{{hV9tHH=XNQC&#U!49%p&6dfh7VALXK~7scOG?vhFwN=~aME3x8- zlc)$rv@Yka$XIiHb3DV-o_tAky)xrOO{v;A>sZm8pVSyg5$=r=E=S-^_Gdj~tgZNgHxmb=x^&-OCzv!Q5-{lopJ z?!S8|%xqD5+Abn~((QK)-SV{QbT-1AC?tr*nA|N3il%=iuq&*ie|L!%eh&9C{e@cX zBc)O|K(VpsivIft&)dJmOq#0g?Rd73LNZ!~x(=q#Sp z8Ir3;RCWJKVT@y?P8BO^$rOS`By<5rc`7)J>m-5xxt@}cN_fHyt z1zz|`HvH0b;B|Slurp(^s+`*%<%HEYT2Di*&6^0m-PHu4@Y)1`z;4SRzoq*ltD9Cs zE>>)K`dV>{w-viU<3Y-L@cMtSGeV<3nCMC1wSDh&4C9i#)-~^1TRlHPv;&`h{j)7A1 zjf!JH5&ma_sE;q9>wfAAKjr(13B7X@PJeMB@iHH<#wBkVQYtgMQ1)^`ZTb$`s1y!S zCg_(OZ*#x5hniiK$-HiLIN3Qee4#y7%%;HF_znSp5?m#5t8Se;^)2ffN44d@kQ444 zm?NxeM_6Ac*#xk)8KfeHM2(SHo!+FCZCKn|lLM{=6lLAF&?XX}NHA39%5Z4Kci@}q z1_|H08$3P0*NaX(dkS5vsN)F0?Bo91DKH?76k%K^nvR_+!HO>`e^-bRe;s|W^3;b; zD*=73CFQ&oN8etMlmYq~%Dr3sVPpDo@zt~u!X}$ z!#3ac-~O5wCj1r`amEyWu`8}X|9W4qy)KuPrbC=DlHzBjnbXINdVqK8Y9IFDBR)M< zMUcm1B!9tAjT)&{o|4x7Z4ywX51U)&^j=&9nn{XPBe?1A6M7zUn|l2!_?-xk&g?PM zoC0&>%6>{20m{=|JnGek$Vb?W|NE2-_hR4XgAxa+vTtrl8V zb3ag{HXihb^U^xer1VFT!#=3(!V_wiN?}tf^x|{zy`9x>JN+z#~z%=IBnG~vVHFWVeL&ljjCf6ws# z?TE^_#uS$<=;2n57d5=lH`u680t*k|l(zVbm+s{A2E`F=b3 zT_N?k6<-+jGZHiuLnE}R9DRp{o;_|Q^p0wtfxW<(Zci;!*k{Kd-ly`+I4(nepy{q{q5MIb8ptg*;W8Vbc{K+F-Ci zA|n{JJpUIh&HHq4`?#P?0%!u~`n9kw-6=|PM|&wJz9X4B<@r%#ugEK&=KDBq9Ra$K zaKMech*j6jQ>$My%E8Wy;7YNS$L-P9`y7@{R`+d2k#NYN9L!@w!}cfURCQ*aF=|IS z>2j5w1+be;`}DlB;GQIhN01W*m*Vi-XGi84`GF9mP#KV>?kiY@k9Az-pW>wc5};q= zltI7$q%4`utdfX>y|$boEXoUyXori2b8Ngr2Sa`ozO|C*T-O8J&I`J3k3 zSM;n#W~A~Vr@o2g+V$estP^Ga(6fnR9B>=kqiBcN3Ra~C=3`dv1K+J<%eaL)`RwL9 zph?y5P_go&5n3N+g{y-JDAfsEN%U_v2nt`9B9KrG*ZUwbY@qo0ZNpY1ly_`d#D`8=6~Dl_31Ev z4AB#3;mmN{7AqHm2)alQK*;dMlqzP5=9h(-gNUeK2_gQ!YLcaDE8$udCpblUM^crk z!Eo|Ro<|GKPJoH{oDl=s#DmwmuIZv@Pq(+aBKO)(c<;3IAe=iw=x0AgpXv!TC2snN z(PUKr8c972!X_(XC2B=OIQu0ms7NEF#|3-l&bR5yKCp<}@~7v{{cu9nPfh*~1NDQt zb)M2`|K-7@GwX`S<0aas`iX-_!??p~yWV6{cIe_g!HYB>2M*$j5AHYGhSM<+!uN@y zip<%tUcSuG`g)RV%K2S{(?&vRrN20=B}Q<7mtNHRFEp3$!p?E5&VR-PWxTJb@IL-crd zRrgJ2-l+x*Rs3X6n;jt$A*us!J4#mx@Y4q;(+a!=$Y8&j7xUB$HH~QCNi(Z_-PwwB z_fh``%k^C_5_vW$Ldg?W+ls{c@2fcnkCrexM!q(;?(3hkWhD;i9GF2~))bZV{{anN zVPs9j!$Q9`Lj6p{Pn>mnmNZwUTQofq0+H!XtmX*IAZ&UdBRuXnIw0|)|2$FynKL2J zoU3a}aOd0r1hL9^v#a8ZI{!h?%aq^Rk??A|0gpUz8FCq_dk4G}80-8w zwR!BOsnK2R%r5UM=PZasgW>ZHXn+))H9|6wdEuv@sK??}Juw2REc)nf#FcjZo$-Bg z>0$1O=p6nhQqRurftBmPK=Z!|Dq|BU%bXOc?z`|*x}ayH42G{4yH$?>JV!yhB00w`M# z_I&!zhMScIjO-uAXWAZBXUVyp9A`^`_OHZT;Bgftcj5k3CoytAr$clCcE&yh8(P4H z603XaxVtvywa0P6BWLul=Tbh4;YFV|riVT$ZHIwWdUUF3@3fjYTawliuVVdS13+)f zp|n)7(^IWjx3kOMr8&2k??z2+HUE(2 zDQ6_(P_3C2-*Dhtw2*f%cNrA093}Z%+NGw`XBY5n;J^8586mTS0`c0f??4*!Tg>!egTOV(LZe@-4d7bfW5cd2sZoGe~ zXX3e3lAbSL0>n)vTT$3zD2enX-Yffn-v9es0CF6MMZDnj>1opsx%Cd6LrV1esNDTD zAIKrf8=6=10#@~8=NGgpQ+Md&_Xf|NphEGibil_iVD#G;907XYSTxnOnbV3&bl@Hc zB>9EQMA0ytiy*+SA3fRLx+VW`DuZp-oQqh>W>GZyTkQ)7ZZVpT=un)v#T6hswqyw@b@S2~E^Ey#4P*hwTyT(73W}Gj@#E9mtf3`IEm=-;#X_{!`E*3lPD~GJcuV|5%^IPJb(u z;_Jzyz!V)&d9|IqgdYdJvF-M6>fPxY<4PCLQoFv&Garaa>XT8S=H>i|&XsW}IcLH4 zx1H-4O|vm4=eK0wjO`a=vB`o8+liLnUmG3H=E^+FuKJ|B)2ZO{oal}L@7IwsT0bRp zzx$cud zaht4fJfIITUB80xBmJxTD4@n0i-ETZMrdtP1JU%09Uo0+J<0xtY7#6IhVhcvkzi+% ziQCb@Z5$zl=bnee`9mj+`c6%DYakSmEn>O`*_FS2Yr|Fm*)Cy8Kon!j8wRL+M=f>Z z)w5Q{(fRlF%<=0cCXqci@gG#FjvJm2$h!fC@->v%c9jc$7f|;trlU4DQWr*On(ZWY z$9YML^GtY?B-`VU3siVH#Vya z2+PN%H(P6{jkPGufxApp?J=c!*9VrDoG3a0HX-|Z(rc#O4%;8@iR}WC{9pD1ado@s zXZdd-N0zqf@>a45zgA8S-n3_lW$@bdn#SyFE&AOV2k#*lv-6Bmkh4o3$z?&MZq*PG z6ilD-*-gc1*ANE}wBZnc%n7lY<68*w^7Ojn%X6b`Bj~rM`tu_Qy!gn1r-wxO@vRNm zSo?)#RzGdfL-=doq{vH7I7MTPW)}kWp-roSnheiy-|&C^f=yJOm>rudhuPy`GM8Jx z*Lz;QtdL5BA_T9Q7ihkh9E1Zxy%|IWQ!wlZrOs zPlWIKa&UZz?0&Jo7}ER2KmMf}nP8pOknZ_y%_-w%na?0(J_UISID1b817U$_M>fXx z6}5dYE=H3NM|ZT`)+sCz*hR{R;x-*d-uKwF@6Ai^O=lXu4IzvVoTnmxw%}r8BF`DD zDq%VkGmwXVzR9JY=6pHIg3JnX5VQDg>WMt}c<935KS)Cu1IbQ(V8z?xz8&PNQZH4K zQN)HHdF`>j29^+KOv9Nke>m9LMj1Szk-2IWXdv&6-+hqad%uF&e;t@KMJ z2lMQ!b?|dB!vbw7hs0k6snP5)nUTLh$u6A~qv-;ggj#B|2{R4VxMwE4<1I zXL7C>vec^mR2g>qcROT&?-!-|aVv)4Qhv1g(q~)RF!IKqo{v9$%jvybV&9gAI_k=B z=!B75|6TtvV@IJU-RYs$q;5fjwnFFv+M8MTI=S(lw0TTi&MgJ%e>GZam{Mk4^(PUy zqTD_2!!2C1VFBlxybB*957pr)unk>4hS@h2Uya|+lyZC+DDhI{E2(-{S;(P8*pck( z?NbDjJ$AP6wz{WUn=SLF|CPF{bx(Ye*u(&*ri(m~7XCth)@aF}H{N~L``Lp9{3LcH zVyj^C(@)0=Z=k{sg_q6nm~QZq1rSlVM?`Qx`Y&1uc{S`RI?2kM1*0VKxLv+E4W)3e zIi55oJ*2zU-}CG3cnvlhO_AjEe@d%Lbo#mbYbd_hm$vIsHMjVio&tU}A?{_}o8N54 zG$4q*SycmHt;J^WW+TR;Pnu}9v`#9(Tc9=LvA-I)&~;&bDGX$(^z7Au1=P9O>>}A~A4fwiN%jHtBy`8Wb%rf$ej8)n^+l zv%drFT+1W8RYW`Ft}&$JB-{Pt7t4q)(Ial)(V7@C^g3JrMMM2zKt(wRaZmMFmHPQ{ zfMAr*cZM$p`eFLu%vj&)_hK6tf1--72%TZVt7E#<5WOVn4OFD4e(kC2;&7IsKijtr zU{6gXww++AIvf_^F(6-HrXD1MR5DbAl}j7e9*H~so2 zRG~>Bm3ZK2t55!*>RRH&lMXA!>#rD*dNQVN2mL$ie87nmH}ti!6Mqsm%=pMsXCu&D zO{Lx1R)Y~c(4^=Y-n|v z$-HD@7QPNw*hRvP(PE^=bj}8$mcuJF z$#Ei|^c*LZX@T_uCWTNb)qup0BWv<{Od==;(#r5D7C)YPq39JY?bWC~RTR{1p8IMr zmE_O*nkVS;LTm$VU9q9rs95b!;$HK3p2;OenAC$r_l~vL?1O2Kn5R0I2V4m)BytIF z)r17bG%{ei)NP`{IU{IUCcEdSC(jGvs_+^1{}u%-D8606i1Qw!gojQyC^m|;bu-zA z5`U64C6BdkxqAT2!JWo%(Swd|IlrdH<9EX*qRWSc49qh!9)6nX_y}?JsRP9$n%i{; zpLZ93m_?)i0HG;Y<#gJ4ke~Wlw=-$*IqL#zLr)j6% z%CC9g;mHE(1cGbLt-C37yO?{XS3U*P-}OjVxNF90nJ5F)nhSoJwz5miw< zSGfT4kSor~HJka(%_#W(*5{;2{^KVy(3xsV=&9hvF<9ycuv=o^S+s5anJSb!P!4=H zzqtCenjStYhVZ`{9nvg~pNoXm%Kg44n0(5rPJP^P`!;ej(;~7gPI6!R6wHQh*Bx0BR$pQJ6Z}z#9{XJ z$^O%!{F6Rq-KGz1J6#HJ^ZX^ORgLw{VHjbCe$&=yLS6~6vSd|+@IQm$4A}WOB;Ch1~-}8fMNtAufG7J=0 z?I-Q;eH#Zkw+3kgLifG~Ag(zXn^lGEEL{7$%8l${(3oZL0% zzhcBnMzEuevsd@)ppJvwh>ouR6 z``XFXi@7d0T}aiB=7mRB=s9I6x9muoRhMwh%th)s(t02})5cZqr_j9sKRn{(qtf!) zr0Fe;3W7y5f}JyZNPOch<}ZQ+EB7Ns3?X}!#4eUxj18y)@W_*{^^MxK?#ULtAFE3}O=y-PWRdYQ}$cZe3 zV_bnyDs4@GI6f-^%vgFQ+xhFYe6;Yc60Gv$KN7L;VZIM|c-4E?-W%Iet;4(1*fRc; z#;E~3^3l!ly$bH>SqyM;1x!zAAA)7Z-WslzMoDdplr`A4mm=l`{)SxRxbd z)!Kl-kwP8OP!^(o=u{I_?%%88mz$Z3m-cU*sC*eT2=Vo&B7E6vRec3~JMkD+P-|5? z3stH;a-3l>KMURMo*Nus){lov-i|y`@CH-2J6jfJ4vajh`$17M9?$KkeagESe-QAi ziBtX;N~dQ`i5o!fX?NOPmTMUBRp9${^M=j4HTZ>q13KNwMd>$tb|C0B3gi!=+=So} ziSdO?&-)>A$Cu<~b&HXaSwhcmEZsA7$|4tdN$K~RYP)>?WOJG;2e=HMqg(DXCelMc z7`AD35&@}#Kx&iXGwyp+BAYgUB^8z6zj)uu*)*fh&Hq8eWg%Splf z8GTR9hSx~9KDTkU>=~}8co%AwI@K)|f@O?N!j?g}^*fMqn{|-o%B# z?%yG;E~RD3_fxwl1*mHn*H-@IIz0&|(|!1apXp`oT=ajQdVA6Gca>0h=|0dAjX%tn z3U<|W?4P|dST5jar=q+hpgbZa6x5S_I9aI&8KiK6{QaLq-K8G*abW+EE3z{rjm59~ zEGmX$eW(!Kc!LsFf39?WAM1pB8{;zmR#^4`bp0k^1bpug5Ae6>>UM=b;89)Lucc60 zEu-?ylP!7%1800~yq+FvAWjW2zalG+mxHn9eVdf#rZEKK1_e}WzoP5855jdxpRug} zn%RlnjnlqQEqw6x8pz~!b*rTLIj(&gPGf$%T-@G3fM5H&G!GGR6W$jA(mhc3W=K-@ z9v#%Jid||4nbA1L)^jAJW7b39qP*T{#l3T9%cduiGj503@;A-}3Xlmb~4cwa_SbYpSp0%lgfh)`x)?poc$xMJ1(p61rBcD6l`FHZE?1mUub1c z9N+Hu3;%%Ea-1K--?Ee^OdK>Lvng(%g1oKi~a|8sA8T==RzS-mFS# zNE$`6Gj9xEMSAdfAjNpn&koKv);C1a5Gmg|Vu}VW`hdY!2E;rROLC4d>U3dEiVGY# zjTPsaQ{gQYMxD4=&LCw_R>9;mjAZef!_>%R*6~Y!Ct~lmrP3Ak+Owy~OiAiw(ss3h zD9bn-Hf`$nP5DfB$$(?F0PbN~z@8 z0k=CD#**n8OvfL^b58-u&)09J={=S($fFX5rv ztUdaUyiNAbi07qW`r+)L*K0qrMG%QJgWbSnwgaR|>3aDsM=>C!4wE;IbDX2{Q?}*b zY+hmdv^@BEpFtSAYm$G`8RFGc?JQUur1VDo4(h|BH~2FPuko8NtPz?>6=XvKPlf*~ zNGq9C_!94hjF#gfXey%!^?7uQ&lZTVn*Fn7elq^=PZPIS(wu-g7)+N1S#Rpy8h?av zlq1sc1$2|g`uj9U-KECfFPOT}(A%{{2BC$hE3{ z{$cR85*p2nfzZx|S?q1~SKHcUMrf4|CVA)#XGl-ALv=Ot zGyukhwQu7@6Awo4lv?29{3v$bt!-D2O9ID@R@}njvLYnTZp2IY?hx*pN~YY`GzNCc z@w;^Ou;)DQi-_~*OO9|5;V$A%b_yd^1yW70sZJjZL6HHao24kwe(p$Vou7?P|00SM@=W$}=a($gN@Ce(Lj@5vC>) zW_QJ3w0cQ~i^DFv<`_ilD%N1Y>mZ8Ffv1$guLKVQmc7L>#)Wdt!7|Schs9@OFUULK zY4j3F#H@gpugd)j)(>7ny;wj6s3##z&`FHZ#38?nz$nA2`XNbxK$fQ^de z5Q;kO=ON4mK@JMc(s1Ju?ETq}bCt?G$T!~6_+;Muw%zyLut7R?Ax>h^b#z@h?LwNF zr`@9i_pZ4)4wo#17RFkmk}Pvu6IGfA}P zXs)8NfY*Mbvc%G!-M32lW{-8;-mLvp%<2x{xvJTIlPC6lXxYY=ON*N;D!RR+P#`)G z>(6F?{#9&Z-+#Lw;OLDtc#CYC9Q!QTc?BGb_Kd|zBYGMI(uqbNp80F8vJ&?-@@eKp z(4IZVhBb3nm8VgU`1dT}-7i6UvcX^VLNdA+ajvDP;)do~IIO+QAJ#l>58J`&$2EwM z#UTO>16dpykW+%n+YR0ZvN&Q-JS*-24R^J#;#{b3KJS&;U*@AjR^qZnFF^(8uV&@4u4$EJEo-Y zzWI_tnjF-@^jXsRXK*zu=lILu6;EC>;91!29a8sQc_V}4v`r6wfe?rr(Z>_hew^Qn zMR43}-a8=PVS#~IZ1PH=&IaFOKwYio?P^$8J5EN+;osZ)+i}~Dg}=72({|)An2lBo#}^ty>c2J43?vMWpD(=b@3%0Q1#M=C*i7(Pb2E#HB-4eN zSB3Rz$I@F}J*~Gxln>2YxOTEk`d(8U%`dAO)hk$r*o?Z_&|BckIi9v>DqP<`mBvdg zMJ5rQ{TXkx)^YkCjIp!w5 zIe7EcswSewy^dpL&}@MXppt}+Ph><<`mPVVI;uyWG{`Z{Qj>R+a~x}vWw>PSwFVHn zwkpX?>GS_}>t7p{7~CP_c5b6Fc$v4)gm)~z3d>GCi%@tcv_3O2@y&mdr`bCg;ovT8B z82Vk@P6sXf1uox)!<@dKJnjzVBMu8-c)UFRa->R(vquJ_CiRFR8s!vy!Wgq>i84Qk zZ>Opj{Vq^&(^gNJI&uktao(mv*1hb%$=Vx+VO}3wNA!2!u`mnL7Z02;p_9}$f{t}! zwZg!9`k9~itxzM(<@XfJi-~HFDN?PQ;WRUNjR#KP!`$9EJ2WXl*$6nN|^2Rg*tD*A4L}xKQkW{To~L%wxAND#+M6L6IAN z4Cy58KA(i2eK%h^L<H%#(RJ)TB<=(s=b z(BZe|^AX4ZPp&0}ejUqUdpWG_hR28mY`s>s5hkv#VHrR`bA?qP8>C zhW*hDjVl)cN7BF1>!6pnG?ME%vkkmrX1up#(LCok@EgticUGSq(mdFi9H8UK#%bH-j zrX#<8UU@esfP@;#&QVFxwc2k~GRroCZAKZoVNcT>6i4*^^kJpq$zLvM#o~C^_JUw> z$?Ym^m@mrW3)i!Y2lemL4(`_DRK}qoE84~YhPA`^x=Agf!Xw8|dLQfU*ex&swWT~3 z!+MTKJEOoWhEfT@nTp523eX$!P^(4&imEob+?3#H}#Q^2eI_ z(m9?-y^A+hEwaTF$r1e&b{f*~=SjzF>`m9G#qz`kXM?gQ|D0Z`41yKV&_y)lRsa(lR@*PH-a z&M8Nh-Rx0$JRkbY*F3vFrC{3^UbH2@Ai(4G*qxz%o)h_NUN%`9L>z}`QFrYcyh>Tw z!uCO1x}w3FbDhxo;`nQ9dnK3e(V?mFpvr{7Id!4nq7YWRD&5xE$w(bRe-H{q=13Oz zZo_mPi)YQ1WOkWmh+xDqD1IAzN&>o z@-rw48_#uXrue_0_C#U+Ci)CABE7R#`P#dnJsJAilXHvmLOfHEPw_(BnW;R+Dxc^R z`P@{Pw>VVz;QgjiT^{WedV!XueApwdas_tdg?oJ$b4cuKUSNjv5I#r2z{$H zFAqWz6p8T-I|H{$128Go0vIN59W9v4}6Zu^eEY3>LG zTem*LcTuAqBOJSZ3$uh%nE*xF_v2Wmz{T4a?PImSzRHtYMw?;MIxME|MBBy?4Rhf# z=hl`H+tr=f^hqsmg%xe|ZRT7D-Kymc+(uly=MT$NM-zKreMybUgqElIj*Xy$ILwHf7-{aUMcf6N!9 zEU~D@8T}F6+;5dB)Aa`xiN%ciBj4B5Pkwn*lOjaQGieZCEbTtQj8D4X578-P_MlN~ zP?RA|SW8@rv@8M)Kcv0FRv_xF)D6-#_2U_vn-kvlTACIQ(&tlKS9FfojdpiukBEDp zj6b3MZQL{)Rx0X$|AT7CfAITQ?Tt8ZHDx$22HRY*;e~~Uh;PrykVRg4PGAB3VM~dA zhbEx+cL>UZU6*2fzVTUP#)%f{de^-3lYz51lc`@qz*10{q812)2vaw3BI4Ae9qYSv zZvhIpOOJh{tnn4$IlFabt)W&;_GDM1<52 zD>y_7-@|;%pLWzMvx%q`AHD*eU=B{jN3Pf0L+&QmT6U~qTiFSBQ6S|N>VD42J|P#+ zI_C>Hu!EamyW`uZ^pF0-EOZuAhUZ%RGA#|jl*@JjSw=Rx?9c_H^yRmKOZYDaK5KDC z14q2#C}%z~aB+hidkR>m=WE6fFTNRYYh`in+K-Q?!BE%bditDsqsHIS@vqB?D^jlL zeGf!)B&4u7bnN zvLYu1B#2gAfZvLp248vqRMmqQ4{!$xXvjAa$CD=sEoh7ezcayFnM7Qk6Gy{(Cf;-N z*R=scYpDZzSI=}1uyK9A-%jM&&Jvz3AoMXh<$AJ|<{iI|{PB+MUIw_jO)?b}z84%i z>S)lPA;zI(o@M`T@^Sq!Txsu%3fqe^sw}^aWKO|^iJ@_^t=B3E}b~Z z-@&8(Qai)RcP>!s?n^^M_bsN82zSHB4CUDVVmzEZRhFoftMadXG07aLW8uJ0TB7L& zN(8Aw(N+shP;+K+P|>q#kz~gFE_fd=MGb~K?}mVFJ=Ndu*r9hR15iHvV)mRXb&~{% z6V1MIjD$ZsPz}~PGsc36VCP!P6eWXmOkd2NzYM(s^VVW|tPuM_6@_F1PQ@Od(>YJ& zKUSj&cO{>HKp(b#|IALKHtiovhqG)2lD_-|WMmFL_pM6-j)(P8Gc|I3avBjQ-zC!B z)tJP&Clu%~ReB^{fN#lSVn?`a6!#f=7y_k^Ie4=z3473J@NKZF;o(X;Oh|3}=^;aH zY2Wu+EVt?Xs#363giTk*t>xWQ9jGto3VEE9*a&KX!4#MVxNoJIwVzLrCnQllUcjeWiYg!}OdX#X#Wmx<|xWbt>T2@EZ!y z@a(f{z!j%|%&9NN66?#NUzRwUJ2>fnDcM$ zIMc}+573r$QpYkh!9<51ku8sqh-OdK)Ktv|6%v(1hBW0Z5e25yKbSF&F|a00;suhF z(<6$;I}PALr)_iUvX%=NIeI@r?q0;EIHfHT$K(W7VWt^J$KJGc9<}=caV*r!V8AEm9>epa>=lVY{fPF_T-}MI~3q~imCnm(pot{lH75^kb zHN(m2p3`PGc3+D3iMy6|5a@WSwt!c}%n{1qSqikkt?!?#sn;?>M(|Y8tvf_aeDvan zO772V4g|z7bJl%+A_v;8W3IbibN<%8cFvY?RpMNQwnT1yGx7lEzes(&zudVi-S7ajH=3xv zlcF_Xs4D&Ss82JQCOyVoO+@Rv#3j9BPACVW`JQglzm3){=Yq~mF)V5`qs;%@@O%w; zR69)h>r?TgDr&$?L>)DQxRY3<)jJP5(w$dfPFR5P> z^T#0M=@HA6!@GV_a5z*BKuWx^{NY=aisO6i&~KeML$GFR^}E?zFcn*0MKGL2wP7`y zXE58b{XoCaj+b5hv$_Q7dJsC28;VH0=PGvT!GX7G5did;`>hQG$~zn6bT8Y_ui<%G zXVF}E&EWP5I64+4(9SWp41adhY9EKEcJlUfq)$ZwDPSD=Xx!E4DsjA7G#&QB+s$`y zX|a3!#(6VIe&2rp=~Y!>WKTEm3`vXoP%zHv^PQh8pY)!+IT}w&&ll!;9`(+;r0L*{ zg&YC`Ayeb3BI8lb(_^_lLwVUM=8Ppp+0)2K2Rp{@IzGgJD|Y(*wshjbnELaq6vBYL zk|?sDYS}R$z4u(kiSuC~WQR9!z92FDz%AX02t+-65BecE{yP>h#Ay#I^>EVz^8h2W z&RY)udmLxE3RJv2`8^1*!{*&^m_22KJSLg^4anMFc8Ucp(b{)yl!A;Qj|Fp`Ks*DD zV8WJq#Z{kf#g@L|Sm0;FuNtB5E-21$1?rdaad*t9O{kb>Z zmO@rVNg>)Hc@g!sW+YmeWgtnj*6Tx3Odbe*h;Ek`^k(5|+F2Bo(sGNysL?&0Cur(E z4)-MXOn>zJI6WEztY>T*f1SqBthvTXMo|&m*iqD8ClY8R^jD?rs1^yoa^NB1lvuH;e56w z?$I?E#Ws_GwF=9;%zopjWuGPW1AEbpD3fIIcdX*&NcwLeXzIV1=A_Rm%e+j{mIFrf zv2lqt`R)yS3!W|~e-Hu3q@jqk@9I?PKh^h)!-uTFVMc^_F_uyv8gCPfk>1C9PN2b2 zak5MHT+_bu)*-6~sf16*>XdiKeH^F3&ph${)I9E{;CeUG=v3d&UwUHpoO=%knzYCN zAUX`Puk1h8RXmQeUq*uu(-6BpA$hAO@!pnSDNkqiAsZ`cJ_E(w7z>B?nX2=?iPSi( z;T(A)PM%G&9K2D$TJ2YKJ-SGjnv8yxfUHV$?opo#pVf5blz44=A7p7%vC^RB($oTK zdmW)66f2=*N~^Jw-LkD4cC`=`%c@^n%B9~Uu7D6VhI?=4ajt}e9qjC6oNK43U4$NQ^kg6S2b8c8-}xa! zlFG+`PQ;0`NLD)<`eEf*@LOSwg8bP*CwgQfidYiSC&e%Rw6knObQ(_ zJe;-Hj-PEgka;z#(M^L$6hwtNwc@U_ZYmzIp|n+$HOcm-(P%wpF%mI7yiZZ5gREI6$e}M{QF1|VH`0F)o476m7$%9HH2IQ=M3Gsbs@M5TNyW)4SS4t; zrqMC)uL6wqR%Rpq;=rmJ|A0b07f;SCz62|sOd$b}1<*SPOjjQJH+$fRLu~-6~6U{ zm6?*Kj>GAz&AL5F$c#yG?enQHgUV1&L7k6?Fug3l2_Z#2Nk{4DAoZb{K1+w+A~^Uu z`xB1&+mvVocKEa^e`n|h=`$8}4LNOT@;y2Cib}u;;Ub21VELVywdNhyIk_D_CtXX<3W{JiqZp)R10a5Yy)wg;&!}$7lBy2d8 z`@dF|Ug4LEpgVImt#ivchIfdsA6ojgI5&vkv5uJFCHAsjpZLQhXcxJu5r39Ij!A7l zo0P0L6N@fPqUQH0>u<-Mp{1@zyqAfOZEbs-Ya3DAbILv7H=R*k@nB!VH-l)GsjeD0 zEBEz~XxP114!x;s(q_lE4<$Q)oH7w0vtxc9?z(*D5;8jkG#=T9wpE{|{Fy(`u5d*{ zjbq~U1i#}bL=iOM$`UD-O47bk34G`8T(#zHEfE znufs$RrnCGq@!=1O8e>`5`*)-QjIphJ6s8|yL*R0YH%8DHf;PBN>+B3l;YCY#$ELm zky3{>J^ml0O;aBcU+7r}3YZ;wX`n@WDs0f0D+j$Szotj>uN+fh`ifTeh8OtWdAR-Q z$g{w|eTf!mN6^(-;$nmzFRQ5iw5M8PI{fckzcP&*D9aBFJ13=nneoR6m_CS|&Un!& zM>XY--P?&jA5=a;4g5qTm7f9u0lRO?rh2zvLq>J)*%a5ER0X_rZhabV z<-o$~3|3=SWH6YdLv+NhW%~Xn`VY^I4+# zMR{z&dvVyq`kt!n%s=Sz&nuxJ_l9fAKGrxO{pxHJsT|)V!BWtCYtJJTs*-4jufIQ2=0re zg5-AWgq(w)eMUJqc&rx0{UcGw6Pk--th_Xe{IPg3N3^(<(0{jSwKLfhynq-Gzh#wl zjlH%!UDm1}bRH*7xU+#<3Pc)}7D&|x#5 zgxK*nE`SJ|*zUAWr7YMo(B8tAO;pstoW|GW$|vkp;HeMyrXK^ zX$A#Q8cVl*R$OI*Du*3)lPTIkvJUTm_WI(eDA?hqzy7_Vk{!s*H*#7anKq;rVLeCX-Gcv1RA==Z zD(X3z^6;yNtdMZII9+-EBVbRp$aKWV=7*0Q5=p4Cr_@CWz|7*rO#c^+<<0_%6`vjN zG@mfrhtKdWDo4R!Ht3140PF6-QokBBf!4Ks0Pp>KA~-KF_EZid;jB76!%|zn1&aVg z9xKr3{t<8Wa9Mb1uu1aAiJu`+hnK#=^nJ$!d2k3_8vlj>|p4x z@vy1K#570~07u)A2#?RqdSC7Aa|mEJ4A-e<=OQO||Hfj0(lXc3b}TihXC*~~XG zh<{59ncq2owEE+Uq=jBoJx4*9923{AL;cWg&T0V&m!TfM5ivJjCMEV0D_yzdo7(Z` z!7?G8&qL5GI;^xU20>wg-1FI#Tlgch2Vn|Su+i3T#7ec7rh(ecfRtHY!VgW_!tjpo z%0r!UL)}uEYp~wAjBL>YGm=NJ-pYPCHkiX8j);uNMvPjXXE*uyM`CidxIxYI66V@l z_Dx>*dAj|TeZtTT&E-}G`t#&5hnH|gQ+I2`uf6kT$#M-nRa^&Bv65scJ5hf&o*Bcs zmg-G@4Q+Tn)f~)P7UjKS+!cjlnF{lw`8#NQ|Ka*Dyhqm?Dom!npUczyO|Miv0)jM< z0~xbp9@UKXA|P2FAJ1+W4)`Bm(;x?HqQydMu=F5ZX+@wTMCjGfurQY#_Ko>l<94&H z*JZB@A?KShtPVV6h-ckre42+3^Bk`0A#kA!k={T#S`)NJ+Nv^(&sclZacl^j7l3hQquNlsfFUN5hslphW z{yD-}1A?7s-2D?Ze;(Lr2uVw(?L|XMR$fDAjD^;ORi+nvZ*|E+H%}<%7l+6ykw2)@ z#y+Y+E(5~Ifeb6*-^4A!vSAk~X)&`2)S@Jwg=QBDw7L|X5sQX1x!Kej8%G@8E_C!l z#6k1RBKKK3W033re91~R<%9T5SKX@7`nfq|XZ0N^kYlKOuX0<1AyLqAG=c84TFo1c zp;Bi?5Dgk&S#YZCHYsKE?K|y)sgI^Sx~btBtVOQcWDBx~Rz5#;ql{N@waT3ZW0@ZC zNV2I?%?jq;&h_shXJ&OacD0c60Kh-+ZrR-tdw-05SrBQq!_XL&q#l6HNs5*2E39@* zhW5PY8vqt$jJ z-H62$#`Q2Adv*w$LC-r>8_={1d(jN$-|(o%82TrT!RJ-0znx|(V?=FykbjcOk5xPR zMy%7>c)2*Ek*H@l_HvYh5BT2q`$t5M|K^A^K(u{K0t#?qKsT_5@2Oh~BjYQ))X<8Y zY5Bh64(C!o`i!;bN(IC>z3fD=UwV;Z;yZ4|05ey_D)K`%9tMQ!88Am4VI=N#d1AVn zJbize3Iw4UXCqF^v?wTNT@<|!iE~kAz%{$kxiD6T7lcC?JhorA$N9~(Sl54SKsaR% z#;|i1P1CoK1(^QKYSZv^Ss9wu_kgdzT`DoQN!gjEW8lUCP541s@-b7ngQO82AW=iS z5@3EQLCZLPX~r{3>hQwdEWAueXu)ciA;FjKJ~Wj0jhH@{%kLk4v+Ut_MgN0}GCmq! ze}r>Yp{~3=IHCOPVtK;od#=ZIjoE@a6x4XozSVoSTZN=Wx-(uj+E+QZG+qX|$k?X> z>hpXe@+EzIh`tu>QT9mAQ#D+ZXH}f^kC$a@JKiz`o^<2#p+!XYjy16%9;zul#C$-- z&_X}-MX}lHdnMU>X5~-aDlR!8^E54~X_0>vFcd|AG7HN*6`tL{;0p7*@&h3yVs3X)CuU7uhWw_8A>0!s`l*yhUFcmB*j<@a8`3=M}6H=40%pX*m9{A8$M37E5V z$OGbiKc*(CwJ%U^V0ywP7MXKVcE}d=CU})d^ zP(D-@($lct;dqlb_|XH~(#LSzl0E)Wzu>H7zEUeWfbqeGbijEUN4ZUHD zwAH4|_4t2Y0MYt;7Os^Y)j!jb7Nm_94h40jCZeRNuV5|YUOTnNRv31BowOcbT~#WR zJ4r_AYd`5>6T2TFX%WAPR+(mJRo2gBRH%8FTNvMWSC({s5#0QKD9G{e9Iu~c&vRxs z5!v1Tj$%k5g6l9seW*l9Ivd2HBb+o1U9aVcXPeS`qxB09Wr@!>Mv+M@W{XN@7dS!r zG)Cs(Z2^s>3yu(j2eFki+bk8O(7R0AHU6sj3tI&3igg<3OlC3T!+$fkF}+K3grC@yiUr!|8;8V{)lK) ze|)3K#HnSZArj-NNRh@8n-92S-Z`*lQ$Lllh8Qx5P^WX{3IdUD z7ex_ox8Y-n-r4@!6_ru!r|}ed7XX~}i1+VbZSg$RIN!KC4CrQHIxpCtUGpve5?b(( zpTuD%jN)!9tj}u)a4MuwZF+m|%SS%hjU=b({me%A=BZ7Th$ZCg@XU{a@v?T;*zN-h zo#F47bHX5suQZJaYxZ8z4G$9x@$J2tecAsq)%yA9_)$$H=M@Qpm5vs0(v@4MIP#n? ze}&d!a;5X5JlVE3k^0D}GU;cRGcF&nt z;eui$l7hf?T`nY6agVq84*}1FM7?jPZ~(fwxH{GPN8y4?4YZOJjUx&HFQrcOF$$nE z1o)7zG4K=w?IU=TBJ^{8?nt54nRWz$ZIoi5K(a2?UzT}OfaxX)o3ug2$wdIJ=&C=M zRQL2jeNiB%Cqv@mOE1TM>3Eei0!Cwo6`~pbkJ@3T^s;e7VD0|+&vhqX=`N@teV?>s zBx#1IfTJHkxws__HLk4?G?~!GCo~wyu-ZxmuUft_uK(2L{&hPM;L-R#BQg00>s;qq zRtv!-?dOAG^MzU0??3QikIAu8r)%S7SM25@De*GRZ_qvr!cB>=MrI}%_#vhjM7+zi z+1pm`9YE?@9@^Dn>&2S{u|bc`MX|4L&}cNg;}31(l9Ifi^h8JB~u>6g*xj7pX^8MJm zu7(0+7W;K6AGREmL3^A{k!&8Q9m`%L?bZ~l!>oO!yajY!+%7Vy^@M*KI@9KUL2>;9 z*IC^#zmnW(&vRYg_N9{3LS%Py%x5&Ph&ET;hoP=S;I3B(W#mH3R8nq1$%$nO_;D;@V3j*VeKxFE`YtIm!_oi>GFA~FR_n6M;RhXS>ezM;o(|MNy!#wn9 z2wX3v9a5bxqu=yOG2SHqigDJ>qR}G(PFpI8Gu%}t82T#>#Vh}XMx{ho$g%ih`q61= zV+HZo!1euzMPFKaOAoPeC12Y;=5+UHLKNux`lGo@T~8ICj(NCPk{Mrn-LoW9MA>%} z1yzChpX=7n%N6)zf9*`D9lKUd7w-N>Uh04!@c#D0>~1n=fVDpD3TFblDkzd=uwnBRgarsldz?d*si4N$RQ=7rq)*UWsYu96ks!$> zL6>Ef-6i*O5L0eRihcBFqxVfv#CR_!)RqBO3!jU2b?GrNYFbeU+ulxs*NxrF&!gUB z;2>K>s%O*GE;zbAdivC{>648h=1PK?E>>ing0$>R(!guW8#t{T56CD1)i&Y2LSJvR z&z!+Sj@?62al!Y@{cXthK!YbsW1M7kc$zKPEvhlJPD`LPEi`~JWHonU1726dqMAgT zA0=_YFO8PD^JkUuLb1B)FRg}df0z9Jp~EaP|2E&-$ndXC zdv0rPuqzm@N;VpMwL5od3!-JbONshCesgI{YB2#DpZK6Tvw3|Ij*h{SwgVA7hT^!g z(newS8Y^xJUMVtXI~|EQL?oi#6;e=Dn{ag4^zLpir@O|+O0UOR>@}i;+`d72{7n=I zZ=PI|4V)h(A7nurK>Iya*IKVV)sOu`VFHeG1Dy2va0Lbgl>VrGTI96gyu1FdOa<%= zLH65(pi-x&l}-FDkC^>MllDCwiZZb2Q%$4Md8(!?(o)?oWR(x;mq~zmGS6mqr&z_W zAi#^6%Tw>t4tU1uMTW|WDw$!S7Tbo?PRQ`yFj*eIy7x^!vQpN;$m;$wxb0)sC}x6Y zwHKBpY&A@GhGc6#zjyD32X%IfW-eoy9W87=t{YP<{-BZH_qHAdBzN0Oi~y(axlZKO<5_BVot zs8sksfSnY^XPXtzViv$l)A$MmeQZ1gg5r|Sfv;|aAi&UwJIGHk_7n)-X$N%Y47!1w zuGWAXN~Z0ne2?}ZhqC%Lw``yLR7G)s2jRxsd*Gp$lqNRKz$az472Fm@%u>x^k=!k$?<2CXUvx#y>b#nb#Ed zM9S{URZmrHbmBBAp;gA`f?Fd+wt=6qr{IA{$bv8kR8a1|U+qSK< z`v0BhT%4M1rX5|!n4yAkWf02#fJf5H7UfZ{Yz)_v(RAmg&Yp92xG;(S zjwI$sLz^UxaP{kgRm&OX*@)LePUeI|nex{iPpZ!l_D_)?zP5+ktq*Di<9t@;MCIkJ zKqaFA9EF;m|0|_OuyutBZi>p4cBku$Vh3U19cuc*J-N-JjHeY~GWffYrOcPRC8aDP zb!chHiE+`Kd-MKsW>J}|XP8Ia_N?sO{I*?BJ?yRD!)<}%g4EzB-iC}$CX&E58SW?# z0wbL7*n=iz*OP99Bd!i{p*ZWVC2-HAU6GBwb=0dIAg|S5Wp6cw8k^sTTwgp1_vllWwD{r+gf%zJLls@FpYDaGg%s~(x8pG zIDfmWu{6Sqwx?|MHd%pzLaD#a9jv=^mGJth^}En#nzmt^zoC`Y$SkqptzWs{Pz|e0 zK);n$GJDtKhl7nXx3GTAn@B0v_nN`1*zo@R`W8Iz3>=%!Ke=vbuyp{D5Rub0bS>j7 zGZUYPK13bd8C4FTh@q2f16CAq(n& zE%9KOCLJ6cv(#YCesH7loyn6&)=m3Q@ea2_4@3<{7#=4x?kCw>KC%2t7+KTOZSlbj3OmVxD*HcI{BY?=8U24R&+G;?8ZFZT> zi)=CnZ{`s-hOyd~9Gn3z{D?iN8OD+O^VhF@Rx7KaH|2-HVyZcpyV`9I{7!}a)%K;XQIfyK|4KsOE8xU*_re9{q*2NBDeR*Av0z!#P?I% z9*%I@CG$lgtih<+x3)-je=UY)&T6kUwDq)~E` zjW@rJ*{;D*G>mPuzvaEvG(-!^GjG4Lhn-|+^PbnqY~5gD@TMU#`AI3WEFI_uI)O40 zwKM>fX&N^<@(s&u%Q8Z(^Q6!5Zwd$NFZ6R7L|mEd&5%Uxp-0LTp2s;_FD#2NY?8n( z(klwra0sQl-6J6xziF7INAygs=JUs58Q96BVXO3@&g|u8i52E_^swCLnXIJyZ1p*x zYssQYtkaI5W#Xx6g*~V?=oyC(Vy5@GQp!5L`ggEfu6Hi4EAh;v=B24P*pl{knp}0C z+EgvwQFt#dhmzA|c{Fv|E4ts@XON_`zx!&84tn53Nqiw&2oY&V376G-5Y7-xD0UHS zz{mBNtm!dz?bC<&v_E5|>`mfeCsP+AeAhog9_wM!S=Go~YvEXPw=%Ud0r~|EfSMl; zNdhK=?Cw%HEbdzjQ#f0=bNR~ma5t8kzW5zR`%UCe(T5^+NE1z5ZK&+JX-k%mvG>#a zt|!EEWfdJc=n$;1tl=kTH{tpO`!Y+Dn-TpV;7gmj`^Yu6YeP zN*H1|Q)@xEM&m`?+uLKFTvpdDB!^L$n%Qqca5y(r-6RNwAmOJ@W*2V~dvgm!7R}=@ zhKHtKjMk1uh&8lnD$;T8x%qm*A`;w1vlKq#1ptZpA#G6uf4~>O^hQZ#=gi3qdtQ&3 z!j#QSmy5)HL-R=qC_@OGZgiRaq1&`0`s4jGG%8OW{F&QgitKj}cO9^oMXN;J_O_1- zGO{-Phqi>;?fQ^8=xGTU88{5y1n-0u2x-yj(POkwvZlC94PB(M;^=W;b7HZ?rmmKc zL(&|vZdjWgNin0gUaJW;0x9q=^V@}~4%oe<(4ABj=Q>aODo1f~4tCV!np38)7>n`|;hSz5bPKgFcVO0jJVpt$D=%jo0 zp60+~Ux7#{(_1m?$?sy+^hAfga)>?>>65?Iw?clxs=*=)Pv3_8RE6=cMxZi;L)uNs zG24P&A0QE0lF)%w34(e3CibdWFr*>}Bvpn(1G|5XqCQ8!nY6f} z%7x3gN#LB>*3Y?nUzSNqMmSfmW66ckrbT+5mryXs?2v&O9eG)WefneNv(iM#I%)}* zx63lx--ZY^$=IVbhNBc+OwZdUrR}MewV(Q{%b6TSF6%iU^gAtM4~{gRv6ThThEyJ> z%I@g_o;c)~XIDrKk~n^{pLvu1;Gqz;;+?RcrXRUwtYb5ZD8*WeWjjf_B;{Y@sxV~F zTzt~#`92o}H<$^=b&mHmdfJVIO37fE zL88@~rP~LrKt@_h7mGsY=k0d6Vu?zh zyfM1Eg0kTtt12+4YxQ_4(m0Lq&zr@J=-I0n&>kj$#(|hLfkag1EJ}o~wvoyJ>dS84 z@FKpl`Cedk#_{3=1h9@&UGe2lX=O;RhD2albCn()_{O|8}Z+ zpsa~?{fF91@O^o-Cl0637sUMzf4Enx8WCi0Mg9xx#f&tyQEwo4#)1^lyA}mCC#I@9 z%MnefI{Q0zKViNYeIrNEl^6j;-T3jcem_Ly@d%H=NdTE=Xu`4riz zLU)leid?t{Qs1V1t(G>!CGB#Qgxe#tZN1JmZ+yO~R8l6W<*UGEDVvz@r_K57MPE!_ z(GWL$AB|-X!e$tUbw@~&#ohlYs8-Ozsoc$Gdv=`d3^B&5-%g1>L3t8m8!n1&gYDk4 z0R^qn13&^ojCh(;P&wteQh<|_BEFgG;biEFmTE9$&DavML`hx6VX_xfciN|zy}}Yp zkHh&y%p(ut-KZ)h<)cL<1kd1m4jR9f@Wl+(VFW~*=~1-ah^pfWU(`Rac1&8HPzQsL6q^%X89Ydur?3?&Ehoyq-uaU9iuIed0nn}E8rXbDw7D>pgZ;naTn>l(7952bbJ z6``IC1@C&28eGgzJkL%C#=!lofNIRT@(j}spT9b)BB=1AmID1<pAwnFcRQ zd`PfRgy|W@zwfb9P_agfGqB{*k#9=78JV+bBc$j`kMep@Cp(2}G?@#&7Zqw>qSMIJ zN?FQn!&dl)%p`{rgG)XZ{e-YDeLO&;TC#Ot6UXhCezvJQ3wikny^7{$Nlzm~d0dz6 zW_)H1WO$x*jc}^zX{oX47N##d3gE0sBahKqT?yy^8$E=xGi?m0iR^bO7n9b{8khF0 zsM^A8Rr%77QRFIuQ^jy+<#MXD@jU?G`4 z6aU`ScL9cq>U&C_SRXTu7B)go?wHy(NxILDvcHeE)^*J2Q{veC-sxX}=5@Cq0!GOc7K#d;9px&DojByZ~w!FCLO z8bof-?H2RFdN|t1}0VpVNtbL(+79Vu6{W2L8TcUAZ?P7{3BGS%P$X z;jk;3)2N(3mjStvq8u8o!UxInjCAnQwW`dbX1bxK5S(7%ulla66)=^a8ato#1z$P& zx_Tb>nsM2(8z(58wN{WHJ{sQ=`QMM8x3bg7H(#zttc#8(ZKqyE=p((x0)5qaiPMaZ zBb`${C(7J;ipDE_U_+`$uz#$hWSy6dpQi%fRC0(wBb|=0?3*^dmXQvMnszWcO?`$N z@*|kEaBY{TtIga(OZruf7B>Xg6%=(nh6~R-8lPZtEBYIVbxNLEOMe9v#pGQ-0PYus z?L6%9yG4YBp^6S@md(}2fbY#O{%Q8hW&*ZSgsfmqsxgErN?MT1U%cWa@Ts99BbFsY zN6nG!Y0kF(f!E&0zM4O-Q-mSCuKkWY)<_?kyz!rkC${ja~@yPuFz;R;V;wN_%ucIl_W6mKlM z1>riy0c6Y(tZv3hoq>Vqq50*KpVj_6UaZ3FnD^PA-GC1(-eKF0<){;}cdhykrG|f` zHtbMlHAUQ#TVc_GtCIi;{-~{kvK0fP0smfosJRy)93clZV4Uojff&1rliNMaP(HPc z6#3BlzixvMtC@0D|C}^dZxrm^vU^uR$U*3uFLg86r-K3*mtdR>ihsp3qAwIsu1s?B z?U*b_R*zVKD0rh4@pu-Red!*2_(ai)0)w7d-X{9f*6Kt$A9hWqnCVL9%Km!Ytjnzw z+gjHN2+$o;Ss@=(`H;3v%#qo|e`>7wIxD|T2oN08s5#}9C?IYP6UuCzeTb4>Vk>{_ z;e3F+9uO4(Y(wF9BEO+O-#01$SbFQKR>X<|KR>zkIh{1|Q`0NK6OQ~F6^vWqVP`#N z`GYj=f(Ce_iqxaUlAWbM$UUnS<<3PY|J8|3-Y`_6CzX&QB485rKhDtA_c%hFJ^MqeHT# z@pF0F{I4tEMwYUTUT3K(eW%v?LNQmZAeUph{t5Og&>nCoY`&^RNVx&msT!E@P(f+> zG3=m)Z9NMQpN3cBUoNnk$e7Z}M2Qe;s-&jBB<0ig9W zw~XiyW5UY@teXfd6wDL|QqcOfzC}J%2&>{P@iexQ#cI{RdXDOBR5aXa?DwQ$sEuwA`|1I0Mr zL3SY#z5lc_J>vOW6u>{te~O!;2k9%sjsy#(3oQyc$2)4I zzA5)~%+@WOcPCj$*4NI-6w0lB>BU$H-C6eHXr^2peCi#ll}70w{S2c1wj`Dj)ppF* zekqg zf7rXu4Y5)mTUFpnhTVieSt&(e8}acsDFEbcKCm3J?3KUd<)GU?$ahS5Lmi_8ST^9?@f{q?r85&Yltp!tav+fAc04`M0Fw<4Dm&J zxW|KjJt-+;_ImzieFWs-!84}SqC1MLMN7&M6f-ZGusSlTxKqR8`pZKi!iiU&w^NTbd2u}8`Jcj5P>TkaAm%jlrq?gou#LYvG zH;^M|J%pyswP^qLzr85FQ4+Z!8 zY-5wszvW$?R>?gxkbh?naIMl)h`3ojlk=HPZ~FMj@$N>XlV8E3km>U}zL{ssSp&A_ z&CU1O+2l+9MW>r+Ch^!(w4Xrjd6!GRC=%-wV_@Y&;$!R8!t%WdVLh+rODBsdBtvei z-UVufmn~C9$Dg|zDt+&zQ%1Ah+_Z>Tj*)j|A2$Aa2Uu4HO(L2rOyMpi|3DTU0R9Un z&l%^oiUu&@J!5G>Cc7IuWeApG$eRAIWVul!E|$BXQg~S(kcBuNFP=HE8Hn!MQ!K?S zq%Ivmf}Gg?`C(pxsg6?i9<6@FD8MA^7Fwbf#e#>i4;LLC{g#J%ibFRG7BpRG_vg_V zDJi&4!ku+q)jK}ND3Fo-Dx4gJFEaniV*6HUa$Ew%*9lI7{mtozzwICR>_Soucr@@- zw};+}QW2xcI99ZRNY?q$4Q=R%P}6}Kzh7Wu63u>G+Q0jgeh82^cpW0_} zy-#M_f{TyNCg%HP#8^>dN|pIHAG1+}Iz==Z5y9L_bf?}y@4qK5Bf`XOsfd z<2P!ExCV;f;U1u#`e(cWWZFa+uD71Qu!d`&i+$XuA~dJ_Sh^iunWcTjsF}l!+)0W# z9#OG;6%68FJ2t7)QjKG!w?r2qObC$l)97=}1V!>^0Ek8ZxkBi?y%L3iPj&Du8f~4l z5^H^n`m@_+SzyCPtk5~)Gm%5!s*x;U<|5mr$Y_yXHY_(6-xRwLxbSzGz7W0Od=TFv zbZqr@=@vM5N$_^5#;;0+iGcm8R8p~FT-s6Kb>v)vuQc6Wf*41$_#Qg=*3o>0{QSuh z&)?VOv~)4-U_FkC><+TLc_RkxQurEm(0b*b27$C?|L|JRrc$^g`(|MP)6r4Ozj_?) zXPM%YXK8gc(gI&2>|G(-%@=k?%@g9aDUkEt48e`gjIsd?%<0G6?$DoM5^ta5%U5e42vqU_$9|m<>6U)h0#h3 z^tDo-)}!4zb@10qM>uh$n?a<{AHAdnsFVFfpbZuznfL^c$Br!MH8yDMtT|+&iu)bU zq^xG2m@M(t_wD=anAqV+vvgTVI#npA@-}xo$Fg59UFHGc&JaNfO(5^>oIM|~KcXG< zUBnOu^UwNv%4j>np(kURQbgE$4&`@BY|W2|Gsfl%_9p`SN89XUS>4SE6iYHR;OWf& zJ(fI^90i6IYg1)lfMARW!bfQYKpt>~-vD}CDqeVXJ@9>Bk%m=-5U`;vFJMgxp~P!E z)8??`7yivf^}~w75M>uB@ZpY%B6{I!izHr!!rX$+zml>fLtC5tvf3-XDcfV7Ms)D2 z)Qp96G8M6Fd`pN3DzaKw2F3m!HD?Ud{(w&(@vE0HPU7c&43dpo-%Yv?KJy8xZr84x#kZ?M{l9ki(Xt%*{ViBI2ws;mJ3p)9Mi{nW+m@%!#Y38d_{Ei_jpL z6)x;zVy^L;Ui*DGYiW72QrvKldxsbz@+N-9Qc}}Fg8y@Y|AD=l<1~TTx=DH@AmIAv zSjVDl1h!u=1-~zVX3v)yrWAu;1cK$wD*|I60%a6-z*Jr~cz#N~8iA>HMeUqi8EyQ? zEH@K9wBXV2=b-drTrT5{O3iI8UmO&t2O&u-q&CeiDaz)kpRJ`V?11rUaLvGUopeQ~ z5{@F6J-#sO3pB#o;?ve{gS2-eq3HSR<*zs*9Q1iS2i*&K!W??2ptT8%I;f?QMGp!Q*7FNToueaJ08QWPuu8lO_!uvpcLf`;1!X9DY5%AcQ$#DU^S z^vC7T$tB;js4>-x%7#>$SaTMISGizf!mnB_!DWEXqASAK@9kaHcGi%mXh;zW!7{P? zrRd5+qqNUlKH3S_7kxMjj|>H|44(15IOMZ%(6$6q)o}xxXK&z87-0KU9{SH70`Q|^ zhK@d^o}Yg+73jeTgHn#t`Z(bF2UGgUgW`Ee`~6ws^8AWQZ+n0pp-}BJ&b_n+ zg|AO%AZ!LBOw5hTah09MWtp%$1u}^9GO_v|#|m}zu2ASl8k&jW=bRJTA(HGQUJg3T zTw9s!vJ|05lwkI?$6vwCIowk#9LT}J#K)3(_++lw79XVy%f5=`*9apwq zMYD}=|6FX;X|i0h-F!01Z=SwUkPEpCPX1lf%!Ko|lp10ybLm2W(<$r?p|o`ZAPa)m zV?;F^gQ!6U$&fSgEPvtM*G*>@Bg1p^vH35oW8>9yh9{WV3&}__tx`Mf^^D~oP9&w* zWUl_kauYumguEH(dVk|QPe?b9^lKQ|y$DbNnOsv6p#)E1M`WKplL##L;h22Pjcd7W zAC$nSNmdX2GwczOR!^KMODJ~v=7Gb3bT?nZT#^CG4Jrie4niPlc zYmBUln2Gkw7X3y&Dt;9ZU^}s8ay``3q3Yh88waKDpiSB;d>{zxfb;6HMdA)SXo;?p zD*bECt}wdbK#|jnpNy?1`dD%S_c-c!QdmnNlXljsJ=dI3S?~1sGV-+pKqhf$b#IoP zsJZxk?Ok{*8koip>e#sTuD$8t zq9MDp;^&zXgrffCbO9kPdXT|;1Y+w1x-e#552M#E`DXAic?i~D%3*=YqG z#FCW;Jp^(m=|FYYV+)^L=7-*^Wi((%o)!Ob4K#Dts5BcBK*c*cyrozmT88Wvi5;2( zL-AEqfr`Aih+5t7JGnWUh(#)D5JE9E2HNCcBBz0-{x^eH{e~zj-@t)hmQ5__4KB68 zC20>UIJl4>r#ob+{PHZ56GL&4jxBQIn_$w>hR~Y4BykuKturd{4x)AEOrX z9k<-y*T#o#TD3mV|G1aCWz{R+@;Mn_i~|-NHbH@Zj9y^ExCjGh)`6IPU%BkuF1WIB z-ugVxb(uq=+dM7TP3g8cfX_uqbCCioRk)0RU!=hhDLsf~N!NBcCXp~!DpG~*yfrRKTJuT1@XnL zH(0$QUvzlSEgBb2BX} zQb8P##y=#>JL9s#L&Rgu_zn0+m6{w&q>)Ai{7aJ%Q{%S=;X&jz#QRPZ)#dXnx8Lh9 zG5W{$!t795r`?U?UvRVRnNg@ zTu0EFxj)LQltg+UzY!w}^g~sVqnKJ3tusOkq2s7=&Ys=6wxFg$J1k(kcvM^;2swq7 zTT{fpETPMhhFxt=t% z)K=s$B(rC(?Ex(hmzO9z%PMkGdzl2{s?M#KjXa%AJByo&z6WH$#z3IKpbR|t25?!b zoo;d+k@Xyh5B>4!jm)~Fr>wTa${DbJD9JbBKZH|u)Nf4c6ggX+H0#NeH4kCF7cfC^ z_`MCfVbsdD0U;$>!es%}I5@3%77;p&YWZu~$!90pz!s}T2(dNqw9z+;rep5_Q}d^C z#HcK5TpsV-y~}O;ejhVMo-0+BtFDj_fZp^K=z;(#JJi=L#l<)pmeQOb2l!HUp`t#9 z;+N1x`G`=KssRIdCe?x8qKbnIxM7N^acKKxpM}o-4O|Y5rJCpBtZPU8%24;S*+s#u z1UFhGtagk{$yrSFtixJ(wyi(uHh##Tlr(-Q2V}>kvRkK0UmahEov=e^D$0m}Tqo&K z9v4n}tWGM5(vvN@TcpH%p=7rD$5irM2+bArR&yP8)>jXO-^Xs?mnb+9Tcd6m6|6b7 zNpW71+aT&Qy`qR29J}bgtPzkRcQ+X_@R{y*y)~uj zVw0nA&@|hjTlMiA&I#q5!Pb%%ecWXK6J0 zs3i7Z9aZZT)OFMbH1ZAUxt@`<0a*5;_!V8SY!lu^*RSw7h;dnW#v#=$j!^zuMV_eN zNcd{ttVVkTlR#Dr4mI256UPwvf;4RmLl!U#i?!~}2GR?t8Z5;jWGp#Jx0|$X?1^MC zumOb9f}_4!x6~sXY?37EwWkVPc*bfp>FT(yztPd?4^^74Bu#z8NjohgA{K;_E7-)3- zDKm+i5y9;>>lUFfV8XJZQdT3IbvC)Ahyh;b`VO}hb($G!`-c#2@qJc@X|eVI(rv)m z6Vmb_+Br3s_CpYMtbKoysw89__jC4$HZ(t28Xx@$;0FYl;lI4_fGUA?uzVWm8 zhq->W(6o{m9QP0!^b>x4=xsc|x#DJGf7M`uFcrS0eCf0LY-RE1-Xu%-YVh!WxOXB>Js?|7b8vOFlf zA6P!ue_U2-jU7e`%l-;Z+OZEmH!89h@~0i0*ws#CT*7V2V{1;LT5G+)M;t|ok_0~s z`Wy^hq=Qv1vR38^{;T49-V5@rkQH-s{XXg~wYJ>Cbz)G(H1| z>ukV%jWUJ1l}}A`sw`8s`S%q={vbB%M9=92{#GteXV1Dt1M^LYXVuB$}Qjs&=MIfwq!LwGUit%%qA0UPYmR~ zWzbd~=q6GZK#Mfw`%VgKI-3#;A^#>bb_Bm&d?j&7PT;bp;mW`xIyf}5WzYjVi|RKt zd^eLEx+pH;JV=bdcA5f<`AvFz)42(50TMy0U=uvn{e$RV1dPxW4@8JRCzS1 zU#n~Kj0B_Pu&j5tFmw1`=x{=y(sTq^rPw53>lA}(BVlcX{0SP*v`)h|W&RRx?!7TE)b5dtOi{n&q|VjcI&0h}Gnkz#k) zi{>LSHV?UYqk`vsLM-EMW!DKMNKC09ao20BuFlDiNEbT^P6Ag&Tj3%PI0P&@F(Vd@ z5L>DR?;WjvV{h+&CXw9F7lHM?Uo-3_?K&7txJ~A`wstnV-aiBCZT6-XRo7{~9l3-s zq9M=ERZQ8xOU@F~LIH5pQxbl3RG%9&LhW!s568W#d6G)a4t=eFg}qqJhq^1zNFQ_w z&mENEQ4mveFGk^?iAX*P26YG{ZSLT}xItM)e$lM|#L(x%IC;EXos8rY zj1S}=G1EVJ{I*NIt(6PcYGX0U>az~tafWnu-tHOq1V6$^BHYC$L9R`?kqvY};0eB? zb8OPpMdsfxPGIA^&7a;rAklL_crJcI$~IQL^ps4T$alCU?+QQ;raS&7z%l*(6a^r1 z1U1c0_hlwV_q;0`r+}axp!nBBQ)T_6R0fNA5f~>K^ASub3E}$(5tEC|1aV)D<;`g0 zr{z=$l4qjBi0gITU-aPjXNx*&`;-_~&=J7RJ!WA<4h-LnSA8r%-rzGuX#z4;RGN1u zlXTiBkDfx$>rI=cQNb9GYwNjT)`gH;b3jyG`LiBf5_lU6mUuRj(LIvxmZ=t4S!6eW zv_O`1Ea_M7VI)_mJn-yFxDuPli=-JZwODIQYm8(-(d|y9k!Y|y=*iq07cVNT;{Hgz zRd?%iN+;m3(UCJ+IW+Nvnva*WwIHR|M zcQ{GM$kp?6@rHsg@X3cRxQSXM+j4;t1N>zj_J?%Gu_GZw_k5aAq`NcYUpMb(Z8@LG zYo+;ROnkZYq)&5uMyd-R(MGqdyFIO08|LrA&1AP!EBmJ2TH;?}qOz zjO`id#`Tq5B6#P{ORu5Qrz(KvhH^{c+Yi*M1&#!4NXqsskBcyD{jnzq^%2+MKhTej zUQ2^$zg2>kF0Em+I!fqy34cGHnf>#Q{MA^Pb~B1fqGg2Vll4Zqgnv7_mRiZ~c^oGmb~JKB~691v;D-Fk!u&BsU)M}9gzE!6r7Tbn+alA?t`Ml=q{KD;{d)P7-6`;v=3yY-- zu&Kv)R*xvx>&6To-cKpAd*t2k>g1iCzj?p&QIfS$#zX1eA|vpldd4!a*H%S&*}0xl z(c+>D0SYH2@tiNO0)t+*>jewU#AQxa*RuE|0{Zsm>8AO>mcZpL0tC(Fo(qRlTTZfqh*Bn!=r0k{%+Z%f_|jz;pO9}Yq%UK z?@A)u>a$z?&P{SI8g_S2AMjB;b)Uiq5S?*afctQOPXf(UtBq8LQMgc`EfdpvtU^%7 zQ^Pqd6GLd(JAk01AT|7!Yc#pb2%-e%(70k1a=32O^RT9I4>woBxfAhb_G zdW~VM9CNAE7a%fE2-HIY?g&a1ll*U)8g9#jD)APcAXiFPznVlR!`A)WN52OfoKFo) zltMl&IO;n#f6dA_jrr$3*Uc^)0n!%tx1mw&iAUDOhmJxPQF~n&34daQ9CaXY<#Q7a z#IKN3T$3N>E4SLRe}+!S_=Q5vS`xI;3F1*r86l4Q?u7W9v(L-6HZiYeR$4!f3mt-X zvTt`yxcS}Au<P>Mn;ER9+H$bL_+-}6@(obQalS!Rn zDf*!Z1RDYoI(1gQu=x(inTqJ#$njwx=Hv69#3tfqbm6a^cK0S&qvYdpX;Fz~W?@TM zqIAbzxKL;+x;b$!`sU9%WnzR(Fx?*6vaTyB<|&oU9#6DR(x49gigo zphw6Ee3`ZV0V`t=TyK7z1^=)2Tlw2E8t4()J(Tqa1t0qb2CCtE?x{{tEt^jT{1JEm9PV1p+$g(JY$eA9!In=EmL{UyzaUF4cyl?;(xbp2oNTB zl_>v?MNtbQ=GSR|csthv7bbye6^3#x(fTBRQp(7JdQf5>WmEr_ouf=;Am~FUa1o&F z9%vaKh{~xrBT#WZLCr3Q1TJ6J%Aus#eUv-Dq7xs!jyhpS3$tC5TL1zh*J~+ZwpTU7 z2c&O#;?Om|u@=0tUJK|f3>Nk2-PiDCNw=p&Rw`0tl;a|wK>VQ9$F2c}hc_DHeEdCx z@=VLS`gMt=gYF5*Lg*s$W5S#K;)3h;3n%CIP$U!^3U#ZiM{UsmPN?~-+haKw% zpGl{sB(ip@vn;sKl0S{zzz15nU~~~Ms3Z-3-GS>TcPHklQbD#v|$wv z5yT#Ndo%@AJ`rZx6ym=rD1`IOF12}t@G$FiS!5`R`+lzs@vbKXseF}v{dSn&}dzD|OC9zw%9uQ|Ta3=nUm7+M26v_TpHb7AR4xf4Wxc8v)*`ceb!Ro4t@7 zLW!5tg^~&UE^K1hSKs>b4&MiF!BKA8{KYC#G{x*Q6pimB^~OBk4-$}agNs8g8^ylt zYLb#I&$sY`Hbfr*%{R8ue=kgr`K55?3RB{B^n151+DNYe*p4{j;4(_&>axssKk1cC zOYy^jaF6B3PGIj?3Sb^K785vIq@C5dz>v?=n?HYRNP8F%oUlRUcUmhP(>~B_uSO*) zk6|432G2N;6v38L(9bLXDWqyw4l+BwvtL3y85nPRXA(!JiI~rZrjpi>lcA%3%tzL` zhS7P(LBqC;%A5%MK+A8-6TU>f{s;! zXBT#XB2(Nem^2_+y@~Wg8mEuOhz?elPz6&aSH+={SE&W{A_@cb@=g}ns z{|13>Lp0kHX-mZ*&nupR+qzFp^m1XKgt9Ud*LuadRbdKF=y&|oxsKMUgsH{E&PCZe zQ{@xZ8mHzr?XNROqr-nf+u;b@MLm!sAWtsc&cZselYd!Qw^XXto!+`)1)J#SaH7NW zSbES{Um}fo>3FLHWO|Y7pZU+f*v5J(QQpsgmc`|tGj#2Jy7&!bDDDDTZ)mgqGCiKO z{Xkj1RZmu@zRTo}(T=cuwzM(}V?v&re?NU)2y+4gy7D{b&*0g6nO{Kdx2 z_?FfBi&=vq%T%s52GMWeRy-kD5sj6F$h~LNuBh0jo^pF<42JKk&pk^<;iLu6w9hA9 z)}bde8wG{0GS~L?>&V3=Kk?*CcQXhq59>NV50yq4^%frAj;j^(xzj zsc+rlryYA{TnS!2{nETdQ8Ob82oh%G=kB|G1QkG^*Pl%S_duDQ#SY zfLU0Vy6Fqn2}%fRXmI3Pv&Yl%O0YZMlpH-~MqM7IsEl>am$b!xgjywWTjvtfoF`;G zXmwb~W)#<2Hp(R!7hDM$8kSE=*8%Q!8^N~@eE(GcgY?KBn2MAA^(1Qsmsb6#`WlmO z4LN*mq4K);mdlb&@ZBc*a*NQlse?Y$j{^kcqcN)wj!v#?=Gy?A2m#hTtTTA3hLCKHcQgVuiXSmre=>s)l@4twL!y=czv zg*r$|dD(38o#PohtNn|MRXQ-{XF~(+D{}oPcz(teGiIjcw@gr_5Y<9xX0iwp`G)l& z7`~RE^fIJ3HCU!*nO=;%{wz&OmCXM!*T@B;X-2AZL@tiTH$Dn&Vp>54)mg>EGQ7b) z=-}P|#_8Y=uw_!1rg()Iy3^QSbpCNzPIGNAquw`kRPU# zvihNjSapY@!zRLGHY3$c66F4tvj>)Pp9lau3+(DA zxqrIZ%?y9vT%Kz@Gs5LTPRe#`mejzzq(+-V@Dge^x z_LdmkscZeKQbK$!G7$R1iy7Z_(`_!bETP|SI5G2&h|1V*&)c7%O7`1{oE+Kvx8>Oc z2He4K%@oE$ault4LohQ0zl0)NLM5&;bZ14-{Y9}K#QZ59v8{33;&lBm6$bZ0I7_xFs=pSLJO4xY@IV* zX1kF&HpqkJnVhig^4sx&9c3G}95M$-ehi=w^_EV)FyUw8Ha;6KE_fbJb@)3KCC2on z00t7W9}X=-FJ-=h6*hr0;>&K7&zdTg3{MgA_)B{yHbrDa7u6L;HG+DOzZg8rl~_27 zI!&#U&0kQuSfz`GPliaJnB@HFodJjGfNOZgcN1d4*`{BeO7 zxo6XjeMZ)_y)bswt6f3doNf>-JHmc1$kCzKxYK7zupmniq&v#QvPPEmD_T6l`7++Q z?Udcznw(IpeBa!8Q-Ln#(a>=LU3>rW#cAhI8Ur!e4QfN2W zs^+ZaPpyfeOh?2hx)*ZZV!+NgVJ9WmyA=^74;!M%-cag|%kT4|=Jfk2iNVTI&`b82 zGU~w~9B(wg+|`!|+fvPuPQr3QO?DutdrczIIFFcTphBfLI>`c(Pl+^MpZ>!e-9U%m z{<_m|{|wV#E;*^{a3L0vSh!kthzC4qJ>4jFHBC9j1P7=*=uep%m~*5BdF1({Y2Msx zM-HawvqOwexNF;ZJS!clR&VZ?5#Hl;R5F)Z9M~1a-1J;oFZuAiK1_9eNNfkLZ0>15-0r0aT=NxKB5H*Sln^%V_MCLP^=jqy;A80xxK|&%pX>q2lHh0>LQW6n)8#M5!T4$@^9ssCK}JwGesE#F{Fd-iZzk2MSyu3E3Z&Q&J9XrN z#wiUaoI|f`+Pd-SGm!ZM=a@q9qu0=1`fV)D8v;S&r2rr*>O z((By5b^HE==>x~g;8#->%MCqm!L_i=5z@t70ZSfq-QJJyC5=W3+31~U;POJi1#-l4 ze9CMPYyf7zLgOA1?|<50zIT#fuq=^O79g+ z><-Wq82_Kft~08sZrjpCKm-J(Nt2F(^d@3Jq&EdAp-b;5JqQV?fJzA%dPg9L^xh#z z?}ed9d=IVD+c#_p zQ2f+dbA`MfM6i?|qiw(ce|a2V$>J$n#x>itqqGb~5p=IW%5j;rS@M#el{phj{Ze59 z@wKnR0IhTqx~c-YMNI(p{Wi^m>8QYPOjlGY30uX&kcLz+*RB}jnWof~10GjMX{&U= zXFW1lg!bE|+_J8=ey9!{te}y)w}m@&0Q*FipT`s!H3J2I~%{Y3gzheSmRyO z9g3`%Vlbfx(9ylWel9p|>5HTc_CLQzReMFPRY~9MKio|q>S*hX1G+!hOJKuBB60nT z_PS!$6P~bn@;cfo{t(*nC`BsO>-3V;FX~PMw@v7=$7#I%_2d?XKXN)P?*%94tMI_i zp@SVM{dfMqgx_GFr7-b6;$G3zYxJI8% zGYl%INWe%qzX(@>6lsPjdZ7w$ZuU=NcPNt6n$hzu4rq=NHFsotm3+&dp1={U%U*}S zw%K^pMuW`)&Rk*#E-XpHElKjTiW3`QIs} zzyovD$<{PUftR-wjc?_@s8Gups6dWuC^|>;AX62GOmBY16u4o7R73c?|t}oU;dmDQ`17~w@=X=%5x_51T7B0-D zeD-8dQZDAv4IWynmyb`L5E09>^$Ud={F1DGZyk^XeYhb$!0v>qyWU@C_uio=*^m`L z`ceaO<~CP>d1ouj?1fYpc}VS-T@T%^RX%G>J}TenpA&@UOx0Cu)Gqw%qHm%8uWwXk zW9sy;)>jQr#0=qKECMt4cO=U^6FFOs>Y6dyVv@O{`=9X$NZ11Z{U*dqpo!3M&7Wlo z4SjQzg1tk!79U$}xB2r${1LzC+!rGC-uk4BGv0IyBfu>ThPYN>xAmbjPj8*vJo*vXyCm zbG`g`;N8n%njvt+ivp3w78GRuI)QCRHzPg~l^ovxywOtyMVf{dU#>o%DYjTm)Nu$; zO+Vz2wz0@-Ntaq;XAN`kqh|KpEUi%UK=Kxg6vm&)dN(IyewoW$^+?ui-YNC~PxT}~ z>4;XJvTaY_vWpF71#4>YxICJWncnk1Ht!Qk4)g1k{*Ql@!wYKX93t*(sMoejwGV$l zQLgS>lE2z}4mV{Jp03TG&MGW_$CZza8-D>YbqX zR3y6fCg_C)_uZQj1J z^I%y8ctKPoH5$nZplGu314^H2DSNQo%y{uciHD-g%`w+wp|(SF;Y`n<(J%F|GkyD# zH>g~3)|Pfo`39`sWbz<@Zg+Bhwhc!6%XR!b$f22fGCdcQPcv&8R;05Z^w(tZiEO!| z)>2hc)|Tk_lc&#M%p%{IN-yqP;b~|U6Ka||52cQ9VQ-I%kj4PhVqTc7(67)GPxW;b zm(QLVT&DF&U1+Wuu&_vjiM4T^OxJJ~3;0w|c^G&<(tqB}Y=}0mZb9om?h+7`tYnR|aes&slv2C(Zp=a#{`P zYHk1WvqjXkBx8|db}mkj_{S%Z!T}*C;tb(zI3$UtxF!pbHQ^lk;n1^=}j9yOX~mu z!ME;hL)ubigimzrRF(b>=0C8GE0Z%oXt11L5t4?dzN)6$3~rbAP3dIMatDs&XLsTm zsYRPlhF4o}I*ZOkCawe@@D16E{-)^JOLQs1v>Xp?EZiFO0q?lgZr0GGntOc^E@zPo z+CS2#V`-4-=bky2Yx;4UD+}#VKa#WKL7ROQ{X`TZT!7b-vY&ip%@+z(>`S3Y-_cF~F5$uM}Po~xNIV~;nTXaeR?AlPP zye(?z?84LQU#yRzf~U@$N9A*=&{p{m*17mW_GxdlCwv0Z4x z?}rAV@f*Cd#7zfsm69azd&2$EuHyXftwl=4>={<*#`j7%QX!aPDaf{mnV*cjN%4lUkgX*}(qp(}gxd;UKO8|#ik zjv?_@jfJmdn3+s>K_mk+BXt-DNL4$iRIH+!EwQ8BnGd>EeEm5%2+c`F1NINQ3{Yrd zKV#{HwA8K@c#RDUdSX5fPMrA? zk}(sEg89MdADP@oE5BZFZI;JPO=49GXkcO=dA;5{(=DVZY*}XsZQ<7~5)&)jq$L&h z_KmR*zw9-I3dC z9VmP>QX8AULO=Kv>E;Yq_eV`e?hL3#m5r}O%AV7#v0zveWvld(l`)vG?`*1h0_|j9 zsvQ8E%*me{_=7R6_2>HNK7JgZz2_-WMmSry9~f_aVy50!B|H_IhjL6Z@js}t8D)j4 zTl3z0jTG)zIpg{%`TK*1anl3&ioM&|JzaX2JBf}Yw0vqVqYz0}%iaTa?F^1!XA>j2 zx}p{*vWt55JY+q0%3CE{>}i&>!7fm#lQx9`*@xBGO(vpF9a7!4nx%)qVkG)U3@a$= zJ;0--2X1rbg^N;umEl0d$nEvJ=t=aj!?Qw~vW_o*YYi)~fvpJwxr#Q3@E#tE{*=`PWVk)@x zzs2>>6|uSnl)=^yM154J`p#7FlcdTNKb0y}RPh&imSu@^xuZ@k)AOMeX-_2(%%LD)6*IWmyh^!>zG?jSKh8s^73*_v{^v}BzLhVvVDkoe7_ z+UOTktgz6v?z%5>$;2~9{^;>@ZpPV>M|4-7*n?II0sG(6-#AuZZurIDsFSS~#RNBa z(@;|(?LNtt_t)mK__(gY{8mwiokq?EFuNC<#&jE+B_Gezn~GVQTimY3G>z;Gar0L< z!wsR4cG=vmS$_lR6356}k`rJCgu(HJKMAy*2HS*XUT0R$UGo(OamlX4diJWHwH(4` zXphI+=lwDlYICM0inqWHZ`JqWtIeldV%#=4j}6Y2-)5pwD5tz4)zI7k&Ko!(Mvxsf z`V<|`{&rKd-{NED-~9Uinek^*@wm}huWzJ{po^SX(2=iy`X$SX@VvPfN=zW)NDBNp zoBFNMv3jeZj=10`YoXMqtb)65w;=cT(np?@;ad~_j}ZFrs9F3ZIw$VCG?v)*j=k_> zdfX#dmI%svuQmtO4c2-6<6v^mQP^$3u9G)?>n3=Vb$XEPh}9e#u#7-^Ag^0?-vpCH`1vob2C9GKrO}XVS&3HyU z*rYP~M=zINEsCgP;vrr^iQml?9e-x2ia%N{8XA&#}~Ru0E!3`4=Rf(a`^8t>tc8YI3A!WA8)R*(bT5(y_;5G(265-&7%M(1GZ@ zeL*t~HR6OSPC;IdiBHo}pa9oRnEy_hK+!N_UNuQCJDQ98Bg=$G=!;=3YfT+15c<;FhXZ4yrZj{v&rD>|?UbnH0rpu+9;WZp&E>?WkWC8&TWv zTHB;FkFIZ`@D=~0qH0$iv)|S&g8Gd4l2vfb5ZLm<@EfMJmNl~RqyzTL?k6s$?1^k2 zw`wSIete@!b6jR&KtrW&`^Hz$p=zALo{=8OCEF+C+STn|5`HkuU3WiXcX2}MIo8}8 z*f7nTe_`Y;#;L5WoKfsR(FRLW-?KbuFMs(@Ga&6SESm~=vZ3RbDB97Tq^jWk;m@4K zUaDP`K9QdY%eboXIBJw^`hKb5%z=Z^P()C_(BYG=_ZNcQG#$@)2SU|~rAuXPmAQ<= z36~qn91owHB`Es|M8E~30I3CQ-yyE4^Ze`qea^fsa*EgCTxTzDnyYpM7<< z&+_O@bRXpE&Dwf!veuUwd8?D#Gi-u5K2YFzEhpOdQt^5eIJ>UvL(*_IQLSalgX{HT zWVFx~^8Nz)IX7?jG+)b}rCcwL3I0vW9p(HV1jno*FckYcn_7Xgr+@KD$n&3pgtm@i zel2igYax(Ju>s2r+?v!s20w$I2g#9SM%35i@w{mW0X>J!gcaEXTp%I~=uni)bmyJI zXwARc8N8r-G*aIJ6B)f4>TAAVY8`G$esm$Q5OyEeppBN<9EmQ|sC8M(_K!mdJ~a%; zz#^#PX-t4pZK`pErdDrsRpK##x_2QjAUXBD_}|%ycumISiRd#g*#I+CK}KCO!{o!6 zCO0I*_$lmtLw<>?PtwMwM{M z9q*7Hw*kaqck)uXyLr+oAM&8-?zTHW=r~6?>`LSdU1p55)2bQ^6kx@g)k{euSPLg^ z1F!+rJI`)@K)_cuDjDOUa4N7=^k5O`_g{g;x9L-k ztZQ`H(PI(PEa0*_%Rzb-*LtSIfgR|V0o%m}ZT@YCa;uoZXywaqfKq{B@M_l8{)mqQ zYX{&u4iZTc5Gh1`m*)}CE~1P>PBPl}uY`xVW*+hIK4fHbIp}Ey8|1yNOlZLV2H-PunceNweYORX&D)ec7=fg=){exe3{w{8KL7YN7 zqJ88Zp4Maajm6+3;!Qq7+C9!N4;#<8#D{!yPi23jG&IBBRCVI5V1&)O8~tnnll6T*{^EN~yusi3icds_&tNk+C~^kP^;ab@f{ecP4rqOB z_gy+>M9k}oHS`acCc$YW?E%x=w(}5@>3HQUXJm5yohgOCScFP0<4(dMgRS>wq&Y_7 z6J(D0#EOYOSo)U}4c&tg_mYCfehqc_(#G@X_=Ch+p%y{CO1SGEt`9h;+}qn_5(uEd zDVTT!7gXzHg4-Mm^2}rgX?{OOwS0{CUujMdMfvt7GYeUG!U-%wS4EelkLFh6}e5{zdwvp|DN-{dyEiC=~l$X%pWks45L6+X)7y~BYZAIbRz2WYRU`JR)U&uKJ zTV79F#Jxg*UQWPsFWQze!yCRhdTkOa7hbx}Ggv^WZR$Ne)iRbI_enq+zQh%t$#L>T zooVPqRq%^gg%arU^Zj90tXdf=xie+uG&v1zi+}GkCi7@*;q@2`Jtt22XB$$sFtbaT zy2uIo-aLsCm>lb4L=w{0l~>yAmc#wY;uZ~FQef-!LyBYUpdp2r(=gJw<0=9aPS1tn zdaXiWdycO(xNu78u0DD_8Ih3PuFN-;yOqemS^Z`@y2ce1X5B;g?6gwe;FZIsI=3S# z51^UD5Q54Ih(yWuE0zcSoyma+av};KLIcpdekR#a?2b7&trcU7drzk+q(Cw0okU1O zW7#w$Ugw59HqnRA!W$gBzNG$ka(ouA&hD6HuOFW@dnz!6G5|qpQPLYX*8Y*ri8q)= z0u#Xn(T7@o)%lleJJA@%p-FSvoRi&UwpCqvWc6Tr*<<~I z@tDrRO{MR$-S5w{7+Z(H_YF*o0>V+^`hs}amVJZV>_Wu=n*F?lPq*b$Zk&B zgW#{6wdlG=aYkM~Vtl=->3~l4@+nIxS4%h(QP^PgmmQ{gdqOLt8dC2VyOFOko!Xm$ zqm-N4WW1ER7sD)aP3K`Gab723+c@QmDJ4*=0Jv|nd4L><+n>BceaNVKXtHg!5!F05 z4zlMXi9%WhYI-cMWwbZU+3-TmzyG{9K{JB%>vsokVF54M(Alt|3+(_c%SfC!l0z}1B$eP$N&Zr%KVCJJAfR2!a) zo;l|0M}Av2qK5G)b%hRfllS4kr;JCr{O*AV-F(DhWei{=;5Weg5pZ_#x@U(Lw_)6O zaokZoc%niFJbZpkrSbXy4%gE)_A%vplP1}jC`i3LOqsVR^j68BKJpWv6g;`kFtAJQ z#XRRevMy7;)t31I`Ee&fp87YmuX#Y8N898SM&NGRIJ6&UsWA{?LdIVgm}ok?oI8%r z$!}fgF7L0iZ4qw~?X|Cl0jaW8_nPHFpXj`XvlBs@RC!yIX)>pa)ltW}?oAZ2kgIi> z;;W&wO4#kcAcBp+s*=Spw&6VBE|xm>DnecHHwT`j+=j2Cu_t;U4JW~SMxusBuv+b; zl?_vDea@#DP1nzuXhXf7@IZpC^{2E=^%`9~(O#0(=|KYj7~Cww2{k^O4)(TVGHw37 zI`BP~rw3T%%KA8GZ4|$j->*KWW5|-JpLl~$miZx}GpN2>9fXw=Sbvxl2H>}d>`dXZ z@Tze}IB);S+y2c<-7C*chI^;lJpxICj;uXgxuXxdN=0TWe2pHBzb)a-O79};o|fP% z7Akv2b;s)AeBeI{Dn&%#&11^``u^d14b#%yzULDVL50J$fnh%Bn*=2M z)c6}QEC+hWYpKT*y@iwi&=E|2L5gVd^2Rsoa&_gF$6*00g0bEFGRgjmr-LVb?hdH1 z$C}bJypiH(ho!d7T~_T$UT+Gzwa<8md~Yj7B)i=1Ou9V18IfK*tL1{6t|E;CW?A4U z!4fJ0#gCTv=E0~vh9aq@Ye?4v4lmR6G}poybuvHWgcRewWF#VScSZ;9MBINLv>Y#` z%OGGsV-)^J4HO(_OIYq$Qp`XrYMo@p%EHj+H&3eFI%xkE?05t>I5HNqf(*HfO-|}F zDOjV|2OiWvqK9cHKTOTWE%4y zelc%u$l>ph_{YF}LPGeWiZMV-@HrCVYs5Tz-Q-&sVk%AkAtiay=cN^AgicgYmh%iH>*Qoh;4oN?AH*h=sS2=54qHq%Sh9~|jAnL`j` zi+aM1TjM=UcuphM&7VHqu{v3;Ny(h8>eFOgiO5b2fUier4_4W@MlRWL67H>`DIXY^ zintF{-X)E3;CO|j1PsFo7`YiI+X?JMXx0Pnjq-HfaCs+IW;df*!k^PV*C^ZB*R$U3 zoP6MtqO7qWR?eIQR$=}mN^R4c_TJXZwrdkgxhS!x{BWnBd6&4+lNL8GY0CpCHbO0@ z0>(CY>Nn2)Yoqs}D?q#6`gf)-)*RO)zN*peP_ZU^#noC0X;uk*Q#y05prg5Tzk9dn zoWsXxm%OO1BjROzL~6i}i^A~m>u4OoPk1j%d7to&fN0&v*DDOlSRw8fZ#Yq_^D{W_ zc?vOS^2)T9ojhC4eL}l9gTpEBTDU(oLhzb?Xdb3UKqPwiAoA`-IKZw|--#4=U5Co> zKEb2UtUZcu6Df6$b6c$ySGs#!x?F)(BJ&D%Z*CeJM`^g_AQkOmR~T##$l?CEsqhVU zP(ex|U%JD77!{!rB%5!WBy)OQ`A4(oKof>LO*`(pEH0y~>#`{e$E}8@=W8=dGhQlc{(;K#Qb=sSEA2h#OUe9tn%Jp|-5BP+;D8^P&aqTm9 ztN*5`+Vi8uFuQQgorH52g9&OmkK*`1gt}!0Kk@7H26cwV4+!Z@f#TEUbdEi_flz7B z+9?Wf7#!p4Q#`tyY@#n0x(f zwWsNp`|D$6wK0*c0~XMNo5B3TqhHEy$98VMQmL?iFdwmjTt^%Kb#|&JXjChFcF=rh zw#zAnl1Ei;aplP=UGQ^g8{!#AWUMkl(cm@5bukUVYPUm-+qHce>tkihH%J}AJy_i( z2WiyYJ+HI3sT>otyV@6hx;u0~{=qG+_bl!uFV;+h>U#FaZp76pvlu?O6-vVui2C~c zf@XOQPb(^;m9%9{xlPW9;c{xC3fxhIXGD>`ldsVyxUxNy?XM&z2AqMP?>ZSnDNE9Q z!1*Ruwu$>Sz|D1A5N0xfV}5QW5;QN1p?p%RE|~uJ3J>=7_$#`hA^hIQWFPX!3!_Q; z4&hD^lbyLk|JR+@SR-MG_VN{p)~t7j%Bnw~j=MIHjvhU^p-Cu((mZzEvJ-@EsPZnL zBTz|RpqnA-CLRbRPM0EeEuB>xHxy2lfsp4 zY=Lscfx#4h$SFV@!D2b2Y(x{_71OYj#CHZWUeZ_JcJeX}9&7S;;^eJT8(;Fu391x& zXg*t$9idKTZSqULH)r-+HdM95`sF)!E9&gKu}fC&k&y)}iB3&lcy#o%Sd_TVMw%Kv z5xulEyWWF9ww#j7gT}mm+{aY<(^VRVl@xfH!|#4Z#T2Z_pMgbufuTZtoyRR_umi>I z7=IdflXvE>Pe*u`!_;P4WCa{%?ypt%N>}w7JMVQh#muZKQM~PIKK78ISbdO5j?3{R c+kE?1;f!2t5$?A@c-WV!qSmvbrxx%23tpG7BLDyZ literal 54221 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%0Ab@$LDmV1~&L*e9gza^Qyl?l~FrJif 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 LtDnm{r-UW|3D$;Q diff --git a/CoreStore.sketch b/CoreStore.sketch index f42236852cbe70ff7e5db0e8bb37d4d8b2b2b400..9299a7e4ada1f903d119e929f5b492bad7b42841 100644 GIT binary patch literal 63581 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 z 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 literal 62385 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 UXj4%i{ez19M36hYwQ+Rxe;}KID*ylh diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 59de5a0..8331ce2 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -3465,7 +3465,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3488,7 +3488,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3548,7 +3548,7 @@ GCC_NO_COMMON_BLOCKS = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3575,7 +3575,7 @@ GCC_NO_COMMON_BLOCKS = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3641,7 +3641,7 @@ GCC_NO_COMMON_BLOCKS = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3670,7 +3670,7 @@ GCC_NO_COMMON_BLOCKS = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3736,7 +3736,7 @@ GCC_NO_COMMON_BLOCKS = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, @@ -3765,7 +3765,7 @@ GCC_NO_COMMON_BLOCKS = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 7.3.1; + MARKETING_VERSION = 8.0.0; OTHER_LDFLAGS = ( "-weak_framework", Combine, diff --git a/Demo/Resources/Images.xcassets/CoreStoreIcon.imageset/CoreStoreIcon.pdf b/Demo/Resources/Images.xcassets/CoreStoreIcon.imageset/CoreStoreIcon.pdf index c7ceed9d7c1b83aca64bc42839e3534ba185aa40..3867bef0430aa81a144b0f1aca9761a6d2a0c325 100644 GIT binary patch delta 1685 zcmZuy3s4hR6qT4z-C)2#DQd+hBZ45wzRhkvHlQX^K4yT1fb!LZY(fGgZ4xWW)M!;G z4npZ7#mZ%th5ePP z>B$WbF079JbhJr3v7pfxc0GD2|2~Qrvwzc?2Lj>c%T-(N$Hb1`9$J#nJhSFVs-72H zXYAdmX_>k#?!r|~q-MrFzP)dQ#{KnzbJ@v+_N?N)yNg)&ctWer)p(@QRewp8v+Yvt z=I&8n4%`V0Y541+Zt=xGW!i_bVac6J zW8pj-FS&E(s7H!1djc1$R>r^6msAxaNZrygcPCbGU)6R@t$kr`w{2Mxkus}vdw=1F zZ?*L-D=$s&Y52Q$LT`x6xM|+$3n{)Lp1bzHoESwd;Kf_u|flD@q>s zAD+E(;6=~zrKK;_{=04Jt=9Jat0wm~A>4k2zgwU_z^$8@*Ec24ED~m~EK+v0nQ#J$ zXlqX`zvfsIwl?>AI`&1tq29Y(g=D^O!og{wQsOF^dw9VZWtuMdj{-*JY&VM133zwLgaB>HG%9DLY@@ z*i~sF58u9dVuy(>Zz(H zmefwnuSh$!FDb)ysWbWFFQ<_{zP@7Tt`p+fPpS_@)~eJU%R^Qi=j|iqj7I4PMu?+J`!qxHNgdel!+q3cn1b# zp2T>E2tahm#sP$00w7E)&>75D6OhXp8v??EN-MyC*b7323o%j8fdfLNt;l9i`#_gZ z0?AO4&Ol9PYke@Poi)jCB!GIC9ZI!~UNGLXw_!#pRmld_4K~+DMq5*SAmw7`P-8ee zgxR#G7L~)9%=I2_OboFaLD=3+92FvD>N1dQAWT#$6*>oL0MOH{+@an;rlOYz4Uk5I zY zhuLNYLMXsTg2Yr8Kf+%Oav~K=%|!-)p-P;f`~su65XB)xF$^OJYHnai#E5kkibl}) zj1fd7cG8H@uPUKd1x^YnTtp}{o$uoYhFRpEurUWvpE6u3OLbfv;pXmurN_YPhBp~7ZJEP9}`Q(2E9>& tl6oSaNHWMom|iBqL^2qM{6A(Sgci==zeQ(v4o-tW2^0wrpO-Qp`44_TIr#tp delta 1603 zcmah|3s6*57!KIQxT4YWT804*$;!*vbM9;JIT&wu{&|KGna zv@x{GLrww+OgV*EcsNidu*Q7zQa}k%8h^><6>E8V&w*c3oG%Q89*Z5gb8e{JaNOhj zGO8lX?TeTT-v3w)JLeWi2M#qa-)lLwWmo=a(9g22z87=1%zeYLLDITAVCb~&Mo4g6 zuRLlCS_S>w$A(*eO>iE~{3IZA{r*Q|=dKRaZ|m*fTIX=ujn%|*eY<_^R>qaQZ|WH0 zK5SiUvCdiW$DPZ6v6cs;*Y1DRbLVz;(y(WZY32{1eGSJx_rEzBvNt)uX3)8yihX>t zKXanc|NJhvyyh8PH9Hlh9=7ANa4Di8QR9$tuEZKudehWCNJ@v zzvkL&esg-+vX3Lqdzbb4%#B(20vj`ExtMbI+muRgYxBq^tiGWi3%^C*Ec)?X?aoD6 zUrVk$+*FU9y)}DTt>?Vb-`PC_n=8KY-^NxY$k54G)jDe} z+Kj@5;n_{wxgsX)Mhc}0+t_z_QK8fMkj-_aNs0X@Qv0|~ibJc(dyh&Vm-oH-)6ET8 zu_xZ6uIsI5w*M`8HL~(>VVk`+wadsC92u;*@AS5pF5Z8SF8I1GCQZ?bwO3V^A9VOr zUACScITo^P3A<}wO=3pLODzX(8(Y!>zVnYdbpv?Km-SfA1~_T8mmkP$AAPy4Y)1FP zqY>S1D|&{jdXC<@y#M~lJ1ed_UTJ%HylCu$&$=9&Ew3xgI|ux_+a(%|HRf^VVpd-y zTB2M;jo7}3;n&K1LxD0yU(6cKfDpw4lxZwyT3MXSa)2HOqD)4!z;l4)-;#Lq2@Z-# zwT;nefHJ1U9G7m^n^_>rFpeVtf+C3tHUbEZhlt}yfbdBh2Z-Rma`5!W0W*%JFGWCQ zGc_7a*b}KTyh-9=r>>Ux@{N+kFN=at15aqxB)vpxqxb}A77wH|?Gaur1$>iqwjEI| z_2U;yXYq1Z=UEd&f^0YOol+luzy-8oj?q}U4HK(^(+HouUVNp9WddbiNBHOF@buNsba25gtvW2qhjrlAX{}mw{+tvyB<7LZ!>fK1q|0V-=1ph$h%X_&7%BV03WCca8ELbiisE$Pt@yV_sRtOnHLP${r zt%ER7*ug-VXv&Kg+Z7Z&ABXt!T%HuTq?k2e5a1Al|1CfZ@hD&b6Bx;e>5B^(CoxD9 zf|z7eL6TM>{+_GCN{cm{%0U$p4ot-m#HR;lm}!0_WP}nua~9FlF&qjF6(0O_rU<8| zC4&ekv}bBS5((4N;igzXkb(f7;UGQTpQff`DvIQ1yL(%4D9FKNG7G)3DOwqCG?;9X z5XLV)S`bM%ttVJ2hbAeUF{mJur=|>44q?!%p-@FtF0R4;-$hWJ&`Qp%FE-m6NvatF MQz&8_l4G%d0T*`%I{*Lx diff --git a/README.md b/README.md index 607ff62..f964125 100644 --- a/README.md +++ b/README.md @@ -183,8 +183,8 @@ CoreStore was (and is) heavily shaped by real-world needs of developing data-dep ### Features -- **🆕SwiftUI and Combine API utilities.** `ListPublisher`s and `ObjectPublisher`s now have their `@ListState` and `@ObjectState` SwiftUI property wrappers. Combine `Publisher` s are also available through the `ListPublisher.reactive`, `ObjectPublisher.reactive`, and `DataStack.reactive` namespaces. -- **Backwards-portable DiffableDataSources implementation!** `UITableViews` and `UICollectionViews` now have a new ally: `ListPublisher`s provide diffable snapshots that make reloading animations very easy and very safe. Say goodbye to `UITableViews` and `UICollectionViews` reload errors! +- **🆕[SwiftUI](#swiftui-utilities) and [Combine](#combine) API utilities.** `ListPublisher`s and `ObjectPublisher`s now have their `@ListState` and `@ObjectState` SwiftUI property wrappers. Combine `Publisher` s are also available through the `ListPublisher.reactive`, `ObjectPublisher.reactive`, and `DataStack.reactive` namespaces. +- **Backwards-portable [DiffableDataSources implementation](#observe-a-diffable-list)!** `UITableViews` and `UICollectionViews` now have a new ally: `ListPublisher`s provide diffable snapshots that make reloading animations very easy and very safe. Say goodbye to `UITableViews` and `UICollectionViews` reload errors! - **💎Tight design around Swift’s code elegance and type safety.** CoreStore fully utilizes Swift's community-driven language features. - **🚦Safer concurrency architecture.** CoreStore makes it hard to fall into common concurrency mistakes. The main `NSManagedObjectContext` is strictly read-only, while all updates are done through serial *transactions*. *(See [Saving and processing transactions](#saving-and-processing-transactions))* - **🔍Clean fetching and querying API.** Fetching objects is easy, but querying for raw aggregates (`min`, `max`, etc.) and raw property values is now just as convenient. *(See [Fetching and querying](#fetching-and-querying))* From b20be10a197b4c57c5af337a1b2b5ef59d636d42 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Sun, 11 Apr 2021 11:39:43 +0900 Subject: [PATCH 9/9] update Readme banner image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f964125..a661a33 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-CoreStore +CoreStore

Unleashing the real power of Core Data with the elegance and safety of Swift